任务背景

一、案例

公司现在需要做MySQL数据库迁移,之前数据库是一主两从,使用MHA做了高可用,跑在私有云平台,现在需要这三台数据库迁移到物理机上,而且云上的数据库正在跑,希望做到热迁移,即不影响业务的情况下,把现有数据库从私有云平台迁移到物理真机上。

二、案例背后核心技术

1、熟悉MHA高可用的原理和部署

2、掌握MySQL数据库的迁移

3、熟悉MySQL主从复制的模式和搭建(基于GTIDs)

三、今日场景

随着业务功能的逐步完善,现有MySQL数据库架构虽然可以保障数据的相对可靠性,但是不能够完全保障服务的可用性。当我们的主库挂掉后,mysql服务不能立马切换到从服务器。所以,需要在现有架构的基础上扩展和升级,==进而在保障数据的可靠性的同时能够保障服务的可用性。

任务要求

MHA理解.png

1、使用三台服务器搭建mysql的复制组

2、使用MHA管理复制组,当master挂掉后,会立马提升一台slave作为新的master

任务拆解

  • 搭建MySQL的复制组(M-S1-S1,并联架构)
  • 安装MHA相关软件来管理复制组

理论储备

一、MHA简介

MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在较大程度上保证数据的一致性,以达到真正意义上的高可用。

二、MHA工作原理

MHA.png

  1. 当master出现故障时,通过对比slave之间I/O线程读取master上binlog的位置,选取最接近的slave做为最新的slave(latest slave)。
  2. 其它slave通过与latest slave对比生成差异中继日志,并应用。
  3. 在latest slave上应用从master保存的binlog,同时将latest slave提升为master。
  4. 最后在其它slave上应用相应的差异中继日志并开始从新的master开始复制.

三、MHA组件

1、MHA相关组件

  • MHA Manager(管理节点)
    MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。
  • MHA Node(数据节点)
    MHA Node运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。

2、MHA组件介绍

  • MHA Manager

运行一些工具,比如masterha_manager工具实现自动监控MySQL Master和实现master故障切换,其它工具手动实现master故障切换、在线mater转移、连接检查等等。一个Manager可以管理多 个master-slave集群

  • MHA Node

部署在所有运行MySQL的服务器上,无论是master还是slave。主要有三个作用:

1)保存二进制日志

  1. 如果能够访问故障master,会拷贝master的二进制日志

2)应用差异中继日志

  1. 从拥有最新数据的slave上生成差异中继日志,然后应用差异日志。

3)清除中继日志

  1. 在不停止SQL线程的情况下删除中继日志

3、相关工具介绍

㈠ Manager工具

工具 说明
masterha_check_ssh 检查MHA的SSH配置
masterha_check_repl 检查MySQL复制
masterha_manager 启动MHA
masterha_check_status 检测当前MHA运行状态
masterha_master_monitor 监测master是否宕机
masterha_master_switch 控制故障转移(自动或手动)
masterha_conf_host 添加或删除配置的server信息

㈡ Node工具

工具 说明
save_binary_logs 保存和复制master的二进制日志
apply_diff_relay_logs 识别差异的中继日志事件并应用于其它slave
filter_mysqlbinlog 去除不必要的ROLLBACK事件(MHA已不再使用这个工具)
purge_relay_logs 清除中继日志(不会阻塞SQL线程)

注意:Node这些工具通常由MHA Manager的脚本触发,无需人手操作__。

任务解决方案

一、MHA部署

1、部署规划

角色 IP 主机名 server-id 功能 备注
MHA-Manager 10.1.1.40 mgr.heima.cc 管理节点
MHA-Node(Master) 10.1.1.10 master.heima.cc 10 数据节点
MHA-Node(Slave1) 10.1.1.20 slave1.heima.cc 20 数据节点
MHA-Node(Slave2) 10.1.1.30 slave2.heima.cc 30 数据节点

2、系统和软件版本

系统版本 MySQL版本 MHA版本
CentOS 7.6 MySQL-5.7.25 mha4mysql-manager-0.57 mha4mysql-node-0.57

3、系统环境初始化

㈠ 修改主机名和hosts

  1. # hostnamectl set-hostname master.heima.cc
  2. # hostnamectl set-hostname slave1.heima.cc
  3. # hostnamectl set-hostname slave2.heima.cc
  4. # hostnamectl set-hostname mgr.heima.cc
  5. # cat /etc/hosts
  6. 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
  7. ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
  8. 10.1.1.10 master.heima.cc master
  9. 10.1.1.20 slave1.heima.cc slave1
  10. 10.1.1.30 slave2.heima.cc slave2
  11. 10.1.1.40 mgr.heima.cc mgr

㈡ 关闭防火墙和selinux

  1. # systemctl stop firewalld
  2. # systemctl disable firewalld
  3. # setenforce 0
  4. # sed -i '/SELINUX=enforcing/cSELINUX=disabled' /etc/selinux/config

㈢ 关闭NetworkManager服务

  1. # systemctl stop NetworkManager
  2. # systemctl disable NetworkManager

㈣ 配置yum源

说明:每台服务器都需要配置!

方案一:分别配置 aliyun、epel 和本地源;

  1. # rpm -ivh /soft/mha/epel-release-latest-7.noarch.rpm
  2. # cat server.repo
  3. [local]
  4. name=local yum
  5. baseurl=file:///mnt
  6. enabled=1
  7. gpgcheck=0
  8. [aliyun]
  9. name=this is aliyun yum
  10. baseurl=http://mirrors.aliyun.com/centos/7/os/x86_64/
  11. enabled=1
  12. gpgcheck=0

方案二:配置自建仓库,提前准备好软件包

注意:如果没有网络可以使用本地仓库,提前下载好包

  1. # cat server.repo
  2. [local]
  3. name=local yum
  4. baseurl=file:///mnt
  5. enabled=1
  6. gpgcheck=0
  7. [mha]
  8. name=mha soft
  9. baseurl=file:///soft/mha/mha-yum
  10. enabled=1
  11. gpgcheck=0
  12. 说明:
  13. 1)每台服务器都需要配置该文件
  14. 2)每台服务器都需要/soft/mha/mha-yum目录来保存相应的软件包

㈤ 安装依赖包

注意:所有服务器均需要安装

  1. yum -y install perl-DBD-MySQL \
  2. perl-Config-Tiny \
  3. perl-Time-HiRes \
  4. perl-Mail-Sender \
  5. perl-Mail-Sendmail \
  6. perl-MIME-Base32 \
  7. perl-MIME-Charset \
  8. perl-MIME-EncWords \
  9. perl-Params-Classify \
  10. perl-Params-Validate.x86_64 \
  11. perl-Log-Dispatch \
  12. perl-Parallel-ForkManager \
  13. net-tools

4、部署MySQL复制环境

㈠ MySQL部署规划

安装目录 数据库目录 配置文件 套接字文件 端口
/usr/local/mysql /usr/local/mysql/data /etc/my.cnf /usr/local/mysql/mysql.sock 3307

㈡ 搭建主从复制

① 创建配置文件
  • master
  1. [root@master ~]# cat /etc/my.cnf
  2. [mysqld]
  3. basedir=/usr/local/mysql
  4. datadir=/usr/local/mysql/data
  5. socket=/usr/local/mysql/mysql.sock
  6. port=3307
  7. log-error=/usr/local/mysql/master.err
  8. log-bin=/usr/local/mysql/data/binlog
  9. server-id=10
  10. character_set_server=utf8mb4
  11. gtid-mode=on
  12. log-slave-updates=1
  13. enforce-gtid-consistency
  14. [client]
  15. socket=/usr/local/mysql/mysql.sock
  • slave1
  1. [root@slave1 ~]# cat /etc/my.cnf
  2. [mysqld]
  3. basedir=/usr/local/mysql
  4. datadir=/usr/local/mysql/data
  5. socket=/usr/local/mysql/mysql.sock
  6. port=3307
  7. log-error=/usr/local/mysql/slave1.err
  8. relay-log=/usr/local/mysql/data/relaylog
  9. log-bin=/usr/local/mysql/data/binlog
  10. server-id=20
  11. character_set_server=utf8mb4
  12. log-slave-updates=1
  13. gtid-mode=on
  14. enforce-gtid-consistency
  15. skip-slave-start
  16. [client]
  17. socket=/usr/local/mysql/mysql.sock
  • slave2
  1. [root@slave2 ~]# cat /etc/my.cnf
  2. [mysqld]
  3. basedir=/usr/local/mysql
  4. datadir=/usr/local/mysql/data
  5. socket=/usr/local/mysql/mysql.sock
  6. port=3307
  7. log-error=/usr/local/mysql/slave2.err
  8. relay-log=/usr/local/mysql/data/relaylog
  9. log-bin=/usr/local/mysql/data/binlog
  10. server-id=30
  11. character_set_server=utf8mb4
  12. log-slave-updates=1
  13. gtid-mode=on
  14. enforce-gtid-consistency
  15. skip-slave-start
  16. [client]
  17. socket=/usr/local/mysql/mysql.sock

② 同步数据到从服务器
  1. [root@master ~]# rsync -av /usr/local/mysql 10.1.1.20:/usr/local/
  2. [root@master ~]# rsync -av /usr/local/mysql 10.1.1.30:/usr/local/
  3. 注意:
  4. 保证两台slave服务器上有mysql用户

③ 删除auto.cnf文件
  1. [root@master data]# rm -f auto.cnf
  2. [root@slave1 data]# rm -f auto.cnf
  3. [root@slave2 data]# rm -f auto.cnf
  4. 注意:三台服务器都删除

④ 启动数据库
  1. [root@master ~]# service mysql start
  2. [root@slave1 ~]# service mysql start
  3. [root@slave2 ~]# service mysql start

⑤ master创建复制用户
  1. mysql> create user 'slave'@'10.1.1.%' identified by '123';
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> grant replication slave on *.* to 'slave'@'10.1.1.%';
  4. Query OK, 0 rows affected (0.00 sec)
  5. mysql> flush privileges;
  6. Query OK, 0 rows affected (0.00 sec)
  7. 说明:创建MHA的监控用户和密码,为后续做准备
  8. mysql> create user 'mha'@'10.1.1.40' identified by '123';
  9. Query OK, 0 rows affected (0.01 sec)
  10. mysql> grant all privileges on *.* to 'mha'@'10.1.1.40';
  11. Query OK, 0 rows affected (0.00 sec)
  12. mysql> flush privileges;
  13. Query OK, 0 rows affected (0.00 sec)

⑥ slave上配置同步信息

注意:两台slave都需要配置

  1. mysql> change master to master_host='10.1.1.10',master_port=3307,master_user='slave',master_password='123',master_auto_position=1;
  2. mysql> start slave;
  3. Query OK, 0 rows affected (0.02 sec)

⑦ 测试验证

5、MHA软件安装

㈠ 不同节点安装软件

说明:在所有节点安装 mha-node 软件包,在 mha 管理端再安装 mha-manager 软件包

  1. [root@mgr ~]# yum y install mha4mysql-node-0.57-0.el7.noarch.rpm
  2. [root@master ~]# yum y install mha4mysql-node-0.57-0.el7.noarch.rpm
  3. [root@slave1 ~]# yum -y install mha4mysql-node-0.57-0.el7.noarch.rpm
  4. [root@slave2 ~]# yum y install mha4mysql-node-0.57-0.el7.noarch.rpm
  5. [root@mgr ~]# yum y install mha4mysql-manager-0.57-0.el7.noarch.rpm

㈡ 配置ssh互信

说明:

  1. 在生产环境中几乎都是禁止root远程登陆服务器的,所以ssh免密码登陆要在admin用户下进行配置,这是处于安全角度考虑出发。
  2. admin用户可以是任意普通用户
  3. 该普通用户用于mha的管理节点远程访问mysql复制组中的所有主机,完成一些其他工作

① 所有机器创建admin用户
  1. # useradd admin
  2. # echo 123|passwd --stdin admin

② 配置mgr主机到其他主机的admin用户互信
  1. mgr端:
  2. [root@mgr ~]# su - admin
  3. [admin@mgr ~]$ ssh-keygen -P "" -f ~/.ssh/id_rsa
  4. [admin@mgr ~]$ cd .ssh/
  5. [admin@mgr .ssh]$ ls
  6. id_rsa id_rsa.pub
  7. [admin@mgr .ssh]$ mv id_rsa.pub authorized_keys
  8. [admin@mgr .ssh]$ for i in 10 20 30;do scp -r ../.ssh/ 10.1.1.$i:~/;done
  9. 测试免密登录:
  10. [admin@mgr .ssh]$ ssh 10.1.1.10
  11. [admin@mgr .ssh]$ ssh 10.1.1.20
  12. [admin@mgr .ssh]$ ssh 10.1.1.30

㈢ 配置admin用户的sudo权限

  • 配置admin用户执行sudo命令权限
  1. [root@master ~]# vim /etc/sudoers.d/admin
  2. #User_Alias 表示具有sudo权限的用 户 列表; Host_Alias表示主机的列表
  3. User_Alias MYSQL_USERS = admin
  4. #Runas_Alias 表示用户以什么身份登录
  5. Runas_Alias MYSQL_RUNAS = root
  6. #Cmnd_Alias 表示允许执行命令的列表
  7. Cmnd_Alias MYSQL_CMNDS = /sbin/ifconfig,/sbin/arping
  8. MYSQL_USERS ALL = (MYSQL_RUNAS) NOPASSWD: MYSQL_CMNDS
  9. [root@master ~]# for i in 20 30;do scp /etc/sudoers.d/admin 10.1.1.$i:/etc/sudoers.d/;done
  • 测试admin用户是否可以挂载VIP
  1. [admin@master ~]$ sudo /sbin/ifconfig ens33:1 10.1.1.100 broadcast 10.1.1.255 netmask 255.255.255.0
  2. [admin@master ~]$ sudo /sbin/arping -fqc 5 -w 5 -I ens33 -s 10.1.1.100 -U 10.1.1.10
  3. [admin@master ~]$ ifconfig
  4. 补充:
  5. arping:用来向局域网内的其它主机发送ARP请求的指令,可以用来测试局域网内的某个IP是否已被使用。
  6. -f:收到第一个响应包后退出。
  7. -qquite模式,不显示输出。
  8. -c:发送指定的countARP REQUEST包后停止。如果指定了-w参数,则会等待相同数量的ARP REPLY包,直到超时为止。
  9. -w:指定一个超时时间,单位为秒,arping在到达指定时间后退出,无论期间发送或接收了多少包。在这种情况下,arping在发送完指定的count(-c)个包后并不会停止,而是等待到超时或发送的count个包都进行了回应后才会退出。
  10. -I:指定设备名,用来发送ARP REQUEST包的网络设备的名称。
  11. -D:重复地址探测模式,用来检测有没有IP地址冲突,如果没有IP冲突则返回0
  12. -s:设置发送ARP包的IP资源地址
  13. -U:无理由的(强制的)ARP模式去更新别的主机上的ARP CACHE列表中的本机的信息,不需要响应。
  14. -h:显示帮助页。

001.png

㈣ 创建mha相关配置文件

  • 创建 mha 相关的工作目录
  1. [root@mgr ~]# mkdir /etc/mha/
  2. [root@mgr ~]# mkdir -p /data/mha/masterha/app1
  3. [root@mgr ~]# chown -R admin. /data/mha
  • 创建mha局部配置文件
  1. [root@mgr ~]# cat /etc/mha/app1.conf
  2. [server default]
  3. # 设置监控用户和密码
  4. user=mha
  5. password=123
  6. # 设置复制环境中的复制用户和密码
  7. repl_user=slave
  8. repl_password=123
  9. # 设置ssh的登录用户名
  10. ssh_user=admin
  11. # 设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行failover
  12. ping_interval=3
  13. # 设置mgr的工作目录
  14. manager_workdir=/data/mha/masterha/app1
  15. # 设置mysql master保存binlog的目录,以便MHA可以找到master的二进制日志
  16. master_binlog_dir=/usr/local/mysql/data
  17. # 设置master的pid文件
  18. master_pid_file=/usr/local/mysql/data/master.heima.cc.pid
  19. # 设置mysql master在发生切换时保存binlog的目录(在mysql master上创建这个目录)
  20. remote_workdir=/data/mysql/mha
  21. # 设置mgr日志文件
  22. manager_log=/data/mha/masterha/app1/app1-3307.log
  23. # MHA到master的监控之间出现问题,MHA Manager将会尝试从slave1和slave2登录到master上
  24. secondary_check_script=/usr/bin/masterha_secondary_check -s 10.1.1.20 -s 10.1.1.30 --user=admin --port=22 --master_host=10.1.1.10 --master_port=3307
  25. # 设置自动failover时候的切换脚本
  26. master_ip_failover_script="/etc/mha/master_ip_failover.sh 10.1.1.100 1"
  27. # 设置手动切换时候的切换脚本
  28. #master_ip_online_change_script="/etc/mha/master_ip_online_change.sh 10.1.1.100 1"
  29. # 设置故障发生后关闭故障主机脚本
  30. # shutdown_script="/etc/mha/power_manager"
  31. [server1]
  32. hostname=10.1.1.10
  33. port= 3307
  34. candidate_master=1
  35. [server2]
  36. hostname=10.1.1.20
  37. port= 3307
  38. candidate_master=1
  39. [server3]
  40. hostname=10.1.1.30
  41. port= 3307
  42. candidate_master=1

㈤ 上传相应脚本

  1. [root@mgr ~]# ls /etc/mha/
  2. app1.conf master_ip_failover.sh
  3. 注意:脚本内容中要修改网卡名字和连接用户为admin
  4. my $vip = shift;
  5. my $interface = 'ens33'; 网卡名
  6. my $key = shift;
  7. ...
  8. sub stop_vip() {
  9. my $ssh_user = "admin"; 用户名
  10. print "=======$ssh_stop_vip==================\n";
  11. `ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
  12. }
  13. [root@mgr ~]# chmod +x /etc/mha/master_ip_*

6、检查ssh互信和集群状态

  • 检查ssh互信
  1. [admin@mgr ~]$ masterha_check_ssh --conf=/etc/mha/app1.conf
  2. Sat Apr 11 22:23:59 2020 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
  3. Sat Apr 11 22:23:59 2020 - [info] Reading application default configuration from /etc/mha/app1.conf..
  4. Sat Apr 11 22:23:59 2020 - [info] Reading server configuration from /etc/mha/app1.conf..
  5. Sat Apr 11 22:23:59 2020 - [info] Starting SSH connection tests..
  6. Sat Apr 11 22:24:00 2020 - [debug]
  7. Sat Apr 11 22:23:59 2020 - [debug] Connecting via SSH from admin@10.1.1.10(10.1.1.10:22) to admin@10.1.1.20(10.1.1.20:22)..
  8. Warning: Permanently added '10.1.1.20' (ECDSA) to the list of known hosts.
  9. Sat Apr 11 22:23:59 2020 - [debug] ok.
  10. Sat Apr 11 22:23:59 2020 - [debug] Connecting via SSH from admin@10.1.1.10(10.1.1.10:22) to admin@10.1.1.30(10.1.1.30:22)..
  11. Warning: Permanently added '10.1.1.30' (ECDSA) to the list of known hosts.
  12. Sat Apr 11 22:23:59 2020 - [debug] ok.
  13. Sat Apr 11 22:24:00 2020 - [debug]
  14. Sat Apr 11 22:23:59 2020 - [debug] Connecting via SSH from admin@10.1.1.20(10.1.1.20:22) to admin@10.1.1.10(10.1.1.10:22)..
  15. Sat Apr 11 22:24:00 2020 - [debug] ok.
  16. Sat Apr 11 22:24:00 2020 - [debug] Connecting via SSH from admin@10.1.1.20(10.1.1.20:22) to admin@10.1.1.30(10.1.1.30:22)..
  17. Warning: Permanently added '10.1.1.30' (ECDSA) to the list of known hosts.
  18. Sat Apr 11 22:24:00 2020 - [debug] ok.
  19. Sat Apr 11 22:24:01 2020 - [debug]
  20. Sat Apr 11 22:24:00 2020 - [debug] Connecting via SSH from admin@10.1.1.30(10.1.1.30:22) to admin@10.1.1.10(10.1.1.10:22)..
  21. Sat Apr 11 22:24:00 2020 - [debug] ok.
  22. Sat Apr 11 22:24:00 2020 - [debug] Connecting via SSH from admin@10.1.1.30(10.1.1.30:22) to admin@10.1.1.20(10.1.1.20:22)..
  23. Sat Apr 11 22:24:00 2020 - [debug] ok.
  24. Sat Apr 11 22:24:01 2020 - [info] All SSH connection tests passed successfully.
  25. [admin@mgr ~]$
  26. 以上信息说明ok
  • 检查集群状态
  1. [admin@mgr ~]$ masterha_check_repl --conf=/etc/mha/app1.conf
  2. Sat Apr 11 22:35:44 2020 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
  3. Sat Apr 11 22:35:44 2020 - [info] Reading application default configuration from /etc/mha/app1.conf..
  4. Sat Apr 11 22:35:44 2020 - [info] Reading server configuration from /etc/mha/app1.conf..
  5. Sat Apr 11 22:35:44 2020 - [info] MHA::MasterMonitor version 0.57.
  6. Sat Apr 11 22:35:45 2020 - [info] GTID failover mode = 1
  7. Sat Apr 11 22:35:45 2020 - [info] Dead Servers:
  8. Sat Apr 11 22:35:45 2020 - [info] Alive Servers:
  9. Sat Apr 11 22:35:45 2020 - [info] 10.1.1.10(10.1.1.10:3307)
  10. Sat Apr 11 22:35:45 2020 - [info] 10.1.1.20(10.1.1.20:3307)
  11. Sat Apr 11 22:35:45 2020 - [info] 10.1.1.30(10.1.1.30:3307)
  12. Sat Apr 11 22:35:45 2020 - [info] Alive Slaves:
  13. Sat Apr 11 22:35:45 2020 - [info] 10.1.1.20(10.1.1.20:3307) Version=5.7.25-log (oldest major version between slaves) log-bin:enabled
  14. Sat Apr 11 22:35:45 2020 - [info] GTID ON
  15. Sat Apr 11 22:35:45 2020 - [info] Replicating from 10.1.1.10(10.1.1.10:3307)
  16. Sat Apr 11 22:35:45 2020 - [info] Primary candidate for the new Master (candidate_master is set)
  17. Sat Apr 11 22:35:45 2020 - [info] 10.1.1.30(10.1.1.30:3307) Version=5.7.25-log (oldest major version between slaves) log-bin:enabled
  18. Sat Apr 11 22:35:45 2020 - [info] GTID ON
  19. Sat Apr 11 22:35:45 2020 - [info] Replicating from 10.1.1.10(10.1.1.10:3307)
  20. Sat Apr 11 22:35:45 2020 - [info] Primary candidate for the new Master (candidate_master is set)
  21. Sat Apr 11 22:35:45 2020 - [info] Current Alive Master: 10.1.1.10(10.1.1.10:3307)
  22. Sat Apr 11 22:35:45 2020 - [info] Checking slave configurations..
  23. Sat Apr 11 22:35:45 2020 - [info] Checking replication filtering settings..
  24. Sat Apr 11 22:35:45 2020 - [info] binlog_do_db= , binlog_ignore_db=
  25. Sat Apr 11 22:35:45 2020 - [info] Replication filtering check ok.
  26. Sat Apr 11 22:35:45 2020 - [info] GTID (with auto-pos) is supported. Skipping all SSH and Node package checking.
  27. Sat Apr 11 22:35:45 2020 - [info] Checking SSH publickey authentication settings on the current master..
  28. Sat Apr 11 22:35:45 2020 - [info] HealthCheck: SSH to 10.1.1.10 is reachable.
  29. Sat Apr 11 22:35:45 2020 - [info]
  30. 10.1.1.10(10.1.1.10:3307) (current master)
  31. +--10.1.1.20(10.1.1.20:3307)
  32. +--10.1.1.30(10.1.1.30:3307)
  33. Sat Apr 11 22:35:45 2020 - [info] Checking replication health on 10.1.1.20..
  34. Sat Apr 11 22:35:45 2020 - [info] ok.
  35. Sat Apr 11 22:35:45 2020 - [info] Checking replication health on 10.1.1.30..
  36. Sat Apr 11 22:35:45 2020 - [info] ok.
  37. Sat Apr 11 22:35:45 2020 - [info] Checking master_ip_failover_script status:
  38. Sat Apr 11 22:35:45 2020 - [info] /etc/mha/master_ip_failover.sh 10.1.1.100 1 --command=status --ssh_user=admin --orig_master_host=10.1.1.10 --orig_master_ip=10.1.1.10 --orig_master_port=3307
  39. Checking the Status of the script.. OK
  40. Sat Apr 11 22:35:45 2020 - [info] OK.
  41. Sat Apr 11 22:35:45 2020 - [warning] shutdown_script is not defined.
  42. Sat Apr 11 22:35:45 2020 - [info] Got exit code 0 (Not master dead).
  43. MySQL Replication Health is OK.
  44. 以上信息说明ok

7、检查MHA-Mgr状态

  1. [admin@mgr ~]$ masterha_check_status --conf=/etc/mha/app1.conf
  2. app1 is stopped(2:NOT_RUNNING).
  3. 开启MHA Manager监控:
  4. [admin@mgr ~]$ nohup masterha_manager --conf=/etc/mha/app1.conf --remove_dead_master_conf --ignore_last_failover &
  5. 再次查看监控状态:
  6. [admin@mgr ~]$ masterha_check_status --conf=/etc/mha/app1.conf
  7. app1 (pid:8913) is running(0:PING_OK), master:10.1.1.10
  8. 注意:
  9. 1. 如果正常,会显示”PING_OK ”,否则会显示”NOT_RUNNING ”,说明 MHA监控没有开启
  10. 2. 使用admin用户启动监控,否则会报权限拒绝
  11. 3. 手动停止监控命令:masterha_stop --conf=/etc/mha/app1.conf

二、自动Failover测试

1、安装测试工具

  1. [root@master ~]# yum -y install sysbench

2、 创建测试数据

  1. master服务器上创建测试库test
  2. mysql> create database test charset utf8mb4;
  3. Query OK, 1 row affected (0.17 sec)
  4. mysql> grant all on *.* to 'mha'@'localhost' identified by '123';
  5. Query OK, 0 rows affected (0.14 sec)
  6. mysql> flush privileges;
  7. Query OK, 0 rows affected (0.11 sec)
  8. mysql> exit
  9. Bye
  10. [root@master ~]# sysbench /usr/share/sysbench/oltp_read_only.lua \
  11. --mysql-host=10.1.1.10 --mysql-port=3307 --mysql-user=mha \
  12. --mysql-password=123 --mysql-socket=/usr/local/mysql/mysql.sock \
  13. --mysql-db=test --db-driver=mysql --tables=1 \
  14. --table-size=100000 --report-interval=10 --threads=128 --time=120 prepare
  15. mysql> select count(*) from sbtest1;
  16. +----------+
  17. | count(*) |
  18. +----------+
  19. | 100000 |
  20. +----------+
  21. 1 row in set (0.01 sec)

3、模拟故障

  1. [root@master ~]# service mysql stop
  2. Shutting down MySQL............ [ OK ]

4、查看切换过程

  1. [root@mgr ~]# tail -f /data/mha/masterha/app1/app1-3307.log

自动切换成功.png

三、经验值分享

1、管理节点配置文件错误

  1. [root@mgr ~]# cat /etc/mha/app1.conf
  2. [server default]
  3. # 设置监控用户和密码,该用户是master上创建的数据库管理账号,拥有所有权限
  4. user=mha
  5. password=123
  6. # 设置复制环境中的复制用户和密码,注意需要有以下权限:
  7. #REPLICATION SLAVE和REPLICATION CLIENT
  8. repl_user=slave
  9. repl_password=123
  10. # 设置ssh的登录用户名
  11. ssh_user=admin
  12. ....
  13. [server1]
  14. hostname=10.1.1.10
  15. port= 3307
  16. candidate_master=1
  17. [server2]
  18. hostname=10.1.1.20
  19. port= 3306
  20. candidate_master=1
  21. [server3]
  22. hostname=10.1.1.30
  23. port= 3306
  24. candidate_master=1
  25. 注意:一定要配置正确的IP和端口号

2、配置MHA时数据只读设置

错误1.png

解决办法:设置从服务器为只读

  1. mysql> set @@global.read_only=1;
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> show variables like 'read_only';
  4. +---------------+-------+
  5. | Variable_name | Value |
  6. +---------------+-------+
  7. | read_only | ON |
  8. +---------------+-------+
  9. 1 row in set (0.00 sec)

3、复制用户权限密码错误

错误2.png

原因:

  1. 复制用户slave没有相关权限,REPLICATION SLAVE和REPLICATION CLIENT
  2. 从服务器没有创建复制用户

4、其他错误

MHA集群至少需要2个slave,所以如果只有一台slave的话,检查也是通不过的!