一、MHA搭建
三台服务器:
主:221
从:222
从:220,兼职作为manager
除了manager以外所有的节点都是node
node+manager两种类型
1、基础环境准备:
准备好三台linux Redhat 6.5机器
规划好IP地址、配置hosts文件解析主机名
vim /etc/hosts
172.16.88.220 master
172.16.88.221 bakmas
172.16.88.222 slave
配置好本地yum源
关闭iptables 和selinux
三台安装一样版本的mysql数据库-5.7.14rpm和xtrabackup工具2.4.4
2、搭建主从
在主上创建复制用户并授权:
mysql> grant replication slave,replication client on *.* to
'repl'@'172.16.88.%' identified by 'repl';
对主库做全备,并应用,传输到2个从库上
在各个从库上进行恢复,并授权
启动后设置主从关系,开启从库,检查主从状态
修改配置文件vim /etc/my.cnf
log-bin=server
binlog_format=roe
binlog_rows_query_log_events=on
server_id=1/2/3
重启主库
service mysqld restart
查看节点文件
[root@master ~]# cd /usr/local/mysql/data/
[root@master data]# ll
total 122920
-rw-r----- 1 mysql mysql 56 May 1 12:23 auto.cnf
-rw-r----- 1 mysql mysql 330 May 1 15:48 ib_buffer_pool
-rw-r----- 1 mysql mysql 12582912 May 1 15:55 ibdata1
-rw-r----- 1 mysql mysql 50331648 May 1 15:55 ib_logfile0
-rw-r----- 1 mysql mysql 50331648 May 1 12:23 ib_logfile1
-rw-r----- 1 mysql mysql 12582912 May 1 15:55 ibtmp1
drwxr-x--- 2 mysql mysql 4096 May 1 12:23 mysql
-rw-rw---- 1 root root 6 May 1 15:55 mysqld_safe.pid
drwxr-x--- 2 mysql mysql 4096 May 1 12:23 performance_schema
-rw-r----- 1 mysql mysql 154 May 1 15:55 server.000001
-rw-r----- 1 mysql mysql 16 May 1 15:55 server.index
drwxr-x--- 2 mysql mysql 12288 May 1 12:23 sys
确定主从关系
mysql> ? change master to
CHANGE MASTER TO
MASTER_HOST='172.16.88.220',
MASTER_USER='repl',
MASTER_PASSWORD='repl',
MASTER_PORT=3306,
MASTER_LOG_FILE='server.000001',
MASTER_LOG_POS=154,
MASTER_CONNECT_RETRY=10;
mysql> start slave;
查看主从状态
从:
mysql> show slave statusG
*************************** 1. row
***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.16.88.220
Master_User: repl
Master_Port: 3306
Connect_Retry: 10
Master_Log_File: server.000001
Read_Master_Log_Pos: 154
Relay_Log_File: bakmas-relay-bin.000003
Relay_Log_Pos: 317
Relay_Master_Log_File: server.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
主:
mysql> show processlist;
主从库安装node节点软件
[root@master mha_file]# rpm -ivh mha4mysql-node-0.54-0.el6.noarch.rpm
备主机器安装所有软件
rpm localinstall ./*.rpm
查看/usr/bin有没有生成脚本
[root@bakmas mha_file]# cd /usr/bin/
[root@bakmas bin]# ll |grep "_logs"
-rwxr-xr-x 1 root root 15977 Dec 1 2012 apply_diff_relay_logs
-rwxr-xr-x 1 root root 7401 Dec 1 2012 purge_relay_logs
-rwxr-xr-x 1 root root 7263 Dec 1 2012 save_binary_logs
3、配置免密
三台都需要
主库:
生成rsa秘钥:
[root@master ~]# ssh-keygen -t rsa
[root@master ~]# cd .ssh/
[root@master .ssh]# ll
total 8
-rw------- 1 root root 1675 May 1 16:45 id_rsa//私钥
-rw-r--r-- 1 root root 393 May 1 16:45 id_rsa.pub//公钥
将生成的公钥追加到认证文件中:
cat /root/.ssh/id_rsa.pub >> authorized_keys
修改ssh文件夹和公钥的权限:
chmod 700 /root/.ssh
chmod 600 authorized_keys
将公钥传输到其他2个机器上:
ssh-copy-id -i id_rsa.pub root@slave
ssh-copy-id -i id_rsa.pub root@bakmas
slave:
ssh-copy-id -i id_rsa.pub root@master
ssh-copy-id -i id_rsa.pub root@bakmas
bakmas:
ssh-copy-id -i id_rsa.pub root@master
ssh-copy-id -i id_rsa.pub root@slave
验证三台机器间无密码登录任何一台机器
4、配置监控用户
在master上创建mha监控用户,这样2个从上自动有该用户
mysql> grant all privileges on *.* to 'mha_bakmas'@'172.16.88.%' identified
by 'mha_bakmas';
测试是否成功:
mysql -umha_bakmas -pmha_bakmas -hmaster -P3306
5、配置MHA
在mha-manager上执行:
1、创建mha的工作目录
mkdir -p /etc/masterha
修改相关配置文件app1.cnf
[server default]
manager_workdir=/var/log/masterha/app1
manager_log=/var/log/masterha/app1/manager.log
master_binlog_dir=/var/lib/mysql/data
master_ip_failover_script=/usr/bin/master_ip_failover //失败切换
master_ip_online_change_script=/usr/bin/master_ip_online_change //主动切换
user=mha_monitor //manager 使用这个账号连接各个数据库
password=mha_monitor //manager 使用这个账号密码连接各个数据库
ping_interval=1 //manager 每隔 1 秒钟,探测一下各个节点
remote_workdir=/tmp //指定远端目录
repl_user=repl //各个节点之间的复制账号和密码
repl_password=repl
ssh_user=root
[server1]
hostname=192.168.10.50
#candidate_master=1
port=3306
[server2]
hostname=192.168.10.51
candidate_master=1 //指定2节点优先成为主,假设没有这个选项,默认使用最新的 slave
成为主
check_repl_delay=0 //关闭延迟监测
port=3306
[server3]
hostname=192.168.10.52
port=3306
填充:
[server default]
manager_workdir=/var/log/masterha/app1
manager_log=/var/log/masterha/app1/manager.log
master_binlog_dir=/var/lib/mysql/data
master_ip_failover_script=/usr/bin/master_ip_failover
master_ip_online_change_script=/usr/bin/master_ip_online_change
user=mha_bakmas
password=mha_bakmas
ping_interval=1
remote_workdir=/tmp
repl_user=repl
repl_password=repl
ssh_user=root
[server1]
hostname=172.16.88.220
port=3306
[server2]
hostname=172.16.88.221
candidate_master=1
check_repl_delay=0
port=3306
[server3]
hostname=172.16.88.222
port=3306
2、在从库上关闭自动purge
在2个从节点,设置relay_log_purge=0,不自动清除relay_log,可以利用自带的purge_relay_log脚本实现定时任务自动清理relay
log
[root@bakmas ~]# vim /etc/my.cnf
relay_log_purge=off
read_only=on
3、修改脚本
主库上:
在主库设置虚拟ip
[root@master etc]# ifconfig eth0:1 172.16.88.224/24
bakmas(监控机)上:
master_ip_failover
master_ip_online_change
将脚本放到/usr/bin
修改虚拟地址
[root@bakmas bin]# vim /usr/bin/master_ip_failover
my $vip = '172.16.88.224/24'; # Virtual IP
[root@bakmas bin]# vim /usr/bin/master_ip_online_change
vip=`echo '172.16.88.224/24'` # Virtual IP
manager需要使用这两个脚本,在新的主上启动漂移ip
将这两个中的所有地址改成漂移ip地址就行了
这两个脚本在manager节点上
4、改完之后加上权限
[root@bakmas bin]# chmod +x master_ip_*
上面配置好以后,就可以在 manager 上面执行相关的脚本进行测试
上面的配置就是告诉 manager,我这个集群的基本信息
5、mha检查ssh免密登录:
masterha_check_ssh --conf=/etc/masterha/app1.cnf
6、mha检查复制
masterha_check_repl --conf=/etc/masterha/app1.cnf
7、mha状态检查
masterha_check_status --conf=/etc/masterha/app1.cnf
8、启动 manager:
nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master
--ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1
&
建议:在启动manager以前,启动好主从
另开窗口查看监控日志: tail -f /var/log/masterha/app1/manager.log
再次查看监控状态:
masterha_check_status --conf=/etc/masterha/app1.cnf
如何关闭manager监控:
masterha_stop --conf=/etc/masterha/app1.cnf
一主两从
搭建两次从服务器
不建议使用半同步复制
注意几个点:
1、从库都该成read-only模式
2、从库的relay log自动删除功能要关闭
3、三个数据库的server_id必须不一致
log-bin = mysql-bin //要求所有可能成为主库的节点开启二进制日志
relay_log_purge = 0 //要求所有可能成为主库的节点都要配置此项
read_only = 1 //MHA 要求所有 slave 节点配置为 read_only = 1
server-id = 2 //注意主从节点的 server-id 不同
5、安装node和manager软件,这个属于mha软件
安装的时候,需要依赖很多的per软件和Perl库,因此可能会比较麻烦
去下载已经安装好的虚拟机
6、配置互信(配置SSH免密登录)
节点之间可以互相执行命令、拷贝数据,这些都不需要密码。
配置完成互信以后,一定要进行测试。
二、MHA在线|故障切换测试
1、手工在线测试
检查master_ip_online_change脚本中所有虚拟ip是否修改完成。
在线切换步骤:
1、手工停掉mha监控
masterha_stop --conf=/etc/masterha/app1.cnf
2、执行在线切换
masterha_master_switch --conf=/etc/masterha/app1.cnf --master_state=alive
--new_master_host=172.16.88.220 --new_master_port=3306
--orig_master_is_new_slave --running_updates_limit=10000
yes,yes
3、其中参数的意思:
--orig_master_is_new_slave 切换时加上此参数是将原 master 变为 slave
节点,如果不加此参数,原来的 master 将不启动。
--running_updates_limit=10000,故障切换时,候选 master 如果有延迟的话,mha
切换不能成功,加上此参数表示延迟在此时间范围内都可切换(单位为
s),但是切换的时间长短是由 recover 时 relay 日志的大小决定。
在备主和监控机上查看是否完成切换:show processlist;
4、启动MHA manager:
nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master
--ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log
2>&1 &
masterha_check_status --conf=/etc/masterha/app1.cnf
2、故障切换测试
直接在主库上进行failover,杀掉mysqld进程
mysql> shutdown;
Query OK, 0 rows affected (0.01 sec)
mysql> show processlist;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
ERROR 2002 (HY000): Can't connect to local MySQL server through socket
'/var/lib/mysql/mysql.sock' (2)
ERROR:
Can't connect to the server
这时候会自动完成222故障切换,vip的漂移,但是manager进程会自动关闭
注意:
1、MHA里有2个角色,一个是manager节点,一个是node节点,要实现这个MHA,最好是不少于3台机器,一主2从,1台是主,一台当备用master,另一台从机当监控机,一旦主库宕机,备主开始充当主库提供服务,如果旧主上线也不会在成为master了,除非修复完整后强制做主库。
2、一旦发生切换,manager进程将会退出,无法进行再次测试,需要将故障数据库加入到MHA环境中。
宕掉的主库需要进行恢复操作:
常情况下,旧主在修复完整后,可能想把旧主作为新主的slave,这时可以借助当时自动切换时刻的MHA日志来完成对旧主的修复。
3、在manager上查看当时的change master 信息:
# cat /var/log/masterha/app1/manager.log |grep -i "All other slaves should
start"
Fri Dec 30 18:09:35 2016 - [info] All other slaves should start replication
from here. Statement should be: CHANGE MASTER TO MASTER_HOST='192.168.10.51',
MASTER_PORT=3306, MASTER_LOG_FILE='mha-server.000001', MASTER_LOG_POS=154,
MASTER_USER='repl', MASTER_PASSWORD='xxx';
获取上述信息后,在旧主上执行change master to操作,重新设置为新主的从库:
启动从库,查看主从状态
无论什么测试,在切换完成后,注意检查vip的位置,主从的状态信息是否正常,read_only和relay_log_purge的值,要和真实的架构状态对应起来,并且记得在配置文件中进行相应的修改
4、修复好的旧主并没有加入到MHA监控环境中,需要手工加入:
masterha_conf_host --command=add --conf=/etc/masterha/app1.cnf
--hostname=172.16.88.220 --block=server1 --params="no_master=1;ignore_fail=1"
或者是直接手工编辑app1.cnf配置文件添加上该信息,再次检查复制环境:
masterha_check_repl --conf=/etc/masterha/app1.cnf
5、Requirements and Limitations
1 这一部分做简要翻译,安装MHA的依赖和限制
2 SSH public key认证
3 仅支持Liunx操作系统
4 只有一台master能被设置成readonly=0,其他设置为只读
5如果是Master1 -> Master2->
Slave3这样的三级复制框架,在配置文件中只需要设置master1和master2这样的二级复制结构,并设置multi_tier_slave=1来支持三级复制结构。
6 MHA仅支持mysql 5.0及以后的版本
7 mysqlbinlog必须是3.3及以上版本
8 log-bin必须在每一个可称为master的mysql服务器上设置
9 所有mysql服务器的复制过滤规则必须一致
10 必须在能成为master的服务器上设置复制账户
11所有Mysql服务器上必须设置relay_log_purge=1,使得能够保存一段时间的relay log
12 基于语句的复制时,不要使用load datainfile命令