MySQL高可用架构之MHA
一、 准备实验MYSQLReplication环境:
MHA对MYSQL复制环境有特殊要求,例如各节点都要开启二进制日志及中继日志,各从节点必须显示启用其read-only属性, 并关relay_log_purge功能等, 这里对配置做事先说明。
本实验环境共有四个节点,其角色分配如下:
node1: MariaDBmaster
node2: MariaDB slave
node3: MariaDB slave
node4: MHA Manager
各节点的/etc/hosts文件配置内容中添加:(可不写,只要在各节点配置skip_name_resolve = ON)
172.17.160.76 node1.magedu.com node1
72.17.160.79 node2.magedu.com node2
172.17.160.80 node3.magedu.com node3
172.17.160.81 node4.magedu.com node4
1、 初始主节点master配置:
vim /etc/my.cnf
[mysqld]
server-id = 1
log-bin = master-log
relay-log =relay-log
skip_name_resolve =ON
2、 所有slave节点依赖的配置:
vim /etc/my.cnf
[mysqld]
server-id = 2#复制集群中的各节点的id均必须唯一;
relay-log =relay-log
log-bin = master-log
read_only = ON
relay_log_purge = 0#是否自动清空不再需要中继日志
skip_name_resolve =ON
3、 按上述要求分别配置好主从节点之后,按MYSQL复制配置架构的配置方式将其配置完成
并启动master节点和各slave节点,以及为各slave节点启动其IO和SQL线程, 确保主从复制运行无误。 操作如下:
master节点上:
MariaDB [(none)]>GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO '[email protected]%.%' IDENTIFIED BY 'magedu';(这个命令在其他从节点也可能用到,所以尽量也写上去)
MariaDB[(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]>SHOW MASTER STATUS;
各slave节点上:
mysql-uroot
MariaDB [(none)]>CHANGE MASTER TO MASTER_HOST='172.17.160.80',
->MASTER_USER='slave',
->MASTER_PASSWORD='magedu',
->MASTER_LOG_FILE=’ master-log.000003′,
->MASTER_LOG_POS=647;
MariaDB[(none)]> start slave;
MariaDB[(none)]> show slave status\G;
二、 安装配置MHA
1、在所有MYSQL节点授权拥有管理权限的用户可在本地网络中有其他节点上远程访问。 当然, 此时仅需要且只能在master节点运行类似如下SQL语句即可。基于安全,需要在各节点都要运行以下的这个命令,因为可能在其他节点没有mhaadmin这个用户。
mysql>GRANT ALL ON *.* TO 'mhaadmin'@'172.17.%.%'IDENTIFIED BY 'mhapass';
2、 准备基于SSH互信通信环境:
MHA集群中的各节点彼此之间均需要基于ssh互信通信,以实现远程控制及数据管理功能。简单起见, 可在Manager节点生成**对儿, 并设置其可远程连接本地主机后,将私钥文件及authorized_keys文件复制给余下的所有节点即可。
下面操作在node4:
Manager节点上操作:
[[email protected] ~]#ssh-****** -t rsa
[[email protected] ~]#ssh-copy-id -i /root/.ssh/[email protected]172.17.160.76
(所有节点之间都要互相发,这样为了使各节点之间ssh连接无需输入密码)
3、 进行MHA安装包安装
首先把安装包给下载下来,安装包默认支持6版本,但是可以与7版本兼容。
Manager 节点: #yum install mha4mysql-manager-0.56-0.el6.noarch.rpm
所有节点,包括Manager节点: #yum install mha4mysql-node-0.56-0.el6.norch.rpm
4、 初始化MHA, 进行配置
Manager节点需要为每个监控的master/slave集群提供一个专用的配置文件, 而所有的master/slave集群也可共享全局配置。 全局配置文件为/etc/masterha_default.cnf,其为可选配置。 如果仅监控一master/slave集群, 也可直接通过application的配置来提供各服务器的默认配置信息。而每个application的配置文件路径为自定义。
5、 定义MHA管理配置文件
为MHA专门创建一个管理用户,方便以后使用, 在mysql的主节点上, 三个节点自动同步
Manager节点:
mkdir/etc/mha_master
vim/etc/mha_master/app1.cnf
配置文件内容如下;
[server default]
user=mhaadmin #在master上授权的具有管理权限的mha用户
password=mhapass#mha密码
manager_workdir=/etc/mha_master/app1 #mha_master的工作路径
manager_log=/etc/mha_master/manager.log #mha_master的日志路径
remote_workdir=/mydata/mha_master/app1 #每个远程主机的工作目录
ssh_user=root #基于ssh的秘钥认证
repl_user=slave
repl_password=magedu
ping_interval=1
[server1]
hostname=172.17.160.79 #这三个ip分别是主的,还有从的ip.
ssh_port=22
candidate_master=1
[server2]
hostname=172.17.160.80
ssh_port=22
candidate_master=1
[server3]
hostname=172.17.160.76
ssh_port=22
candidate_master=1
6、检测各节点间ssh互信通信配置是否Ok:
[[email protected] ~]#masterha_check_ssh -conf=/etc/mha_master/app1.cnf
输出信息最后一行类似如下信息,表示其通过检测。
[info]All SSHconnection tests passed successfully.
检查管理的MySQL复制集群的连接配置参数是否OK:
[[email protected]~]#masterha_check_repl -conf=/etc/mha_master/app1.cnf
如果测试时会报错,可能是从节点上没有账号, 因为这个架构, 任何一个从节点, 将有可能成为主节点, 所以也需要创建账号。因此,这里只要在mater节点上再次执行以下操作即可:
MariaDB[(none)]>GRANT REPLICATION SLAVE,REPLICATION CLIENT ON
*.* TO'[email protected]%.%' IDENTIFIED BY 'magedu';
MariaDB [(none)]>FLUSH PRIVILEGES;
Manager节点上再次运行,就显示Ok了。
三、 启动MHA
[[email protected]~]#nohup masterha_manager -conf=/etc/mha_master/app1.cnf &>/etc/mha_master/manager.log &
# 启动成功后,可用过如下命令来查看master节点的状态:
[[email protected]~]#masterha_check_status -conf=/etc/mha_master/app1.cnf
app1 (pid:4978)isrunning(0:PING_OK),master:172.16.252.18
上面的信息中“app1(pid:4978)is running(0:PING_OK)”表示MHA服务运行OK,否则, 则会显示为类似“app1 isstopped(1:NOT_RUNNINg).”如果要停止MHA,需要使用master_stop命令。
[[email protected]~]#masterha_stop -conf=/etc/mha_master/app1.cnf
四、 测试MHA测试故障转移
(1)在master节点关闭mariadb服务,模拟主节点数据崩溃
#killall -9 mysqldmysqld_safe
#rm -rf/var/lib/mysql/*
(2)在manager节点查看日志:
/data/masterha/app1/manager.log日志文件中出现如下信息, 表manager检测到172.17.160.79节点故障, 而后自动执行故障转移, 172.17.160.80提升为主节点。 注意, 故障转移完成后, manager将会自动停止, 此时使用masterha_check_status命令检测将会遇到错误提示,如下所示:
#masterha_check_status–conf=/etc/masterha/app1.cnf
app1 isstopped(2:NOT_RINNING).
四、 测试MHA测试故障转移
(3) 提供新的从节点以修复复制集群
原有 master 节点故障后,需要重新准备好一个新的 MySQL 节点。 基于来自于master 节点的备份恢复数据后,将其配置为新的 master 的从节点即可。 注意,新加入的节点如果为新 增节点, 其 IP地址要配置为原来 master 节点的 IP, 否则, 还需要修改 app1.cnf中相应的 ip 地址。 随后再次启动 manager, 并再次检测其状态。
把原来的master挂掉之后,其中一个从节点接管master位置,待主节点修复好后,基于节约资源考虑,将其变为从节点继续使用,变为从节点方法:
1、把配置文件/etc/my.cnf中的内容改为从节点的配置
2、再次安装数据库,并进行如下配置:
mysql -uroot
MariaDB [(none)]>CHANGE MASTER TO MASTER_HOST='172.17.160.80',
->MASTER_USER='slave',
->MASTER_PASSWORD='magedu',
->MASTER_LOG_FILE=’ master-log.000003′,
->MASTER_LOG_POS=647;
MariaDB[(none)]>GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.*TO '[email protected]%.%' IDENTIFIED BY 'magedu';
mysql>GRANT ALL ON *.* TO 'mhaadmin'@'172.17.%.%'IDENTIFIED BY 'mhapass';
MariaDB[(none)]> start slave;
MariaDB[(none)]> show slave status\G;
这样才可能保证mha检测通过。
3、在后来居上的master上也需要修改配置文件:
#read_only=On把这句话给注释掉,因为它已经变为主节点了,所以不能设为只读。
4、在现在的主节点上,关闭slave,因为它已经不需要了。Stopslave.
(4)新节点提供后再次执行检查操作
masterha_check_status-conf=/etc/mha_master/app1.cnf
masterha_check_repl-conf=/etc/mha_master/app1.cnf
检查无误, 再次运行, 这次要记录日志
masterha_manager-conf=/etc/mha_master/app1.cnf >/etc/mha_master/manager.log2>&1
五、 新节点上线, 故障转换恢复注意事项
(1)、 在生产环境中,当你的主节点挂了后, 一定要在从节点上做一个备份, 拿着备份文件把主节点手动提升为从节点,并指明从哪一个日志文件的位置开始复制
(2)、 每一次自动完成转换后,每一次的(replication health )检测不ok始终都是启动不了必须手动修复主节点,除非你改配置文件
(3)、 手动修复主节点提升为从节点后,再次运行检测命令
[[email protected] ~]#masterha_check_repl --conf=/etc/mha_master/app1.cnf
app1 (pid:3211) isrunning(0:PING_OK), master:172.16.5.103
(4)、 再次运行起来就恢复成功了
masterha_manager--conf=/etc/mha_master/app1.cnf
六、本次实验遇到的各种需要注意的问题
master挂掉前:
1、没有在所有节点上安装mha4mysql-node-0.56-0.el6.norch.rpm
2、配置文件没有写正确
3、在slave 节点上没有创建对应的slave及mhaadmin用户
4、主节点没有与两个从节点信息同步,即
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
5、在manager节点上妹纸文件时少配置了一个ip
6、ssh无密码连接没有做好
master挂掉后:
1、把前master的配置文件修改成slave的配置文件,因为它已经不再是master了。
2、重新授权数据库用户。
3、关闭现有master的slave,因为它之前是slave,但是现在不是了,所以要关掉。
4、修改现在的master配置文件,把read-only关闭。
5、进入数据库,检查各从节点是否与现在的主节点连接。