您的位置:首页 > 博客中心 > 数据库 >

MySQL之MMM安装及测试

时间:2022-03-13 23:53

1.1.        MMM安装规划

         在主主、主从搭建正常情况下,进行如下配置。

1.1.1.       主机规划

         配置环境:

1.1.2.       设置hosts解析

         三台服务器配置如下(分别配置):

1.1.3.      创建mysql账号

         创建账号:在上述三台主机上分别创建。

1.2.        MMM依赖安装1.2.1.       epel包安装

         在安装mmm之前要安装epel包,Epel是企业版Linux附加软件包(Extra Packages for Enterprise Linux)的缩写,是一个由特别兴趣小组创建、维护并管理的,针对红帽企业版Linux(RHEL)及其衍生发行版(比如CentOS、Scientific Linux)的一个高质量附加软件包项目。分为32bit和64bit。

         在三台服务器上分别安装:

#wget 

#rpm -ivh epel-release-5-4.noarch.rpm

#yum -y install mysql-mmm*

注意区分版本。

         mmm软件是基于perl的。所以,需要安装许多perl的模块。

1.2.2.       MMMperl依赖包安装

         安装mmm之前需要安装以下几个必须的perl模块,依赖包名称、安装方法及下载地址省略。


1.3.        MMM安装

         各个数据库上只需要mmm_agent进程,管理服务器上需要监控进程。

1.3.1.       安装mysql-mmm

         在三台服务器上分别安装:

#wget 

#rpm -ivh epel-release-5-4.noarch.rpm

#yum -y install mysql-mmm*

注意区分版本。

         下载地址:

http://mysql-mmm.org/downloads/mysql-mmm-2.2.1.tar.gz

http://mysql-mmm.org/_media/:mmm2:mysql-mmm-2.2.1.pdf

         安装:

[root@gflinux home]# tar -zxvf mysql-mmm-2.2.1.tar.gz

[root@gflinux home]# cd mysql-mmm-2.2.1

[root@gflinux mysql-mmm-2.2.1]#make

[root@gflinux mysql-mmm-2.2.1]# make install


1.3.2.      配置mysql-mmm监控和代理服务1.3.2.1.       mmm_common.conf配置

         完成安装后,所有的配置文件都放到了/etc/mysql-mmm/下面。管理服务器和数据库服务器上都要包含一个共同的文件mmm_common.conf,所有服务器配置文件内容相同,内容如下:

[root@gflinux mysql-mmm]# vi mmm_common.conf

include mmm_common.conf

this db1

         这里db1的名称一定要与mmm_common.conf文件中的<host db1>名称相同。

         (2)mysql-db1上配置


include mmm_common.conf

this db2

         (3)mysql-slave1上配置

[root@gflinux203 mysql-mmm]# vi mmm_agent.conf


include mmm_common.conf

this slave1

1.3.2.3.       mmm_mon.conf监控配置

         在mysql-mon服务器上配置mmm_mon.conf,这个只需要在监控服务器上配置即可:

[root@gflinux203 mysql-mmm]# vi mmm_mon.conf

1.3.3.      启动各服务器的相关服务1.3.3.1.       从各个数据库节点上启动代理程序

         在数据库服务器上启动代理程序(192.169.6.100 192.168.6.101 192.169.6.102)

         cd /etc/init.d/

         chkconfig mysql-mmm-agent on

         service mysql-mmm-agent start[|stop]

1.3.3.2.       在管理服务器上启动监控程序

         在管理服务器上启动监控程序(192.168.6.100)

         cd /etc/init.d/

         chkconfig mysql-mmm-monitor on

         service mysql-mmm-monitor start

    启动后,稍等几秒,可以通过mmm_control程序查看状态:

1.3.3.3.       检查监控程序

[root@gflinux mysql-mmm]#  mmm_control --help

Invalid command ‘--help‘


Valid commands are:

    help                              - show this message

    ping                              - ping monitor

    show                              - show status

    checks [<host>|all [<check>|all]] - show checks status

    set_online <host>                 - set host <host> online

    set_offline <host>                - set host <host> offline

    mode                              - print current mode.

    set_active                        - switch into active mode.

    set_manual                        - switch into manual mode.

    set_passive                       - switch into passive mode.

    move_role [--force] <role> <host> - move exclusive role <role> to host <host>

                                        (Only use --force if you know what you are doing!)

    set_ip <ip> <host>                - set role with ip <ip> to host <host>

         查看状态信息

[root@gflinux DBD-mysql-4.023]# mmm_control show

  db1(192.168.6.100) master/ONLINE. Roles: writer(192.168.6.51)

  db2(192.168.6.101) master/ONLINE. Roles:

  slave1(192.168.6.102) slave/ONLINE. Roles: reader(192.168.6.52 # 192.168.0.53)


[root@gflinux DBD-mysql-4.023]# mmm_control checks all

db2     ping         [last change: 2014/09/10 11:30:03]  OK

db2     mysql        [last change: 2014/09/10 11:49:25]  OK

db2     rep_threads  [last change: 2014/09/10 11:49:25]  OK

db2     rep_backlog  [last change: 2014/09/10 11:49:25]  OK: Backlog is null

slave1  ping         [last change: 2014/09/10 11:30:03]  OK

slave1  mysql        [last change: 2014/09/10 11:30:03]  OK

slave1  rep_threads  [last change: 2014/09/10 11:30:03]  OK

slave1  rep_backlog  [last change: 2014/09/10 11:30:03]  OK: Backlog is null

db1     ping         [last change: 2014/09/10 11:30:03]  OK

db1     mysql        [last change: 2014/09/10 11:30:03]  OK

db1     rep_threads  [last change: 2014/09/10 11:38:03]  OK

db1     rep_backlog  [last change: 2014/09/10 11:30:03]  OK: Backlog is null


[root@gflinux DBD-mysql-4.023]#

         其中db1负责写(192.168.6.51),slave1负责读(192.168.6.52)。这里要特别说明,这个读写分离要配合前端程序应用,也就是说你的程序要支持读写分离,把这两个vip告诉开发人员,让他们在配置文件里指定,mmm并不具有读写分离的功能,这个与官方的mysql-proxy和淘宝的Amoeba是不同的。

         节点的上线和脱机:

         这样不必每次重新启动mmm_control。

[root@gflinux Net-ARP-1.0.8]# mmm_control set_offline db2

OK: State of ‘db2‘ changed to ADMIN_OFFLINE. Now you can wait some time and check all roles!

[root@gflinux Net-ARP-1.0.8]# mmm_control show

  db1(192.168.6.100) master/ONLINE. Roles: writer(192.168.6.51)

  db2(192.168.6.101) master/ADMIN_OFFLINE. Roles:

  slave1(192.168.6.102) slave/ONLINE. Roles: reader(192.168.6.52)


[root@gflinux Net-ARP-1.0.8]# mmm_control show

  db1(192.168.6.100) master/ONLINE. Roles: writer(192.168.6.51)

  db2(192.168.6.101) master/ADMIN_OFFLINE. Roles:

  slave1(192.168.6.102) slave/ONLINE. Roles: reader(192.168.6.52)


[root@gflinux Net-ARP-1.0.8]# mmm_control set_online db2

OK: State of ‘db2‘ changed to ONLINE. Now you can wait some time and check its new roles!

[root@gflinux Net-ARP-1.0.8]# mmm_control show

  db1(192.168.6.100) master/ONLINE. Roles: writer(192.168.6.51)

  db2(192.168.6.101) master/ONLINE. Roles:

  slave1(192.168.6.102) slave/ONLINE. Roles: reader(192.168.6.52)

1.3.3.4.       查看agent服务器上的虚拟ip

         命令为:ip -f inet addr

         slave1:

[root@gflinux203 mysql-mmm]# ip -f inet addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue

    inet 127.0.0.1/8 scope host lo

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000

    inet 192.168.6.102/24 brd 192.168.6.255 scope global eth0

         注意查看不到虚拟ip

         使一台主机脱机后,再观察:

[root@gflinux Net-ARP-1.0.8]# mmm_control set_offline db1

OK: State of ‘db1‘ changed to ADMIN_OFFLINE. Now you can wait some time and check all roles!


[root@gflinux203 mysql-mmm]# ip -f inet addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue

    inet 127.0.0.1/8 scope host lo

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000

    inet 192.168.6.102/24 brd 192.168.6.255 scope global eth0

    inet 192.168.6.52/32 scope global eth0

         db1:

[root@gflinux Net-ARP-1.0.8]# ip -f inet addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue

    inet 127.0.0.1/8 scope host lo

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000

    inet 192.168.6.100/24 brd 192.168.6.255 scope global eth0

         db2:

[root@gflinux mysql-mmm]# ip -f inet addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue

    inet 127.0.0.1/8 scope host lo

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000

    inet 192.168.6.101/24 brd 192.168.6.255 scope global eth0

    inet 192.168.6.51/32 scope global eth0


1.3.3.5.       监控项目说明

         mmm_mon在每台服务器上执行四种不同的检查,以确定相关服务是否OK:

    (1)ping             host is pingable

    (2)mysql            MySQL server on the host is alive

    (3)rep_threads       replication threads are running

    (4)rep_backlog       replication backlog is not too big

1.3.4.      查看服务器日志

         服务器日志存放路径:/var/log/mysql-mmm/

         代理服务器日志文件(启动及切换信息):mmm_agentd.log

         监控服务器日志文件(集群状态信息):mmm_mond.log


[root@gflinux mysql-mmm]# tail -f mmm_mond.log

2014/09/10 11:41:30  INFO Removing all roles from host ‘slave1‘:

2014/09/10 11:41:30  INFO     Removed role ‘reader(192.168.6.52)‘ from host ‘slave1‘

2014/09/10 11:41:30  INFO Orphaned role ‘reader(192.168.6.52)‘ has been assigned to ‘db2‘

2014/09/10 11:43:32 FATAL Admin changed state of ‘slave1‘ from ADMIN_OFFLINE to ONLINE

2014/09/10 11:46:50 FATAL Admin changed state of ‘db1‘ from ONLINE to ADMIN_OFFLINE

2014/09/10 11:46:50  INFO Removing all roles from host ‘db1‘:

2014/09/10 11:46:50  INFO     Removed role ‘writer(192.168.6.51)‘ from host ‘db1‘

2014/09/10 11:46:50  INFO Orphaned role ‘writer(192.168.6.51)‘ has been assigned to ‘db2‘

2014/09/10 11:46:50  INFO Moving role ‘reader(192.168.6.52)‘ from host ‘db2‘ to host ‘slave1‘

2014/09/10 11:47:04 ERROR Check ‘rep_threads‘ on ‘db1‘ has failed for 10 seconds! Message: ERROR: Replication is broken

[root@gflinux mysql-mmm]# tail -f mmm_agentd.log

2014/09/10 11:41:29  INFO We have some new roles added or old rules deleted!

2014/09/10 11:41:29  INFO Added:   reader(192.168.6.52)

2014/09/10 11:41:29 FATAL Couldn‘t configure IP ‘192.168.6.52‘ on interface ‘eth0‘: undef

2014/09/10 11:46:49  INFO We have some new roles added or old rules deleted!

2014/09/10 11:46:49  INFO Deleted: reader(192.168.6.52)

2014/09/10 11:46:49  INFO Added:   writer(192.168.6.51)

2014/09/10 11:46:50 FATAL Couldn‘t configure IP ‘192.168.6.51‘ on interface ‘eth0‘: undef


[root@gflinux203 mysql-mmm]# tail -f mmm_agentd.log

2014/09/10 11:42:50  INFO Changing active master to ‘db1‘

1.3.5.      模拟宕机切换测试

         服务器正常状态如下:

[root@gflinux DBD-mysql-4.023]# mmm_control show

  db1(192.168.6.100) master/ONLINE. Roles: writer(192.168.6.51)

  db2(192.168.6.101) master/ONLINE. Roles:

  slave1(192.168.6.102) slave/ONLINE. Roles: reader(192.168.6.52 # 192.168.0.53)

1.3.5.1.       master宕机切换

场景一:

master宕机,切换

模拟db2同步延时,slave1同步无延时。

[root@gflinux init.d]# service mysql stop

Shutting down MySQL..                                      [  OK  ]

         vip理论上切换到slave1上,但是这里是db2上,永远不会切换到比其身份低的slave1从机上,即使他没有延时。如果此时db2再挂掉,那么整个集群全部挂掉。

[root@gflinux init.d]# mmm_control show

  db1(192.168.6.100) master/HARD_OFFLINE. Roles:

  db2(192.168.6.101) master/ONLINE. Roles: writer(192.168.6.51)

  slave1(192.168.6.102) slave/ONLINE. Roles: reader(192.168.6.52 # 192.168.0.53)

         在漂移到db2上后,必须要等到同步追完才可以切换,否则就在那里等待。

mysql> show processlist;

+----+-------------+-----------+------+-------------+------+-----------------------------------------------------------------------+-------------------------+

| Id | User        | Host      | db   | Command     | Time | State                                                                 | Info                    |

+----+-------------+-----------+------+-------------+------+-----------------------------------------------------------------------+-------------------------+

|  1 | system user |           | NULL | Connect     | 1131 | Reconnecting after a failed master event read                         | NULL                    |

|  2 | system user |           | gf   | Connect     |  714 | Waiting for table level lock                                          | insert into t1 select 1 |

| 13 | repl_user   | db1:44093 | NULL | Binlog Dump | 1113 | Master has sent all binlog to slave; waiting for binlog to be updated | NULL                    |

| 44 | root        | localhost | gf   | Query       |    0 | init                                                                  | show processlist        |

+----+-------------+-----------+------+-------------+------+-----------------------------------------------------------------------+-------------------------+

4 rows in set (0.00 sec)


         这里有可能用到master_pos_wait函数,它会等待slave执行完全部的中继日之后,在释放锁。如果延时很大,想要硬切换,只能人工杀掉select master_pos_wait()这个进程id,此时slave1会自动执行db2,自动执行change master命令与db2机器进行同步复制,并且这个软件会自动记录db2上的点

[root@gflinux init.d]# mmm_control show

  db1(192.168.6.100) master/HARD_OFFLINE. Roles:

  db2(192.168.6.101) master/ONLINE. Roles: writer(192.168.6.51)

  slave1(192.168.6.102) slave/ONLINE. Roles: reader(192.168.6.52 # 192.168.0.53)

         再把db1重启起来:


[root@gflinux DBD-mysql-4.023]# mmm_control show

  db1(192.168.6.100) master/AWAITING_RECOVERY. Roles:

  db2(192.168.6.101) master/ONLINE. Roles: writer(192.168.6.51)

  slave1(192.168.6.102) slave/ONLINE. Roles: reader(192.168.6.52 # 192.168.0.53)

         此时vip还在db2上,并不会因db1修复好了再漂移过去

mysql> unlock tables;

Query OK, 0 rows affected (0.00 sec)


mysql> select * from t1;

+------+

| id   |

+------+

|    1 |

+------+

1 row in set (0.00 sec)


mysql>

1.3.5.2.       slave切换

场景二:slave切换

         在slave上,只要同步挂掉,有一个线程不为yes,就会切换到另两台主机上:

Slave_IO_Running: Yes

Slave_SQL_Running: Yes


mysql> stop slave;

Query OK, 0 rows affected (0.00 sec)


[root@gflinux DBD-mysql-4.023]# mmm_control show

  db1(192.168.6.100) master/ONLINE. Roles:

  db2(192.168.6.101) master/ONLINE. Roles: writer(192.168.6.51)

  slave1(192.168.6.102) slave/REPLICATION_FAIL. Roles:

[root@gflinux DBD-mysql-4.023]# mmm_control show

  db1(192.168.6.100) master/ONLINE. Roles: reader(192.168.6.52 # 192.168.0.53)

  db2(192.168.6.101) master/ONLINE. Roles: writer(192.168.6.51)

  slave1(192.168.6.102) slave/REPLICATION_FAIL. Roles:

结果slave VIP漂移到db1上。

在db1上再次执行stop slave:

[root@gflinux DBD-mysql-4.023]# mmm_control show

  db1(192.168.6.100) master/REPLICATION_FAIL. Roles:

  db2(192.168.6.101) master/ONLINE. Roles: reader(192.168.6.52 # 192.168.0.53), writer(192.168.6.51)

  slave1(192.168.6.102) slave/REPLICATION_FAIL. Roles:

         结果slave VIP漂移到db2上。

         再在slave上执行start slave

[root@gflinux DBD-mysql-4.023]# mmm_control show

  db1(192.168.6.100) master/REPLICATION_FAIL. Roles:

  db2(192.168.6.101) master/ONLINE. Roles: writer(192.168.6.51)

  slave1(192.168.6.102) slave/ONLINE. Roles: reader(192.168.6.52 # 192.168.0.53)

         这时vip再次漂移到slave上。

优缺点:

至少三个节点,对主机的数量有要求,需要实现读写分离,对程序来说是个挑战。


热门排行

今日推荐

热门手游