MHA工作原理:

1)一主三从架构,主库挂了,但主库能被从库ssh上去的情况下,MHA从三个从库中选择同步最接近的作为新主,然后新主和s2,s3都ssh到原主上通过binlog补上还没有同步的数据,io_thread读取到binlog位置,传到save_binary_logs,然后回放,达到s1,s2,s3和原主一致。

(2)主库无法ssh上去的情况下,即主库的系统无法连接,假设有binlog server ,利用binlog补数据,和前面情况一样;

如果没有binlog server,假设s1靠前,s2和s3会通过relay-log和s1同步(所以从库的relay不能自动清除参数relay_log_purge = 0) ,提升s1为主,把s2和s3作为s1的从

实验环境:

rhel6.5 mysql5.7
master server1
slave server2. 3
MHA server4

部署数据同步

server1、serevr2、serevr3 做以下操作
如果之前安装过mysql,卸掉

rpm -qa |grep mysql   查看系统中是否有mysql包
rpm -e   --nodeps       删除

安装mysql

[[email protected] ~]# tar xf mysql-5.7.20-1.el6.x86_64.rpm-bundle.tar
[[email protected] ~]#  yum install -y mysql-community-client-5.7.20-1.el6.x86_64.rpm 
mysql-community-libs-compat-5.7.20-1.el6.x86_64.rpm 
mysql-community-common-5.7.20-1.el6.x86_64.rpm 
mysql-community-libs-5.7.20-1.el6.x86_64.rpm 
mysql-community-server-5.7.20-1.el6.x86_64.rpm 

编辑文件
server1、serevr2、serevr3只有serevr_id不同,其他内容不变

[[email protected] ~]# vim /etc/my.cnf
server_id=1
gtid_mode=ON 
enforce_gtid_consistency=ON 
master_info_repository=TABLE 
relay_log_info_repository=TABLE 
binlog_checksum=NONE 
log_slave_updates=ON 
log_bin=binlog 
binlog_format=ROW
打开mysql
[[email protected] ~]# /etc/init.d/mysqld start
查看端口是否开启
[[email protected] ~]# netstat -antlp |grep mysql
tcp        0      0 :::3306                     :::*               

安全初始化

查看mysql 初始密码
[[email protected] ~]# grep password /var/log/mysqld.log
2018-10-27T10:09:29.923519Z 1 [Note] A temporary password is generated for [email protected]: t1h5kLWl>Q9V
[[email protected] ~]# mysql_secure_installation  修改root用户密码

到此server1、serevr2、serevr3共同的操作完成
在master 上给slave 授权

[[email protected] ~]# mysql [email protected]
mysql> grant replication slave on *.* to [email protected]'172.25.77.%' identified by '[email protected]';

在两个slave 上指定master

[[email protected] ~]# mysql [email protected]
mysql> change master to master_host='172.25.77.1' , master_user='salt', master_password='[email protected]', MASTER_AUTO_POSITION=1;
mysql> start slave;
mysql> show slave status\G;

MHA实现mysql高可用
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
io线程和sql线程都开启则表示以上操作成功
测试是否同步
在master 端写入slave 端查看

master端
mysql> create database linux;
Query OK, 1 row affected (0.04 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| linux              |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.01 sec)

slave端
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| linux              |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

slave端与master端数据一致则表示数据同步成功

MHA切换

serevr4安装MHA

所需包

Installed:
  mha4mysql-manager.noarch 0:0.56-0.el6             
  mha4mysql-node.noarch 0:0.56-0.el6                
  perl-Config-Tiny.noarch 0:2.12-7.1.el6            
  perl-Email-Date-Format.noarch 0:1.002-5.el6       
  perl-Log-Dispatch.noarch 0:2.27-1.el6             
  perl-MIME-Lite.noarch 0:3.027-2.el6               
  perl-MIME-Types.noarch 0:1.28-2.el6               
  perl-Mail-Sender.noarch 0:0.8.16-3.el6            
  perl-Mail-Sendmail.noarch 0:0.79-12.el6           
  perl-Parallel-ForkManager.noarch 0:0.7.9-1.el6 

生成**:

[[email protected] ~]# ssh-******
[[email protected] ~]# ssh-copy-id 172.25.77.1
[[email protected] ~]# ssh-copy-id 172.25.77.2
[[email protected] ~]# ssh-copy-id 172.25.77.3

MHA实现mysql高可用
MHA实现mysql高可用
分发钥匙

[[email protected] ~]# cd .ssh/
[[email protected] .ssh]# ls
id_rsa  id_rsa.pub  known_hosts
[[email protected] .ssh]# scp id_rsa server1:.ssh/
[[email protected] .ssh]# scp id_rsa server2:.ssh/
[[email protected] .ssh]# scp id_rsa server3:.ssh/

在其他各个节点测试是否互相可以免密连接(如server1的操作)
MHA实现mysql高可用
在master 端创建监控用户同步到slave 端

mysql> grant all on *.* to [email protected]'172.25.77.%' identified by '[email protected]';
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> grant replication slave on *.* to [email protected]'172.25.77.%' identified by '[email protected]';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> 

在MHA 端

[[email protected] ~]# chmod +x /usr/local/bin/master_ip_failover  //给脚本加可执行权限
[[email protected] ~]# chmod +x /usr/local/bin/master_ip_online_change
[[email protected] ~]# mkdir /etc/mha
[[email protected] ~]# vim /etc/mha/mha.conf
[server default] 
manager_workdir=/etc/mha //设置manager的工作目录 
manager_log=/etc/mha/mha.log //设置manager的日志 
master_binlog_dir=/var/lib/mysql //设置master 保存binlog的位置,以便MHA可以找到master的日志 
#master_ip_failover_script=/usr/local/bin/master_ip_failover //设置自动failover时候的切换脚本 
#master_ip_online_change_script=/usr/local/bin/master_ip_online_change //设置手动切换时候的切换脚本 
user=root //设置监控用户root 
[email protected] //设置mysql中root用户的密码,这个密码是前文中创建监控用户的那个密码 
ping_interval=1 //设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行railover 
remote_workdir=/tmp //设置远端mysql在发生切换时binlog的保存位置 
repl_user=salt //设置复制环境中的复制用户名 
[email protected] //设置复制用户的密码 
#report_script=/usr/local/send_report //设置发生切换后发送的报警的脚本 
ssh_user=root //设置ssh的登录用户名 

[server1] 
hostname=172.25.77.1 
port=3306 

[server2] 
hostname=172.25.77.2 
port=3306 
#candidate_master=1 //设置为候选master 
#check_repl_delay=0 //默认情况下如果一个slave落后master 100M的relay logs的话,MHA将不会选择该slave作为一个新的master 

[server3] 
hostname=172.25.77.3 
port=3306 

检测ssh 与健康检查是否配置成功

[[email protected] ~]# masterha_check_ssh --conf=/etc/mha/mha.conf
Sat Oct 27 20:01:56 2018 - [info] All SSH connection tests passed successfully.

[[email protected] ~]# masterha_check_repl --conf=/etc/mha/mha.conf
MySQL Replication Health is OK.

测试:
手动在线切换

  • 在slave端查看现在的master是谁

MHA实现mysql高可用
在MHA 上手动切换master

masterha_master_switch --conf=/etc/mha/mha.conf --master_state=alive --new_master_host=172.25.77.2 --new_master_port=3306 --orig_master_is_new_slave

MHA实现mysql高可用
在slave 端查看是否成功
MHA实现mysql高可用
server2为新的master 原来的master变为slave
测试切换后是否同步:
在新master上写入数据

mysql> use linux ;
Database changed
mysql> create table info(
    -> username varchar(10) not null,
    -> password varchar(10) not null);
Query OK, 0 rows affected (0.07 sec)

mysql> insert into info values('user1','111');
Query OK, 1 row affected (0.02 sec)

mysql> select * from linux.info;
+----------+----------+
| username | password |
+----------+----------+
| user1    | 111      |
+----------+----------+
1 row in set (0.00 sec)

在slave端查看是否同步
MHA实现mysql高可用

手动故障切换

kill掉master 端的mysql进程

MHA实现mysql高可用
在MHA端手动切换坏掉的master

[[email protected] ~]# masterha_master_switch --conf=/etc/mha/mha.conf --master_state=dead --dead_master_host=172.25.77.2 --dead_master_port=3306 --new_master_host=172.25.77.1 --new_master_port=3306

MHA实现mysql高可用
在slave 端查看
成功替换掉坏的master
MHA实现mysql高可用
重新打开server2

Starting mysqld:                                           [  OK  ]
[[email protected] ~]# mysql [email protected]
mysql> change master to master_host='172.25.77.1' , master_user='salt' , master_password='[email protected]' , MASTER_AUTO_POSITION=1;
Query OK, 0 rows affected, 2 warnings (0.05 sec)

mysql> start slave;
Query OK, 0 rows affected (0.02 sec)
mysql> show slave status\G;

MHA实现mysql高可用
测试切换后是否同步
在master端写入数据

mysql> use linux;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> insert into info values('use2','123');
Query OK, 1 row affected (0.02 sec)

slave 端查看

mysql> select * from linux.info
    -> ;
+----------+----------+
| username | password |
+----------+----------+
| user1    | 111      |
| use2     | 123      |
+----------+----------+
2 rows in set (0.00 sec)

mysql> 

自动切换

删除MHA端的切换脚本,将服务打入后台

[[email protected] ~]# cd /etc/mha/
[[email protected] mha]# ls
mha.conf  mha.failover.complete
[[email protected] mha]# rm -fr mha.failover.complete 
[[email protected] mha]# nohup masterha_manager --conf=/etc/mha/mha.conf &
[1] 1698

关闭master端的mysql 进程
MHA实现mysql高可用
在其他主机上查看新master为谁
server3
MHA实现mysql高可用
显示serevr2现在为master
手动打开server1

[[email protected] ~]# /etc/init.d/mysqld start
Starting mysqld:                                           [  OK  ]
[[email protected] ~]# mysql [email protected]
mysql> change master to master_host='172.25.77.2', master_user='salt', master_password='[email protected]', MASTER_AUTO_POSITION=1;
Query OK, 0 rows affected, 2 warnings (0.07 sec)

mysql> start slave;
Query OK, 0 rows affected (0.02 sec)

mysql> show slave status\G;

MHA实现mysql高可用
检测切换后是否同步
在master端写入数据

mysql> use linux;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
mysql> insert into info values('user3','234');
Query OK, 1 row affected (0.01 sec)

在slave端是否同步
MHA实现mysql高可用

相关文章: