实验环境:
servre5:MHA
server2:master
server3,server4:slave
1:server4:安装MHA所需插件
[root@server5 ~]# yum install -y mha4mysql-manager-0.56-0.el6.noarch.rpm perl-Config-Tiny-2.12-7.1.el6.noarch.rpm perl-Email-Date-Format-1.002-5.el6.noarch.rpm perl-Log-Dispatch-2.27-1.el6.noarch.rpm perl-Mail-Sender-0.8.16-3.el6.noarch.rpm perl-Mail-Sendmail-0.79-12.el6.noarch.rpm perl-MIME-Lite-3.027-2.el6.noarch.rpm perl-MIME-Types-1.28-2.el6.noarch.rpm perl-Parallel-ForkManager-0.7.9-1.el6.noarch.rpm
[root@server5 ~]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm [email protected]:/root/
[root@server5 ~]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm [email protected]:/root/
[root@server5 ~]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm [email protected]:/root/
2:master和slave安装所需插件
server2:
yum install mha4mysql-node-0.56-0.el6.noarch.rpm
设置master状态,连接超时,也可以不在数据库里面进行操作,可以写在配置文件里,然后在启动mysql服务
mysql> SET GLOBAL rpl_semi_sync_master_enabled=1; Query OK, 0 rows affected (0.00 sec)
mysql> SET GLOBAL rpl_semi_sync_master_timeout=1000000000000;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like '%rpl%';
+-------------------------------------------+---------------+
| Variable_name | Value |
+-------------------------------------------+---------------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_master_timeout | 1000000000000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_for_slave_count | 1 |
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_semi_sync_master_wait_point | AFTER_SYNC |
| rpl_semi_sync_slave_enabled | OFF |
| rpl_semi_sync_slave_trace_level | 32 |
| rpl_stop_slave_timeout | 31536000 |
+-------------------------------------------+---------------+
9 rows in set (0.01 sec)
mysql> show status like'%rpl%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 1 |
| Rpl_semi_sync_master_net_avg_wait_time | 0 |
| Rpl_semi_sync_master_net_wait_time | 0 |
| Rpl_semi_sync_master_net_waits | 0 |
| Rpl_semi_sync_master_no_times | 0 |
| Rpl_semi_sync_master_no_tx | 0 |
| Rpl_semi_sync_master_status | ON |
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 0 |
| Rpl_semi_sync_master_tx_wait_time | 0 |
| Rpl_semi_sync_master_tx_waits | 0 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 0 |
| Rpl_semi_sync_slave_status | OFF |
+--------------------------------------------+-------+
15 rows in set (0.00 sec)
server3:
yum install mha4mysql-node-0.56-0.el6.noarch.rpm
server4:
yum install mha4mysql-node-0.56-0.el6.noarch.rpm
[root@server4 ~]# mysql -pYz123456@
mysql> stop slave;
mysql> change master to master_host='172.25.36.2',master_user='repl',master_passwod='Westos+007',master_auto_position=1;
mysql> start slave;
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.25.36.2
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
三个节点保证配置文件相同,并且都安装了主从复制的插件
以一为列:
[root@server2 ~]# vim /etc/my.cnf
server-id=2
log-bin=mysql-bin
gtid_mode=ON
enforce-gtid-consistency=true
rpl_semi_sync_master_enabled=1
loose-rpl_semi_sync_slave_enabled=1
[root@server3 ~]# vim /etc/my.cnf
server-id=3
log-bin=mysql-bin
gtid_mode=ON
enforce-gtid-consistency=true
relay_log_recovery=ON :server3作为备用的master必须有这个参数,保证在升为master后可以生成被复制的文件
rpl_semi_sync_slave_enabled=1
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000000000 ##设置连接超时
[root@server4 ~]# vim /etc/my.cnf
server-id=4
log-bin=mysql-bin
gtid_mode=ON
enforce-gtid-consistency=true
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000000000 ##设置连接超时
rpl_semi_sync_slave_enabled=1
#所有节点都需要安装
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
ysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
并且激活主从复制
server5上生成钥匙进行免密操作:
server5连接server2,server3,server4都不需要密码
[root@server5 ~]# ssh-keygen
[root@server5 ~]# ssh-copy-id server2
[root@server5 ~]# ssh-copy-id server3
[root@server5 ~]# ssh-copy-id server4
[root@server5 ~]# ssh server2
Last login: Mon Feb 25 20:47:01 2019 from foundation36.ilt.example.com
3:server5上编辑配置文件:
创建目录:
[root@server5 ~]# mkdir /etc/masterha
[root@server5 ~]# cd /etc/masterha/
[root@server5 masterha]# vim app1.conf
[server default]
manager_workdir=/etc/masterha/
manager_log=/etc/masterha/manager.log
master_binlog_dir=/etc/masterha
#master_ip_failover_script=/usr/local/bin/master_ip_failover
#master_ip_online_change_script= /usr/local/bin/master_ip_online_change
password=Yz123456@
user=root
ping_interval=1
remote_workdir=/tmp
repl_password=Yz123456@
repl_user=repl
#report_script=/usr/local/send_report
#secondary_check_script= /usr/local/bin/masterha_secondary_check -s server03 -s server02
#shutdown_script=""
ssh_user=root
[server2]
hostname=172.25.36.2
port=3306
[server3]
hostname=172.25.36.3
port=3306
candidate_master=1
check_repl_delay=0
[server4]
hostname=172.25.36.4
port=3306
no_master=1
4:要求不仅是server(MHA)要实现和server2(master)server3,server4(slave)实现免密连接,server2,srever3,server
4之间也要是、实现相互的免密连接
[root@server5 ~]# cd .ssh/
[root@server5 .ssh]# ls
id_rsa id_rsa.pub known_hosts
[root@server5 .ssh]# cd
[root@server5 ~]# scp -r .ssh/ server2:
[root@server5 ~]# scp -r .ssh/ server3:
[root@server5 ~]# scp -r .ssh/ server4:
5:检查是否通过:
[root@server5 ~]# masterha_check_ssh --conf=/etc/masterha/app1.conf ##需要看到最后为successfully
Tue Feb 26 01:18:35 2019 - [info] All SSH connection tests passed successfully.
[root@server5 masterha]# masterha_check_repl --conf=/etc/masterha/app1.conf ##最后显示为ok
MySQL Replication Health is OK.
6:server2:master授权
[root@server2 ~]# mysql -p ##master授权
mysql> grant all on *.* to root@'%' identified by 'Yz123456@';
7:server3,server4:(server3,server4都是server2的slave)
[root@server3 ~]# mysql -p
mysql> set GLOBAL read_only=1;
[root@server4 ~]# mysql -p
mysql> set GLOBAL read_only=1;
8:检测 进行主从切换实验:
一:关闭之前之前的master
1:先关闭之前的master(server2)
2:[root@server5 masterha]# masterha_master_switch --conf=/etc/masterha/app1.conf --master_state=dead --dead_master_host=172.25.36.2 --dead_master_port=3306 --new_master_host=172.25.36.3 --new_master_port=3306
3:在server2上:
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)
mysql> CHANGE MASTER TO MASTER_HOST='172.25.36.3', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='Yz123456@';
Query OK, 0 rows affected, 2 warnings (0.02 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show status slave\G;
二:热部署,不关闭之前之前的master
1:删除:
[root@server5 masterha]# ls
app1.conf app1.failover.complete
[root@server5 masterha]# rm -f app1.failover.complete
[root@server5 masterha]# ls
app1.conf
[root@server5 masterha]# masterha_master_switch --conf=/etc/masterha/app1.conf --master_state=alive --new_master_host=172.25.36.2 --new_master_port=3306 --orig_master_is_new_slave ##此时切换到server2上去了,之前在server3上
三:自动切换master
1:[root@server5 masterha]# nohup masterha_manager --conf=/etc/masterha/app1.conf &> /dev/null &
[1] 13856
2:关闭之前之前的master
[root@server2 ~]# ps ax | grep mysql
2696 ? Sl 0:01 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
2750 pts/0 S+ 0:00 grep --color=auto mysql
一会之后:
[root@server5 masterha]#
[root@server5 masterha]#
[1]+ Done nohup masterha_manager --conf=/etc/masterha/app1.conf &>/dev/null
[root@server2 ~]# kill -9 2696
[root@server2 ~]# ps ax | grep mysql
2774 ? Sl 0:00 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
2811 pts/0 S+ 0:00 grep --color=auto mysql
[root@server2 ~]# systemctl stop mysqld
此时发现master在server3上:
打开server2,mysqld服务;
mysql> CHANGE MASTER TO MASTER_HOST='172.25.36.3',MASTER_PORT=3306, MASTER_AUTO_POSITION=1,MASTER_USER='repl',MASTER_PASSWORD='Yz123456@';
Query OK, 0 rows affected, 2 warnings (0.02 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G;
9:vip
vip
[root@server5 bin]# vim master_ip_failover
my $vip = '172.25.36.100/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
[root@server5 bin]# vim master_ip_online_change
my $vip = '172.25.36.100/24'; # Virtual IP
my $key = "1";
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
my $exit_code = 0;
masters上:
[root@server3 ~]# ip addr add 172.25.36.100/24 dev eth0
[root@server5 bin]# masterha_master_switch --conf=/etc/masterha/app1.conf --master_state=alive --new_master_host=172.25.36.2 --new_master_port=3306 --orig_master_is_new_slave
此时vip就跑到server2上
此时原远程连接,看到的就是server2上:
[root@foundation36 Desktop]# mysql -h 172.25.36.100 -u proxy -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 34
Server version: 5.7.24-log MySQL Community Server (GPL)
Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| westos |
+--------------------+
2 rows in set (0.01 sec)
MySQL [(none)]>
MySQL [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| westos |
+--------------------+
2 rows in set (0.00 sec)
MySQL [(none)]> use westos;
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 [westos]> select * from usertb;
MySQL [westos]> show tables;
+------------------+
| Tables_in_westos |
+------------------+
| linux |
+------------------+
1 row in set (0.00 sec)
MySQL [westos]> desc linux;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| username | varchar(10) | NO | | NULL | |
| password | varchar(20) | NO | | NULL | |
+----------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
MySQL [westos]> select * from linux; ##此时都是在server3上看到的
+----------+----------+
| username | password |
+----------+----------+
| yz | 123 |
| yy | 666 |
+----------+----------+
[root@server5 bin]# nohup masterha_manager --conf=/etc/masterha/app1.conf &> /dev/null & ##将master换到server2上
[1] 14052
[root@server5 bin]#
[1]+ Exit 1 nohup masterha_manager --conf=/etc/masterha/app1.conf &>/dev/null
关闭server2的mysqld服务
MySQL [westos]> select * from linux;
+----------+----------+
| username | password |
+----------+----------+
| yz | 123 |
| yy | 666 |
+----------+----------+