文章来源:http://hatemysql.com/2012/11/24/%E8%BF%9C%E7%A6%BB%E6%95%85%E9%9A%9C%E7%9A%84%E5%8D%81%E5%A4%A7%E5%8E%9F%E5%88%99/
故障是运维人员永远的痛。相信每个运维人员的KPI中都有一项:可用性。可用性高就是不出故障,各个公司对可用性和故障评级的标准都不相同,可是避免故障的方法倒是异曲同工。咱们怎么避免故障,沃趣科技简单列举了如下几条,与你们共勉!
一、变动要有回滚,在一样的环境测试过
二、对破坏性的操做谨慎当心
三、设置好命令提示
四、备份并验证备份有效性
五、对生产环境存有敬畏之心
六、交接和休假最容易出故障,变动请谨慎
七、搭建报警,及时得到出错信息。搭建性能监控,了解历史,得到趋势,预测将来
八、自动切换需谨慎
九、仔细一点,偏执一点,检查,检查,再检查
十、简单便是美。
第1条,变动要有回滚,在一样的环境测试过。也是运维最繁琐,最苦逼的地方,全部的变动都必须有回滚的办法,在一样的环境下测试过。没有作过的东西,老是会在你意想不到的地方给你一次痛击,在阿里巴巴的这么多年运维经验告诉咱们,全部没有作过的变动,出错的几率最大。因此咱们须要给变动以回滚的可能,在各个步骤可能出错的状况下,考虑回滚到最初状态。优秀的运维人员对不考虑回滚的的操做都是敬而远之的。从某种意义上来讲,运维是一门经验的学科,是一门试错的学科。
第2条,对破坏性的操做谨慎当心。破坏性的操做有哪些列?对数据库来讲有:DROP Table, Drop database, truncate table, delete all data;这些操做作完了之后几乎没法考虑怎么把数据都回滚回去了。就算回滚,代价也是很是大的。你执行这样的语句很是简单,可是回滚恢复数据缺很是困难。linux的命令rm能够-r(recursive)递归的删除某一个目录,-f(force)强制删除,可是你有没有删错过文件。咱们遇到过一个文件名中末尾有空格的状况,而有的同事rm -r习惯性的会在文件名后面加*,这样就成了rm -r aa *,全部当前目录的数据都被删除掉了!通过此次故障之后咱们给rm作了别名:
alias rm=’rm -i’
这样在删除数据时,rm命令会提示你,是否确认删除该文件。
一样的cp和mv也能够有一样的选项:
alias cp=’cp -i’
alias mv=’mv -i’
第3条,设置好命令提示。让你时刻知道你在操做哪一个数据库,让你知道你在哪一个目录下。mysql字符客户端容许你设置提示符,默认的提示符就是一个光秃秃的mysql >,为了让你清楚的知道你当前是以哪一个用户名,哪一个IP(多是localhost,127.0.0.1或者具体的物理IP),你当前操做的是哪一个schema,以及当前的时间,你能够设置数据库的提示符为:prompt=”\\u@\\h : \\d \\r:\\m:\\s> “。它能够直接写在my.cnf的[mysql]下,这样你每次连上MySQL就默认显示以下:
root@127.0.0.1 : woqutech 08:24:36>
具体prompt能够设置哪些提示,你能够参考http://dev.mysql.com/doc/refman/5.6/en/mysql-commands.html中的列表
而linux命令提示符也容许你设置的。有两个地方能够设置。第一个:PS1。这个是每次shell提示你输入命令的信息,默认为:$或者#,只会提示你是超级用户仍是普通用户。有经验的运维者会设置export PS1=’\n\e[1;37m[\e[m\e[1;31m\u\e[m\e[1;31m@\e[m\e[1;31m\h\e[m \e[4m`pwd`\e[m\e[1;37m]\e[m\e[1;36m\e[m\n\$'。这样你就能够知道你当前的目录,登陆的用户名和主机信息了,示例提示符以下:
[root@woqu-lsv-01 /home/mysql]
#
你能够查看http://www.cyberciti.biz/tips/howto-linux-unix-bash-shell-setup-prompt.html得到具体的PS1设置颜色,设置各个提示内容的介绍。
第二个提示符就是PROMPT_COMMAND。这个是设置你连到具体的数据库之后标签页标题上显示的内容,Windows用户可能会用securtCRT,Mac用户可能会用iTerm2,开多个标签页的话,若是每一个标签页的标题上内容同样,咱们切来切去就有可能在错误的标签页上作操做,设置了这个之后,这个问题几率就会小不少。好比咱们的机器上设置为PROMPT_COMMAND=’echo -ne “\033]0;${USER}@${HOSTNAME%%.*}”; echo -ne “\007″‘对应的标签页以下图
第4条,备份并验证备份有效性。是人总会出错,是机器总可能会有忽然崩溃的那一天。怎么办-咱们须要准备备份。
备份的学问很大。按照不一样的纬度能够分为:冷备份和热备份;实时备份和非实时备份;物理备份和逻辑备份。
互联网企业为了提供7*24小时不间断的服务,数据库就须要有实时热备份。在主库出现问题的状况下可以由备库提供服务。备库时候有效,数据是否一致,主库出现问题的时候怎么切换都须要运维人员认真考虑。
是否是有了这些就够了列?不行,应用程序也是人写的,曾经出现过程序一不当心delete语句没有带任何条件,致使一个表中全部的数据都被删除的惨状。因此你除了实时的备份,还须要有非实时的备份,在你的数据出现逻辑错误以后可以从备份数据中恢复出来。如今不少人在研究MySQL模仿oracle的flashback功能,利用binlog来恢复数据。可是这样的话,binlog_format必须设置为row而且对于DDL操做也没法回滚。它是为快速解决部分数据被错误删除的解决方案,可是没法代替非实时备份的做用。
非实时备份有能够分为在线延时备份和离线备份。在线延时备份是搭建数据库的必定时间延迟的热备份,好比MySQL就能够搭建一个延迟一天的slave,一直保持着备库与主库的延迟在一天。能够利用pt-slave-delay工具来实现这个功能。另外,离线备份是目前你们用的比较多的,能够利用mysqldump进行逻辑备份或者xtrabackup进行物理备份。为了空间的缘由和快速恢复考虑,你还能够利用xtrabackup进行增量的物理备份。
备份有了,是否就能够高枕无忧了?仍是不行。你须要验证备份的有效性。没有一个备份可以保证它备份出来的数据可以100%恢复出正确的数据,特别是物理备份的几率相对来讲,更低,xtrabackup备份一个月总有那么几回来大姨妈,不能给你很好的服务。因此,备份并不仅是备份,它还包括备份的验证,它若是不能恢复出正确的数据,就只是浪费空间而已。备份的验证最简单的就是找一个空闲的库,来恢复出来,mysql启动之后检查部分数据。若是不须要这么严谨,对于xtrabackup来讲,你至少得验证它–apply-log可以恢复上去吧?一样,备库的数据一致性也须要常常检查一下,mysql的replication并不保证100%的数据一致性,你能够去翻翻mysql statement复制的bug列表,有些数据在主备不一样的环境上分别执行,数据就会不同。能够考虑用percona的工具pt-table-checksum来检查主备不一致,用pt-table-sync来同步主备数据。
第5条,对生产环境存有敬畏之心。这应该是运维者进入行业首先须要具有的素质。可是咱们仍是须要把它拿出来强调一下。
有机会的话,你能够梳理一下:
- 你的生产环境上有哪些帐户,这些帐户是否都确实须要登陆到机器上来?这些帐户即包括linux用户还包括数据库帐户。
- 你的root用户是否开放给了某些用户,这些用户安全吗?
- 你的用户密码是否常常修改,是否加密不让具体的操做人员直接看到,密码强度时候足够,密码重试次数达到必定次数是否黑名单;
- 你的生产环境和线下环境是否隔离,数据库是否和外网隔离?
- 是否一些工做明明可以在开发库和测试库作,却被放到生产环境上去了。
- 是否有专门的人负责线上应用的发布,从而避免开发人员直接接触生产环境
这些都是你避免出现csdn密码泄漏,在业界的名声一落千丈的法宝。
第6条,交接和休假最容易出故障,变动请谨慎。这个是经验之谈。咱们在总结故障的状况时,发如今公司部门有变化时,工做交接(无论是休假,工做职责变化仍是离职),故障的出现频率会比正常状况下多50%以上。有人说,这是由于机器或者应用是有感情的,舍不得离开的运维者。
咱们不谈感情,简单的理性分析一下。公司或者部门不免会作一些调整,变化是世界上惟一不变的事情。而运维人员是一线作事情的人,部门调整或者领导的更换可能致使工做的着重点不一样,作事的方式和评测的标准变了,适应过程当中不免会出现一些考虑不周到的地方,出故障也是情理之中了。
而工做交接,对运维人来讲,实际上是一个很是费时费力的事情,你须要把全部日常作的工做都梳理清楚,甚至包括你的一些经意不经意的操做习惯,这样的话,下一我的才可能接手的下来。好比:你可能认为备库正常状况下没有访问,因而让某些并不重要的任务(一个月一次抽取部分数据到线下测试?)直接连备机IP进行操做。下一我的接手,认为备机就是备机,操做起来不会有任何问题,结果下一次任务抽取就是一个故障出来了。再举一个咱们遇到了事例吧:同事A出国休假了,休假期间估计联系不上,他留了文档,并告诫说某几个库和表是比较核心和容易出问题的,没有特殊状况最好等他回来再作变动。正好,休假期间,开发人员找到同事B,要求他重置一个字段的某一位(bit),并打包票说这个bit没有用,同事B拒绝,并背上了不配合的骂名。同事A回来吓了一身冷汗,原来这个字段已经被另一个离职的开发使用了。
因此,运维部门和运维人员对变化须要尽可能放平心态;接手别人的工做要一而再,再而三的确认变动方案。请教人并不见得就是能力不行的表现;休假前最好各类能够作好的事情,最好可以准备一份文档,指明在什么状况下怎么作和联系哪些人。在别人放假的时候接手工做,“能拖则拖”,实在须要执行:必须不厌其烦的跟原运维者确认各个操做细节。
第7条,搭建报警,及时得到出错信息。搭建性能监控,了解历史,得到趋势,预测将来。运维的最高境界不是故障来了,泰山崩于前而不惊,苍老师勾引你而抗日;而是没有故障,让故障消失在萌芽之中。请给那些默默无闻,天天想着咱们的系统还存在哪些隐患,怎么解决,怎么及早发现的运维人员鼓掌。他们是最可爱的人。而他们赖以生存的工具就是报警和监控。Oracle发展了这么多年,awr和相关的性能参数都相对比较全;MySQL如今也已经迎头遇上,配套的工具愈来愈多。
报警可让你及时知道系统出现了什么异常。好比slave io报警,在数据库replication异常的时候就会提醒你:IO线程出现了问题,多是网络问题,主数据库问题等,slave sql报警会提醒你replication的SQL线程出现了问题,多是主备不一致,slave被停掉了,存储过程在备机有异常或者其余问题。这样你收到报警就能够及时跟进,而不至于主备长时间不一致,主库坏掉了想要切换到备库的时候却不能切换。
性能监控可让你了解系统的历史性能信息。分析故障发生时的各类现象,确认故障的真正缘由;了解变化趋势,发现故障的苗头,及早优化和调整。好比你若是使用了PCI-E的Flash卡,你能够监控logical_written_bytes,logical_read_bytes,physical_written_bytes,physical_read_bytes以便得到flash卡的每秒的逻辑读写和物理读写字节数。对于MySQL你能够监控Com_delete+Com_delete_multi, Com_insert+Com_insert_select,Com_update+Com_update_multi,Com_select来得到每秒的MySQL DML删除,插入,更新和查询的次数。
报警和性能监控其实不不彻底独立的,不少性能的监控项也能够报警出来。好比linux的iostat中的await_time能够做为性能监控采集起来得到系统IO响应时间的变化曲线,当该值达到20以上的时候,也能够报警出来,让运维人员跟进是磁盘阵列中坏了一块,仍是异常的数据拷贝影响了系统的IO性能等。
第8条:自动切换需谨慎。如今数据库的HA不少都是进行自动切换的,这样运维人员深夜起来手工切换到备库的机会就会少不少。切换也会快速不少。可是,它带来的反作用也不容忽视。
如今业界使用的HA软件很是多,heartbeat因为不少SA兼做DBA的运维比较熟悉,在MySQL自动切换也是很多的。通常来讲,它会经过mysqladmin ping来探测MySQL是否存活,若是发现异常,那么他就会切换VIP和MySQL资源到备库。可是此时备库的数据延迟是否为0,主库crash以后binlog的数据是否所有都同步到备库上去了,备库的read_only是否关闭,这些heartbeat都无论。咱们想象一下,主库上应用提交了一笔订单,结果发生了切换,这笔订单没有同步到备库上,卖家也就损失了一个销售单,对客户,对公司都是很是大的影响。
固然,自动切换也不能全盘否认,它可以更快速的将应用切换到新的热备份备库上,应用的不可用时间大大缩短。只是咱们要好好利用这一把双刃剑,仔细评估它的影响,下降或者去除反作用,让它为咱们服务。
第9条,仔细一点,偏执一点,检查,检查,再检查。以前我跟一个资深的运维学习线上操做的时候,以为这家伙有点变态,他在作一个变动的时候,会先提早一两周发送邮件并电话手机的通知相关人;在测试机上写好脚本,召集你们review操做步骤和脚本;测试完成之后拷贝到生产环境;登陆对应机器,“打开,关闭,打开,关闭”该脚本;跟相关人员再次确认执行的操做,顺序,时间点,可能的影响和回滚是否都准备好了;执行前还要退出这个机器,而后再登陆进去,“打开,关闭”脚本;最后才在后台运行脚本,在另一个窗口登陆着,随时ps和查看结果输出。期间姿式端正,呼吸急促而均匀,眼神凝重。操做的人不以为累,却是一边学习的人很累。
当我作到必定程度,我也开始这样了。医学上,这种好像叫作强迫症。唉…,提早通知会让你们都有准备,也避免了临时相关人员过来讲这个操做和其余操做有依赖须要调整操做时间的问题; 召集你们review步骤和脚本是为了让你们一块儿来看看整个过程当中还有哪些依赖没有考虑到或者哪些细节没有注意到,三个臭皮匠顶一个诸葛亮在运维来讲是金科玉律;“打开,关闭,打开,关闭”是为了一再确认脚本拷贝过来是否正确,目录时候正确,思考在测试环境运行和在生产环境运行有什么不同的;退出再登陆机器是为了确认我登陆的机器确实没有错;在后台运行是担忧网络忽然中断,个人脚本运行到一半怎么办;调整呼吸和端正姿式是为了对这个操做的敬重,对本身工做和运维工做的尊重。
以MySQL 使用flash卡为例吧。flash算是一个比较新的事务,提供的IO比普通磁盘是几个数量级的提高。要想在生产环境使用,首先咱们须要对他进行详尽的评估和破坏性测试,设置各类参数,考虑他们在各类场景下使用的配置;24小时不间断的进行半个月读写操做,中途忽然掉电;高并发,高吞吐量下的测试;温度湿度极限测试;预留空间释放测试等等。而后咱们会尝试在测试库上部署试用,收集和修改各个配置已达到最稳定,最高性能的配置;运行稳定之后咱们才考虑在线上备库使用,而且主备要求异构;适当的时机切换为使用新的flahs卡为主库,万一出现了问题,还能够切换回原主机。
第10条,简单便是美。最后一条有点禅的意境了。它和Unix的思想不谋而合。咱们老是面临着各类诱惑:新的系统架构,新的更智能的命令和工具,最新的硬件平台,功能更全的HA软件等。他们老是以各类各样的方式吸引咱们,most exciting,unbelievable,让你欲罢不能。你能够在线下安装,测试,怎么搞都行。可是若是想要在生产环境下使用起来,那就得通过很是详细,很是漫长,各类方式验证其稳定性的过程。
可以使用系统内置命令的话,就不用考虑其余要专门下载安装的软件了;脚本自己就能完成的功能,就没有必要专门找一个功能丰富的软件来作;linux自己自带的字符界面比那些复杂的图形界面要简洁方便;MySQL的一些分区,生僻函数,没有必要的话不要使用。