MySQL高可用MHA集群
Posted iouwenbo的博客~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL高可用MHA集群相关的知识,希望对你有一定的参考价值。
环境准备:
- client50做客户端。不需要运行mysql。不拷贝包。
- mysql51-55共5台虚拟机做集群。运行mysql,mysql为初始状态。拷贝mha-soft-student包
- host56做MHA管理主机。运行mysql。拷贝mha-soft-student包
主机名 | 作用 | IP地址 |
client50 | 客户端 | eth0:192.168.4.50/24 |
mysql51 | 主服务器 | eth0:192.168.4.51/24 |
mysql52 | 备份服务器 | eth0:192.168.4.52/24 |
mysql53 | 备份服务器 | eth0:192.168.4.53/24 |
mysql54 | 从服务器 | eth0:192.168.4.54/24 |
mysql55 | 从服务器 | eth0:192.168.4.55/24 |
host56 | 从服务器 | eth0:192.168.4.56/24 |
配置主节点
[[email protected] ~]# vim /etc/my.cnf
[mysqld]
log_bin=master51
server_id=51
binlog_format="mixed"
plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so" //加载主库、从库模块
rpl-semi-sync-master-enabled=1
rpl-semi-sync-slave-enabled=1
relay_log_purge=0 //关闭自动删除中继日志
[[email protected] ~]# systemctl restart mysqld
[[email protected] ~]# mysql -uroot -p123qqq...A
mysql> show master status;
mysql> show global variables where variable_name="relay_log_purge"; //确认已关闭自动删除中继日志
+---------------------+--------+
| Variable_name | Value |
+---------------------+--------+
| relay_log_purge | OFF |
+---------------------+--------+
1 row in set (0.00 sec)
//若未关闭,则set global relay_log_purge=off;
mysql> grant replication slave on *.* to [email protected]"%" identified by "123qqq...A"; //添加授权用户repluser
配置mysql52、53为mysql51的从库,并做备用主库的配置
注:52、53做相同操作
[[email protected] ~]# vim /etc/my.cnf
[mysqld]
log_bin=master52
server_id=52
binlog_format="mixed"
plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl-semi-sync-master-enabled=1
rpl-semi-sync-slave-enabled=1
relay_log_purge=0
[[email protected] ~]# systemctl restart mysqld
[[email protected] ~]# mysql -uroot -p123qqq...A
mysql> show master status;
mysql> show global variables where variable_name="relay_log_purge"; //确认关闭自动删除中继日志
mysql> grant replication slave on *.* to [email protected]"%" identified by "123qqq...A";
//配置mysql52为mysql51的从库
mysql> change master to master_host="192.168.4.51",master_user="repluser",master_password="123qqq...A",master_log_file="master51.000001",master_log_pos=441;
mysql> start slave;
mysql> show slave statusG;
配置mysql54、55为mysql51的从库
注意:54、55做类似操作
[[email protected] ~]# vim /etc/my.cnf
[mysqld]
server_id=54
plugin-load="rpl_semi_sync_slave=semisync_slave.so"
rpl-semi-sync-slave-enabled=1
relay_log_purge=0
[[email protected] ~]# systemctl restart mysqld
[[email protected] ~]# mysql -uroot -p123qqq...A
mysql> change master to master_host="192.168.4.51",master_user="repluser",master_password="123qqq...A",master_log_file="master51.000001",master_log_pos=441;
mysql> start slave;
mysql> show slave statusG;
检查上述配置
在主库服务器mysql51上建个库和表,并授权一个测试用户。
mysql> create database db1;
mysql> create table db1.a(id int);
mysql> grant select,insert on db1.* to [email protected]"%" identified by "123qqq...A";
在客户端用测试用户client登录主服务器mysql51,测试集群配置。
[[email protected] ~]# mysql -h192.168.4.51 -uclient -p123qqq...A
mysql> insert into db1.a values(123);
mysql> select * from db1.a;
配置MHA高可用
一、配置SSH
1.配置mysql51-55共5台服务器之间ssh密钥登录
以mysql51为例:(其他4台同样操作)
[[email protected] ~]# ssh-keygen -t rsa
[[email protected] ~]# for i in {52..55};do ssh-copy-id 192.168.4.$i ;done
验证ssh密钥登录是否成功。
再到其他4台服务器做同样操作。
2.配置管理主机(host56)可ssh密钥登录mysql51-55
操作同步骤1
二、装包
3.安装perl相关包(51-56主机)
# yum -y install perl-* //204个,约12min
4.安装MHA依赖包(51-56主机)
# unzip mha-soft-student.zip -d /root/
# cd /root/mha-soft-student/
# yum install -y prel-*.rpm //8个
5.安装mha_node软件包(51-56主机)
# cd /root/mha-soft-student/
# rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
6.安装mha-manger软件包(56主机),并建立管理命令
[[email protected] ~]# cd /root/mha-soft-student/
# tar -xf mha4mysql-manager-0.56.tar.gz
# cd mha4mysql-manager-0.56/
# perl Makefile.PL
# make
# make installcd
[[email protected] ~]# ls /usr/local/bin/masterha_* //查看是否有管理命令
若没有则:[[email protected] ~]# cp -r /root/mha-soft-student/mha4mysql-manager-0.56/bin/ /root/
三、配置
7.创建集群配置文件(56主机)
[[email protected] ~]# mkdir /etc/mha/
[[email protected] ~]# cp /root/mha-soft-student/mha4mysql-manager-0.56/samples/conf/app1.cnf /etc/mha/
[[email protected] ~]# vim /etc/mha/app1.cnf
[server default]
manager_workdir=/etc/mha
manager_log=/etc/mha/manager.log
master_ip_failover_script=/etc/mha/master_ip_failover
ssh_user=root
ssh_port=22
repl_user=repluser
repl_password=123qqq...A
user=root
password=123qqq...A
[server1]
hostname=192.168.4.51
port=3306
candidate_master=1
[server2]
hostname=192.168.4.52
port=3306
candidate_master=1
[server3]
hostname=192.168.4.53
port=3306
candidate_master=1
[server4]
hostname=192.168.4.54
port=3306
no_master=1
[server5]
hostname=192.168.4.55
port=3306
no_master=1
8. 创建vip地址切换脚本
从真机资料拷贝:
[[email protected] ~]# scp ‘/root/桌面/nsd1808笔记1229/software-2018/09.dba2/mha-soft-student/master_ip_failover‘ 192.168.4.56:/etc/mha/
[[email protected] ~]# vim /etc/mha/master_ip_failover
:35
my $vip = ‘192.168.4.100/24‘; # Virtual IP
[[email protected] ~]# chmod +x /etc/mha/master_ip_failover
9.在竞选主库服务器(51,52,53)上添加授权用户
[[email protected] ~]# mysql -uroot -p123qqq...A //在mysql51上操作
mysql> grant all on *.* to [email protected]"%" identified by "123qqq...A";
10.把vip地址 绑定在当前的主库服务器51的 eth0接口
[[email protected] ~]# ifconfig eth0:1 192.168.4.100
[[email protected] ~]# ifconfig eth0:1
eth0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.4.100 netmask 255.255.255.0 broadcast 192.168.4.255
ether 52:54:00:2f:7b:4f txqueuelen 1000 (Ethernet)
四、测试配置
11.在管理主机56 上测试配置
[[email protected] ~]# masterha_check_ssh --conf=/etc/mha/app1.cnf
......
Fri Jan 11 19:33:26 2019 - [info] All SSH connection tests passed successfully.
12.测试主从同步配置
[[email protected] ~]# masterha_check_repl --conf=/etc/mha/app1.cnf
......
MySQL Replication Health is OK.
五、启动服务
13.启动管理服务
[[email protected] ~]# masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover
新开一个终端查看状态:
[[email protected] ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:9748) is running(0:PING_OK), master:192.168.4.51
至此MHA高可用搭建完成!
停止服务的命令:# masterha_stop --conf=/etc/mha/app1.cnf
测试
客户端测试:
[[email protected] ~]# mysql -h192.168.4.51 -uclient -p123qqq...A
mysql> select @@hostname; //查看登录的服务器
+------------+
| @@hostname |
+------------+
| mysql51 |
+------------+
1 row in set (0.00 sec)
mysql> select * from db1.a;
+------+
| id |
+------+
| 123 |
+------+
1 row in set (0.00 sec)
mysql> insert into db1.a values(666);
Query OK, 1 row affected (0.11 sec)
模拟主服务器mysql51宕机:
[[email protected] ~]# systemctl stop mysqld
可看到masterha_manager检测到了mysql51故障,并做故障切换,然后masterha_manager服务将自动退出。
[[email protected] ~]# masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover
Fri Jan 11 19:36:11 2019 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Fri Jan 11 19:36:11 2019 - [info] Reading application default configuration from /etc/mha/app1.cnf..
Fri Jan 11 19:36:11 2019 - [info] Reading server configuration from /etc/mha/app1.cnf..
Creating /var/tmp if not exists.. ok.
Checking output directory is accessible or not..
ok.
Binlog found at /var/lib/mysql, up to master51.000001
Fri Jan 11 19:53:56 2019 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Fri Jan 11 19:53:56 2019 - [info] Reading application default configuration from /etc/mha/app1.cnf..
Fri Jan 11 19:53:56 2019 - [info] Reading server configuration from /etc/mha/app1.cnf..
[[email protected] ~]#
[[email protected] ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 is stopped(2:NOT_RUNNING).
[[email protected] ~]# ping 192.168.4.100 //VIP依然可ping通
PING 192.168.4.100 (192.168.4.100) 56(84) bytes of data.
64 bytes from 192.168.4.100: icmp_seq=1 ttl=64 time=0.620 ms
64 bytes from 192.168.4.100: icmp_seq=2 ttl=64 time=0.571 ms
64 bytes from 192.168.4.100: icmp_seq=3 ttl=64 time=0.610 ms
64 bytes from 192.168.4.100: icmp_seq=4 ttl=64 time=0.535 ms
^C
--- 192.168.4.100 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3000ms
rtt min/avg/max/mdev = 0.535/0.584/0.620/0.033 ms
[[email protected] ~]# mysql -h192.168.4.100 -uclient -p123qqq...A
mysql> select @@hostname; //mysql52自动切换成为主服务器
+-------------------+
| @@hostname |
+-------------------+
| mysql52 |
+-------------------+
1 row in set (0.01 sec)
mysql> insert into db1.a values(888);
Query OK, 1 row affected (0.07 sec)
mysql> select * from db1.a;
+------+
| id |
+------+
| 123 |
| 666 |
| 888 |
+------+
3 rows in set (0.00 sec)
[[email protected] ~]# ifconfig eth0:1 //VIP到了mysql52的eth0:1上
eth0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.4.100 netmask 255.255.255.0 broadcast 192.168.4.255
ether 52:54:00:46:8a:53 txqueuelen 1000 (Ethernet)
[[email protected] ~]# cat /etc/mha/app1.cnf //可看到配置文件中server1的配置已被自动清除
[server default]
manager_log=/etc/mha/manager.log
manager_workdir=/etc/mha
master_ip_failover_script=/etc/mha/master_ip_failover
password=123qqq...A
repl_password=123qqq...A
repl_user=repluser
ssh_port=22
ssh_user=root
user=root
[server2]
candidate_master=1
hostname=192.168.4.52
port=3306
[server3]
candidate_master=1
hostname=192.168.4.53
port=3306
[server4]
hostname=192.168.4.54
no_master=1
port=3306
[server5]
hostname=192.168.4.55
no_master=1
port=3306
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
将mysql51再加回集群中:
- 手动启动mysqld
- 恢复数据
- 配置为mysql52的从库
- 在管理主机masterha_manager的配置文件添加mysql51相关配置
- 重新开启MHA
[[email protected] ~]# mysqldump -uroot -p123qqq...A db1 > /root/db1.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[[email protected] ~]# scp /root/db1.sql 192.168.4.51:/root/
db1.sql 100% 1783 1.9MB/s 00:00
[[email protected] ~]#
[[email protected] ~]# systemctl start mysqld
[[email protected] ~]# mysql -uroot -p123qqq...A db1 < /root/db1.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
[[email protected] ~]# mysql -uroot -p123qqq...A
mysql> select * from db1.a;
mysql> change master to master_host="192.168.4.52",master_user="repluser",
-> master_password="123qqq...A",master_log_file="master52.000001",master_log_pos=1248;
mysql> start slave;
mysql> show slave statusG;
[[email protected] ~]# vim /etc/mha/app1.cnf
添加mysql51的配置:
[server1]
candidate_master=1
hostname=192.168.4.51
port=3306
[[email protected] ~]# masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover
以上是关于MySQL高可用MHA集群的主要内容,如果未能解决你的问题,请参考以下文章