mysqlzhimmm集群
角色 | ip | Hostname | id | 写 | 读 |
Master1 | 192.168.1.128 | Master1 | 1 | 192.168.1.100 | |
Master2(backup) | 192.168.1.131 | Master2 | 2 | 192.168.1.110 | |
Slave1 | 192.168.1.132 | Slave1 | 3 | 192.168.1.120 | |
Slave2 | 192.168.1.133 | Slave2 | 4 | 192.168.1.130 | |
Monitor | 192.168.1.134 | Monitor1 | 无 |
在所有主机上配置/etc/hosts(master1,master2,slave1,slave2,monitor1)
[root@mini1 ~]# vim /etc/hosts
192.168.1.128 master1
192.168.1.131 master2
192.168.1.132 slave1
192.168.1.133 slave2
192.168.1.134 monitor1
[root@mini1 ~]# hostnamectl set-hostname master1
[root@master1 ~]# for i in master2 slave1 slave2 monitor; do scp /etc/hosts $i:/etc/hosts ;dne
在 所 有 主 机 上 安 装 perl perl-devel perl-CPAN libart_lgpl.x86_64 rrdtool.x86_64
rrdtool-perl.x86_64 包
#yum -y install perl-* libart_lgpl.x86_64 rrdtool.x86_64 rrdtool-perl.x86_64
注:使用 centos7 在线 yum 源安装
安装 perl 的相关库
#cpan -i Algorithm::Diff Class::Singleton DBI DBD::mysql Log::Dispatch Log::Log4perl
Mail::Send Net::Ping Proc::Daemon Time::HiRes Params::Validate Net::ARP
在 master1、master2、slave1、slave2 主机上安装 mysql5.7 和配置复制
master1 和 master2 互为主从,slave1、slave2 为 master1 的从
在每个 mysql 的配置文件/etc/my.cnf 中加入以下内容, 注意 server-id 不能重复。
[root@master1 ~]# vim /etc/my.cnf
log-bin = mysql-bin
binlog_format = mixed
server-id = 1
relay-log = relay-bin
relay-log-index = slave-relay-bin.index
log-slave-updates = 1
auto-increment-increment = 2
auto-increment-offset = 1
[root@master2 ~]# vim /etc/my.cnf
log-bin = mysql-bin
binlog_format = mixed
server-id = 2
relay-log = relay-bin
relay-log-index = slave-relay-bin.index
log-slave-updates = 1
auto-increment-increment = 2
auto-increment-offset = 2
[root@slave1 ~]# vim /etc/my.cnf
server-id = 3
relay-log = relay-bin
relay-log-index = slave-relay-bin.index
read_only = 1
[root@slave2 ~]# vim /etc/my.cnf
server-id = 4
relay-log = relay-bin
relay-log-index = slave-relay-bin.index
read_only = 1
4 台数据库主机若要开启防火墙,要么关闭防火墙或者创建访问规则:
[root@master1 ~]# firewall-cmd --permanent --add-port=3306/tcp
success
[root@master1 ~]# firewall-cmd --reload
Success
主从配置(master1 和 master2 配置成主主,slave1 和 slave2 配置成 master1 的从):
在 master1 上授权:
mysql> grant replication slave on *.* to rep@'192.168.1.%' identified by '123';
在 master2 上授权:
mysql> grant replication slave on *.* to rep@'192.168.1.%' identified by '123';
把 master2、slave1 和 slave2 配置成 master1 的从库:
在 master1 上执行 show master status; 获取 binlog 文件和 Position 点
mysql> show master status\G;
*************************** 1. row ***************************
File: mysql-bin.000003
Position: 451
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
在 master2、slave1 和 slave2 执行
mysql> change master to master_host='192.168.1.128',master_port=3306,master_user='rep',master_password='123',master_log_file='mysql-bin.000003',master_log_pos=451;
mysql> slave start;
MySQL [(none)]> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.128
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 451
Relay_Log_File: relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
把 master1 配置成 master2 的从库:在 master2 上执行 show master status ;获取 binlog 文件和 Position 点
mysql> change master to master_host='192.168.1.131',master_port=3306,master_user='rep',master_password='123',master_log_file='mysql-bbin.000002',master_log_pos=1045;
mysql> start slave;
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.131
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 1045
Relay_Log_File: relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
4、mysql-mmm 配置:在 4 台 mysql 节点上创建用户
创建代理账号:
mysql> grant super,replication client,process on *.* to 'mmm_agent'@'192.168.1.%' identified by '123';
创建监控账号:
mysql> grant replication client on *.* to 'mmm_monitor'@'192.168.1.%' identified by '123';
注 1:因为之前的主从复制,以及主从已经是 ok 的,所以我在 master1 服务器执行就 ok 了。
检查 master2 和 slave1、slave2 三台 db 上是否都存在监控和代理账号
mysql> select user,host from mysql.user where user in ('mmm_monitor','mmm_agent');
+-------------+-------------+
| user | host |
+-------------+-------------+
| mmm_agent | 192.168.1.% |
| mmm_monitor | 192.168.1.% |
+-------------+-------------+
或
mysql> show grants for 'mmm_agent'@'192.168.1.%';
+------------------------------------------------------------------------------+
| Grants for mmm_agent@192.168.1.% |
+------------------------------------------------------------------------------+
| GRANT PROCESS, SUPER, REPLICATION CLIENT ON *.* TO 'mmm_agent'@'192.168.1.%' |
+------------------------------------------------------------------------------+
MySQL [(none)]> show grants for 'mmm_monitor'@'192.168.1.%' ;
+----------------------------------------------------------------+
| Grants for mmm_monitor@192.168.1.% |
+----------------------------------------------------------------+
| GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'192.168.1.%' |
+----------------------------------------------------------------+
在 monitor 主机(192.168.31.106) 上安装监控程序
[root@monitor1 ~]# tar zxf mysql-mmm-2.2.1.tar.gz
[root@monitor1 mysql-mmm-2.2.1]#
[root@monitor1 mysql-mmm-2.2.1]# make install
在数据库服务器(master1、master2、slave1、slave2)上安装代理
[root@master1 ~]# tar zxf mysql-mmm-2.2.1.tar.gz
[root@master1 ~]# cd mysql-mmm-2.2.1/
配置 mmm
编写配置文件,五台主机必须一致:完成安装后,所有的配置文件都放到了/etc/mysql-mmm/下面。管理服务器和数据库服务器上都要包含一个共同的文件 mmm_common.conf,内容如下:active_master_rolewriter#积极的 master 角色的标示,所有的 db 服务器要开启 read_only 参数,对于 writer 服务器监控代理会自动将 read_only 属性关闭。
[root@monitor1 mysql-mmm-2.2.1]# cd /etc/mysql-mmm/
[root@monitor1 mysql-mmm]# vim mmm_common.conf
active_master_role writer
cluster_interface ens32 #网卡名
pid_path /var/run/mmm_agentd.pid #pid 路径
bin_path /usr/lib/mysql-mmm/ #可执行文件路径
replication_user rep #复制用户
replication_password 123 #复制用户密码
agent_user mmm_agent #代理用户
agent_password 123 #代理用户密码
ip 192.168.1.128 #ip
mode master #角色属性
peer master2 #对等的服务器host名
ip 192.168.1.131
mode master
peer master1
ip 192.168.1.132
mode slave
ip 192.168.1.133
mode slave
hosts master1,master2 #master1,master2#能进行写操作的服务器的 host 名,如果不想切换写操作这里可以只配置 master,这样也可以避免因为网络延时而进行 write 的切换,但是一旦master 出现故障那么当前的 MMM 就没有 writer 了只有对外的 read 操作。
ips 192.168.1.100 #写的虚拟ip
mode exclusive #代表只允许存在一个主,也就是只能提供一个写的 IP
hosts master2,slave1,slave2
ips 192.168.1.130, 192.168.1.110, 192.168.1.120
mode balanced #负载均衡
[root@monitor1 mysql-mmm]# for i in master1 master2 slave1 slave2; do scp /etc/mysql-mmm/mmm_common.conf $i:/etc/mysql-mmm/ ;done
代理文件配置编辑 4 台 mysql 节点机上的/etc/mysql-mmm/mmm_agent.conf
在数据库服务器上,还有一个 mmm_agent.conf 需要修改,其内容是:
[root@master1 mysql-mmm-2.2.1]# vim /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
this master1 #每台数据库host
启动代理进程
在 /etc/init.d/mysql-mmm-agent 的脚本文件的#!/bin/sh 下面,加入如下内容
source /root/.bash_profile
[root@master1 mysql-mmm-2.2.1]# cd /etc/init.d/
[root@master1 init.d]# chkconfig --add mysql-mmm-agent
[root@master1 init.d]# chkconfig mysql-mmm-agent on
[root@master1 init.d]# /etc/init.d/mysql-mmm-agent start
Daemon bin: '/usr/sbin/mmm_agentd'
Daemon pid: '/var/run/mmm_agentd.pid'
Starting MMM Agent daemon... Ok #表示启动成功
[root@master1 init.d]# ss -lanp|grep mmm
tcp LISTEN 0 10 192.168.1.128:9989 *:* users:(("mmm_agentd",pid=9680,fd=3))
[root@master1 init.d]# firewall-cmd --add-port=9989/tcp --permanent
[root@master1 init.d]# firewall-cmd --reload
编辑 monitor 主机上的/etc/mysql-mmm/mmm_mon.conf
[root@monitor1 mysql-mmm]# vim /etc/mysql-mmm/mmm_mon.conf
include mmm_common.conf
ip 127.0.0.1
pid_path /var/run/mmm_mond.pid
bin_path /usr/lib/mysql-mmm/
status_path /var/lib/misc/mmm_mond.status
auto_set_online 0
ping_ips 192.168.1.128, 192.168.1.131, 192.168.1.132,192.168.1.133 #四台数据库的真实ip
check_period 5
trap_period 10
timeout 2
restart_after 10000
max_backlog 86400
monitor_user mmm_monitor
monitor_password 123
debug 0
启动监控进程
在 /etc/init.d/mysql-mmm-monitor 的脚本文件的#!/bin/sh 下面,加入如下内容
source /root/.bash_profile
添加成系统服务并设置为自启动
[root@monitor1 init.d]# vim /etc/init.d/mysql-mmm-monitor
[root@monitor1 init.d]# chkconfig --add mysql-mmm-monitor
[root@monitor1 init.d]# chkconfig mysql-mmm-monitor on
[root@monitor1 init.d]# ./mysql-mmm-monitor start
Daemon bin: '/usr/sbin/mmm_mond'
Daemon pid: '/var/run/mmm_mond.pid'
Starting MMM Monitor daemon: Ok
[root@monitor1 ~]# mmm_control show
master1(192.168.1.128) master/HARD_OFFLINE. Roles:
master2(192.168.1.131) master/HARD_OFFLINE. Roles:
slave1(192.168.1.132) slave/HARD_OFFLINE. Roles:
slave2(192.168.1.133) slave/HARD_OFFLINE. Roles:
启动所有mysql,然后让所有服务上线
[root@monitor1 ~]# mmm_control set_online master1
OK: State of 'master1' changed to ONLINE. Now you can wait some time and check its new roles!
[root@monitor1 ~]# mmm_control show
master1(192.168.1.128) master/ONLINE. Roles: writer(192.168.1.100)
master2(192.168.1.131) master/ONLINE. Roles: reader(192.168.1.130)
slave1(192.168.1.132) slave/ONLINE. Roles: reader(192.168..120)
slave2(192.168.1.133) slave/ONLINE. Roles: reader(192.168.1.110)
[root@master1 init.d]# ip addr
2: eno16777728:
link/ether 00:0c:29:d8:de:a3 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.128/24 brd 192.168.1.255 scope global noprefixroute dynamic eno16777728
valid_lft 5352004sec preferred_lft 5352004sec
inet 192.168.1.100/32 scope global eno16777728
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fed8:dea3/64 scope link noprefixroute
valid_lft forever preferred_lft forever
当master1 down vip地址则漂到master2
[root@master1 init.d]# service mysqld stop
[root@monitor1 ~]# mmm_control show
master1(192.168.1.128) master/HARD_OFFLINE. Roles:
master2(192.168.1.131) master/ONLINE. Roles: reader(192.168.1.130), writer(192.168.1.100)
slave1(192.168.1.132) slave/ONLINE. Roles: reader(192.168.1.120)
slave2(192.168.1.133) slave/ONLINE. Roles: reader(192.168.1.110)
#查看整个集群的状态,可以看到整个集群状态正常
[root@monitor1 ~]# mmm_control show
日志文件:
日志文件往往是分析错误的关键,所以要善于利用日志文件进行问题分析。
db 端:/var/log/mysql-mmm/mmm_agentd.log
监控端:/var/log/mysql-mmm/mmm_mond.log
命令文件:
mmm_agentd:db 代理进程的启动文件
mmm_mond:监控进程的启动文件
mmm_backup:备份文件
mmm_restore:还原文件
mmm_control:监控操作命令文件
db 服务器端只有 mmm_agentd 程序,其它的都是在 monitor 服务器端。
mmm_control 用法
mmm_control 程序可以用于监控群集状态、切换 writer、设置 online\offline 操作等。
Valid commands are:
help - show this message #帮助信息
ping - ping monitor #ping 当前的群集是否正常
show - show status #群集在线状态检查
checks [
set_online
set_offline
mode - print current mode. #打印输出当前的 mode
set_active - switch into active mode.
set_manual - switch into manual mode.
set_passive - switch into passive mode.
move_role [--force]
为指定的 host 服务器(Only use --force if you know what you are doing!)
set_ip
检查所有的 db 服务器群集状态:
[root@monitor1 ~]# mmm_control checks all
检查项包括:ping、mysql 是否正常运行、复制线程是否正常等
检查群集环境在线状况:
[root@monitor1 ~]# mmm_control show
对指定的 host 执行 offline 操作:
[root@monitor1 ~]# mmm_controlset_offline slave2
对指定的 host 执行 onine 操作:
[root@monitor1 ~]# mmm_controlset_online slave2
执行 write 切换(手动切换):
[root@monitor1 ~]# mmm_controlmove_role writer master1
总结
1.对外提供读写的虚拟 IP 是由 monitor 程序控制。如果 monitor 没有启动那么 db 服务器
不会被分配虚拟 ip,但是如果已经分配好了虚拟 ip,当 monitor 程序关闭了原先分配的虚拟 ip
不会立即关闭外部程序还可以连接访问(只要不重启网络),这样的好处就是对于 monitor
的可靠性要求就会低一些,但是如果这个时候其中的某一个 db 服务器故障了就无法处理切
换,也就是原先的虚拟 ip 还是维持不变,挂掉的那台 DB 的虚拟 ip 会变的不可访问。
2.agent 程序受 monitor 程序的控制处理 write 切换,从库切换等操作。如果 monitor 进
程关闭了那么 agent 进程就起不到什么作用,它本身不能处理故障。
3.monitor 程序负责监控 db 服务器的状态,包括 Mysql 数据库、服务器是否运行、复制
线程是否正常、主从延时等;它还用于控制 agent 程序处理故障。
4.monitor 会每隔几秒钟监控 db 服务器的状态,如果 db 服务器已经从故障变成了正常,
那么 monitor 会自动在 60s 之后将其设置为 online 状态(默认是 60s 可以设为其它的值),有
监控端的配置文件参数"auto_set_online"决定,群集服务器的状态有三种分别是:
HARD_OFFLINE→AWAITING_RECOVERY→online
5.默认 monitor 会控制 mmm_agent 会将 writer db 服务器 read_only 修改为 OFF,其它的
db 服务器 read_only 修改为 ON,所以为了严谨可以在所有的服务器的 my.cnf 文件中加入
read_only=1 由 monitor控制来控制 writer 和read,root 用户和复制用户不受read_only 参数的
影响。
总结
(1)master2备选主节点宕机不影响集群的状态,就是移除了master2备选节点的读状态。
(2)master1 主节点宕机,由 master2 备选主节点接管写角色,slave1,slave2 指向新 master2
主库进行复制,slave1,slave2 会自动 change master 到 master2.
(3)如果 master1 主库宕机,master2 复制应用又落后于 master1 时就变成了主可写状态,
这时的数据主无法保证一致性。
如果 master2,slave1,slave2 延迟于 master1 主,这个时 master1 宕机,slave1,slave2 将会
等待数据追上 db1 后,再重新指向新的主 node2 进行复制操作,这时的数据也无法保证
同步的一致性。
(4)如果采用 MMM 高可用架构,主,主备选节点机器配置一样,而且开启半同步进一步
提高安全性或采用 MariaDB/mysql5.7 进行多线程从复制,提高复制的性能。