MySQL-MMM高可用架构

目录

一、MMM

1. MMM的概述

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

2. MMM的应用场景

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

3. MMM的特点

● MMM是一套灵活的脚本程序

● 基于perl语言实现

● 用来对mysql replication进行监控和故障迁移

● 管理MySQL Master-Master复制的配置

4. 关于MMM高可用架构的说明



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

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

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

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

5. 用户及授权

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

二、案例环境

1. 服务器配置

服务器 主机名 操作系统 IP地址 主要软件
Master1服务器 master1 CentOS 7.4 192.168.122.10 MySQL 5.7、MySQL-MMM
Master2服务器 master2 CentOS 7.4 192.168.122.11 MySQL 5.7、MySQL-MMM
Slave1服务器 slave1 CentOS 7.4 192.168.122.100 MySQL 5.7、MySQL-MMM
Slave2服务器 slave2 CentOS 7.4 192.168.122.101 MySQL 5.7、MySQL-MMM
Monitor服务器 monitor CentOS 7.4 192.168.122.12 MySQL-MMM

2. 服务器环境

systemctl stop firewalld
systemctl disable firewalld
setenforce 0

3. 修改主机名称

Master1服务器(192.168.122.10)

[root@localhost ~]# hostnamectl set-hostname master1

Master2服务器(192.168.122.11)

[root@localhost ~]# hostnamectl set-hostname master2

Slave1服务器(192.168.122.100)

[root@localhost ~]# hostnamectl set-hostname slave1

Slave2服务器(192.168.122.101)

[root@localhost ~]# hostnamectl set-hostname slave2

Monitor服务器(192.168.122.12)

[root@localhost ~]# hostnamectl set-hostname monitor

三、案例实施

1. 搭建MySQL多主多从架构

1.1 master1、master2、slave1、slave2节点上安装mysql5.7

刷下列脚本,过程忽略

#!/bin/bash
systemctl stop firewalld
systemctl disable firewalld
setenforce 0 #--------mysql-------- #安装依赖包 yum -y install gcc gcc-c++ ncurses ncurses-devel bison cmake #配置软件模块 cd /opt/
tar zxvf mysql-5.7.17.tar.gz
tar zxvf boost_1_59_0.tar.gz
mv boost_1_59_0 /usr/local/boost cd /opt/mysql-5.7.17/
cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DSYSCONFDIR=/etc \
-DSYSTEMD_PID_DIR=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=/usr/local/boost \
-DWITH_SYSTEMD=1 #编译安装 make -j 2 && make install #创建mysql用户 useradd -M -s /sbin/nologin mysql #修改mysql 配置文件 echo '[client]
port = 3306
default-character-set=utf8
socket=/usr/local/mysql/mysql.sock [mysql]
port = 3306
default-character-set=utf8
socket = /usr/local/mysql/mysql.sock
auto-rehash [mysqld]
user = mysql
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port = 3306
character-set-server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket=/usr/local/mysql/mysql.sock
bind-address = 0.0.0.0
skip-name-resolve
max_connections=2048
default-storage-engine=INNODB
max_allowed_packet=16M
server-id = 1 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES' > /etc/my.cnf #更改mysql安装目录和配置文件的属主属组 chown -R mysql:mysql /usr/local/mysql/
chown mysql:mysql /etc/my.cnf #设置路径环境变量 echo 'export PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH' >> /etc/profile
source /etc/profile #初始化数据库 cd /usr/local/mysql/bin/
./mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data #添加mysqld系统服务 cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
systemctl daemon-reload
systemctl start mysqld.service
systemctl enable mysqld yum -y install expect
mima () {
passwd=$1
/usr/bin/expect <<-EOF
spawn mysqladmin -u root -p password $passwd
expect "Enter password:"
send "\r"
expect eof
EOF
}
mima "123456" dl () {
/usr/bin/expect <<-EOF
spawn mysql -u root -p
expect "Enter password:" {send "123456\r"}
expect "mysql>" {send "grant all privileges on *.* to 'root'@'%' identified by '123456';\r"}
expect "mysql>" {send "quit\r"}
expect eof
EOF
}
dl

1.2 修改master1配置文件

Master1服务器(192.168.122.10)

[root@master1 ~]# vim /etc/my.cnf

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

1.3 把配置文件复制到其他3台数据库服务器并重启mysql服务器

注意:配置文件中的server-id不可相同,需要修改。

[root@master1 ~]# scp /etc/my.cnf root@192.168.122.11:/etc/
[root@master1 ~]# scp /etc/my.cnf root@192.168.122.100:/etc/
[root@master1 ~]# scp /etc/my.cnf root@192.168.122.101:/etc/

1.4 配置主主复制,两台主服务器相互复制

1.4.1 在两台主服务器上都执行授予从的权限,从服务器上不需要执行

Master1服务器(192.168.122.10)

[root@master1 ~]# mysql -u root -p
Enter password: mysql> grant replication slave on *.* to 'replication'@'192.168.122.%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)

Master2服务器(192.168.122.11)

[root@master2 ~]# mysql -u root -p
Enter password: mysql> grant replication slave on *.* to 'replication'@'192.168.122.%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)
1.4.2 在两台主服务器上查看

Master1服务器(192.168.122.10)

mysql> show master status;
+------------------+----------+--------------+--------------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+--------------------------+-------------------+
| mysql_bin.000001 | 154 | | mysql,information_schema | |
+------------------+----------+--------------+--------------------------+-------------------+
1 row in set (0.00 sec)

Master2服务器(192.168.122.11)

mysql> show master status;
+------------------+----------+--------------+--------------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+--------------------------+-------------------+
| mysql_bin.000001 | 154 | | mysql,information_schema | |
+------------------+----------+--------------+--------------------------+-------------------+
1 row in set (0.00 sec)
1.4.3 在master1上配置同步

Master1服务器(192.168.122.10)

mysql> change master to
-> master_host='192.168.122.11',
-> master_user='replication',
-> master_password='123456',
-> master_log_file='mysql_bin.000001',
-> master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.00 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.122.11
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql_bin.000001
Read_Master_Log_Pos: 154
Relay_Log_File: master1-relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql_bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 154
Relay_Log_Space: 529
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 2
Master_UUID: 51f017b7-0fe5-11ec-a583-000c299463f1
Master_Info_File: /usr/local/mysql/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
1.4.4 在master2上配置同步

Master2服务器(192.168.122.11)

mysql> change master to
-> master_host='192.168.122.10',
-> master_user='replication',
-> master_password='123456',
-> master_log_file='mysql_bin.000001',
-> master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.02 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.122.10
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql_bin.000001
Read_Master_Log_Pos: 154
Relay_Log_File: master2-relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql_bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 154
Relay_Log_Space: 529
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: 7587444a-0fe5-11ec-ac87-000c2959bebe
Master_Info_File: /usr/local/mysql/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)

1.5 配置主从复制,在两台从服务器上做

Slave1服务器(192.168.122.100)

[root@slave1 ~]# mysql -u root -p
Enter password: mysql> change master to
-> master_host='192.168.122.10',
-> master_user='replication',
-> master_password='123456',
-> master_log_file='mysql_bin.000001',
-> master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.01 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.122.10
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql_bin.000001
Read_Master_Log_Pos: 154
Relay_Log_File: slave1-relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql_bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 154
Relay_Log_Space: 528
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: 7587444a-0fe5-11ec-ac87-000c2959bebe
Master_Info_File: /usr/local/mysql/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)

Slave2服务器(192.168.122.101)

[root@slave2 ~]# mysql -u root -p
Enter password: mysql> change master to
-> master_host='192.168.122.10',
-> master_user='replication',
-> master_password='123456',
-> master_log_file='mysql_bin.000001',
-> master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.01 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.122.10
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql_bin.000001
Read_Master_Log_Pos: 154
Relay_Log_File: slave2-relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql_bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 154
Relay_Log_Space: 528
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: 7587444a-0fe5-11ec-ac87-000c2959bebe
Master_Info_File: /usr/local/mysql/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)

1.6 测试主主、主从同步情况

Master1服务器(192.168.122.10)

mysql> create database test;
Query OK, 1 row affected (0.00 sec) mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
5 rows in set (0.00 sec)

Master2服务器(192.168.122.11)

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
5 rows in set (0.00 sec)

Slave1服务器(192.168.122.100)

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
5 rows in set (0.00 sec)

Slave2服务器(192.168.122.101)

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
5 rows in set (0.00 sec)

2. 安装配置MySQL-MMM

2.1 在所有服务器上安装MySQL-MMM

Master1服务器(192.168.122.10)

[root@master1 ~]# yum -y install epel-release
[root@master1 ~]# yum -y install mysql-mmm*

Master2服务器(192.168.122.11)

[root@master2 ~]# yum -y install epel-release
[root@master2 ~]# yum -y install mysql-mmm*

Slave1服务器(192.168.122.100)

[root@slave1 ~]# yum -y install epel-release
[root@slave1 ~]# yum -y install mysql-mmm*

Slave2服务器(192.168.122.101)

[root@slave2 ~]# yum -y install epel-release
[root@slave2 ~]# yum -y install mysql-mmm*

Monitor服务器(192.168.122.12)

[root@monitor ~]# yum -y install epel-release
[root@monitor ~]# yum -y install mysql-mmm*

注:若本地仓库中无以上软件,需先为各服务器配置在线源仓库。

2.2 阿里云源仓库配置方法

wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
#将阿里云镜像下载到/etc/yum.repos.d/目录下
yum clean all && yum makecache
#清理缓存并且生成新的缓存

2.3 在master1上对MySQL-MMM进行配置

Master1服务器(192.168.122.10)

[root@master1 ~]# cd /etc/mysql-mmm/
[root@master1 mysql-mmm]# cp mmm_common.conf mmm_common.conf.bak
#修改配置文件前,先备份
[root@master1 mysql-mmm]# vim mmm_common.conf active_master_role writer <host default>
cluster_interface ens33
pid_path /run/mysql-mmm-agent.pid
bin_path /usr/libexec/mysql-mmm/
replication_user replication
##指定主主、主从复制用户,要与前面一致
replication_password 123456
agent_user mmm_agent
##指定monitor代理进程的用户名
agent_password 123456
</host> <host db1>
ip 192.168.122.10
mode master
peer db2
##peer设置同级数据库
</host> <host db2>
ip 192.168.122.11
mode master
peer db1
</host> <host db3>
ip 192.168.122.100
mode slave
</host> <host db4>
ip 192.168.122.101
mode slave
</host> <role writer>
hosts db1, db2
ips 192.168.122.200
##设定写VIP
mode exclusive
#只有一个 host 可以进行写操作模式
</role> <role reader>
hosts db3, db4
ips 192.168.122.201, 192.168.122.202
##设定读VIP
mode balanced
##多个 slave 主机可以进行读操作模式
</role>

2.4 把配置文件复制到其他4台主机

所有主机该配置文件内容都是相同的

Master1服务器(192.168.122.10)

[root@master1 mysql-mmm]# scp mmm_common.conf root@192.168.122.11:/etc/mysql-mmm/
[root@master1 mysql-mmm]# scp mmm_common.conf root@192.168.122.100:/etc/mysql-mmm/
[root@master1 mysql-mmm]# scp mmm_common.conf root@192.168.122.101:/etc/mysql-mmm/
[root@master1 mysql-mmm]# scp mmm_common.conf root@192.168.122.12:/etc/mysql-mmm/

注:因为scp将直接覆盖原配置文件,所以建议先将配置文件做好备份

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

Master1服务器(192.168.122.10)

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

include mmm_common.conf
this db1
##根据不同的主机分别修改为db1/db2/db3/db4,默认配置为db1,因此master1无需修改

Master2服务器(192.168.122.11)

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

include mmm_common.conf
this db2

Slave1服务器(192.168.122.100)

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

include mmm_common.conf
this db3

Slave2服务器(192.168.122.101)

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

include mmm_common.conf
this db4

2.6 在monitor监控服务器上修改监控配置文件mmm_mon.conf

Monitor服务器(192.168.122.12)

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

include mmm_common.conf

<monitor>
ip 127.0.0.1
pid_path /run/mysql-mmm-monitor.pid
bin_path /usr/libexec/mysql-mmm
status_path /var/lib/mysql-mmm/mmm_mond.status
ping_ips 192.168.122.10,192.168.122.11,192.168.122.100,192.168.122.101
##指定所有数据库服务器的IP
auto_set_online 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
##指定mmm_monitor的用户名
monitor_password 123456
##指定mmm_monitor的密码
</host> debug 0

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

Master1服务器(192.168.122.10)

[root@master1 ~]# mysql -u root -p
Enter password: mysql> grant super, replication client, process on *.* to 'mmm_agent'@'192.168.80.%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.01 sec)

Master2服务器(192.168.122.11)

[root@master2 ~]# mysql -u root -p
Enter password: mysql> grant super, replication client, process on *.* to 'mmm_agent'@'192.168.80.%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)

Slave1服务器(192.168.122.100)

[root@slave1 ~]# mysql -u root -p
Enter password: mysql> grant super, replication client, process on *.* to 'mmm_agent'@'192.168.80.%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)

Slave2服务器(192.168.122.101)

[root@slave2 ~]# mysql -u root -p
Enter password: mysql> grant super, replication client, process on *.* to 'mmm_agent'@'192.168.80.%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)

注:

权限 功能
process 显示或杀死属于其他用户的服务线程
super 允许用户终止任何查询;修改全局变量的SET语句;使用CHANGE MASTER,PURGE MASTER LOGS
replication client 查询主服务器、从服务器状态

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

Master1服务器(192.168.122.10)

mysql> grant replication client on *.* to 'mmm_monitor'@'192.168.80.%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.01 sec) mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

Master2服务器(192.168.122.11)

mysql> grant replication client on *.* to 'mmm_monitor'@'192.168.80.%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.01 sec) mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

Slave1服务器(192.168.122.100)

mysql> grant replication client on *.* to 'mmm_monitor'@'192.168.80.%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.01 sec) mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

Slave2服务器(192.168.122.101)

mysql> grant replication client on *.* to 'mmm_monitor'@'192.168.80.%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.01 sec) mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

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

Master1服务器(192.168.122.10)

[root@master1 ~]# systemctl start mysql-mmm-agent.service
[root@master1 ~]# systemctl enable mysql-mmm-agent.service
Created symlink from /etc/systemd/system/multi-user.target.wants/mysql-mmm-agent.service to /usr/lib/systemd/system/mysql-mmm-agent.service.

Master2服务器(192.168.122.11)

[root@master2 ~]# systemctl start mysql-mmm-agent.service
[root@master2 ~]# systemctl enable mysql-mmm-agent.service
Created symlink from /etc/systemd/system/multi-user.target.wants/mysql-mmm-agent.service to /usr/lib/systemd/system/mysql-mmm-agent.service.

Slave1服务器(192.168.122.100)

[root@slave1 ~]# systemctl start mysql-mmm-agent.service
[root@slave1 ~]# systemctl enable mysql-mmm-agent.service
Created symlink from /etc/systemd/system/multi-user.target.wants/mysql-mmm-agent.service to /usr/lib/systemd/system/mysql-mmm-agent.service.

Slave2服务器(192.168.122.101)

[root@slave2 ~]# systemctl start mysql-mmm-agent.service
[root@slave2 ~]# systemctl enable mysql-mmm-agent.service
Created symlink from /etc/systemd/system/multi-user.target.wants/mysql-mmm-agent.service to /usr/lib/systemd/system/mysql-mmm-agent.service.

2.9 在monitor服务器上启动mysql-mmm-monitor

Monitor服务器(192.168.122.12)

[root@monitor ~]# systemctl start mysql-mmm-monitor.service

2.10 在monitor服务器上测试群集

2.10.1 查看各节点的情况

Monitor服务器(192.168.122.12)

[root@monitor ~]# mmm_control show
db1(192.168.122.10) master/ONLINE. Roles: writer(192.168.122.200)
db2(192.168.122.11) master/ONLINE. Roles:
db3(192.168.122.100) slave/ONLINE. Roles: reader(192.168.122.202)
db4(192.168.122.101) slave/ONLINE. Roles: reader(192.168.122.201)
2.10.2 检测监控功能是否完善

Monitor服务器(192.168.122.12)

[root@monitor ~]# mmm_control checks all
db4 ping [last change: 2021/09/08 02:05:52] OK
db4 mysql [last change: 2021/09/08 02:10:38] OK
db4 rep_threads [last change: 2021/09/08 02:25:20] OK
db4 rep_backlog [last change: 2021/09/08 02:10:38] OK: Backlog is null
db2 ping [last change: 2021/09/08 02:05:52] OK
db2 mysql [last change: 2021/09/08 02:10:38] OK
db2 rep_threads [last change: 2021/09/08 02:25:20] OK
db2 rep_backlog [last change: 2021/09/08 02:10:38] OK: Backlog is null
db3 ping [last change: 2021/09/08 02:05:52] OK
db3 mysql [last change: 2021/09/08 02:10:38] OK
db3 rep_threads [last change: 2021/09/08 02:25:20] OK
db3 rep_backlog [last change: 2021/09/08 02:10:38] OK: Backlog is null
db1 ping [last change: 2021/09/08 02:05:52] OK
db1 mysql [last change: 2021/09/08 02:10:38] OK
db1 rep_threads [last change: 2021/09/08 02:25:20] OK
db1 rep_backlog [last change: 2021/09/08 02:10:38] OK: Backlog is null
2.10.3 指定绑定VIP的主机

Monitor服务器(192.168.122.12)

[root@monitor ~]# mmm_control move_role writer db2
OK: Role 'writer' has been moved from 'db1' to 'db2'. Now you can wait some time and check new roles info!
[root@monitor ~]# mmm_control show
db1(192.168.122.10) master/ONLINE. Roles:
db2(192.168.122.11) master/ONLINE. Roles: writer(192.168.122.200)
db3(192.168.122.100) slave/ONLINE. Roles: reader(192.168.122.202)
db4(192.168.122.101) slave/ONLINE. Roles: reader(192.168.122.201) [root@monitor ~]# mmm_control move_role writer db1
OK: Role 'writer' has been moved from 'db2' to 'db1'. Now you can wait some time and check new roles info!
[root@monitor ~]# mmm_control show
db1(192.168.122.10) master/ONLINE. Roles: writer(192.168.122.200)
db2(192.168.122.11) master/ONLINE. Roles:
db3(192.168.122.100) slave/ONLINE. Roles: reader(192.168.122.202)
db4(192.168.122.101) slave/ONLINE. Roles: reader(192.168.122.201)

3. 故障测试

3.1 模拟master宕机以及恢复

3.1.1 停止master1的mysql服务

Master1服务器(192.168.122.10)

[root@master1 ~]# systemctl stop mysqld
3.1.2 查看VIP漂移情况

Monitor服务器(192.168.122.12)

[root@monitor ~]# mmm_control show
db1(192.168.122.10) master/HARD_OFFLINE. Roles:
db2(192.168.122.11) master/ONLINE. Roles: writer(192.168.122.200)
db3(192.168.122.100) slave/ONLINE. Roles: reader(192.168.122.202)
db4(192.168.122.101) slave/ONLINE. Roles: reader(192.168.122.201)

VIP成功漂移至master2,且master1显示HARD_OFFLINE

3.1.3 重启master1的mysql服务

Master1服务器(192.168.122.10)

[root@master1 ~]# systemctl start mysqld
3.1.4 查看master1是否恢复

Monitor服务器(192.168.122.12)

[root@monitor ~]# mmm_control show
db1(192.168.122.10) master/AWAITING_RECOVERY. Roles:
db2(192.168.122.11) master/ONLINE. Roles: writer(192.168.122.200)
db3(192.168.122.100) slave/ONLINE. Roles: reader(192.168.122.202)
db4(192.168.122.101) slave/ONLINE. Roles: reader(192.168.122.201)

显示等待恢复,等待数秒后重新查看,发现Master1在线,但未能获得VIP

[root@monitor ~]# mmm_control show
db1(192.168.122.10) master/ONLINE. Roles:
db2(192.168.122.11) master/ONLINE. Roles: writer(192.168.122.200)
db3(192.168.122.100) slave/ONLINE. Roles: reader(192.168.122.202)
db4(192.168.122.101) slave/ONLINE. Roles: reader(192.168.122.201)

3.2 模拟从服务器宕机以及恢复

3.2.1 停止slave1的mysql服务

Slave1服务器(192.168.122.100)

[root@slave1 ~]# systemctl stop mysqld
3.2.2 查看VIP漂移情况

Monitor服务器(192.168.122.12)

[root@monitor ~]# mmm_control show
db1(192.168.122.10) master/ONLINE. Roles:
db2(192.168.122.11) master/ONLINE. Roles: writer(192.168.122.200)
db3(192.168.122.100) slave/HARD_OFFLINE. Roles:
db4(192.168.122.101) slave/ONLINE. Roles: reader(192.168.122.201), reader(192.168.122.202)

slave1所对应的的VIP对slave2成功接管

3.2.3 重启slave1的mysql服务

Slave1服务器(192.168.122.100)

[root@slave1 ~]# systemctl start mysqld
3.2.4 查看slave1是否恢复
[root@monitor ~]# mmm_control show
db1(192.168.122.10) master/ONLINE. Roles:
db2(192.168.122.11) master/ONLINE. Roles: writer(192.168.122.200)
db3(192.168.122.100) slave/AWAITING_RECOVERY. Roles:
db4(192.168.122.101) slave/ONLINE. Roles: reader(192.168.122.201), reader(192.168.122.202) [root@monitor ~]# mmm_control show
db1(192.168.122.10) master/ONLINE. Roles:
db2(192.168.122.11) master/ONLINE. Roles: writer(192.168.122.200)
db3(192.168.122.100) slave/ONLINE. Roles:
db4(192.168.122.101) slave/ONLINE. Roles: reader(192.168.122.201), reader(192.168.122.202) [root@monitor ~]# mmm_control show
db1(192.168.122.10) master/ONLINE. Roles:
db2(192.168.122.11) master/ONLINE. Roles: writer(192.168.122.200)
db3(192.168.122.100) slave/ONLINE. Roles: reader(192.168.122.202)
db4(192.168.122.101) slave/ONLINE. Roles: reader(192.168.122.201)

在短暂的交接后,slave1重新获取到VIP,继续工作

3.3 客户端测试

3.3.1 在master1服务器上为monitor服务器地址授权登录

Master1服务器(192.168.122.10)

[root@master1 ~]# mysql -u root -p
Enter password: mysql> grant all on *.* to 'test'@'192.168.122.12' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
3.3.2 在monitor服务器上使用VIP登录

Monitor服务器(192.168.122.12)

[root@monitor ~]# yum install -y mariadb-server mariadb
[root@monitor ~]# systemctl start mariadb.service
[root@monitor ~]# mysql -u test -p -h 192.168.122.200
Enter password:
##登录成功
MySQL [(none)]>
3.3.3 客户端创建数据,测试同步情况

Monitor服务器(192.168.122.12)

MySQL [(none)]> create database client_test;
Query OK, 1 row affected (0.00 sec) MySQL [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| client_test |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
6 rows in set (0.00 sec)

Master1服务器(192.168.122.10)

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| client_test |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
6 rows in set (0.00 sec)

Master2服务器(192.168.122.11)

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| client_test |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
6 rows in set (0.00 sec)

Slave1服务器(192.168.122.100)

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| client_test |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
6 rows in set (0.00 sec)

Slave2服务器(192.168.122.101)

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| client_test |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
6 rows in set (0.00 sec)

MySQL-MMM高可用架构的更多相关文章

  1. centos6.6部署mysql mmm高可用架构

    一.环境简述 1.工作逻辑图 2.MySQL-MMM优缺点 优点:高可用性,扩展性好,出现故障自动切换,对于主主同步,在同一时间只提供一台数据库写操作,保证的数据的一致性. 缺点:Monitor节点是 ...

  2. mysql mmm高可用架构设计

    项目概述:搭建主从,双主,安装Perl模块  安装配置mmm软件  测试 硬件环境:4台虚拟PC 软件环境:rehl6.5 MySQL-5.6.26 percona-xtrabackup-2.3.4 ...

  3. CentOS 搭建 Mysql MMM 高可用架构

    环境 CentOS Mysql 5.1 前提 安装了EPEL,详细安装步骤请參照 http://blog.csdn.net/robinsonmhj/article/details/36184863 机 ...

  4. 美团点评MySQL数据库高可用架构从MMM到MHA+Zebra以及MHA+Proxy的演进

    本文介绍最近几年美团点评MySQL数据库高可用架构的演进过程,以及我们在开源技术基础上做的一些创新.同时,也和业界其它方案进行综合对比,了解业界在高可用方面的进展,和未来我们的一些规划和展望. MMM ...

  5. MySQL集群搭建(3)-MMM高可用架构

    1 MMM 介绍 1.1 简介 MMM 是一套支持双主故障切换以及双主日常管理的第三方软件.MMM 由 Perl 开发,用来管理和监控双主复制,虽然是双主架构,但是业务上同一时间只允许一个节点进行写入 ...

  6. mysql复制(高可用架构方案的基础)

    mysql复制:把一个数据库实例上所有改变复制到另外一个数据库库服务器实例的过程特点:1.没有改变就无所谓复制 ;改变是复制的根本与数据源2.所有的改变:是指可以复制全部改变,也可以复制部分改变 可以 ...

  7. Mysql MMM 高可用

    一.Mysql MMM 高可用概况: mmm_mond  负责所有的监控工作的监控守护进程,决定节点的移除等: mmm_agentd  运行在mysql服务器上的代理守护进程,通过简单远程服务集提供给 ...

  8. 搭建MySQL MMM高可用

    搭建MMM: 1,安装 agent 节点执行 yum install -y mysql-mmm-agent 2, monitor 节点执行 yum install -y mysql-mmm-monit ...

  9. Oracle Compute云快速搭建MySQL Keepalived高可用架构

    最近有个客户在测试Oracle Compute云,他们的应用需要使用MySQL数据库,由于是企业级应用一定要考虑高可用架构,因此有需求要在Oracle Compute云上搭建MySQL高可用集群.客户 ...

  10. mysql实现高可用架构之MHA

    一.简介 MHA(Master HA)是一款开源的 MySQL 的高可用程序,它为 MySQL 主从复制架构提供了 automating master failover 功能.MHA 在监控到 mas ...

随机推荐

  1. TortoiseGit使用技巧

    汇总TortoiseGit使用技巧,包括提交代码,创建patch等等. 1.提交代码到本地仓库 在Git工程目录下右键, 点击 Git Commit -> "master". ...

  2. python 之 pip、pypdf2 安装与卸载

    pip是个啥? pip 是一个现代的,通用的 Python 包管理工具.提供了对 Python 包的查找.下载.安装.卸载的功能. 第一步:pip 下载:https://pypi.org/projec ...

  3. nginx+keepalived 简单实现主备和双主模式

    准备nginx和keepalived 安装nginx(自行安装) yum install nginx 安装keepalived(安装包安装总报错,yum安装能好一点) yum install keep ...

  4. Java Date 类型比较

    //某时间Date time = tRemind.getTime();//现在时间Date now = new Date();//结果大于0则是现在时间大于某时间//结果等于0则为刚好相等//结果小于 ...

  5. HDU 1312 Red and Black (DFS & BFS)

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1312 题目大意:有一间矩形房屋,地上铺了红.黑两种颜色的方形瓷砖.你站在其中一块黑色的瓷砖上,只能向相 ...

  6. Pop Sequeue

    题目描述 Given a stack which can keep M numbers at most. Push N numbers in the order of 1,2,3...,N and p ...

  7. HTTP2和WebSocket

    HTTP http是目前应用最广泛的应用层协议,截止到目前为止已经发布了多个版本,最常用的是http1.1和http2. http0.9是最早的版本,功能很简单,没有header,只支持GET. ht ...

  8. java基础04-数据类型扩展及面试题

    java基础04-数据类型扩展及面试题讲解 public class demo02 { public static void main(String[] args){ // 一.整数拓展: 进制 二进 ...

  9. 判断jquery类库是否加载,如未加载则加载。

    本人所有文章使用到的东西均在"渭南电脑维修网"网站中得以实现和应用,还请大家参考. 抄写别人网站的同时,N多不同的网站,势必有N多的css.javascript引用文件都会重复引用 ...

  10. 43.Kruskal算法

    public class KruskalCase { private int edgeNum; //边的个数 private char[] vertexs; //顶点数组 private int[][ ...