目录
一、MHA概述
1.1 概述
—套优秀的MySQL高可用环境下故障切换和主从复制的软件MHA的出现就是解决MySQL单点的问题。
MHA: Master High Availability,对主节点进行监控,可实现自动故障转移至其它从节点;通过提升某一从节点为新的主节点,基于主从复制实现,还需要客户端配合实现,目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库,出于机器成本的考虑,淘宝进行了改造,目前淘宝TMHA已经支持一主一从。
MySQL故障过程中,MHA能做到0-30秒内自动完成故障切换MHA能在故障切换的过程中最大程度上保证数据的一致性,以达到真正意义上的高可用
1.2 组成
MHA Manager(管理节点)
Manager工具包主要包括以下几个工具: | |
masterha_check_ssh | 检查MHA的SSH配置状况 |
masterha_check_rep1 | 检查MySQL复制状况 |
masterha_manger | 启动MHA |
masterha_check_status | 检测当前MHA运行状态 |
masterha_master_monitor | 检测master是否宕机 |
masterha_master_switch | 故障转移(自动或手动) |
masterha_conf_host | 添加或删除配置的server信息 |
masterha_stop--conf=app1.cnf | 停止MHA |
masterha_secondary_check | 两个或多个网络线路检查MySQL主服务器的可用 |
MHA Node(数据节点)
Node工具包:这些工具通常由MHA Manager的脚本触发,无需人为操作)主要包括以下几个工具: | |
save_binary_1ogs | #保存和复制master的二进制日志 |
apply_diff_relay_logs | #识别差异的中继日志事件并将其差异的事件应用于其他的s1ave |
filter_mysq1binlog | #去除不必要的ROLLBACK事件(MHA已不再使用此工具) |
purge_re1ay_1ogs | #清除中继日志(不会阻塞SQL线程) |
1.3 特点
自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失。
使用半同步复制,可以大大降低数据丢失的风险。
目前MHA支持一主多从架构,最少三台服务,即一主两从。
1.4 切换过程
(1)从宕机崩溃的master保存二进制日志事件(binlog events);
(2)识别含有最新更新的slave;
(3)应用差异的中继日志(relay log)到其他 slave;
(4)应用从master保存的二进制日志事件(binlog events);
(5)提升一个slave为新master;
(6)使其他的slave连接新的master进行复制
二、MHA高可用配置
2.1 服务器配置
主master:192.168.162.100
从slave1:192.168.162.111
从slave2:192.168.162.102
MHA服务器:
2.2 实验配置
##关闭主从服务器服务器防火墙
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
##修改主从服务器节点的主机名
[root@lppdff mysql]# hostnamectl set-hostname mysql1
[root@lppdff mysql]# hostnamectl set-hostname mysql2
[root@lppdff mysql]# hostnamectl set-hostname mysql3
##修改添加主机记录
[root@mysql1 mysql]# vim /etc/hosts
192.168.162.100 mysql1
192.168.162.111 mysql2
192.168.162.102 mysql3
##修改主服务器日志
[root@mysql1 ~]# vim /etc/my.cnf
server-id = 1
log_bin = master-bin
log-slave-updates = true
##重启服务
[root@mysql3 ~]# systemctl restart mysqld.service
##创建软连接
[root@mysql1 ~]# ln -s /usr/local/mysql/bin/{mysql,mysqlbinlog} /usr/sbin/
##修改从1服务器日志
[root@mysql2 mysql]# vim /etc/my.cnf
server-id = 2
log_bin = master-bin
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
##重启服务
[root@mysql3 ~]# systemctl restart mysqld.service
##创建软连接
[root@mysql2 ~]# ln -s /usr/local/mysql/bin/{mysql,mysqlbinlog} /usr/sbin/
##修改从服务器2日志
[root@mysql3 ~]# vim /etc/my.cnf
server-id = 3
log_bin = master-bin
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
##重启服务
[root@mysql3 ~]# systemctl restart mysqld.service
##创建软连接
[root@mysql3 ~]# ln -s /usr/local/mysql/bin/{mysql,mysqlbinlog} /usr/sbin/
##主服务器授权
mysql> grant replication slave on *.* to 'myslave'@'192.168.162.%' identified by '123123';
mysql> grant all privileges on *.* to 'mha'@'192.168.162.%' identified by 'manager';
mysql> grant all privileges on *.* to 'mha'@'Mysql1' identified by 'manager';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> grant all privileges on *.* to 'mha'@'Mysql2' identified by 'manager';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> grant all privileges on *.* to 'mha'@'Mysql3' identified by 'manager';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
##从服务器1授权
mysql> grant replication slave on *.* to 'myslave'@'192.168.162.%' identified by '123123';
mysql> grant all privileges on *.* to 'mha'@'192.168.162.%' identified by 'manager';
mysql> grant all privileges on *.* to 'mha'@'Mysql1' identified by 'manager';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> grant all privileges on *.* to 'mha'@'Mysql2' identified by 'manager';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> grant all privileges on *.* to 'mha'@'Mysql3' identified by 'manager';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
##从服务器2授权
mysql> grant replication slave on *.* to 'myslave'@'192.168.162.%' identified by '123123';
mysql> grant all privileges on *.* to 'mha'@'192.168.162.%' identified by 'manager';
mysql> grant all privileges on *.* to 'mha'@'Mysql1' identified by 'manager';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> grant all privileges on *.* to 'mha'@'Mysql2' identified by 'manager';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> grant all privileges on *.* to 'mha'@'Mysql3' identified by 'manager';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
##查看主服务器状态
mysql> show master status;
##从节点从服务器1配置
mysql> change master to master_host='192.168.162.100',master_user='myslave',master_password='123123',master_log_file='master-bin.000001',master_log_pos=1747;
##开启
mysql> start slave;
##查看状态
mysql> show slave status\G
##从服务器2配置
mysql> change master to master_host='192.168.162.100',master_user='myslave',master_password='123123',master_log_file='master-bin.000001',master_log_pos=1747;
##开启
mysql> start slave;
##查看状态
mysql> show slave status\G
主从验证
2.4 安装MHA
##MHA服务器关闭防火墙
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
##在所有服务器上安装所需环境
##使用阿里云源仓库下载
[root@localhost yum.repos.d]# yum install epel-release --nogpgcheck -y
[root@localhost yum.repos.d]#yum install -y perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN
##将HMA安装包放入MHA服务器
mha4mysql-manager-0.57.tar.gz mha4mysql-node-0.57.tar.gz
[root@localhost opt]# ls
mha4mysql-manager-0.57.tar.gz mha4mysql-node-0.57.tar.gz rh
##主从服务器上放入mha4mysql-node-0.57.tar.gz
[root@localhost opt]# ls
mha4mysql-node-0.57.tar.gz
##MHA服务器解压包(主从服务器同样操作)
[root@localhost opt]# tar zxvf mha4mysql-node-0.57.tar.gz
[root@localhost opt]# cd mha4mysql-node-0.57/
[root@localhost mha4mysql-node-0.57]# perl Makefile.PL
[root@localhost mha4mysql-node-0.57]# make && make install
##MHA服务器配置
[root@localhost opt]#tar zxvf mha4mysql-manager-0.57.tar.gz
[root@localhost opt]#cd mha4mysql-manager-0.57/
[root@localhost mha4mysql-manager-0.57/]#perl Makefile.PL
[root@localhost mha4mysql-manager-0.57/]#make && make install
#manager 组件安装后在/usr/local/bin 下面会生成几个工具,主要包括以下几个:
masterha_check_ssh 检查 MHA 的 SSH 配置状况
masterha_check_repl 检查 MySQL 复制状况
masterha_manger 启动 manager的脚本
masterha_check_status 检测当前 MHA 运行状态
masterha_master_monitor 检测 master 是否宕机
masterha_master_switch 控制故障转移(自动或者 手动)
masterha_conf_host 添加或删除配置的 server 信息
masterha_stop 关闭manager
#node 组件安装后也会在/usr/local/bin 下面会生成几个脚本(这些工具通常由 MHAManager 的脚本触发,无需人为操作)主要如下:
save_binary_logs 保存和复制 master 的二进制日志
apply_diff_relay_logs 识别差异的中继日志事件并将其差异的事件应用于其他的 slave
filter_mysqlbinlog 去除不必要的 ROLLBACK 事件(MHA 已不再使用这个工具)
purge_relay_logs 清除中继日志(不会阻塞 SQL 线程)
##MHA设置免密登录
[root@localhost ~]# ssh-copy-id 192.168.162.100
[root@localhost ~]# ssh-copy-id 192.168.162.111
[root@localhost ~]# ssh-copy-id 192.168.162.102
##主服务器免密登录
[root@localhost ~]#ssh-keygen -t rsa
[root@localhost ~]#ssh-copy-id 192.168.162.111
[root@localhost ~]#ssh-copy-id 192.168.162.102
##从服务器免密登录
[root@localhost ~]#ssh-keygen -t rsa
[root@localhost ~]#ssh-copy-id 192.168.162.100
[root@localhost ~]#ssh-copy-id 192.168.162.102
##从服务器免密登录
[root@localhost ~]#ssh-keygen -t rsa
[root@localhost ~]#ssh-copy-id 192.168.162.100
[root@localhost ~]#ssh-copy-id 192.168.162.111
##MHA服务器在 manager 节点上复制相关脚本到/usr/local/bin 目录
[root@localhost scripts]# cp -rp /opt/mha4mysql-manager-0.57/samples/scripts /usr/local/bin
[root@localhost scripts]# cd /usr/local/bin/
[root@localhost bin]# cp scripts/* ./
##添加启动脚本(12.7)
[root@localhost bin]# vim master_ip_failover
##MHA服务器修改运行脚本
[root@localhost opt]/cd /mha4mysql-manager-0.57/samples
[root@localhost samples]#cd conf/
[root@localhost conf]#ls
app1.cnf masterha_default.cnf
[root@localhost conf]#mkdir /etc/masterha
[root@localhost conf]#cp app1.cnf /etc/masterha/
[root@localhost conf]# cd /etc/masterha/
[root@localhost masterha]#vim /etc/masterha/app1.cnf
##在主服务器添加虚拟网卡
[root@mysql1 mha4mysql-node-0.57]# ifconfig ens33:1 192.168.162.188/24
##MHA服务器测试 ssh 无密码认证,如果正常最后会输出 successfully,
[root@localhost masterha]# masterha_check_ssh -conf=/etc/masterha/app1.cnf
##MHA服务器测试mysql 主从连接情况,最后出现 MySQL Replication Health is OK 字样说明正常
##启动MHA会出现进程号
[root@localhost opt]#nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &
模拟故障验证
##关闭主服务器mysql
[root@mysql1 ~]# systemctl stop mysqld.service
##此时主服务器网卡虚拟地址分配给从服务器中
##如果将主服务器故障消失再次在MHA服务器上 修改配置文件app1.cnf(再把这个记录添加进去,因为它检测掉失效时候会自动消失)
vi /etc/masterha/app1.cnf[server1]
hostname=192.168.162.100
port=3306[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.162.111
port=3306[server3]
hostname=192.168.162.102
port=3306##再次重启主服务器Mysql,修复主从
show master status; ##查看主从节点号
change master to master_host='192.168.162.101',master_user='myslave',master_password='123123',master_log_file='master-bin.000002',master_log_pos=154; ##添加记录
start slave; ##开启
##MHA服务器上启动服务
nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &