Blog.068 MySQL 数据库 MMM 高可用集群搭建

本章目录

 

 

 

 

1. MMM
  1.1 概念
  1.2 优缺点与适用场景
  1.3 工作原理
  1.4 MMM 部署所需资源
  1.5 高可用、单点故障
2. 搭建 MySQL MMM
  2.1 搭建步骤

 

 

 

 

1. MMM
  1.1 概念

    MMM(Master-Master replication manager for MvSQL,MySQL主主复制管理器)是一套支持双主故障切换和双主日常管理的脚本程序。
    MMM 使用 Perl 语言开发,主要用来监控和管理 MySQL Master-Master (双主)复制,虽然叫做双主复制,但是业务上同一时刻只允许对一个主进行写入,另一台备选主上提供部分读服务,以加速在主主切换时备选主的预热。
    可以说MMM这套脚本程序一方面实现了故障切换的功能,另一方面其内部附加的工具脚本也可以实现多个 Slave 的 read 负载均衡。


  1.2 优缺点与适用场景

    MMM提供了自动和手动两种方式移除一组服务器中复制延迟较高的服务器的虚拟ip,同时它还可以备份数据,实现两节点之间的数据同步等。由于MMM无法完全保证数据的一致性,所以MMM适用于对数据的一致性要求不是很高,但是又想最大程度地保证业务可用性的场景。

  • 优点:

    高可用性,扩展性好,出现故障自动切换,对于主主同步,在同一时间只提供一台数据库写操作,保证 的数据的一致性。当主服务器挂掉以后,另一个主立即接管,其他的从服务器能自动切换,不用人工干预。

  • 缺点:

    monitor节点是单点,不过这个你也可以结合keepalived或者haertbeat做成高可用;至少三个节点,对主机的数量有要求,需要实现读写分离,还需要在前端编写读写分离程序。在读写非常繁忙的业务系统下表现不是很 稳定,可能会出现复制延时、切换失效等问题。MMM方案并不太适应于对数据安全性要求很高,并且读、写 繁忙的环境中。

  • 适用场景:

    MMM的适用场景为数据库访问量大,并且能实现读写分离的场景。


  1.3 工作原理

    MMM是一套灵活的脚本程序,基于perl实现,用来对 mysql replication 进行监控和故障迁移,并能管理 MySQL Master-Master 复制的配置。

    关于 MMM 高可用架构的说明如下:

  • mmm_mon:监控进程,负责所有的监控工作,决定和处理所有节点角色活动。此脚本需要在监控主机上运行。
  • mmm_agent:运行在每个MySQL服务器上的代理进程,完成监控的探针工作和执行简单的远端服务设置。此脚本需要在被监管机上运行。
  • mmm_control:一个简单的脚本,提供管理 mmm_mon 进程的命令。

    mysql-mmm 的监管端会提供多个虚拟 IP(VIP),包括一个可写 VIP,多个可读 VIP,通过监管的管理,这些 IP 会绑定在可用 MySQL 之上,当某一台 MySQL 宕机时,监管会将 VIP 迁移至其他 MySQL。
    在整个监管过程中,需要在 MySQL 中添加相关授权用户,以便让 MySQL 可以支持监控主机的维护。 授权的用户包括一个 mmm_monitor 用户和一个 mmm_agent 用户。


  1.4 MMM 部署所需资源

名称 数量 说明
主DB服务器 2 用于主备模式的主主复制配置
从DB服务器 0-N 可以配置0台或者多台,但不建议多台
监控服务器 1 用于监控MySQL复制集群
IP地址 2*(n+1) n为MySQL服务器数量(DB)
监控用户(mmm_mon) 1 用于监控数据库状态的MySQL用户
代理用户(mmm_agent) 1 用于MMM代理的MySQL用户
复制用户 1 用户MySQL复制的MySQL用户


  1.5 高可用、单点故障

  • 高可用:指的是通过尽量缩短因日常维护操作(计划)和突发的系统崩溃(非计划)所导致的停机时间,以提高系统和应用的可用性;
  • 单点故障:指一个系统提供相同功能的组件只有一个,如果失效,会影响整个系统的正常使用


2. 搭建 MySQL MMM
  2.1 搭建步骤

 

    (1)数据库分配

主机 ip hostname server id 所需安装
monitoring host 192.168.229.50 monitor mysql-mmm
master 1 192.168.229.90 db1 1 mysql5.7、mysql-mmm
master 2 192.168.229.80 db2 2 mysql5.7、mysql-mmm
slave 1 192.168.229.70 db3 3 mysql5.7、mysql-mmm
slave 2 192.168.229.60 db4 4 mysql5.7、mysql-mmm


    (2)虚拟ip

ip role
192.168.229.100 writer
192.168.229.101 reader
192.168.229.102 reader


    (3)数据库同步需要的用户

function description privileges
monitor user mmm监控用于对mysql服务器进程健康检查 REPLICATION  CLIENT
agent user mmm代理用来更改只读模式,复制的主服务器等 SUPER,  REPLICATION CLIENT, PROCESS
replication user 用于复制 REPLICATION SLAVE


    (4)所有服务器关闭防火墙

1 systemctl stop firewalld
2 setenforce 0

 

    (5)修改 master01 配置文件

 1 vim /etc/my.cnf
 2 ......
 3 [mysqld]
 4 user = mysql
 5 basedir = /usr/local/mysql
 6 datadir = /usr/local/mysql/data
 7 port = 3306
 8 character_set_server=utf8
 9 pid-file = /usr/local/mysql/mysqld.pid
10 socket = /usr/local/mysql/mysql.sock
11 server-id = 1                                               #每台 Mysql 主机的 server-id 不能相同
12 log-error=/usr/local/mysql/data/mysql_error.log             #错误日志
13 general_log=ON                                              #通用查询日志
14 general_log_file=/usr/local/mysql/data/mysql_general.log
15 slow_query_log=ON                                           #慢查询日志
16 slow_query_log_file=mysql_slow_query.log
17 long_query_time=5
18 binlog-ignore-db=mysql,information_schema        #不需要同步的库名
19 log_bin=mysql_bin                                #开启二进制日志用于主从数据复制
20 log_slave_updates=true                           #允许slave从master复制数据时可以写入到自己的二进制日志
21 sync_binlog=1                            #"双1设置",MySQL 在每写一次二进制日志时都会同步到磁盘中去   
22 innodb_flush_log_at_trx_commit=1         #"双1设置",每次事务提交时MySQL都会把缓存的数据写入日志文件,并且刷到磁盘中去
23 auto_increment_increment=2               #自增字段一次递增多少
24 auto_increment_offset=1                  #自增字段的起始值

 

    (6)把配置文件复制到其它 3 台数据库服务器上并启动服务器,注意:配置文件中的 server_id 要修改

1 scp /etc/my.cnf root@192.168.229.80:/etc/
2 scp /etc/my.cnf root@192.168.229.70:/etc/
3 scp /etc/my.cnf root@192.168.229.60:/etc/
4  
5 systemctl restart mysqld

 

    (7)配置主主复制,两台主服务器相互复制

1 ##在两台主服务器上都执行授予从的权限,从服务器上不需要执行
2 
3 grant replication slave on *.* to 'replication'@'192.168.229.%' identified by '12345';

 

    (8)在两台主服务器上查看,记录日志文件名称和同步点

1 show master status;
2 +-------------------+----------+--------------+------------------+
3 | File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
4 +-------------------+----------+--------------+------------------+
5 | master-bin.000002 |    154   |              |                  |
6 +-------------------+----------+--------------+------------------+

 

    (9)在 master01 上配置同步

1 change master to master_host='192.168.229.80',master_user='replication',master_password='12345',master_log_file='mysql_bin.000002',master_log_pos=618;
2  
3 start slave;
4  
5 show slave status\G
6     Slave_IO_Running: Yes
7     Slave_SQL_Running: Yes

 

    (10)在 master02 上配置同步

1 change master to master_host='192.168.229.90',master_user='replication',master_password='12345',master_log_file='mysql_bin.000002',master_log_pos=618;
2  
3 start slave;
4  
5 show slave status\G
6     Slave_IO_Running: Yes
7     Slave_SQL_Running: Yes

 

    (11)配置主从复制,在两台从服务器上做

1 change master to master_host='192.168.229.90',master_user='replication',master_password='123456',master_log_file='mysql_bin.000002',master_log_pos=154;
2  
3 start slave;
4  
5 show slave status\G
6     Slave_IO_Running: Yes
7     Slave_SQL_Running: Yes

 

    (12)测试主主、主从 同步情况

1 create database db_test;


    (13)在所有服务器上安装 MySQL-MMM

1 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
2 yum -y install epel-release
3 yum -y install mysql-mmm*

 

    (14)在 master01 上对 MySQL-MMM 进行配置

 1 cd /etc/mysql-mmm/
 2 vim mmm_common.conf
 3 ……
 4 <host default>
 5     cluster_interface       ens33
 6     ……
 7     replication_user        replication
 8     replication_password    12345
 9     agent_user              mmm_agent
10     agent_password          12345
11  
12 <host db1>
13     ip      192.168.229.90
14     mode    master
15     peer    db2
16 </host>
17  
18 <host db2>
19     ip      192.168.229.80
20     mode    master
21     peer    db1
22 </host>
23  
24 <host db3>
25     ip      192.168.229.70
26     mode    slave
27 </host>
28  
29 <host db4>
30     ip      192.168.229.60
31     mode    slave
32 </host>
33  
34 <role writer>
35     hosts   db1, db2
36     ips     192.168.229.100
37     mode    exclusive           #只有一个 host 可以进行写操作模式
38 </role>
39  
40 <role reader>
41     hosts   db3, db4
42     ips     192.168.229.101, 192.168.229.102
43     mode    balanced            #多个 slave 主机可以进行读操作模式
44 </role>

 

    (15)把配置文件复制到其它 4 台主机,所有主机该配置文件内容都是一样的

1 scp mmm_common.conf root@192.168.229.80:/etc/mysql-mmm/
2 scp mmm_common.conf root@192.168.229.70:/etc/mysql-mmm/
3 scp mmm_common.conf root@192.168.229.60:/etc/mysql-mmm/
4 scp mmm_common.conf root@192.168.229.50:/etc/mysql-mmm/


    (16)修改所有数据库服务器的代理配置文件 mmm_agent.conf

1 vim /etc/mysql-mmm/mmm_agent.conf
2 include mmm_common.conf
3 this db1                #根据不同的主机分别修改为 db1,db2,db3,db4

 

    (17)在所有数据库上为 mmm_agent(代理进程)授权

1 grant super, replication client, process on *.* to 'mmm_agent'@'192.168.229.%' identified by '12345';

 

    (18)在所有数据库上为 mmm_moniter(监控进程)授权

1 grant replication client on *.* to 'mmm_monitor'@'192.168.229.%' identified by '12345';
2  
3 flush privileges;

 

    (19)在所有数据库服务器上启动 mysql-mmm-agent

1 systemctl start mysql-mmm-agent.service
2 systemctl enable mysql-mmm-agent.service

 

    (20)在 monitor 服务器上启动 mysql-mmm-monitor

1 systemctl start mysql-mmm-monitor.service 

 

    (21)查看各节点的情况

1 mmm_control show
2   db1(192.168.229.90) master/ONLINE. Roles: writer(192.168.229.100)
3   db2(192.168.229.80) master/ONLINE. Roles:
4   db3(192.168.229.70) slave/ONLINE. Roles: reader(192.168.229.101)
5   db4(192.168.229.60) slave/ONLINE. Roles: reader(192.168.229.102)

 

    (22)检测监控功能是否都完善

1 mmm_control checks all

 

    (23)指定绑定 VIP 的主机

1 mmm_control move_role writer db2

 

    (24)故障测试
    (25)客户端测试

 

 

 

 

-

 

上一篇:配置mysql数据库MMM高可用


下一篇:在eclipse中配置Tomcat时,出现“Cannot create a server using the selected type”的错误。