1. MMM简介
介绍:MMM 是一套灵活的脚本程序,使用perl语言开发。
功能:
1. 用来监控各mysql数据库的状态,包括mysql服务器的状态、从库拷贝活动的状态等。
2. 用来在mysql服务器故障时,切换mysql服务器角色(通过在各mysql服务器上增减虚拟IP实现),
避免单mysql写服务器故障。
3. 当配置多个slave时,可配置多个虚拟读IP,配合第三方负载均衡软件(如LVS),提供负载均衡功能。
特点:配置简单,功能强大。
缺点:需要大量perl库支持,安装比较耗时,而且由于服务器(操作系统)环境不一样,所需的perl库和版本也不一样。
在本次安装时,在网上搜索了N次,下载了二十几个rpm库,而且安装过程中有各种错误。
由于只提供虚拟IP,来达到真正的读写分离。应用程序需根据一组特定的虚拟IP,来区分读写和读负载均衡。
2. 安装Mysql数据库
如果系统自带有数据库卸载掉
#yum -y remove mysql-server
#yum -y remove mysql-devel
#yum -y remove mysql-shared
#yum -y remove mysql-client
3. MMM安装向导
这个安装向导描述了在Red Hat Enterprise Linux Server release 5.4( Linux Kernel 2.6.18-164.el5) 环境上安装MMM version 2。一个基本的安装至少包括2台数据库服务器和1台监控服务器,在这个向导里,使用了3台服务器,如下:
功能 | IP | hostname | Server id |
Monitoring host | 192.168.2.157 | Mon | - |
Master1 | 192.168.2.190 | db1 | 1 |
Master2 | 192.168.2.191 | db2 | 2 |
使用如下虚拟IP,这些VIP只需在MMM配置文件中配置,然后通过MMM自动设置到各db1和db2服务器上,不需手动设置。
IP | 角色 | 描述 |
192.168.2.92 | writer | 应用程序应使用此IP,进行数据库写操作。 |
192.168.2.90 | reader | 应用程序应使用其中的一个IP,进行数据库查询。 |
192.168.2.90 |
3.1 MMM安装准备
在安装MMM前对db1和db2做一些基本的配置,以满足mmm监控。
3.1.1 db1和db2 的基本配置
在安装完mysql数据库后,编辑/etc/my.cnf(数据库的配置文件),增加或修改以下配置项:
log_bin = /var/lib/mysql/mysql-bin.log #master日志文件路径
log_bin_index = /var/lib/mysql/mysql-bin.log.index #master 日志索引文件路径
relay_log = /var/lib/mysql/mysql-relay-bin #同步日志文件路径
relay_log_index = /var/lib/mysql/mysql-relay-bin.index #同步日志索引文件路径
binlog-do-db=issncoreswitch #当master角色时,需向slave提供同步的数据库
binlog-ignore-db=mysql #当master角色时,不允许slave同步的数据库
replicate-do-db=issncoreswitch #当slave角色时,需要从master同步的数据库
replicate-ignore-db=mysql #当slave角色时,不充许从master同步的数据库
auto_increment_increment = 2 #设置master的数量
auto_increment_offset =1 #在各个服务器上设置一个唯一值,此值不能大于auto_increment_increment
#如果db1中设置为1,则db2中设置为2
expire_logs_days = 10 #日志保留的天数
max_binlog_size = 100M库 #日志最大容量
log_slave_updates = 1
log_bin_trust_function_creators=1 #如果数据库中使用到事件,需设置如下两个值
event_scheduler=1
移除下面的配置项,因为bind-address不能指定具体的地址:
bind-address = 127.0.0.1
对bind-address可指定0.0.0.0地址,表示任何地址。
bind-address = 0.0.0.0
配置完后,需重启mysql server.
3.1.2 在db1和db2上创建用户
现在创建3个不同用户
功能 | 描述 | 权限 |
monitor user: | Mmm monitor使用此用户来检测Mysql 服务器的健康状况 | REPLICATION CLIENT |
agent user | Mmm agent使用此用户来更改服务角色(读或写) | SUPER,REPLICATION CLIENT, PROCESS |
relication user | 从库使用此用户从master库同步数据。 | REPLICATION SLAVE |
执行以下命令,增加相应用户和用户权限
GRANT REPLICATION CLIENT ON *.* TO 'monitor'@'%' IDENTIFIED BY 'monitor';
GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'agent'@'%' IDENTIFIED BY 'agent';
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%' IDENTIFIED BY 'replication';
grant replication client,reload,super on *.* to 'tools'@'%' identified by 'tools';
注意:在设置密码时,密码长度不能超过32个字符。
3.1.3 在数据库之间同步数据
假如db1已包含正确的数据。现有一个空库,需按刚才创建用户的步骤创建相应用户。
如果db1在线,首先确保数据库处于只读模式,需执行以下命令:
(db1) mysql>FLUSH TABLES WITH READ LOCK;
3.1.4 设置db1和db2互为主从关系
1.1.1.1 将db1设为db2的主服务器
1. 在master1上显示master的状态:
2. Master2上将Master1设为自己的主服务器
mysql >change master to master_host='192.168.2.190',master_user='replication',
master_password='replication',master_log_file='mysql-bin.000040',master_log_pos=138655209;
注:master_log_file须为上面显示的文件名,master_log_pos须为上面显示的位置。
3.启动Master2的从服务。
mysql > start slave;
4.显示状态
MySQL> show slave status\G
若以下两项显示Yes,则代表同步正常。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
1.1.1.2 将db2设为db1的主服务器
1.在Master2上显示状态
2.在Master1上将Master2设为自己的主服务器
mysql >change master to master_host='192.168.2.191',master_user=’replication’,
master_password='replication',master_log_file='mysql-bin.000017',master_log_pos=107;
注:master_log_file须为上面显示的文件名,master_log_pos须为上面显示的位置。
3.启动Master1的从服务。
mysql > start slave;
4.显示状态
MySQL> show slave status\G
3.2 下载Perl和MMM安装包
官方网站:http://mysql-mmm.org/
可在www.google.com.hk上搜索各rpm包并下载。
3.3 安装MMM
如果系统中有旧版本的 mysql-mmm
直接卸载 rpm -aq|grep mysql-mmm |xargs rpm -e –nodeps
卸载过程中会把
把相关的文件删掉
rm –rf /usr/share/mysql-mmm
rm –rf /usr/lib/mysql-mmm
rm –rf /usr/libexec/mysql-mmm
rm –rf /var/lib/mysql-mmm
rm –rf /var/log/mysql-mmm
rm –rf /var/run/mysql-mmm
rm –rf /etc/logrotate.d/mysql-mmm
rm –rf /etc/mysql-mmm
3.3.1 安装mmm依赖的包
rpm -ivh rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
rpm -ivh libart_lgpl-2.3.17-4.x86_64.rpm
rpm -ivh perl-XML-Parser-2.34-6.1.2.2.1.x86_64.rpm
rpm -ivh perl-XML-RegExp-0.03-2.el5.noarch.rpm
rpm -ivh perl-Algorithm-Diff-1.1902-2.el5.noarch.rpm
rpm -ivh perl-Class-Singleton-1.4-6.el5.noarch.rpm
rpm -ivh perl-DateManip-5.44-1.2.1.noarch.rpm
rpm -ivh perl-IPC-Shareable-0.60-3.el5.noarch.rpm
rpm -ivh perl-TimeDate-1.16-5.el5.noarch.rpm
rpm -ivh perl-MailTools-1.77-1.el5.noarch.rpm
rpm -ivh perl-Mail-Sender-0.8.13-2.el5.1.noarch.rpm
rpm -ivh perl-Mail-Sendmail-0.79-9.el5.1.noarch.rpm
rpm -ivh perl-MIME-Lite-3.01-5.el5.noarch.rpm
rpm -ivh perl-Net-ARP-1.0.6-1.el5.rf.x86_64.rpm
rpm -ivh perl-Params-Validate-0.88-3.el5.x86_64.rpm
rpm -ivh perl-Path-Class-0.16-1.el5.rf.noarch.rpm
rpm -ivh perl-Proc-Daemon-0.03-1.el5.noarch.rpm
rpm -ivh rrdtool-1.2.27-3.el5.x86_64.rpm
rpm -ivh rrdtool-perl-1.2.27-3.el5.x86_64.rpm
rpm -ivh perl-XML-DOM-1.44-2.el5.noarch.rpm
rpm -ivh perl-DBI-1.620-1.el5.rfx.x86_64.rpm
rpm -ivh perl-Log-Dispatch-2.20-1.el5.noarch.rpm
rpm -ivh perl-Log-Dispatch-FileRotate-1.16-1.el5.noarch.rpm
rpm -ivh perl-Log-Log4perl-1.13-2.el5.noarch.rpm
rpm -ivh mysqlclient15-5.0.67-1.el5.remi.x86_64.rpm
rpm -ivh perl-DBD-MySQL-4.014-1.el5.rfx.x86_64.rpm
3.3.2 安装mmm包
rpm -ivh mysql-mmm-2.2.1-1.el5.noarch.rpm #mmm公共安装包
rpm -ivh mysql-mmm-agent-2.2.1-1.el5.noarch.rpm #mmm代理安装包
rpm -ivh mysql-mmm-monitor-2.2.1-1.el5.noarch.rpm #mmm监控安装包
rpm -ivh mysql-mmm-tools-2.2.1-1.el5.noarch.rpm #mmm工具安装包
3.3.3 安装后mmm文件
文件目录 | 描述 |
/usr/lib/perl5/vendor_perl/5.8.8/MMM | MMM使用的Perl模块 |
/usr/lib/mysql-mmm | MMM的脚本插件 |
/usr/sbin | MMM的命令保存路径 |
/var/log/myql-mmm | MMM的日志保存路径 |
/etc/mysql-mmm | MMM配置文件保存的路径 |
/etc/init.d/ | Agent和monitor的启动停止脚本 |
配置文件介绍:
Mmm_agent.conf :mmm_agent进程调用,作用是确定当前的节点名字。
Mmm_common.conf :monitor和agent进程都调用,大部分配置都在里面。
Mmm_mon.conf :mmm_mon进程调用,monitor相关的配置。
3.4 配置MMM
所有通用的配置项放在 /etc/mysql-mmm/mmm_common.conf中,这个配置文件在各服务器是相同的。
3.4.1 mmm_common配置项
active_master_role writer
<host default>
cluster_interface eth0 #真实IP和虚拟IP所在网卡
pid_path /var/run/mmm_agentd.pid #mmm
bin_path /usr/lib/mysql-mmm/ #mmm执行程序所在的目录
replication_user replication #从库同步的用户
replication_password replication #从库同步的用户密码
agent_user agent #代理的用户
agent_password agent #代理用户的密码
</host>
<host db1>
ip 192.168.2.190 #master1的真实IP
mode master #模式,master或slave
peer db2 #另一个master
</host>
<host db2>
ip 192.168.2.191
mode master
peer db1
</host>
<role writer> #写角色
hosts db1, db2 #写角色的服务器
ips 192.168.2.92 #虚拟IP
mode exclusive #排斥模式,即只允许同一时刻有一个写服务器
</role>
<role reader>
hosts db1, db2 #读角色的服务器
ips 192.168.2.90, 192.168.2.91 #虚拟IP
mode balanced
</role>
配置完后,把此文件拷贝到所有服务器,包括监控服务器。
3.4.2 mmm_agent配置项
在数据库服务器上编辑 /etc/mysql-mmm/mmm_agent.conf.
在服务器db1上配置内容如下:
include mmm_common.conf
# The 'this' variable refers to this server. Proper operation requires
# that 'this' server (db1 by default), as well as all other servers, have the
# proper IP addresses set in mmm_common.conf.
this db1 #在db2服务器上,此项配置为db2
debug 0
3.4.3 mmm_mon配置项
在监控服务器上编辑/etc/mysql-mmm/mmm_mon.conf:
include mmm_common.conf
<monitor>
ip 127.0.0.1
pid_path /var/run/mmm_mond.pid
bin_path /usr/lib/mysql-mmm/ #mmm程序所在的路径
status_path /var/lib/misc/mmm_mond.status
ping_ips 192.168.2.190, 192.168.2.191 #mmm_agent服务器的真实IP
</monitor>
<host default>
monitor_user monitor #mmm监控服务器所用的用户
monitor_password monitor #mmm监控服务器所用的用户密码
</host>
debug 0
4.1.1 启动和停止 MMM Agent
设置服务器重启后,mmm agent自启动
chkconfig mysql-mmm-agent on
启动
[root@localhost bin]# /etc/init.d/mysql-mmm-agent start
Starting MMM Agent Daemon:
停止
[root@localhost bin]# /etc/init.d/mysql-mmm-agent stop
4.1.2 启动和停止MMM Monitor
设置服务器重启后,mmm monitor自启动
chkconfig mysql-mmm-monitor on
启动
[root@localhost ~]# /etc/init.d/mysql-mmm-monitor start
Daemon bin: '/usr/sbin/mmm_mond'
Daemon pid: '/var/run/mmm_mond.pid'
Starting MMM Monitor daemon: Ok
停止
[root@localhost ~]# /etc/init.d/mysql-mmm-monitor stop
5. 配置一台monitir监控多组服务器
添加一组数据库服务器服务器各种配置同上
IP | 角色 | 描述 |
192.168.2.253 | writer | 应用程序应使用此IP,进行数据库写操作。 |
192.168.2.250 | reader | 应用程序应使用其中的一个IP,进行数据库查询。 |
192.168.2.251 |
5.1.1 mmm_mon_log_test1.conf配置
在目录/etc/mysql-mmm/下,复制mmm_mon_log.conf 为 mmm_mon_log_test1.conf并修改为如下配置:
说明:(如果没有mmm_mon_log.conf文件就不需配置)
MailFatal为邮件报警模块
perl日志级别,由低到高:INFO,WARN,ERROR,FATAL
log4perl.logger = FATAL, MMMLog, MailFatal
#log4perl.logger = FATAL, MMMLog
log4perl.appender.MMMLog = Log::Log4perl::Appender::File
log4perl.appender.MMMLog.Threshold = INFO
log4perl.appender.MMMLog.filename = /var/log/mysql-mmm/mmm_mond_test1.log
log4perl.appender.MMMLog.recreate = 1
log4perl.appender.MMMLog.layout = PatternLayout
log4perl.appender.MMMLog.layout.ConversionPattern = %d %5p %m%n
log4perl.appender.MailFatal = Log::Dispatch::Email::MailSender
log4perl.appender.MailFatal.Threshold = ERROR
log4perl.appender.MailFatal.from = mmm@example.com
log4perl.appender.MailFatal.to = root
log4perl.appender.MailFatal.buffered = 0
log4perl.appender.MailFatal.subject = FATAL error in mysql-mmm-monitor
log4perl.appender.MailFatal.layout = PatternLayout
log4perl.appender.MailFatal.layout.ConversionPattern = %d %m%n
5.1.2 mmm_common_test1.conf配置
active_master_role writer
<host default>
cluster_interface eth0
pid_path /var/run/mysql-mmm/mmm_agentd.pid
bin_path /usr/libexec/mysql-mmm/
replication_user replication
replication_password replication
agent_user agent
agent_password agent
</host>
<host db1>
ip 192.168.2.208
mode master
peer db2
</host>
<host db2>
ip 192.168.2.133
mode master
peer db1
</host>
#<host db3>
# ip 192.168.100.51
# mode slave
#</host>
<role writer>
hosts db1, db2
ips 192.168.2.253
mode exclusive
</role>
<role reader>
hosts db1, db2
ips 192.168.2.250, 192.168.2.251
mode balanced
</role>
5.1.3 mmm_mon_test1.conf配置
include mmm_common_test1.conf
<monitor>
ip 127.0.0.1
port 9981 (可配置其他端口)
pid_path /var/run/mysql-mmm/mmm_mond_test1.pid
bin_path /usr/libexec/mysql-mmm
status_path /var/lib/mysql-mmm/mmm_mond_test1.status
ping_ips 192.168.2.208, 192.168.2.133
# auto_set_online 60
# The kill_host_bin does not exist by default, though the monitor will
# throw a warning about it missing. See the section 5.10 "Kill Host
# Functionality" in the PDF documentation.
#
# kill_host_bin /usr/libexec/mysql-mmm/monitor/kill_host
#
</monitor>
<host default>
monitor_user monitor
monitor_password monitor
</host>
debug 0
5.1.4 mysql-mmm-monitor_test1执行文件
复制一份可执行文件
cp /etc/init.d/mysql-mmm-monitor /etc/init.d/mysql-mmm-monitor_test1
修改 /etc/init.d/mysql-mmm-monitor_test1如下:
CLUSTER='test1'
LOCKFILE='/var/lock/subsys/mysql-mmm-monitor_test1'
prog='MMM Monitor Daemon'
if [ "$CLUSTER" != "" ]; then
MMMD_MON_BIN="/usr/sbin/mmm_mond @$CLUSTER"
MMMD_MON_PIDFILE="/var/run/mysql-mmm/mmm_mond-$CLUSTER.pid"
else
MMMD_MON_BIN="/usr/sbin/mmm_mond"
MMMD_MON_PIDFILE="/var/run/mysql-mmm/mmm_mond.pid"
fi
==================================================================================
设置服务器重启后,mmm agent自启动
chkconfig mysql-mmm-monitor_test1 on
启动
[root@localhost bin]# /etc/init.d/mysql-mmm-agent start
Starting MMM Agent Daemon:
查看状态mmm_control @test1 show
db1(192.168.2.208) master/ONLINE. Roles: reader(192.168.2.250), writer(192.168.2.253)
db2(192.168.2.133) master/ONLINE. Roles: reader(192.168.2.251)
[root@BOMPIS mysql-mmm]# mmm_control @test1 checks;
db2 ping [last change: 2012/10/22 15:09:13] OK
db2 mysql [last change: 2012/10/22 15:09:13] OK
db2 rep_threads [last change: 2012/10/22 15:09:13] OK
db2 rep_backlog [last change: 2012/10/22 15:09:13] OK: Backlog is null
db1 ping [last change: 2012/10/22 15:09:13] OK
db1 mysql [last change: 2012/10/22 15:09:13] OK
db1 rep_threads [last change: 2012/10/22 15:09:13] OK
db1 rep_backlog [last change: 2012/10/22 15:09:13] OK: Backlog is null