MySQL+MMM高可用

MySQL+MMM高可用

一、环境简述

1、工作逻辑图

wKiom1LiE0TjqodPAAFe12iPcoM036.jpg

2、MySQL-MMM优缺点

优点:高可用性,扩展性好,出现故障自动切换,对于主主同步,在同一时间只提供一台数据库写操作,保证的数据的一致性。

缺点:Monitor节点是单点,可以结合Keepalived实现高可用。

3、MySQL-MMM工作原理

MMM(Master-Master replication managerfor Mysql,Mysql主主复制管理器)是一套灵活的脚本程序,基于perl实现,用来对mysql replication进行监控和故障迁移,并能管理mysql Master-Master复制的配置(同一时间只有一个节点是可写的)。

mmm_mond:监控进程,负责所有的监控工作,决定和处理所有节点角色活动。此脚本需要在监管机上运行。

mmm_agentd:运行在每个mysql服务器上的代理进程,完成监控的探针工作和执行简单的远端服务设置。此脚本需要在被监管机上运行。

mmm_control:一个简单的脚本,提供管理mmm_mond进程的命令。

mysql-mmm的监管端会提供多个虚拟IP(VIP),包括一个可写VIP,多个可读VIP,通过监管的管理,这些IP会绑定在可用mysql之上,当某一台mysql宕机时,监管会将VIP迁移至其他mysql。

在整个监管过程中,需要在mysql中添加相关授权用户,以便让mysql可以支持监理机的维护。授权的用户包括一个mmm_monitor用户和一个mmm_agent用户,如果想使用mmm的备份工具则还要添加一个mmm_tools用户。

4、需求描述

操作系统:CentOS 7.8

数据库:MySQL 5.7

MMM:MySQL-MMM 2.2.1

数据库分配:

function ip hostname server id
monitoring host 192.168.206.120 monitor
master 1 192.168.206.121 master1 1
master 2 192.168.206.122 master2 2
slave 1 192.168.206.123 slave1 3
slave 2 192.168.206.124 slave2 4

虚拟IP地址(VIP):

ip role
192.168.0.211 writer
192.168.0.212 reader
192.168.0.213 reader

数据库同步需要的用户:

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

二、4台服务器安装MySQL并配置

1、通用配置

在这个步骤中,可以先在1台mysql服务器(192.168.206.121)上进行以下配置:

[root@master1 ~]# vi /etc/my.cnf   #添加如下
[mysqld]
binlog-do-db=test           #需要记录二进制日志的数据库,多个用逗号隔开
binlog-ignore-db=mysql,information_schema  #不需要记录二进制日志的数据库,多个用逗号隔开
auto_increment_increment=2  #字段一次递增多少
auto_increment_offset=1     #自增字段的起始值,值设置不同
replicate-do-db=test        #同步的数据库,多个写多行
replicate-ignore-db = information_schema #不同步的数据库,多个写多行
server_id = 1               #每台设置不同
log_bin = mysql-bin
log_slave_updates           #当一个主故障,另一个立即接管
sync-binlog=1               #每条自动更新,安全性高,默认是0
[root@master1 ~]# systemctl restart mysqld 

2、修改配置

按照第一台服务器克隆出3台,分别修改以下信息:

(1)网卡的IP
(2)mysql的UUID
vim /var/lib/mysql/autoconf
(3)my.cnf文件

关于mysql的配置,只需要在master1的基础上修改个别参数的值即可。

1)master2
auto_increment_offset=2		#自增字段的起始值,值设置不同
server_id=2					#每台设置不同
2)slave1和slave2

删除以下2项:

auto_increment_increment=2  #字段一次递增多少
auto_increment_offset=1     #自增字段的起始值,值设置不同

server_id分别设置为3和4

# slave1
server_id=3					#每台设置不同
# slave2
server_id=4					#每台设置不同

修改完毕之后别忘了重启mysql服务:

systemctl restart mysqld 

三、配置master1和master2主主同步

1、先查看下log bin日志和pos值位置

(1)master1
[root@master1 ~]# mysql -uroot -p
mysql> show master status;

MySQL+MMM高可用_第1张图片

(2)master2
[root@master2 ~]# mysql -uroot -p
mysql> show master status;

MySQL+MMM高可用_第2张图片

2、配置主主同步

(1)master1配置
mysql> set global validate_password_policy=0;
mysql> set global validate_password_length=6;
mysql> grant replication slave on *.* to 'repl'@'192.168.206.%' identified by '123456';
mysql> flush privileges;

mysql> stop slave;
mysql> change master to master_host='192.168.206.122',master_user='repl',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=154;
mysql> start slave;
(2)master2配置
mysql> set global validate_password_policy=0;
mysql> set global validate_password_length=6;
mysql> grant replication slave on *.* to 'repl'@'192.168.206.%' identified by '123456';
mysql> flush privileges;

mysql> stop slave;
mysql> change master to master_host='192.168.206.121',master_user='repl',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=154;
mysql> start slave;
(3)测试主主同步

主主同步配置完毕,查看同步状态Slave_IO和Slave_SQL是YES说明主主同步成功。

mysql> show slave status\G

MySQL+MMM高可用_第3张图片

如果Slave_IO_Running和Slave_SQL_Running都为yes,那么主从就已经配置OK了。

1)在master1上增加数据
mysql> create database test;
mysql> use test;
mysql> create table grade(id int);
mysql> insert into grade values(1),(2),(3);
2)在master2上查看是否数据同步

MySQL+MMM高可用_第4张图片
可以看到已经成功同步过去,同样在master2插入到grade表数据,也能同步过去。我们的双主就成功了,开始做主从复制。

(4)可能出现的错误
Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Client requested master to start replication from position > file size'

解决方案:

stop slave;
reset slave;
start slave;

四、配置slave1和slave2做为master1的从库

1、先看下master1状态值

MySQL+MMM高可用_第5张图片

2、配置主从库

(1)在slave1和slave2分别修改权限
mysql> change master to master_host='192.168.206.121',master_user='repl',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=759;
(2)在slave1和slave2查看结果

MySQL+MMM高可用_第6张图片

如上图所示,说明主从复制成功。但是数据没过来,这是因为主从复制原理只同步配置完后的增删改记录,以前的数据是不能同步的。我们可以把主的数据库备份了,然后在送数据库还原。

3、还原数据库

[root@master1 ~]# mysqldump -uroot -p123456 test > test.sql
[root@master1 ~]# scp test.sql [email protected]:/root/
[root@master1 ~]# scp test.sql [email protected]:/root/

[root@slave1 ~]# mysql -uroot -p -e "create database test;"
[root@slave1 ~]# mysql -uroot -p test 

[root@slave2 ~]# mysql -uroot -p -e "create database test;"
[root@slave2 ~]# mysql -uroot -p test 

五、MySQL-MMM安装配置

CentOS默认没有mysql-mmm软件包,官方推荐使用epel的网络源,五台都安装epel:

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

rpm -ivh http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm

yum -y install perl-* libart_lgpl.x86_64 rrdtool.x86_64 rrdtool-perl.x86_64

1、monitor节点安装

yum -y install mysql-mmm-monitor

2、四台db节点安装

yum -y install mysql-mmm-agent

MySQL+MMM高可用_第7张图片

3、在四台db节点授权monitor访问

mysql> set global validate_password_policy=0;
mysql> set global validate_password_length=6;

# 监听帐号,是MMM监控服务器用来对MySQL服务器做健康检查的
mysql> grant replication client on *.* to 'mmm_monitor'@'192.168.206.%' identified by '123456';

# 代理帐号,是MMM代理用来变成只读模式和同步master等的
mysql> grant super,process,replication client on *.* to 'mmm_agent'@'192.168.206.%' identified by '123456';

# 刷新权限
mysql> flush privileges;

4、修改mmm_common.conf文件(5台相同)

(1)配置示例说明
[root@monitor ~]# vim /etc/mysql-mmm/mmm_common.conf
active_master_role      writer    #积极的master角色的标示,所有的db服务器要开启read_only参数,对于writer服务器监控代理会自动将read_only属性关闭。

<host default>
    cluster_interface       eth0 #群集的网络接口
    pid_path                /var/run/mysql-mmm/mmm_agentd.pid  #pid路径
    bin_path                /usr/libexec/mysql-mmm/  #可执行文件路径
    replication_user        replication    #复制用户
    replication_password    123456      #复制用户密码
    agent_user              mmm_agent    #代理用户
    agent_password          123456      #代理用户密码
</host>

<host master-db1>   #master-db1的host名称
    ip      192.168.1.11   #master-db1的ip
    mode    master        #角色属性,master代表是主
    peer    master-db2   #与master-db1对等的服务器的host名,也就是master-db2的服务器host名
</host>

<host master-db2>   #和master-db1的概念一样
    ip      192.168.1.12
    mode    master
    peer    master-db1
</host>

<host slave-db1>     #从库的host名,如果存在多个从库可以重复一样的配置
    ip      192.168.1.13    #从的ip
    mode    slave      #slave的角色属性代表当前host是从
</host>

<host slave-db2>      #和slave-db1的概念一样
    ip      192.168.1.14
    mode    slave
</host>
<role writer>      #writer角色配置
    hosts   master-db1, master-db2   #能进行写操作的服务器的host名,如果不想切换写操作这里可以只配置master,这样也可以避免因为网络延时而进行write的切换,但是一旦master出现故障那么当前的MMM就没有writer了只有对外的read操作。
    ips     192.168.1.250    #对外提供的写操作的虚拟IP
    mode    exclusive    #exclusive代表只允许存在一个主,也就是只能提供一个写的IP
</role>

<role reader>   #read角色配置
    hosts   master-db1, master-db2, slave-db1, slave-db2    #对外提供读操作的服务器的host名,当然这里也可以把master加进来
    ips     192.168.1.251, 192.168.1.252, 192.168.1.253, 192.168.1.254    #对外提供读操作的虚拟ip,这三个ip和host不是一一对应的,并且ips也hosts的数目也可以不相同,如果这样配置的话其中一个hosts会分配两个ip
    mode    balanced
</role>
(2)实际配置参数
[root@monitor ~]# mkdir /etc/mysql-mmm
[root@monitor ~]# vim /etc/mysql-mmm/mmm_common.conf
active_master_role      writer

<host default>
        cluster_interface       ens33
        pid_path                /var/run/mysql-mmm/mmm_agentd.pid
        bin_path                /usr/libexec/mysql-mmm
        replication_user        repl
        replecation_password    123456
        agent_user              mmm_agent
        agent_password          123456
<host>

<host master1>
        ip      192.168.206.121
        mode    master
        peer    master2
<host>

<host master2>
        ip      192.168.206.122
        mode    master
        peer    master1
<host>

<host slave1>
        ip      192.168.206.123
        mode    slave
<host>

<host slave2>
        ip      192.168.206.124
        mode    slave
<host>

<role writer>
        hosts   master1,master2
        ips     192.168.206.250
        mode    exclusive
<role>

<role reader>
        hosts   master1,master2,slave1,slave2
        ips     192.168.206.251, 192.168.206.252, 192.168.206.253, 192.168.206.254
        mode    balanced
<role>
(3)通过scp命令传送到其他4台
[root@monitor ~]# scp -r /etc/mysql-mmm/ [email protected]:/etc
[root@monitor ~]# scp -r /etc/mysql-mmm/ [email protected]:/etc
[root@monitor ~]# scp -r /etc/mysql-mmm/ [email protected]:/etc
[root@monitor ~]# scp -r /etc/mysql-mmm/ [email protected]:/etc

5、修改4台db代理端mmm_agent.conf文件

在所有的MySQL上修改mmm_agent.conf,只需要修改master-db1这里,是哪台就改成哪台,这里只给出master1的:

[root@master2 ~]# vim /etc/mysql-mmm/mmm_agent.conf

include mmm_common.conf
this 

6、修改管理端mmm_mon.conf文件

[root@monitor ~]# vim /etc/mysql-mmm/mmm_mon.conf
include mmm_common.conf

<monitor>
        ip              192.168.206.120
        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.206.121.192.168.206.122,192.168.206.123,192.168.206.124
        auto_set_online 60	#恢复后自动设置在线的时间
<monitor>

<host default>
        monitor_user            mmm_monitor
        monitor_password        123456
<host>

debug   0

六、启动MySQL-MMM

1、db代理端启动

[root@db1 ~]# /etc/init.d/mysql-mmm-agent start
[root@db1 ~]# chkconfigmysql-mmm-agent on

2、monitor管理端启动

[root@monitor ~]# /etc/init.d/mysql-mmm-monitor start
[root@monitor ~]# chkconfigmysql-mmm-monitor on

你可能感兴趣的:(MySQL)