MHA简介:
MHA,即MasterHigh Availability Manager and Toolsfor MySQL,是日本的一位MySQL专家采用Perl语言编写的一个脚本管理工具,该工具仅适用于MySQLReplication 环境,目的在于维持Master主库的高可用性。
MHA(Master High Availability)是自动的master故障转移和Slave提升的软件包.它是基于标准的MySQL复制(异步/半同步).
MHA组成部分:
MHA由两部分组成:
- MHA Manager(管理节点)
- MHA Node(数据节点)
MHA部署解读:
MHA Manager可以单独部署在一台独立机器上管理多个master-slave集群,也可以部署在一台slave上.MHA Manager探测集群的node节点,当发现master出现故障的时候,它可以自动将具有最新数据的slave提升为新的master,然后将所有其它的slave导向新的master上.整个故障转移过程对应用程序是透明的。
MHA node运行在每台MySQL服务器上(master/slave/manager),它通过监控具备解析和清理logs功能的脚本来加快故障转移的。
MHA优缺点介绍:
优点:
1. 故障切换时,可以自行判断哪个从库与主库的数据最接近,就切换到上面,可以减少数据的丢失,保证数据的一致性
2. 支持 binlog server,可提高 binlog 传送效率,进一步减少数据丢失风险。
3. 可以配置 mysql 5.7 的增强半同步,来保证数据的时时同步
缺点:
1. 自动切换的脚本太简单了,而且比较老化,建议后期逐渐完善。
2. 搭建 MHA 架构,需要开启 linux 系统互信协议,所以对于系统安全性来说,是个不小的考验。
原理介绍:
MHA的目的在于维持MySQL Replication中Master库的高可用性,其最大特点是可以修复多个Slave之间的差异日志,最终使所有Slave保持数据一致,然后从中选择一个充当新的Master,并将其它Slave指向它。
当master出现故障时,可以通过对比slave之间I/O thread 读取主库binlog的position号,选取最接近的slave做为备选主库(备胎)。其它的从库可以通过与备选主库对比生成差异的中继日志。在备选主库上应用从原来master保存的binlog,同时将备选主库提升为master。最后在其它slave上应用相应的差异中继日志并开始从新的master开始复制。
MHA工具包功能介绍:
- Manager工具:
1 2 3 4 5 6 7 |
#masterha_check_ssh : 检查MHA的SSH配置。
|
2. Node工具:
1 2 3 4 |
#save_binary_logs : 保存和复制master的二进制日志。
|
实战图表展示:
实战开始:
环境介绍:
1 2 3 4 |
192.168.56.100 master node
|
第一步操作:生成ssh无密钥证书
主库(100)执行生成密钥操作:
1 2 3 4 |
ssh -keygen -t dsa -P ‘‘ -f id_dsa
|
从库(101)执行生成密钥操作:
1 2 |
ssh -keygen -t dsa -P ‘‘ -f id_dsa
|
管理节点(102)生成密钥过程:
1 2 |
ssh -keygen -t dsa -P ‘‘ -f id_dsa
|
主库(100)执行接收密钥的过程:
1 2 |
scp 192.168.56.101: /root/ . ssh /id_dsa .pub . /id_dsa .pub.101
|
1 2 3 |
合并密钥:
|
在主库上传送合成密钥:
1 2 |
scp authorized_keys 192.168.56.101: /root/ . ssh /
|
在三台服务器上,编辑/etc/hosts文件,分别加入三台主机hostname
1 2 3 4 |
vim /etc/hosts
|
验证主机名登陆,密钥验证:
分别在三台机器上执行:
1 2 3 4 5 6 7 8 9 |
在192.168.56.100执行
|
搭建主从环境(一主两从架构,我这里是mysql 5.7版本)
在所有节点上都要执行
1 2 3 |
创建主从账号:
|
1 2 3 |
创建管理账号:
|
在Master(100)上面安装数据节点:
首先要先安装mysql依赖的perl环境
1 |
yum install perl-DBD-MySQL
|
解压数据节点的包
1 |
tar -zxvf mha4mysql-node-0.57. tar .gz
|
安装perl-cpan软件包
1 2 3 4 |
cd mha4mysql-node-0.57
|
在从库(101)上面安装数据节点:
同主库一样的安装操作;
在manager管理节点(102)上面安装管理节点:
首先先要安装环境需要的介质包
1 2 3 4 5 |
yum install -y perl-DBD-MySQL*
|
再安装数据节点:
1 2 3 4 5 |
tar -zxvf mha4mysql-node-0.57. tar .gz
|
最后安装管理节点:
1 2 3 4 |
tar -zxvf mha4mysql-manager-0.57. tar .gz
|
环境配置,基础安装操作完成。
下面来进行管理节点MHA配置:
创建mha家目录,编辑启动配置文件
1 2 |
mkdir -p /usr/local/mha
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
编辑MHA配置文件
|
1 2 3 4 5 6 |
[server1]
|
1 2 3 4 5 6 |
[server2]
|
1 2 3 4 5 6 |
[server3]
|
创建failover,online 脚本的目录
1 |
mkdir -p /usr/local/scripts
|
编辑failover切换脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
vim master_ip_failover
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
sub main {
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
sub start_vip() {
|
编辑online_change的脚本:
cd /usr/local/scripts/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
vim master_ip_online_change
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
sub main {
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
elsif ( $ command eq "status" ) {
|
创建完两个脚本,记得赋予执行权限
利用mha工具检测ssh
安装需要的环境包:
1 |
yum -y install perl-Time-HiRes
|
执行检测命令;
1 |
/usr/local/bin/masterha_check_ssh --conf= /etc/mha/mha .conf
|
检测结果显示:都为OK,代表ssh检测成功
结果展示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
Sun Jul 23 09:39:09 2017 - [warning] Global configuration file /etc/masterha_default .cnf not found. Skipping.
|
在主库(100)执行添加vip的过程:(第一次手动添加)
1 |
ip addr add 192.168.56.123 dev eth0
|
在管理节点(102)上,执行mha的启动
1 |
nohup masterha_manager --conf= /etc/mha/mha .conf > /tmp/mha_manager .log < /dev/null 2>&1 &
|
验证启动成功的命令:查看显示状态
1 |
masterha_check_status --conf= /etc/mha/mha .conf
|
模拟主库故障,查看是否自动切换:
在主库(100)上面执行停掉mysql操作。
1 2 |
mysqladmin -uroot -proot123 shutdown
|
切换后,MHA进程会自动停止运行
在管理节点查看:
1 2 |
masterha_check_status --conf= /etc/mha/mha .conf
|
恢复操作:
把宕掉的主库192.168.56.100恢复起来;
1 |
/usr/local/mysql/bin/mysqld_safe --defaults- file = /etc/my .cnf &
|
验证结果:重新指向现在的主库192.168.56.101
主从状态一切ok!