1. MMM双主应用架构图,架构角色,IP及功能如下:
角色 |
物理IP |
server_id |
虚拟IP地址 |
IP角色 |
功能 |
Master1 (mysql) |
10.10.10.104 (RHEL7.3) |
1 |
10.10.10.100 |
writer IP |
写入VIP,单点写入 |
10.10.10.101 |
reader IP |
读查询VIP,每个节点一个读VIP,可通过负载均衡软件对读负载均衡 |
|||
Master2 (mysql) |
10.10.10.105 (RHEL7.3) |
2 |
10.10.10.102 |
||
Monitor |
10.10.10.103 (RHEL7.3) |
|
|
|
Mysql的监控节点,以及数据库备份节点 |
2. 配置前准备(每台节点都要设置):
关闭防火墙:systemctl stop firewalld
关闭selinux:
setenforce 0(临时生效)
sed -i ‘s/enforcing/disabled/g’ /etc/selinux/config(写入配置文件,永久生效)
时间同步:ntpdate ntp1.aliyum.com
安装并初始化mariadb数据库
yum -y install mariadb mariadb-server(yum安装,需配置好yum源)
systemctl start mariadb && systemctl enable mariadb(启动mariadb数据库,并设置开启自启动)
mysql_secure_installation(初始化数据库,我这里设置了root密码为123)
3. Monitor节点安装所有的MMM组件
yum -y install mysql-mmm mysql-mmm-agent mysql-mmm-monitor mysql-mmm-tools
4. Master1和Master2节点安装mysql-mmm-agent
yum -y install mysql-mmm-agent
5. Master1和Master2主主配置
Master1节点配置如下:
[root@master1 ~]# vim /etc/my.cnf #在[mysqld]中添加如下
server-id=1 #本机数据库ID 标示
log-bin=mysql-bin-master1 #启用二进制日志
binlog-do-db=HA #可以被从服务器复制的库(默认同步所有库)
binlog-ignore-db=mysql #不可以被从服务器复制的库(可不写)
read_only=1 #MMM对数据需严格的读写控制
#此参数不影响replication;root用户依然可写。
[root@master1 ~]# systemctl restart mariadb(重启mariadb数据库)
登陆数据库,并授权账号,用于从节点(Master2)来本机进行复制
注意:下面步骤必须等Master2主机开启binlog日志和配置好授权账号再来执行
停止slave,指定master主机,以及复制账号信息,开启slave。
查看slave状态信息,如下Slave_IO_Running和Slave_SQL_Running必须都为Yes
Master2节点配置如下:
[root@master2 ~]# vim /etc/my.cnf #在[mysqld]中添加如下内容:
server-id=2 #本机数据库ID 标示
log-bin=mysql-bin-master2 #启用二进制日志
binlog-do-db=HA #可以被从服务器复制的库。(默认同步所有库)
binlog-ignore-db=mysql #不可以被从服务器复制的库(可不写)
read_only=1 #MMM对数据需严格的读写控制
#此参数不影响replication;root用户依然可写。
systemctl restart mariadb(重启mariadb数据库)
登入数据库,并授权账号,用于从节点(Master1)来本机进行复制
停止slave,指定master主机,以及复制账号信息,开启slave。
查看slave状态信息,如下Slave_IO_Running和Slave_SQL_Running必须为Yes
到此,主主配置完成!
6. MySQL节点配置
所有MySQL节点创建monitor user(健康检测)和monitor agent(切换只读模式和同步Master信息)帐号(仅在mysql写入主节点,其他节点会自动复制,我们这里主主2台都做)
7. 所有MMM节点配置mmm_common.conf
vim /etc/mysql-mmm/mmm_common.conf
active_master_role writer
#当设置此参数,所有mysql节点都设置为"read_only=1",MMM会根据Mysql角色来决定是否执行"set global read_only=0".
<host default>
cluster_interface ens32 #设置网络接口
pid_path /run/mysql-mmm-agent.pid #设置PID文件位置
bin_path /usr/libexec/mysql-mmm/#设置MMM可执行文件路径
replication_user repl #设置复制的用户名
replication_password 123 #设置复制用户密码
agent_user mmm_agent #设置更改只读操作用户
agent_password 123 #设置更改只读操作用户密码
</host>
<host db1> #DB1配置信息
ip 10.10.10.64
mode master
peer db2 #与DB1对等主机
</host>
<host db2>
ip 10.10.10.65
mode master
peer db1
</host>
#<host db3>
# ip 10.10.10.66
# mode slave
#</host>
<role writer> #设置可写角色模式
hosts db1, db2 #DB1和DB2都可写
ips 10.10.10.10 #设置可写的VIP
mode exclusive #设置角色互斥模式,互斥角色只有一个IP,同一时间只能分配给一个用户
</role>
<role reader> #设置可读角色模式
hosts db1, db2 #设置可执行主机
ips 10.10.10.11, 10.10.10.12 #设置可读的VIP
mode balanced #设置角色模式为负载均衡,这些IP动态分配多个MySQL主机
</role>
8. 仅在MMM管理节点(Monitor)配置mmm_mom.conf
[root@monitor ~]# vim /etc/mysql-mmm/mmm_mon.conf
include mmm_common.conf
<monitor>
ip 127.0.0.1 #安全起见,只在本机监听,默认端口9988
pid_path /run/mysql-mmm-monitor.pid
bin_path /usr/libexec/mysql-mmm
status_path /var/lib/mysql-mmm/mmm_mond.status
#测试网络连通性,只要一个正常则网络正常
ping_ips 10.10.10.64, 10.10.10.65
flap_duration 3600 #抖动时间范围
flap_count 3 #在抖动时间范围内最大抖动次数
auto_set_online 8 #是否自动上线,如果大于0,抖动的主机在抖动时间范围过后,则设置自动上线
# 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 123
</host>
debug 0 #MMM管理端运行模式: 0 正常模式,1 debug模式
9. 所有Mysql节点设置mmm_agent.conf
[root@master1 ~]# cat /etc/mysql-mmm/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 db1
[root@master2 ~]# cat /etc/mysql-mmm/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 db2
10. 启动MMM服务,并设置开机自启动
MMM管理端:
[root@monitor ~]# systemctl start mysql-mmm-monitor && systemctl enable mysql-mmm-monitor
[root@monitor ~]# ss -lnt #查看端口监听情况
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 10 127.0.0.1:9988 *:*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
Mysql节点:(2台master节点都要启动)
[root@master1 ~]# systemctl start mysql-mmm-agent && systemctl enable mysql-mmm-agent
[root@master1 ~]# ss -lnt #查看端口监听情况
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 50 *:3306 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 10 10.10.10.64:9989 *:*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
MMM管理端基本管理命令:
mmm_control show (查看mmm连接状态)
mmm_control set_online db1 (如果一直显示等待,可手动设置)
mmm_control checks all (查看各个节点运行状态)
11. 读写分离测试
[root@monitor ~]# mmm_control show #查看vip分布情况
db1(10.10.10.64) master/ONLINE. Roles: reader(10.10.10.11), writer(10.10.10.10)
db2(10.10.10.65) master/ONLINE. Roles: reader(10.10.10.12)
使用写vip登陆mariadb数据,创建HA数据库(因为前面配置文件里面只指定了HA数据库同步),创建test表,然后插入测试数据
[root@monitor ~]# mysql -uroot -p123 -h 10.10.10.10 #写vip登陆数据库
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 524
Server version: 5.5.56-MariaDB MariaDB Server
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> create database HA;#创建HA数据库
Query OK, 1 row affected (0.01 sec)
MariaDB [(none)]> use HA; #进入HA数据库
Database changed
MariaDB [HA]> create table test(id int ,name varchar(20)); #进入test表
Query OK, 0 rows affected (0.04 sec)
MariaDB [HA]> insert into test values(1,'wyq'); #插入测试数据
Query OK, 1 row affected (0.04 sec)
[root@monitor ~]# mysql -uroot -p123 -h 10.10.10.12 -e 'select * from HA.test'
#使用读vip登陆数据库,执行查询
+------+------+
| id | name |
+------+------+
| 1 | wyq |#查询结果就是刚才插入的数据
+------+------+
12. 故障测试
[root@monitor ~]# mmm_control show
db1(10.10.10.64) master/ONLINE. Roles: reader(10.10.10.11), writer(10.10.10.10)
db2(10.10.10.65) master/ONLINE. Roles: reader(10.10.10.12)
[root@master1 ~]# systemctl stop mariadb #Master1停止数据库服务
[root@monitor ~]# mmm_control show
db1(10.10.10.64) master/HARD_OFFLINE. Roles: #Master1节点已停止服务
db2(10.10.10.65) master/ONLINE. Roles: reader(10.10.10.11), reader(10.10.10.12), writer(10.10.10.10) #此时读VIP已经漂到Master2节点上了
[root@master1 ~]# systemctl start mariadb #重新启动Master1节点数据库服务
[root@monitor ~]# mmm_control show
db1(10.10.10.64) master/ONLINE. Roles: reader(10.10.10.12)#Master1节点已恢复
db2(10.10.10.65) master/ONLINE. Roles: reader(10.10.10.11), writer(10.10.10.10)
#注意虽然DB1复活,但写VIP仍然在DB2不变