【MySQL运维】MySQL双主高可用架构之MMM实战51CTO博客 - 超凡娱乐

【MySQL运维】MySQL双主高可用架构之MMM实战51CTO博客

2019年04月05日10时04分02秒 | 作者: 白风 | 标签: 效劳,装备,形式 | 浏览: 2055

MMM简介:


MMM即Master-Master Replication Manager for MySQL(mysql主主仿制办理器),是关于mysql主主仿制装备的监控、毛病搬运和办理的一套可弹性的脚本套件(在任何时分只要一个节点能够被写入),这个套件也能根据规范的主从装备的恣意数量的从效劳器进行读负载均衡,所以你能够用它来在一组居于仿制的效劳器发动虚拟ip,除此之外,它还有完成数据备份、节点之间从头同步功用的脚本。
MySQL自身没有供给replication failover的解决计划,经过MMM计划能完成效劳器的毛病搬运,然后完成mysql的高可用。
MMM项目来自 Google:http://code.google.com/p/mysql-master-master


官方网站为:http://mysql-mmm.org


MMM主要功用由下面三个脚本供给
mmm_mond    :担任一切的监控作业的监控看护进程,决议节点的移除等等
mmm_agentd  :运转在mysql效劳器上的署理看护进程,经过简略长途效劳集供给给监控节点


mmm_control :经过指令行办理mmm_mond进程

关于此架构的优缺陷:
长处:安全性、稳定性高,可扩展性好,当主效劳器挂掉今后,另一个主当即接收,其他的从效劳器能主动切换,不必人工干预。

缺陷:至少三个节点,对主机的数量有要求,需求完成读写别离,能够在程序扩展上比较难完成。一同对主从(双主)同步推迟要求比较高!因而不适合数据安全十分严厉的场合。

有用场所:高访问量,事务增加快,而且要求完成读写别离的场景。

环境:
MMM_Monitor: 192.168.8.31-(MySQL-MON)
MySQL_Master1: 192.168.8.32-(MySQL-M1)


MySQL_Master2: 192.168.8.33-(MySQL-M2)


VIP_Write: 192.168.8.30-(VIP0)


VIP_Read1: 192.168.8.34-(VIP1)


VIP_Read2: 192.168.8.35-(VIP2)

架构原理图:




一、环境根底装备



1. 设置hosts解析


三台效劳器装备如下:


cat >>/etc/hosts<<EOF
192.168.8.31    MySQL-MON
192.168.8.32    MySQL-M1


192.168.8.33    MySQL-M2


EOF

二、装置装备mysql

详细装置过进程略,假如不会装置 mysql的能够不必看本教程了!


这儿说下my.cnf装备文件的细节:


MySQL-M1的装备:


server-id = 12


#log-slave-updates


#sync_binlog = 1


log-bin = /data/mysql/binlog/mysql-bin


auto-increment-increment = 2


auto-increment-offset = 2


relay-log=mysql-relay            


relay-log-index=mysql-relay.index


MySQL-M2的装备:


server-id = 13


#log-slave-updates


#sync_binlog = 1


log-bin = /data/mysql/binlog/mysql-bin


auto-increment-increment = 2


auto-increment-offset = 2


relay-log=mysql-relay            


relay-log-index=mysql-relay.index


三、装置mysql-mmm

在三台效劳器装置


wget http://download.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm


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


yum -y install mysql-mmm*


[root@MySQL-M1 mysql-mmm]# rpm -qa |grep mysql-mmm


mysql-mmm-2.2.1-1.el5


mysql-mmm-agent-2.2.1-1.el5


mysql-mmm-tools-2.2.1-1.el5


mysql-mmm-monitor-2.2.1-1.el5


阐明:也能够下载源码包装置:
wget http://mysql-mmm.org/_media/:mmm2:mysql-mmm-2.2.1.tar.gz
mv :mmm2:mysql-mmm-2.2.1.tar.gz mysql-mmm-2.2.1.tar.gz
tar xf mysql-mmm-2.2.1.tar.gz
cd mysql-mmm-2.2.1
make install

四、装备MySQL-M1和MySQL-M2主主形式


1.首要创立三个账号

mysql> grant file, replication salve on *.* to repl@192.168.8.% identified by "repl";


mysql> grant process, super, replication client on *.* to mmm_agent@192.168.8.% identified by mmm_agent;


mysql> grant replication client on *.* to "mmm_monitor"@"192.168.8.%" identified by "mmm_monitor";

阐明:
第一个账号repl(仿制账号),是用于主主仿制
第二个账号mmm_agent(署理账号),是mmm agent用来变成只读形式和同步master等
第三个账号mmm_monitor(监听账号),是mmm monitor效劳器用来对mysql效劳器做健康查看的


要注意一点是:因为MySQL-M1和MySQL-M2之间有仿制,所以只要在一台效劳器上履行就能够了,不过要在MySQL-MON上履行后边两条!

2.装备主主形式

2.1 把MySQL-M1效劳器作为MySQL-M2效劳器主

在MySQL-M1效劳器操作:


mysql> show master status;


+++++


| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |


+++++


| mysql-bin.000003 |      107 |              | mysql            |


+++++


1 row in set (0.00 sec)


然后在MySQL-M2效劳器操作:


mysql> change master to master_host=192.168.8.32,master_user=repl,master_password=repl,master_log_file=mysql-bin.000003,master_log_pos=107;


Query OK, 0 rows affected (0.07 sec)


mysql>  start slave;


Query OK, 0 rows affected (0.00 sec)


mysql> show slave status\G


*************************** 1. row ***************************


              Slave_IO_State: Waiting for master to send event


                 Master_Host: 192.168.8.32


                 Master_User: repl


                 Master_Port: 3306


               Connect_Retry: 60


             Master_Log_File: mysql-bin.000003


         Read_Master_Log_Pos: 107


              Relay_Log_File: mysql-relay.000002


               Relay_Log_Pos: 253


       Relay_Master_Log_File: mysql-bin.000003


           Slave_IO_Running: Yes


           Slave_SQL_Running: Yes
       .....................................................
后边的信息省掉..
       .....................................................

2.2 把MySQL-M2效劳器作为MySQL-M1效劳器主


在MySQL-M2效劳器上操作:


mysql> show master status;


+++++


| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |


+++++


| mysql-bin.000003 |      605 |              |                  |


+++++


1 row in set (0.00 sec)


在MySQL-M1效劳器上操作:


mysql> change master to master_host=192.168.8.33,master_user=repl,master_password=repl,master_log_file=mysql-bin.000003,master_log_pos=605;


Query OK, 0 rows affected (0.06 sec)


mysql> start slave;


Query OK, 0 rows affected (0.00 sec)


mysql> show slave status\G;


*************************** 1. row ***************************


              Slave_IO_State: Waiting for master to send event


                 Master_Host: 192.168.8.33


                 Master_User: repl


                 Master_Port: 3306


               Connect_Retry: 60


             Master_Log_File: mysql-bin.000003


         Read_Master_Log_Pos: 605


              Relay_Log_File: mysql-relay.000002


               Relay_Log_Pos: 253


       Relay_Master_Log_File: mysql-bin.000003


            Slave_IO_Running: Yes


           Slave_SQL_Running: Yes
       .....................................................
后边的信息省掉..
       .....................................................

OK...主主形式装备成功!主主仿制同步测验这儿不再阐明,接着下面的过程。


五、装备MMM监控、署理效劳

1. 在三台效劳器修正mmm_common.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        repl     #前面创立的仿制账号


   replication_password    repl     #前面创立的仿制账号密码


   agent_user              mmm_agent   #前面创立的署理账号


   agent_password          mmm_agent   #前面创立的署理账号密码


</host>


<host MySQL-M1>


   ip      192.168.8.32   #MySQL-M1效劳器IP


   mode    master


   peer    MySQL-M2       #MySQL-M2效劳器主机名


</host>


<host MySQL-M2>


   ip      192.168.8.33


   mode    master


   peer    MySQL-M1


</host>


<role writer>


   hosts   MySQL-M1, MySQL-M2   #能够作为Write的效劳器


   ips     192.168.8.30         #Write节点虚拟IP,使用的写恳求将直接连接到这个IP


mode    exclusive            #排它形式


</role>


<role reader>


   hosts   MySQL-M1, MySQL-M2   #作为Reader的效劳器


   ips     192.168.8.34, 192.168.8.35  #Reader节点虚拟IP,使用的读恳求将直接连接到这些IP


mode    balanced             #平衡形式


</role>


阐明:mode  exclusive


这个当地有两种形式:


exclusive:在这种形式下任何时分只能一个主机具有该人物


balanced : 该形式下能够多个主机一同具有此人物。


通常情况下writer是exclusive,reader是balanced


2. 在MySQL-M1效劳器上修正mmm_agent.conf装备文件


修正后的内容如下:


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 MySQL-M1


3. 在MySQL-M2效劳器上修正mmm_agent.conf装备文件

修正后的内容如下:


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 MySQL-M2


4. 在MySQL-MON效劳器上装备mmm_mon.conf装备文件

修正后的内容如下:


include mmm_common.conf


<monitor>


   ip                  127.0.0.1


   pid_path            /var/run/mysql-mmm/mmm_mond.pid


   bin_path            /usr/libexec/mysql-mmm


   status_path         /var/lib/mysql-mmm/mmm_mond.status


ping_ips            192.168.8.32,192.168.8.33    #能够ping的实在agent效劳器的IP


auto_set_online     10    #发现节点丢掉则过10秒进行切换


# 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        mmm_monitor    #前面创立的监控账号


   monitor_password    mmm_monitor    #前面创立的监控账号密码


</host>



debug 0


5.发动署理(默许是启用,这儿仅仅阐明下)

[root@MySQL-M1 mysql-mmm]# cat /etc/default/mysql-mmm-agent


# mysql-mmm-agent defaults


ENABLED=1


[root@MySQL-M2 mysql-mmm]# cat /etc/default/mysql-mmm-agent


# mysql-mmm-agent defaults


ENABLED=1

六、发动各效劳器的相关效劳

MySQL-M1和MySQL-M2效劳器上发动


/etc/init.d/mysql-mmm-agent start


MySQL-MON效劳器上发动


/etc/init.d/mysql-mmm-monitor start


在MySQL-MON监控机上查看MMM状况信息:


[root@MySQL-MON mysql-mmm]# mmm_control show


 MySQL-M1(192.168.8.32) master/ONLINE. Roles: reader(192.168.8.35), writer(192.168.8.30)


 MySQL-M2(192.168.8.33) master/ONLINE. Roles: reader(192.168.8.34)



[root@MySQL-MON mysql-mmm]# mmm_control checks all


MySQL-M2  ping         [last change: 2012/10/15 05:07:35]  OK


MySQL-M2  mysql        [last change: 2012/10/15 05:07:35]  OK


MySQL-M2  rep_threads  [last change: 2012/10/15 05:07:35]  OK


MySQL-M2  rep_backlog  [last change: 2012/10/15 05:07:35]  OK: Backlog is null


MySQL-M1  ping         [last change: 2012/10/15 05:07:35]  OK


MySQL-M1  mysql        [last change: 2012/10/15 05:07:35]  OK


MySQL-M1  rep_threads  [last change: 2012/10/15 05:07:35]  OK


MySQL-M1  rep_backlog  [last change: 2012/10/15 05:07:35]  OK: Backlog is null


[root@MySQL-MON mysql-mmm]# mmm_control mode


ACTIVE

下面别离查看各效劳器的日志信息:


[root@MySQL-M1 mysql-mmm]# cat /var/log/mysql-mmm/mmm_agentd.log


2012/10/15 05:06:06  INFO We have some new roles added or old rules deleted!


2012/10/15 05:06:06  INFO Added:   reader(192.168.8.35), writer(192.168.8.30)


[root@MySQL-M2 mysql-mmm]# cat /var/log/mysql-mmm/mmm_agentd.log


2012/10/16 14:53:51  INFO We have some new roles added or old rules deleted!


2012/10/16 14:53:51  INFO Added:   reader(192.168.8.34)


[root@MySQL-MON ~]# cat /var/log/mysql-mmm/mmm_mond.log


2012/10/15 05:07:36 FATAL Couldnt open status file /var/lib/mysql-mmm/mmm_mond.status: Starting up without status information.


2012/10/15 05:08:38 FATAL State of host MySQL-M2 changed from AWAITING_RECOVERY to ONLINE because of auto_set_online(10 seconds). It was in state AWAITING_RECOVERY for 10 seconds


2012/10/15 05:08:38 FATAL State of host MySQL-M1 changed from AWAITING_RECOVERY to ONLINE because of auto_set_online(10 seconds). It was in state AWAITING_RECOVERY for 10 seconds


下面再看下各效劳器的效劳进程信息:


[root@MySQL-MON ~]# ps aux |grep mmm


root     19176  0.0  2.8 115784 14320 ?        S    05:07   0:00 mmm_mond


root     19178  0.3 14.4 331756 71556 ?        Sl   05:07   0:18 mmm_mond


root     19185  0.1  1.8 105824  9376 ?        S    05:07   0:06 perl /usr/libexec/mysql-mmm/monitor/checker ping_ip


root     19188  0.0  2.2 137644 10940 ?        S    05:07   0:05 perl /usr/libexec/mysql-mmm/monitor/checker mysql


root     19190  0.0  1.8 105824  9384 ?        S    05:07   0:02 perl /usr/libexec/mysql-mmm/monitor/checker ping


root     19192  0.1  2.2 137644 10984 ?        S    05:07   0:07 perl /usr/libexec/mysql-mmm/monitor/checker rep_backlog


root     19194  0.1  2.2 137644 10984 ?        S    05:07   0:07 perl /usr/libexec/mysql-mmm/monitor/checker rep_threads


root     19308  0.0  0.1  61228   720 pts/1    R+   06:42   0:00 grep mmm


[root@MySQL-M1 mysql-mmm]# ps aux |grep mmm


root      1371  0.0  0.1  61228   724 pts/1    R+   06:40   0:00 grep mmm


root     24228  0.0  2.2 106096 11068 ?        S    04:58   0:00 mmm_agentd


root     24230  0.2  2.6 140148 13204 ?        S    04:58   0:16 mmm_agentd


下面再看下VIP绑定信息:

七、模仿宕机切换测验

1.现在把MySQL-M1的mysqld效劳停掉


[root@MySQL-M1 mysql-mmm]# service mysqld stop


Shutting down MySQL.                                       [  OK  ]


[root@MySQL-M1 mysql-mmm]# ps aux |grep mysqld |grep -v grep



[root@MySQL-MON ~]# mmm_control show


 MySQL-M1(192.168.8.32) master/HARD_OFFLINE. Roles:


 MySQL-M2(192.168.8.33) master/ONLINE. Roles: reader(192.168.8.34), reader(192.168.8.35), writer(192.168.8.30)


2. 现在再康复MySQL-M1


[root@MySQL-M1 mysql-mmm]# service mysqld start


Starting MySQL.....                                        [  OK  ]


[root@MySQL-M1 mysql-mmm]# ps aux |grep mysqld |grep -v grep


root     19328  1.2  0.2  66116  1340 pts/1    S    09:51   0:00 /bin/sh /opt/webserver/mysql/bin/mysqld_safe datadir=/data/mysql/data/ pid-file=/data/mysql/data//MySQL-M1.pid


mysql    20139  7.0 10.3 420060 51348 pts/1    Sl   09:51   0:00 /opt/webserver/mysql/bin/mysqld basedir=/opt/webserver/mysql datadir=/data/mysql/data/ plugin-dir=/opt/webserver/mysql/lib/plugin user=mysql log-error=/data/mysql/logs/mysql.err open-files-limit=10240 pid-file=/data/mysql/data//MySQL-M1.pid socket=/tmp/mysql.sock port=3306


然后再到MySQL-MON上查看MMM信息:


[root@MySQL-MON ~]# mmm_control show


 MySQL-M1(192.168.8.32) master/ONLINE. Roles: reader(192.168.8.34)


 MySQL-M2(192.168.8.33) master/ONLINE. Roles: reader(192.168.8.35), writer(192.168.8.30)


能够看到MySQL-M1康复后又OK了。。。。可是MySQL-M1此刻不再供给写署理了,只供给读署理了!


接下来看下VIP绑定信息:

[root@MySQL-M1 mysql-mmm]# ip a |grep eth0

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

   inet 192.168.1.32/24 brd 192.168.1.255 scope global eth0

   inet 192.168.8.34/32 scope global eth0

[root@MySQL-M2 mysql-mmm]# ip a |grep eth0

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

   inet 192.168.8.33/24 brd 192.168.8.255 scope global eth0

   inet 192.168.8.35/32 scope global eth0

   inet 192.168.8.30/32 scope global eth0

总结:mmm_mond监控各mysql-server的运转状况


1、当Roles为reader和write的MySQL-M1发作毛病的时分,就将reader和writer人物从MySQL-M1上移除,并标记为HARD_OFFLINE状况,由Roles为reader的MySQL-M2替代该效劳器,并分配writer人物和起浮IP,此刻MySQL-M2为主效劳器,承当效劳器的读写署理。当MySQL-M1康复后,mysql-mmm会主动分配Roles为reader,标记为ONLINE状况,并和MySQL-M2一同承当读压力,此刻MySQL-M1为slave,供给只读署理功用。


2、当Roles为reader的MySQL-M1发作毛病,就将reader的人物从MySQL-MMM上移除,并标记为HARD_OFFLINE状况。当该MySQL-M1康复后又会主动分配reader人物给该效劳器,标记为ONLINE状况,并和MySQL-M2一同承当读压力。



这儿只测验下MySQL-MMM毛病搬运,有爱好的朋友还要以测验下当主主仿制呈现问题时,会导致MMM呈现什么问题!


附录:mmm_control指令相关参数阐明

[root@MySQL-MON ~]# /usr/sbin/mmm_control help


Valid commands are:


   help                              - show this message   #查看协助信息


   ping                              - ping monitor     #ping监控,用于监控检测agent效劳器


   show                              - show status     #查看状况信息


   checks [<host>|all [<check>|all]] - show checks status   #显现查看状况,包含(ping、mysql、rep_threads、rep_backlog)


   set_online <host>                 - set host <host> online   #设置某host为online状况


   set_offline <host>                - set host <host> offline  #设置某host为offline状况


   mode                              - print current mode.      #打印当时的形式,是ACTIVE、MANUAL、PASSIVE(默许是ACTIVE形式)


   set_active                        - switch into active mode.  #更改为active形式


   set_manual                        - switch into manual mode.  #更改为manual形式


   set_passive                       - switch into passive mode. #更改为passive形式


   move_role [force] <role> <host> - move exclusive role <role> to host <host>   #更改host的形式,比方更改处于slave的mysql数据库人物为writer


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


   set_ip <ip> <host>                - set role with ip <ip> to host <host>    help    #为host设置ip,只要passive形式的时分才答应更改!


最终再总结MMM的两点缺乏:

1、MMM不答应两台Master一同挂掉

2、MMM对主主仿制之间的推迟操控比较严厉

后期博文发写一篇关于MHA高可用架构的切换试验。。。。






版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表超凡娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章