一、ARP地址解析协议
ARP的功能是在32bit的ip地址和采用不同网络技术的硬件地址之间提供动态映射。
ARP高速运行的关键是由于每个主机上都有一个ARP高速缓存,这个高速缓存存放了最近Internet地址到硬件地址之间的映射记录。
可以在linux中通过命令arp -a查看,参数-a的意思是显示高速缓存中所有的内容
|
|
二、php代码实现
|
|
三、云服务器使用情况
|
|
ARP的功能是在32bit的ip地址和采用不同网络技术的硬件地址之间提供动态映射。
ARP高速运行的关键是由于每个主机上都有一个ARP高速缓存,这个高速缓存存放了最近Internet地址到硬件地址之间的映射记录。
可以在linux中通过命令arp -a查看,参数-a的意思是显示高速缓存中所有的内容
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
平时经常听到Google公司讲企业文化,阿里、华为讲价值观,总觉得很牛B,高大上的东西。几个字就成为公司的核心竞争力,我们能不能自己也搞一个呢?其实文化只是一种思想观念、行为习惯、处事风格,家有家风,国有国法,一个民族有一个民族的文化。寺庙文化传承千百年,舌尖上的美食流传至今,它应该有一个自己的发展规律。今天,我们一起来探讨一下,研发团队文化是怎么形成的,下面以我个人的经历来抛砖引玉。
我35岁前主要钻研技术,近几年逐步转向管理,带过几十人至一两百人的研发队伍。在最近的管理工作中,总结并归纳了几个可以贴到墙上的大字,即「共治分享自视一起拼,简单有效快」,接下来讲讲这14个字的来源。
我一年多以前入职了现在的单位,以技术负责人的身份。到岗以后发现了不少的问题:
技术差:架构臃肿,分层混乱,不利于维护和扩展;机房建设落后,有两个自建机房,故障处理没流程;
氛围差:团队没有活力,没有争论,没有学习和分享的氛围。准时上下班,人员懒散,没有激情,像一潭死水一样。不接受新事物,封闭自己,遇到问题相互推诿;
组织结构不合理:人员没有充分利用起来,造成资源浪费,团队角色职责定义模糊,整个团队没有一个清晰的目标和落地的步骤,成员相互的合作不协调。
有问题当然是解决问题,所有的问题本质上都是人的问题,空降的领导必然会导致一部分人员的流失,只要控制在一定的范围内即可。不是因为你不够好,只是因为他对过去领导的依恋,以及对新事物的不正面。改变一个人的成本,比招聘一个人的成本还要大。所以如果有人要离职,同意即可,让他优雅地离开,这是于公司于个人都是有利的事情。
解决了人的问题,接着是解决技术问题,组建架构部,引进一些优秀的人才,自己带几个项目,打两场硬仗,培养兄弟感情的同时,也是让大家认同你的最好方式。做完了这些,然后调整组织架构,实行弹性工作制,接下来就是日常的管理工作了。部门共治,搭建统一工作平台,树立新工作作风,搞氛围,激活团队,只能一步一步地来。
部门共治就是部门要共同治理,我一直认为,每个人只要管好自己,部门的管理就简单得多。先在文件服务器上建一个文件夹,取名为部门共治,然后在里面新建如周报、周会纪要、工时统计、故障报告等目录。
1.周报,我个人一直有写周报的习惯,它是自我管理的方式。上一周总结、下一周计划,让自己有一个清晰的工作目标,理清事情的轻重缓急,同时透明化自己的工作,增加彼此的信任。先是自己写,然后分级逐步推广到全员。
2.工时统计,工时统计是每个月对团队工作时长的统计,由人事协助出报表。它统计到每个人、小组、部门的上班时长情况,主要通过疲劳指数、超出率、小组平均超出率、总平均超出率4个指数来体现。
一切以数据说话,增加人员要看小组平均超出率,员工累不累看疲劳指数,总平均超出率体现了整个部门的负荷情况,了解整个部门的工作节奏,也为增员或者裁员提供了参考指标,工时统计还可以与工单统计相结合。在具体操作时,需要注意可能产生的负面影响,如造成团队成员的反感、过度鼓励加班等,其实超出率过高或过低都不是很好的现象。
3.周会,管理小组每周碰一下,汇总一下工作和问题,同时提交会议纪要,全员都可以查看,并邮件方式同步给领导。我们的周会在每周一下午上班的第一时间,并要求开启午休关掉的灯,管理层从自己做起,严格约束自己,给大家立一个榜样,顺带还解决午休延迟开灯的问题。
早期的周会由我主持,后面轮流主持和记录。主持人站在部门负责人的角度,对汇报人员提出质疑或建议,这样就迫使站在整个研发中心的角度去思考,培养了每个人的全局观,减少本位主义和平时工作中不必要的冲突,同时还提高了管理人员的组织协调力。
4.故障分析报告,将故障分级管理,然后尽量透明化,重要故障全员通告,此工作由运维部门负责。故障报告不仅可追溯,也是一个总结分析的过程,可协助查找到根本问题。透明化可以提高大家的警惕,造成的损失也间接地告诉了代码与商业价值的关系。
5.书籍分享和书斋建设,如果要构建一个学习型团队,书籍的分享和书斋的建设是很好的办法。同时它相当于一面文化宣传墙,利于人员的招聘。书籍可以公司出钱购买,也可以鼓励大家捐赠、分享。书籍它本身很便宜,但真的要捐赠时也有不舍,所以鼓励大家离开时可赎回。捐赠和购书、以及分享书籍的过程,也是学习氛围养成的过程。
搭工作平台,立新工作作风。没有度量就没有提升,管理要数据化、工具化。搭建统一的工作平台,提高大家的工作效率,同时还要树立新的工作作风,如站立式会议、周五分享日、项目管理工具和知识管理工具。
1、项目管理工具JIRA,引入JIRA项目管理工具,可以管理需求、工单、缺陷等各种任务。可以实时地监控、跟踪任务的状态,还可以在每月底出工单统计报告,评估开发人员的工作量和测试人员的工作量。
2、知识管理工具WIKI,类似于维基百科,主要用于知识的分享。可以创建部门的空间、自己个人的空间,写自己的工作心得、新的技术知识等。我个人的一些心得和重要邮件,我也会截图分享到自己的个人空间,这有利于新成员的了解和合作,也利于团队文化的形成。以前企业文化搞海报、杂志等方式,现在采用这种方式更容易接受,也更容易推广。
3、站立式会议,研发是一个需要创意,大脑密集性的工作。所以技术讨论是必不可少的部分,而站立式会议则是非常好的形式。小组周会或者几个人讨论一个问题,非常适合站立式短会。20分钟左右,大家站在白板前,不需要做会议记录,直接用手机拍照,会后发邮件或QQ群。简单高效快,大家保持专注,也不会懒洋洋的样子,没人会玩手机。因为站着,所以会议不会太长,高效、方便、随时随地,不一定需要会议室,所以研发中心要多一些白板,多一些小的会议室。
4、周五分享日,技术的分享现在已成为研发团队的标配,我们每周五是技术分享日,时间定在下午17点到19点,这样避免影响正常的工作。同时让大家知晓,成长不仅是团队的事情,也是个人的事情。分享有利于主讲人知识的巩固、总结,成果的展示,也有利于大家快速的学习。架构部的分享是工作的一部分,其它的则是自愿报名,自由组织。我们的分享也要采用简单有效快的方式,鼓励直接show代码,或使用wiki来讲,这样也利于二次传播,不一定要高大上,也不一定要PPT,达到目的和起到效果即好。
工作和生活要平衡,认真工作,快乐生活。如果管理是鞭策或大棒,那么领导就是鼓励或葫芦卜。季度会议、乐捐与周四下午茶、户外兴趣小组是搞氛围、激活团队的很好方式。
1、季度会议,周会说事,季度会议谈情怀。每3个月左右开一次季度会,套路是新人介绍,上季度的总结,下季度的计划,其它如新书推荐、特长展示等。新人介绍可以快速地融入整个部门,感受团队的热情。上季度的工作总结和下季度的计划,是每个部门长向下级汇报,我们鼓励上级向下级定期汇报,总理都要每年向全国人民汇报,我们也要这样,让每个人都知道各小组最近在干些什么事,下阶段要做什么,设置一个共同的目标,然后一起拼搏。新书推荐,主持人会向大家介绍近期自己读过的书,以及读书的感悟与心得,一起成长。
季度会议如同年度会议,年会不开会,只是吃吃喝喝,以及节目表演,所以季度会议的形式也要比较轻松,以乐观向上的氛围为主,参与的人数比较多。我们的季度会议采用轮值,每次的风格都不一样,这样挺好的,也非常锻炼主持人的组织协调能力,会议时间一般占用周五分享日的时间。
2、乐捐与周四下午茶,乐捐是一个自罚约定、一个问责制度,让员工敢于担当。对于开会迟到、系统小故障、乐捐10元能够起到很好的作用。惩罚只是手段,改进才是目的,培养承担责任的习惯,每次出现问题,都有人站出来承担责任。可别小瞧10元,10元只是最低额,额度自定,乐捐它是一个很好的追责方式,故障更容易明确主要责任人。明确责任后,个人自愿,如果你不愿意10至50元,则由他的直接领导来承担,这是一种社区式的潜在力量。
乐捐不可强制,如会议迟到了你不愿意承担,那便需要由会议主持人承担。乐捐的钱会汇入到部门基金,用于部门的下午茶。我们每周举办一次下午茶,周四进行,因为周一是例会日、周二是发布日、周三无会议日、周五又是分享会。下午茶给大家一个轻松的时间,促进交流,营造气氛,费用由个人乐捐、项目经费共同组成。
3、户外活动兴趣小组,工作生活Balance,兴趣小组能够促进大家的交流,非正式的沟通能改善大家的关系,增强团队的凝聚力。我们组建了羽毛球兴趣小组、户外徒步兴趣小组,以及参与公司的年会表演,组织形式是开放的,是弱化了公司和部门信息的QQ群。兴趣小组有利于业务与技术的融合、跨部门沟通,大家劳逸结合,一起爬山一起拼。
当然不仅仅是以上,我们每一个管理工具都是针对当前的问题,推行2至4周,一个阶段仅推广一个管理工具。我们尝试并留下来的管理工具总共有20多个,具体有:“周会周报、弹性工作制、技术分享会、季度会议、下午茶、10元自罚约定、白板前站立式会议、技术评审制度、会议轮流主持制度、书斋建设、项目管理制度的推行、项目奖金申报制度、招聘比自己更优秀人的约定、末尾淘汰约定、鼓励争论、跨部门沟通约定、源代码统一管理、Y盘文档管理、JIRA和WIKI研发管理工具推广、羽毛球兴趣小组、户外爬山兴趣小组、个体绽放,周一例会日、周二发布日、周三无会议日、周四下午茶、周五分享日”。
太阳底下没有新鲜事,这些工具或措施,或多或少都知道些,我们只是把它落地贯彻,形成了一定的体系。我们的团队一步一步往前走,确实越来越好。这时不断有新人加入,如何将这过去一年多的想法和做法都留下来,并传达出去呢?我们需要把它浓缩成几个字才好,这就是前面提到的“共治分享自视一起拼,简单有效快”,具体内容如下:
共治:共治就是部门要共同治理,自我管理和部门管理一起进行,每个人要管好自己,部门的共治我们希望能转化为个人的自治。具体形式有部门共治文件夹、轮值会议等;
分享:因为专业所以自信,因为自信所以开放,因为开放所以分享。具体形式有周五分享日、书斋建设;
自视:自视就是自我察觉,双眼反向注视着自己。对公司和他人的要求转化为对自己的要求,少一些抱怨,多找一些方法,如乐捐;
一起拼:一起拼就是团队要一起拼搏,一起奋斗,一起喝酒、一起爬山,如户外、项目管理;
简单有效快:把复杂的事情变简单,追求事物的本质,这就是简单有效。“快”是指快速地交付,快速响应业务的需求,如站立式会议等。
以上是我们近一年的总结和实践,也许它并不完美,但它还是能表达团队之前及现阶段的一些行为。当我们确定了这个阶段的部门文化后,团队氛围有了较大的改善,从死气沉沉到激情活力,从固步自封到好学分享,从互相推诿到勇于担当。在后期的几个大项目中,项目的成功显得自然得多,特别在新员工的融合上,成本也低得多。
可能现在你已发现,原来文化的构建并没有想象地那么难,也没有多少高大上。它也需要脚踏实地、土里吧唧,一步一步埋头干。先有管理工具、制度和行为措施,然后予以贯彻,形成一种习惯,最后才是总结提升。
我们不能简单的参考大公司的做法,或者管理书籍上挑选几个词语,然后领导喊两声或挂在墙上。这个过程就如同花朵或生物一般,需要播种、栽培,然后才能收获。这样「长」出来的文化,才能管人做事,深入骨髓、改变思想,才能成为公司或团队的核心竞争力。以上浅见,希望能给你一些参考,当然,你也可以尝试一把,just do it!
张辉清,中青易游CTO,曾就职于携程架构、古大集团,在古大集团任首席架构师和高级技术总监。现阶段关注技术与业务的融合、工程效率和团队管理。
|
|
|
|
招聘是团队管理者工作中的重要一环。本文会结合自己亲身经历以及接受的招聘培训,综合分析怎么找到我们要的人,也希望可以通过招聘这面镜子照亮自己,怎样成为一个更好的工程师。
当今社会,技术已经成为影响商业成功的关键因素,工程师成为了这些公司最宝贵的财富,没有优秀的人组成团队来完成商业目标,公司根本不可能有今天的成就。所以招聘,就是选择最优秀的人。
招优秀的人显然是一个很模糊的概念,我们来度量的时候,我个人认为三个因素是最关键的:
工作项目经验,以及解决疑难问题的能力,毕竟招来的人首先必须很好的完成工作,这是最基本的要求,注意,是很好的完成,不是仅仅完成。
这个概念看起来比较模糊,其实还是比较容易评价的,对计算机相关的专业的知识体系是不是完整,基础是不是扎实,平常是不是喜欢钻研,对这个世界充满好奇心,这几年走下来,沉淀的速度如何,都是判断一个人的潜力的方式,注意我们看潜力主要是基于候选人的之前的成长经历实事求是来看,过去的优秀经历才能给未来背书。潜力和技能的重要性一样重要,我们不能只看眼前,团队是需要不断发展和前进的,所以我们招人应该面向未来。
软实力这里其实包含了性格,执行力,领导力等方方面面,它代表了候选人是否能快速融入团队,拿到结果,带领团队攻城拔寨,激励和影响身边的人变得更加优秀等等,软实力一般HR肯定会考察,虽然技术面不会特别去关注,但是从面试的过程中可以看出候选人的沟通能力,以及性格相关的特点,也值得我们注意。
说了这么多,其实在招人上有一个对比的标杆,就是你招的人是不是比团队中同一等级中50%的同学优秀,如果你觉得没有他们优秀,那不用纠结,这个候选人不要了,团队必须不停加入更好的同学,才能变得更加强大。
这里结合之前的培训以及自己的真实经历,讲解面试的一些方法。
之所以说这些问题不应该问,我认为主要是因为这些很难考察到面试者的真实能力,45分钟的时间本来就很短,有些问题有可能比较偏,有些问题又过于庞大没法一下子描述特别清楚,还有一些问题缺乏上下文,让人摸不到头脑,所以尽量避免这么问问题,另外把握一个重要原则,不要在面试中试图证明别人不如自己,毫无意义,人无完人,总有覆盖不到的地方,按照这个规则招聘,会错过很多优秀的人才。
比如面试移动开发者,面试官应该认真看下其做过的App,具体的工作是什么,准备一些相关的问题,这里就可以看出来之前工作中的积累是什么,有多深。
针对项目经验和一些学习的经验上面,应该问拿到问题以后解决思路是什么,在什么场景下为什么这么做,这里根据面试者的方案,分析的方法论,就可以大致了解面试者是否聪明,知识面是不是够广,遇到问题时会不会举一反三。
具体可以举个简单的例子,很多同学说自己做过架构,然后都会讲自己做了一个解耦和分层的框架,其实这类框架iOS很多,外部github上就有各种方案。在阿里内部手淘早先做的bundle拆分时沉淀的容器规则,天猫开源出去的beeHive,闲鱼内部的Xframework,抑或是服务端的spring mvc,其实都实现了IoC,但实现和思路上都有一些差异,到底为什么这么做,其实是有区别的,这里面就可以看出知识广度,总结和思辩能力,在关键路径上的技术判断。
又比如说,我们总在强调性能稳定性怎么做,业界也有很多方案,到底哪个方案更好呢?答案没有绝对的对错,取决于某个时间点和场景下哪个问题是最核心的突破点,而你的选择标准和落地的技术方案是不是合理(考虑成本,收益,以及后续的风险是什么)。一般来讲,我们更倾向于用系统化的思维看待一个问题,也就是说,相比根据人的经验去识别性能瓶颈,我们更希望能通过自动化,智能化,数据化的方式去解决问题。
一般刚开始做面试官的同学很喜欢以问为主,但因为大家的知识体系不太一样,成长环境也不同,直接这么问起来很难就找到面试者的优点,所以尽量让应试者自己陈述,然后以学习和交流的心态针对陈述中存疑的地方再进行发问,会更容易让应试者放松,也更容易让应试者更全面的表达自己。另外,问的差不多的时候,结尾的时候可以补充一句:您觉得刚才的面试中还有哪些我没问到的,您想再补充一下的内容?末了,再问下:我的问题问完了,您有什么想要问我的吗?
知道了应该怎么做,那具体的提问方法有没有什么技巧呢?在招聘中有一个重要的STAR原则,可以跟大家分享。
在什么样的环境下
接到了什么样的任务
然后具体怎么落地的
拿到了什么结果
我们尽量问清楚对方在什么样的环境下接到这个任务,接到以后是做了什么事情,最后的结果是什么样子的。乍一听,感觉,这不是套路嘛,是不是知道这个原则的人,只要按照这四点编故事,就能通过面试了?当然不是,在叙述过程中,我们应该分辨出STAR中的真假,那下面就举一些例子。
比如,我用这个方案解决了这个问题,效果很好,得到了大家的一致好评。注意,效果好是哪里好,有什么度量的标准?一致好评的体现是在具体KPI还是比如团队有个什么奖励之类的。
我觉得线上稳定性非常重要,应该重点解决和持续跟进。如果只有这一句话,没有后面具体认为重要的解决方案的话,这部分的经验难以令人信服。
如果我来做这件事情,我会1234怎么怎么样。前面其实面试应该问的问题里面有提到,我们本身就不应该问假设性的问题,那作为面试者,假设没做过的事情,如果只是看思路还好,但是如果说的天花乱坠,这个时候要警惕了,毕竟说和做之前的差异是很大的。对于假设的事情,面试官是没法评估具体效果的,因为它不像过去已有的项目和工作内容,是有明显结果的,如果对过去结果存疑,后续也可以背调了解具体的情况。
针对假的STAR,我们要甄别分辨出来,引导其表达出真正的情况。
做了什么事情,具体做的方案1234几步,为什么要这么做,比如图片的优化,最早肯定什么都没有,后续加cache,cache策略又可以升级,包括cache本身的算法以及多级cache的实现,图片尺寸上面后来有做了什么裁切之类的,图片格式上面后续又做了优化等等。
每个阶段不太一样,关注的重点也不一样,刨根问题问一问,会了解是不是真的做过这件事情,另外有一些可能项目做得很久说很多东西忘了,这里我分享一个观点,之前看过一句话,招聘的人中有一种人是比较好的,他总能比较清楚的记住过往项目当中的重点,这样的人在经验沉淀的过程中肯定更快一些,当然这样的同学肯定得归结在聪明一类的人了,当然能记住也说明他可能喜欢总结和回顾,平常的学习习惯应该也比较好。
很多关键节点的细节很重要,比如网络库的优化。如果你是一个iOS开发,一般都会知道iOS的网络协议优化常采用拦截NSURLProtocol的方式进行,然后针对传统的https协议我们会将其替换成为spdy协议或者http2协议,过程中还有一些httpdns等的优化。但如果你今天希望招聘一个有这部分网络优化经验的同学,怎么判断这个同学有实操的经验呢?你可以让他说细节上面的很多事情,比如说URLProtocol拦截request以后,针对不同的case的降级策略是什么,选择依据是什么?当时遇到了什么其他的坑没有?你自己的做法有什么缺陷?
又比如Weex的实现上面,整个渲染的流程到底是怎样的,渲染部分还有什么优化空间吗?或者说这个方案本身做了哪方面的优化?它的配套工程体系上的问题是什么,你遇到以后是怎么解决掉的,这些在了解大概思路后,都可以往深入再问一下细节的部分,认真研读以及修改过代码的同学,肯定是答得出来的。
面试是双向的,面试官是一个团队对外的门面,不要迟到,提问和交流要尊重面试者,让面试者感受到我们的真诚。
我们永远应该为未来招聘,因为招聘的人入职也是发生在未来,不能立刻就解决你眼前的问题,所以我们招聘的时候也放长远一点,招为团队未来更有好处的人。
以人为镜,优秀的面试者给我们能带来新的思路和新的方法,而差强人意的面试者则提高我们看人的能力,为后续的提升招聘效率找到更正确的人打下基础。
招聘,培训,人才选拔晋升,我认为评价标准和方法都应该有比较多的重合的部分,我们从刚才的面试经验中,反思下,如果现在是我们去找工作,这个市场或者团队更需要什么样的人?
经验能解决实际的问题,另外知识体系可以让你在遇到新的问题时举一反三,当然大公司和小公司要求的知识体系又不太一样,大公司更偏向一专多能的T型人才,小公司更喜欢全栈,所以到底要成为什么样的人,跟你的职业规划很有关系,是想在大公司成就一番事业,还是出去闯荡,那你点的技能树肯定是不一样的。到底应该怎么做,我自己的经验是,找到身边的标杆,向更优秀的同学学习,在阿里当然非常优秀的专业人才也好,架构师也好,都非常多,所以标杆应该也好找,业界当然也有很多成功的人,有了标杆,就努力向上吧。
当我还是一个菜鸟的时候,当时的老板问了我一个问题,每周写周报的时候,想想自己这一周到底收获了什么,这给我留下了很深的印象。我在想,既然我每次面试别人都问你最近有研究什么新的技术或者看到什么有趣的文章没有的,那我自己是不是能这样要求自己呢?不积跬步无以至千里,贵在坚持积累。
通过根据服务器目前状况,修改Mysql的系统参数,达到合理利用服务器现有资源,最大合理的提高MySQL性能
32G内存、4个CPU,每个CPU 8核
centos 7
打开MySQL配置文件my.cnf
|
|
修改back_log参数值:由默认的50修改为500
|
|
修改back_log参数值:由默认的50修改为500
|
|
修改wait_timeout参数值
|
|
修改max_connections参数值
|
|
修改max_user_connections值,由默认的0,修改为800
|
|
修改thread_concurrency值,由目前默认的8,修改为64
|
|
default-storage-engine(设置MySQL的默认存储引擎)
|
|
[mysqld]
basedir = path # 使用给定目录作为根目录(安装目录)。
datadir = path # 从给定目录读取数据库文件。
pid-file = filename # 为mysqld程序指定一个存放进程ID的文件(仅适用于UNIX/Linux系统);
socket = /tmp/mysql.sock # 为MySQL客户程序与服务器之间的本地通信指定一个套接字文件(Linux下默认是/var/lib/mysql/mysql.sock文件)
port = 3306 # 指定MsSQL侦听的端口
key_buffer = 384M # key_buffer是用于索引块的缓冲区大小,增加它可得到更好处理的索引(对所有读和多重写)。
索引块是缓冲的并且被所有的线程共享,key_buffer的大小视内存大小而定。
table_cache = 512 # 为所有线程打开表的数量。增加该值能增加mysqld要求的文件描述符的数量。可以避免频繁的打开数据表产生的开销
sort_buffer_size = 2M # 每个需要进行排序的线程分配该大小的一个缓冲区。增加这值加速ORDER BY或GROUP BY操作。
注意:该参数对应的分配内存是每连接独占!如果有100个连接,那么实际分配的总共排序缓冲区大小为100×6=600MB
read_buffer_size = 2M # 读查询操作所能使用的缓冲区大小。和sort_buffer_size一样,该参数对应的分配内存也是每连接独享。
query_cache_size = 32M # 指定MySQL查询结果缓冲区的大小
read_rnd_buffer_size = 8M # 改参数在使用行指针排序之后,随机读用的。
myisam_sort_buffer_size = 64M # MyISAM表发生变化时重新排序所需的缓冲
thread_concurrency = 8 # 最大并发线程数,取值为服务器逻辑CPU数量×2,如果CPU支持H.T超线程,再×2
thread_cache = 8 # #缓存可重用的线程数
skip-locking # 避免MySQL的外部锁定,减少出错几率增强稳定性。
[mysqldump]
max_allowed_packet = 16M # 服务器和客户端之间最大能发送的可能信息包
[myisamchk]
key_buffer = 256M
sort_buffer = 256M
read_buffer = 2M
write_buffer = 2M
back_log = 384
yum list installed | grep mysql
如果有,就先全部卸载,命令如下:
yum -y remove mysql-libs.x86_64
若有多个依赖文件则依次卸载。当结果显示为 Complete!即卸载完毕。
MySQL 依赖 libaio,所以先要安装 libaio
yum search libaio # 检索相关信息
yum install libaio # 安装依赖包
wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
如果提示-bash: wget: 未找到命令,请先执行 yum install wget 安装 wget
添加 MySQL Yum Repository
添加 MySQL Yum Repository 到你的系统 repository 列表中,执行
yum localinstall mysql-community-release-el7-5.noarch.rpm
提示是否 OK ,输入 y
验证下是否添加成功
yum repolist enabled | grep “mysql.-community.“
选择要启用 MySQL 版本
查看 MySQL 版本,执行
yum repolist all | grep mysql
可以看到 5.5, 5.7 版本是默认禁用的,因为现在最新的稳定版是 5.6
yum repolist enabled | grep mysql 查看当前的启动的 MySQL 版本
通过 Yum 来安装 MySQL
yum install mysql-community-server
遇到上述提示,输入 y 继续,执行完成会提示“完毕!”。此时MySQL 安装完成,
它包含了 mysql-community-server、mysql-community-client、mysql-community-common、mysql-community-libs 四个包。
执行 whereis mysql 可以看到 MySQL 的安装目录是 /usr/bin/
启动 MySQL Server
systemctl start mysqld
查看 MySQL Server 状态
systemctl status mysqld
关闭 MySQL Server
systemctl stop mysqld
远程访问 MySQL, 需开放默认端口号 3306
firewall-cmd方式
firewall-cmd –permanent –zone=public –add-port=3306/tcp
firewall-cmd –permanent –zone=public –add-port=3306/udp
服务器启动后,可以执行
mysql_secure_installation;
此时输入 root 原始密码(初始化安装的话为空),接下来,为了安全,MySQL 会提示你重置 root 密码,移除其他用户账号,
禁用 root 远程登录,移除 test 数据库,重新加载 privilege 表格等,你只需输入 y 继续执行即可。
创建一个普通用户 sa ,密码是 some_pass
CREATE USER ‘zalocal’@’%’ IDENTIFIED BY ‘zhian@local#’;
给这个用户授予 SELECT,INSERT,UPDATE,DELETE 的远程访问的权限,这个账号一般用于提供给实施的系统访问
GRANT SELECT,INSERT,UPDATE,DELETE ON . TO ‘zalocal’@’%’;
创建一个管理员用户 admin 账号 ,密码是 some_pass
CREATE USER ‘admin’@’%’ IDENTIFIED BY ‘some_pass’;
给这个用户授予所有的远程访问的权限。这个用户主要用于管理整个数据库、备份、还原等操作。
GRANT ALL ON . TO ‘admin’@’%’;
使授权立刻生效
flush privileges;
创建数据存放目录
home 目录下建立 data 目录
mkdir /opt/data
把 MySQL 服务进程停掉
如果 MySQL 是启动的,要先关闭
mysqladmin -u root -p shutdown
systemctl stop mysqld
移动数据到数据存放目录
/var/lib/mysql 整个目录移到 /opt/data,执行
mv /var/lib/mysql /opt/data
这样就把 MySQL 的数据文件移动到了 /opt/data/mysql 下
修改 /etc/my.cnf 文件,
#########################################
[mysqld]
datadir=/home/data/mysql
socket=/home/data/mysql/mysql.sock
[mysql]
socket=/home/data/mysql/mysql.sock
#########################################
修改文件夹权限
chown -R mysql:mysql /home/data/mysql
重启后,如果不能启动 MySQL 服务,执行
vi /etc/sysconfig/selinux
调整
SELINUX=permissive 调整为宽松模式
保存设置,执行 reboot 重启生效
查看 MySQL 服务是否开机启动
systemctl is-enabled mysql.service;echo $?
如果是 enabled 则说明是开机自动,如果不是,执行
chkconfig –levels 235 mysqld on
一般的,为了支持中文,我们应该讲字符集设为 UTF-8, 在mysql控制台执行
SHOW VARIABLES LIKE ‘character%’;
查看当前 MySQL 字符集
可以看到默认服务器的字符器是 latin1 ,对中文不友好。
修改 /etc/my.cnf 文件,添加字符集的设置
##########################################################
[mysqld]
character_set_server = utf8
[mysql]
default-character-set = utf8
##########################################################
重启 MySQL ,可以看到字符集已经修改了
SHOW VARIABLES LIKE ‘character%’
1.检查是否安装了gcc ,没有的话执行yum install gcc
2.检查是否安装了libxml2 ,没有的话执行yum install libxml2
3.检查是否安装了libxml2-devel,没有的话执行yum install libxml2-devel
4.检查是否安装了openssl,没有的话执行yum install openssl openssl-devel
5.curl安装 yum -y install curl-devel
6.图片库安装 yum install libjpeg.x86_64 libpng.x86_64 freetype.x86_64 libjpeg-devel.x86_64 libpng-devel.x86_64 freetype-devel.x86_64 -y
7.图片库安装 yum install libjpeg-devel
8.解压软件安装 yum install bzip2-devel.x86_64 -y
9.yum install libXpm-devel 10.yum install gmp-devel
10.yum install -y icu libicu libicu-devel
11.yum install php-mcrypt libmcrypt libmcrypt-devel
12.yum install postgresql-devel
13.yum install libxslt-devel
下载php7.1.22
|
|
解压
|
|
‘./configure’ ‘–prefix=/usr/local/php’ ‘–with-pdo-pgsql’ ‘–with-zlib-dir’ ‘–with-freetype-dir’ ‘–enable-mbstring’ ‘–with-libxml-dir=/usr’ ‘–enable-soap’ ‘–enable-calendar’ ‘–with-curl’ ‘–with-mcrypt’ ‘–with-gd’ ‘–with-pgsql’ ‘–disable-rpath’ ‘–enable-inline-optimization’ ‘–with-bz2’ ‘–with-zlib’ ‘–enable-sockets’ ‘–enable-sysvsem’ ‘–enable-sysvshm’ ‘–enable-pcntl’ ‘–enable-mbregex’ ‘–enable-exif’ ‘–enable-bcmath’ ‘–with-mhash’ ‘–enable-zip’ ‘–with-pcre-regex’ ‘–with-pdo-mysql’ ‘–with-mysqli’ ‘–with-jpeg-dir=/usr’ ‘–with-png-dir=/usr’ ‘–enable-gd-native-ttf’ ‘–with-openssl’ ‘–with-fpm-user=www-data’ ‘–with-fpm-group=www-data’ ‘–with-libdir=/lib/x86_64-linux-gnu/‘ ‘–enable-ftp’ ‘–with-gettext’ ‘–with-xmlrpc’ ‘–with-xsl’ ‘–enable-opcache’ ‘–enable-fpm’ ‘–with-iconv’ ‘–with-xpm-dir=/usr’
如果出现错误:No package libmcrypt-devel available.
解决办法:
1.yum install epel-release //扩展包更新包
2.yum update //更新yum源
出现报错 Cannot find OpenSSL’s
则执行 yum install openssl openssl-devel
出现报错 Please reinstall the libcurl distribution
则执行 yum -y install curl-devel
出现报错 jpeglib.h not found
则执行 yum install libjpeg.x86_64 libpng.x86_64 freetype.x86_64 libjpeg-devel.x86_64 libpng-devel.x86_64 freetype-devel.x86_64 -y
和执行yum install libjpeg-devel
checking for BZip2 in default path… not found
configure: error: Please reinstall the BZip2 distribution
这是bzip2软件包没有安装
解决办法
yum install bzip2-devel.x86_64 -y
configure: error: xpm.h not found.
yum install libXpm-devel
error: Unable to locate gmp.h
Fix: yum install gmp-devel
现象:Unable to detect ICU prefix or /usr//bin/icu-config failed. Please verify ICU install
prefix and make sure icu-config works
解决办法:yum install -y icu libicu libicu-devel
错误:mcrypt.h not found. Please reinstall libmcrypt.
解决办法:yum install php-mcrypt libmcrypt libmcrypt-devel
错误: configure: error: Cannot find libpq-fe.h. Please specify correct PostgreSQL installation path
解决办法:yum install postgresql-devel
错误 : configure: error: xslt-config not found. Please reinstall the libxslt >= 1.1.0 distribution
解决: yum install libxslt-devel
配置的checking 结束后,执行:
make && make install
安装完成后,我们要把源码包中的配置文件复制到PHP安装目录下,源码包中有两个配置 php.ini-development php.ini-production ,看名字就知道,一个是开发环境,一个是生产环境,我们这里就复制开发环境的
cp php.ini-development /usr/local/php/lib/php.ini
另外还需要设置环境变量 :
修改/etc/profile文件使其永久性生效,并对所有系统用户生效,在文件末尾加上如下两行代码
PATH=$PATH:/usr/local/php/bin
export PATH
然后执行 命令 source /etc/profile
php -v 就可以看到PHP版本信息了。
此时还需要配置php-fpm:
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
cp ./sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
chmod +x /etc/init.d/php-fpm
启动php-fpm:
/etc/init.d/php-fpm start
如果出现错误:ERROR: [pool www] cannot get uid for user ‘www-data’
则新建www-data 用户组:
groupadd www-data
useradd -g www-data www-data
然后再启动php-fpm:
service php-fpm restart
vi /usr/local/php/etc/php-fpm.d/www.conf
1.进程数
php-fpm初始/空闲/最大worker进程数
pm.max_children = 300
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
2.最大处理请求数
最大处理请求数是指一个php-fpm的worker进程在处理多少个请求后就终止掉,master进程会重新respawn一个新的。
这个配置的主要目的是避免php解释器或程序引用的第三方库造成的内存泄露。
pm.max_requests = 10240
3.最长执行时间
最大执行时间在php.ini和php-fpm.conf里都可以配置,配置项分别为max_execution_time和request_terminate_timeout
之前简单介绍过Unix Domain Socket这种通信方式,参见:Nginx+PHP-FPM的域Socket配置方法
Unix域Socket因为不走网络,的确可以提高Nginx和php-fpm通信的性能,但在高并发时会不稳定。
Nginx会频繁报错:
connect() to unix:/dev/shm/php-fcgi.sock failed (11: Resource temporarily unavailable) while connecting to upstream
可以通过下面两种方式提高稳定性:
1)调高nginx和php-fpm中的backlog
配置方法为:在nginx配置文件中这个域名的server下,在listen 80后面添加default backlog=1024。
同时配置php-fpm.conf中的listen.backlog为1024,默认为128。
2)增加sock文件和php-fpm实例数
再新建一个sock文件,在Nginx中通过upstream模块将请求负载均衡到两个sock文件背后的两套php-fpm实例上。
随着网站、应用访问量的增加,一台服务器已经不能满足应用的需求,而需要多台服务器集群,这时就需要用到负载均衡了
负载均衡的好处
负载均衡优化了访问请求在服务器组之间的分配,消除了服务器之间的负载不平衡,从而提高了系统的反应速度与总体性能;
负载均衡可以对服务器的运行状况进行监控,及时发现运行异常的服务器,并将访问请求转移到其它可以正常工作的服务器上,从而提高服务器组的可靠性采用了负均衡器器以后,可以根据业务量的发展情况灵活增加服务器,系统的扩展能力得到提高,同时简化了管理。
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
|
|
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
|
|
权重越高,在被访问的概率越大,如上例,分别是30%,70%
方式1和2存在一个问题,在负载均衡系统中,假如用户在某台服务器上登录了,那么该用户第二次请求的时候,每次请求都会随机重新定位到服务器集群中的某一个,那么已经登录某一个服务器的用户再重新定位到另一个服务器,其登录信息将会丢失,这样显然是不妥的。
我们可以采用ip_hash指令解决这个问题,如果客户已经访问了某个服务器,当用户再次访问时,会将该请求通过哈希算法,自动定位到该服务器
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
在redis.conf中进行配置:
|
|
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
|
|
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
|
|
以阿里云服务器为例,进入阿里云管理后台,域名管理处,选择excample.com域名解析到服务器ip
域名解析后,进入nginx配置文件,(以centos 7下的yum install nginx为例)
80端口分发服务配置
vi /etc/nginx/conf.d/test_example_com.conf
|
|
8088端口解析服务配置
vi /etc/nginx/conf.d/example8088.conf
|
|
8089端口解析服务配置
vi /etc/nginx/conf.d/example8089.conf
|
|
重启web服务器nginx
service nginx restart
往两个系统的首页写入标识内容
|
|
浏览器访问 test.excample.com
可以看到不停的变换’8089 b’和’8088 a’ 说明负载均衡成功运行
将ip_hash;前的#号去掉,重启web服务器nginx
service nginx restart
浏览器访问 test.excample.com
可以浏览器输出的内容并不会变换,说明iphash模式下的负载均衡运行成功
nginx监听本地的80端口,80端口接收到请求后,将请求转发到192.168.214.81:8089,192.168.214.81:8088应用中的其中一个,如果映射的策略是ip_hash,这个策略会对请求的ip进行hash运算并将结果映射到其中一个应用,它能确保一个确定的请求ip会被映射到一个确定的服务,这样就连session的问题也就解决了。如果不需要考虑session,可选用默认的轮询或权重
NFS 就是 Network FileSystem 的缩写,最早之前是由sun 这家公司所发展出来的。 它最大的功能就是可以透过网络,让不同的机器、不同的操作系统、可以彼此分享个别的档案 (share files)。所以,你也可以简单的将他看做是一个文件服务器 (file server) 呢!这个 NFS 服务器可以让你的 PC 来将网络远程的 NFS 服务器分享的目录,挂载到本地端的机器当中, 在本地端的机器看起来,那个远程主机的目录就好像是自己的一个磁盘分区槽一样 (partition)!使用上面相当的便利!
因为 NFS 支持的功能相当的多,而不同的功能都会使用不同的程序来启动, 每启动一个功能就会启用一些端口来传输数据,因此, NFS 的功能所对应的端口才没有固定住, 而是随机取用一些未被使用的小于 1024 的端口来作为传输之用。但如此一来又造成客户端想要连上服务器时的困扰, 因为客户端得要知道服务器端的相关端口才能够联机吧!
此时我们就得需要远程过程调用 (RPC) 的服务啦!RPC 最主要的功能就是在指定每个 NFS 功能所对应的 port number ,并且回报给客户端,让客户端可以连结到正确的端口上去。 那 RPC 又是如何知道每个 NFS 的端口呢?这是因为当服务器在启动 NFS 时会随机取用数个端口,并主动的向 RPC 注册,因此 RPC 可以知道每个端口对应的 NFS 功能,然后 RPC 又是固定使用 port 111 来监听客户端的需求并回报客户端正确的端口, 所以当然可以让 NFS 的启动更为轻松愉快了!
所以你要注意,要启动 NFS 之前,RPC 就要先启动了,否则 NFS 会无法向 RPC 注册。 另外,RPC 若重新启动时,原本注册的数据会不见,因此 RPC 重新启动后,它管理的所有服务都需要重新启动来重新向 RPC 注册。
当客户端有 NFS 档案存取需求时,他会如何向服务器端要求数据呢?
1、客户端会向服务器端的 RPC (port 111) 发出 NFS 档案存取功能的询问要求;
2、服务器端找到对应的已注册的 NFS daemon 端口后,会回报给客户端;
3、客户端了解正确的埠口后,就可以直接与 NFS daemon 来联机。
由于 NFS 的各项功能都必须要向 RPC 来注册,如此一来 RPC 才能了解 NFS 这个服务的各项功能之 port number, PID, NFS 在服务器所监听的 IP 等等,而客户端才能够透过 RPC 的询问找到正确对应的埠口。 也就是说,NFS 必须要有 RPC 存在时才能成功的提供服务,因此我们称 NFS 为 RPC server 的一种。事实上,有很多这样的服务器都是向 RPC 注册的,举例来说,NIS (Network Information Service) 也是 RPC server 的一种呢
要设定好 NFS 服务器我们必须要有两个软件才行,分别是:
|
|
NFS 记录文件
|
|
系统CentOS7.1
服务器端IP 192.168.214.71
客户端IP 192.168.214.81
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
在你的 NFS 服务器设定妥当之后,我们可以在 server 端先自我测试一下是否可以联机,利用 showmount 这个指令来查阅!
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
创建test.txt并往文件中写入内容test
查看test.txt文件内容并写入内容1024
|
|
查看test.txt文件内容
|
|
|
|
为了方便配置防火墙,需要固定nfs服务端口
NFS启动时会随机启动多个端口并向RPC注册,这样如果使用firewalls对NFS端口进行限制就会有点麻烦,可以更改配置文件固定NFS服务相关端口。
|
|
分配端口,编辑配置文件:
|
|
添加:
|
|
重启:
|
|
查看结果
|
|
可以看到,随机端口以固定
firewalls策略问题完美解决!!!