大型互联网公司运维体系

今天听了下百度的朋友讲了百度现有的运维体系,感觉还是很不错的,比较适合大的方向把握。

第一个是运维的日常工作:
1. 突发流量,这个需要及时的进行流量调度,以及排查为什么会有突发流量,是某个新的上线导致还是由于配置错误还是运营推广。
2. 复杂环境关联。这个其实是最重要的,在一个复杂的系统环境中会有很多层次,我们要了解每个层次之间的关联,以及每个层次的性能。所以一个完整的系统逻辑框架图和物理框架图是很有必要的。 3. 快速开发并上线。这个是由于互联网的特性造成的,我们什么都是讲究一个快字,快速开发,快速部署,快速增长,快速下线。

第二个是整体运维的框架:
1. 容量管理
2. 关联关系
3. 任务管理
4. 自动部署
5. 分布式集群和传统集群
6. 机器管理
要在一开始为这6项做好流程化和监控管理,同时最后要贯穿安全检测和灾难管理。

具体到运维框架里的自动化监控
数据采集:
1. 数据采集(主动提交到中心服务器上): 在client端部署公共插件和自定义脚本的一些监控
2. 服务器状态检测(由中心服务器隔时间去检测): 这个主要是中心服务器去检测服务器上的服务状态和程序状态,以及用户访问的质量 3. 第三方信息:这个主要是跟公司内部系统相关联
数据处理:
1. 复杂计算:因为有些监控阈值不是单独一个值就能判定这个是否有问题,而是通过多个监控值进行计算后才能确定是否有故障
2. 阈值判别
3. 智能分析:这个是分析到底是什么导致了这个故障,为后面做故障自动恢复打下基础。
报警和联动:
1. 报警策略:这个主要是报警的阈值和去重报警。当一台服务器挂掉的时候,那一般情况这个服务器上所有报警都会发出来,但是这个时候其实就报一个服务器down就可以了。 2. 联动处理:由于一个服务的问题可能导致其它问题的产生,这个时候需要了解系统的逻辑架构和关联关系才能知道。
3. 报警跟踪:跟踪问题的处理过程和结果,时间等信息
4. 问题管理:每个问题都有各种各样的原因产生的,这个可以汇总整理

完整的监控内容:
1. 域名监控:看看dns解析是否正确,这个百度吃过大亏的
2. 流量监控:主要是某个区域和全网流量是否有异常。
3. 访问质量监控:通过对于前端服务器的流量镜像分析来判定网络质量值否正常。也有是从本地通往远程是否网络路由是否正常。也可以使用networkbench和gomez这种第三方监测来发现。 4. 语义监控:就是对于页面中的关键字进行监控
5. 基础监控:系统的状态,cpu, load等等
6. 端口监控:telnet到机器的服务端口看看是否正确返回
7. 结构体监控: 这个是当某个进程还在系统中存在,端口也存活,但是无法正常服务的情况下进行监控。可以模拟程序请求这个进程,看是否能正常工作并返回正确的值。 8. 模块监控
9. 日志监控:对于机器的错误日志,访问日志等信息进行监控
10. 自定义监控:
其实以上所有的监控的最终目的就是要发现对于用户的影响是什么?

具体到具体的语义监控内容:
1. 语义监控(页面监控):其实就是通过get页面然后判断页面是否有预定义的关键字。
2. 高级语义监控(面向功能):这个是为了监控页面中多个模块是否正常。这个需要在html对于不同的功能定义标签开始符和结束符,这样通过get这个面后看看标签之间是否数据存在就知道页面功能是否正常。

监测各地用户访问质量:
1. 各地访问速度:这个基本需要在当地部署机房后才能测定,也有用networkbench和gomez来测量的。
2. 各地流量
3. 机房带宽使用
4. 各地DNS速度

对于模块的监控:
1. 程序自身占用的资源是否合理
2. 程序的性能表现是否正常
3. 该程序的分支是否正常

基础监控:
1. CPU资源占用: 这个就看CPU到底是多少核了,不能一定说多少
2. 内存使用:这个要看实际使用的,不能算上buffer和cache,因为Linux系统默认是利用完所有的内存的
3. 文件句柄的使用
4. 网络句柄
5. 各种状态的进程数

服务监控标准:
1. 数据加载情况
2. 模块处理能力
2.1 平均耗时
2.2 队列长度
2.3 线程池使用率
3. 模块间通讯状态
3.1 平均连接时间
3.2 读写错误数

异常根源分析:
1. 关联关系查询
2. 模块关联探测
3. 服务器关联状态探测
4. 网络关联探测
5. 波动性预警

联动处理:
1. 流量切换预案
2. 服务器重启
3. 磁盘数据清理
4. 执行用户自定义命令

报警去重:
1. 服务器维度
2. 策略维度
3. 多维度
4. 计算同策略两次连续报警的时间间隔
5. 最大等待时间

###########################################

Best regards
Timo Seven
blog:http://www.timoseven.com
twitter: http://twitter.com/zauc
Linux System Admin & MySQL DBA

mysql5.5安装

mysql 5.5 以后的tar包居然是用cmake来进行安装的,而不是之前的Autotools方式即(configure方式)

所以还是记录一下安装过程,以备后记。

首先是下载tar包,大概22M的样子,我自己下载的是5.5.10的版本。

然后是安装一些必备的工具

sudo apt-get install cmake libncurses5-dev g++

然后是通过cmake来进行编译

cmake -DCMAKE_INSTALL_PREFIX=/usr/local -DMYSQL_DATADIR=/home/server/mysqldata -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DMYSQL_UNIX_ADDR=/tmp/mysqld.sock -DWITH_DEBUG=0 -DWITH_INNOBASE_STORAGE_ENGINE=1

具体可以参考http://forge.mysql.com/wiki/Autotools_to_CMake_Transition_Guide
这是mysql开发者写的一个autools转换岛对应的cmake的各种编译参数的对比资料。

make
sudo make install

这样安装就算完成了

后面的步骤就跟之前的一样了。

安装mysql库

mysql_install_db  --user=mysql --basedir=/usr/local --datadir=/home/server/mysqldata --no-defaults

这里一定要加上no-defaults参数,不然程序会自动载入配置文件。

拷贝启动文件和my.cnf文件

sudo cp /usr/local/support-files/mysql.server /etc/init.d/mysqld
sudo cp /usr/local/support-files/my-innodb-heavy-4G.cnf /etc/mysql/my.cnf

修改my.cnf文件

[mysqld]
basedir=/usr/local
datadir=/home/server/mysqldata
user=mysql

启动并加入启动项

/etc/init.d/mysqld start
chkconfig mysqld on

为了方便以后安装,最好将这个编译成deb或者rpm包

mysql-mmm配置

最近一周主要是对mysql的mmm进行的相关测试。

它的官方网站是mysql-mmm.org
mmm其实是一个针对mysql双master的一个套件,是完全使用perl来写的。主要作用是监控2个mysql的状态和在出现问题的情况下进行IP漂移切换。不能算是完全意义上的mysql高可用。只是在传统的双master基础上加个监控和漂移,这个完全可以自己写程序来实现。因为mmm在切换过程中也会导致当前连接的丢失,而且这种模式在innodb的情况下出现故障后恢复是一个非常麻烦的问题。
mmm的主要架构是这样的,一个是mmm
monitor服务器,它来负责监控和切换,所以它的配置文件主要是进行设置如何进行监控。2个mysql服务器是客户端。但是需要配置上虚IP,所以每个mysql服务器最少有3个IP,一个真实的IP,2个虚IP。mmm monitor就是进行切换虚IP的,而不是实际的IP
安装过程就不详细说了,主要是要安装一堆perl包,如果可以cpan的话完全可以用cpan来安装,不然就自己下tar包安装,最后做个rpm包来进行安装。
下面就是整个配置流程:
首先对2个mysql配置好了双master,就是互为主备的那种模式。
首先我们定义一下各个机器的IP,mmm monitor的IP是10.10.36.111, mysql
1的真实IP为10.10.36.112, 虚拟IP为10.10.36.201和10.10.36.202,mysql
2的真实IP为10.10.36.113,虚拟IP同样是10.10.36.201和10.10.36.202。
安装完mmm后首先要对mmm monitor进行配置
cat /etc/mysql-mmm/mmm_monitor.conf

include mmm_common.conf

check_period 1
trap_period 2
timeout 2


check_period 1
trap_period 2
timeout 2


ip                                      127.0.0.1
pid_path                                /var/run/mmm_mond.pid
bin_path                                /usr/lib/mysql-mmm/
status_path                             /var/lib/misc/mmm_mond.status
ping_ips                                10.10.36.113,10.10.36.112


monitor_user                    mmm_monitor
monitor_password                mmm_monitor_password

debug 0

接着是配置mmm_common.conf,这个文件在monitor和agent上都是一样的。
cat /etc/mysql-mmm/mmm_common.conf

active_master_role      writer

cluster_interface               eth0
pid_path /var/run/mmm_agentd.pid
bin_path /usr/lib/mysql-mmm/
replication_user mmm_repl
replication_password mmm_repl_password
agent_user mmm_agent
agent_password                  mmm_agent_password


ip                                      10.10.36.112
mode                                    master
peer                                    mysql_db2


ip                                      10.10.36.113
mode                                    master
peer                                    mysql_db1


hosts                                   mysql_db1,mysql_db2
ips                                     10.10.36.201
mode                                    exclusive


hosts                                   mysql_db1,mysql_db2
ips                                     10.10.36.202
mode                                    balanced

下面这个是10.10.36.112上的agent上的mmm_agent.conf的配置
cat /etc/mysql-mmm/mmm_agent.conf

include mmm_common.conf
this mysql_db1

下面是10.10.36.113上的agent的mmm_agent.conf的配置
cat /etc/mysql-mmm/mmm_agent.conf

include mmm_common.conf
this mysql_db2

这些都配置完成了,首先是启动2个mysql服务,同时都启动slave。然后各自启动mmm_agent服务。最后是启动mmm_monitor服务。
启动完成后mmm_monitor进行相关事务:
首先是启动监控2个agent服务,启动方式为mmm_contorl set_online mysql_db1以及mmm_control set_online mysql_db2
启动结果我们可以通过mmm_control show来进行展示,也可以检查监控的状态,mmm_contorl checks来检测现在监控的状态。 

###########################################

Best regards
Timo Seven
blog:http://www.timoseven.com
twitter: http://twitter.com/zauc
Linux System Admin  & MySQL DBA