MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司的youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。
该软件由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。MHA Node运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。
在MHA自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据的不丢失,但这并不总是可行的。例如,如果主服务器硬件故障或无法通过ssh访问,MHA没法保存二进制日志,只进行故障转移而丢失了最新的数据。使用MySQL 5.5的半同步复制,可以大大降低数据丢失的风险。MHA可以与半同步复制结合起来。如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性。
主机 | 应用 | ip |
---|---|---|
server1 | MHA manager(管理节点) | 172.25.4.1 |
server2 | MHA node(数据节点) | 172.25.4.2 |
server3 | MHA node(数据节点) | 172.25.4.3 |
master端(server1):
1.解压并安装数据库
[root@server1 ~]# ls
mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar
[root@server1 ~]# tar -xf mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar
[root@server1 ~]# ls
[root@server1 ~]# ]yum install -y mysql-community-client-5.7.24-1.el7.x86_64.rpm mysql-community-common-5.7.24-1.el7.x86_64.rpm mysql-community-libs-5.7.24-1.el7.x86_64.rpm mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm mysql-community-server-5.7.24-1.el7.x86_64.rpm
[root@server1 ~]# scp mysql-community-client-5.7.24-1.el7.x86_64.rpm mysql-community-common-5.7.24-1.el7.x86_64.rpm mysql-community-libs-5.7.24-1.el7.x86_64.rpm mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm mysql-community-server-5.7.24-1.el7.x86_64.rpm [email protected]:/root
[root@server1 ~]# scp mysql-community-client-5.7.24-1.el7.x86_64.rpm mysql-community-common-5.7.24-1.el7.x86_64.rpm mysql-community-libs-5.7.24-1.el7.x86_64.rpm mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm mysql-community-server-5.7.24-1.el7.x86_64.rpm [email protected]:/root
2.编辑配置文件并开启数据库
[root@server1 ~]# vim /etc/my.cnf
server-id=1
log_bin=binlog ##开启二进制日志
gtid_mode=ON 开启gtid模式
enforce-gtid-consistency=ON
log_slave_updates=ON ##更新数据库到二进制日志中
[root@server1 ~]# systemctl start mysqld
[root@server1 ~]# cat /var/log/mysqld.log | grep password
2019-03-04T09:02:46.452639Z 1 [Note] A temporary password is generated for root@localhost: d;Kju!5Ige:/
[root@server1 ~]# mysql_secure_installation
[root@server1 ~]# mysql -p
mysql> grant replication slave on *.* to yang@'172.25.4.%' identified by 'Yang+0428';
mysql> flush privileges;
[root@server2 ~]# ls
mysql-community-client-5.7.24-1.el7.x86_64.rpm
mysql-community-common-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm
mysql-community-server-5.7.24-1.el7.x86_64.rpm
[root@server2 ~]# yum install -y mysql-community-client-5.7.24-1.el7.x86_64.rpm mysql-community-common-5.7.24-1.el7.x86_64.rpm mysql-community-libs-5.7.24-1.el7.x86_64.rpm mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm mysql-community-server-5.7.24-1.el7.x86_64.rpm
2.编辑配置文件,并开启数据库
[root@server2 ~]# vim /etc/my.cnf ##在最后写入以下内容(与server1的只有servcer-id不同)
server-id=2
log_bin=binlog
gtid_mode=ON
enforce-gtid-consistency=ON
[root@server2 ~]# systemctl start mysqld
3.获取初始密码,进行初始化
[root@server2 ~]# cat /var/log/mysqld.log | grep password
2019-03-04T09:11:18.048879Z 1 [Note] A temporary password is generated for root@localhost: pduM(waJV5?W
[root@server2 ~]# mysql_secure_installation
4.登陆数据库,添加gtid复制模式
[root@server2 ~]# mysql -p
mysql> change master to master_host='172.25.4.1',master_user='yang',master_password='Yang+0428',master_auto_position=1; ##
mysql> start slave;
mysql> show slave status\G; ##查看slave状态,以下两项为yes即可
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
== slave端(server3)配置步骤与server2一样,只是编辑配置文件时的server-id=3即可 ==
master端(server1):
1.登陆数据库,安装插件并开启
[root@server1 ~]# mysql -p
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so'; ##安装master插件
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; ##安装slave插件,因为后面server1会切换成slave
mysql> SET GLOBAL rpl_semi_sync_master_enabled=1; ##启动插件
mysql> SET GLOBAL rpl_semi_sync_slave_enabled=1;
mysql> SET GLOBAL rpl_semi_sync_master_timeout=100000000; ##设置延迟时间,越大越好,保证数据一致性
mysql> show variables like '%rpl%'; ##查看半同步状态
slave端(server2):
1.登陆数据库,安装插件并开启
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql> SET GLOBAL rpl_semi_sync_slave_enabled=1;
mysql> stop slave io_thread; ##重起io线程,先关掉在开启
mysql> start slave io_thread;
mysql> show variables like '%rpl%';
slave端(server3):
== slave端(server3)与server2操作一样==
1.主库创建表并插入信息:
mysql> create database westos;
mysql> use westos;
mysql> create table userlist (
-> username varchar(15) not null,
-> password varchar(10) not null);
mysql> insert into userlist values ('user1','123');
2.两个从库端查看数据是否同步
server2:
server3:
1.安装mha manager管理节点需要的包
[root@server1 MHA-7]# pwd
/root/MHA-7
[root@server1 MHA-7]# ls
mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
mha4mysql-manager-0.58.tar.gz
mha4mysql-node-0.58-0.el7.centos.noarch.rpm
perl-Config-Tiny-2.14-7.el7.noarch.rpm
perl-Email-Date-Format-1.002-15.el7.noarch.rpm
perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm
perl-Mail-Sender-0.8.23-1.el7.noarch.rpm
perl-Mail-Sendmail-0.79-21.el7.noarch.rpm
perl-MIME-Lite-3.030-1.el7.noarch.rpm
perl-MIME-Types-1.38-2.el7.noarch.rpm
perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm
[root@server1 MHA-7]# yum install -y *
拷贝MHA node数据节点需要的包到从库端,并在从库端进行安装
[root@server1 MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm server2:
[root@server1 MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm server3:
[root@server2 ~]# yum install -y mha4mysql-node-0.58-0.el7.centos.noarch.rpm
[root@server3 ~]# yum install -y mha4mysql-node-0.58-0.el7.centos.noarch.rpm
2.主从间设置ssh免密
1).管理节点可以免密登陆数据节点
[root@server1 MHA-7]# ssh-keygen
[root@server1 MHA-7]# ssh-copy-id server1
[root@server1 MHA-7]# ssh-copy-id server2
[root@server1 MHA-7]# ssh-copy-id server3
[root@server1 ~]# cd .ssh/
[root@server1 .ssh]# ls
authorized_keys id_rsa id_rsa.pub known_hosts
[root@server1 .ssh]# cd
[root@server1 ~]# scp -r .ssh/ server2:
[root@server1 ~]# scp -r .ssh/ server3:
[root@server1 ~]# mkdir /etc/masterha
[root@server1 ~]# cd /etc/masterha/
[root@server1 masterha]# vim app1.conf
[server default]
manager_workdir=/etc/masterha ##manager工作目录
manager_log=/var/log/masterha.log ##manager日志存放路径
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=Yang+0428 ##管理员密码
user=root ##管理员用户
ping_interval=1 ##设定监控频率,默认为3秒,如果三次没有回应自动进行railover
remote_workdir=/tmp
repl_password=Yang+0428
repl_user=yang
#report_script=/usr/local/send_report
#secondary_check_script=/usr/local/bin/masterha_secondary_check -s server03 -s server02
#shutdown_script=""
ssh_user=root ##免密用户
[server1]
hostname=172.25.4.1
port=3306
[server2]
hostname=172.25.4.2
port=3306
candidate_master=1
check_repl_delay=0
4.检测:
1).检测ssh免密
[root@server1 masterha]# masterha_check_ssh --conf=/etc/masterha/app1.conf
[root@server1 masterha]# masterha_check_repl --conf=/etc/masterha/app1.conf
== 此时会报错,因为master端没有给root用户权限,给root权限后再次执行即可成功==
mysql> grant all on *.* to root@'%' identified by 'Yang+0428';
[root@server1 masterha]# masterha_check_repl --conf=/etc/masterha/app1.conf
手动切换:
1.模拟主库宕机,并进行手动切换
[root@server2 ~]# systemctl stop mysqld
[root@server1 masterha]# masterha_master_switch --master_state=dead --conf=/etc/masterha/app1.conf --dead_master_host=172.25.4.1 --dead_master_ip=172.25.4.1 --dead_master_port=3306 --new_master_host=172.25.4.2 --new_master_port=3306 ##手动切换
2.server2端查看,此时server2节点接管master
3.server3查看master已经切换为172.25.4.2(server2)
4.开启server1端数据库,手动将其添加到slave中
[root@server1 masterha]# systemctl start mysqld
[root@server1 masterha]# mysql -p
mysql> change master to master_host='172.25.4.2',master_user='yang',master_password='Yang+0428',master_auto_position=1;
mysql> start slave;
mysql> show slave status\G; ##查看slave状态,master为172.25.4.2(server2)
热切换:主库状态良好状态时手动切换
1.删除app1.failover.complete文件
[root@server1 masterha]# ls
app1.conf app1.failover.complete
[root@server1 masterha]# rm -rf app1.failover.complete
[root@server1 masterha]# ls
app1.conf
2.进行切换
[root@server1 masterha]# masterha_master_switch --conf=/etc/masterha/app1.conf --master_state=alive --new_master_host=172.25.4.1 --new_master_port=3306 --orig_master_is_new_slave
3.server1查看,以为master
4.server2与server3查看master为172.25.4.1(server1)
自动切换:
1.设定自动切换
[root@server1 masterha]# nohup masterha_manager --conf=/etc/masterha/app1.conf &> /dev/null &
2.停掉server1的数据库,master会自动切换到其他两台
3.server2查看状态
4.server3查看slave状态信息,master为172.25.4.2
5.开启server1数据库并添加到slave中
mysql> change master to master_host='172.25.4.2',master_user='yang',master_password='Yang+0428',master_auto_position=1;
mysql> start slave;
mysql> show slave status\G;
1.下载两个脚本
[root@server1 bin]# ls
master_ip_failover master_ip_online_change
2.编辑两个脚本
[root@server1 bin]# vim master_ip_failover ##此脚本实现手动切换vip
11 my $vip = '172.25.4.100/24';
12 my $ssh_start_vip = "/sbin/ip addr add $vip dev eth0";
13 my $ssh_stop_vip = "/sbin/ip addr del $vip dev eth0";
[root@server1 bin]# vim master_ip_online_change ##此脚本实现自动切换vip
my $vip = '172.25.4.100/24';
my $ssh_start_vip = "/sbin/ip addr add $vip dev eth0";
my $ssh_stop_vip = "/sbin/ip addr del $vip dev eth0";
my $exit_code = 0;
[root@server1 bin]# ll
total 8
-rw-r--r-- 1 root root 2156 Mar 4 18:50 master_ip_failover
-rw-r--r-- 1 root root 3809 Mar 4 18:50 master_ip_online_change
[root@server1 bin]# chmod +x *
[root@server1 bin]# ll
total 8
-rwxr-xr-x 1 root root 2156 Mar 4 18:50 master_ip_failover
-rwxr-xr-x 1 root root 3809 Mar 4 18:50 master_ip_online_change
[root@server1 masterha]# ls
app1.conf app1.failover.complete
[root@server1 masterha]# rm -rf app1.failover.complete
[root@server1 masterha]# pwd
/etc/masterha
[root@server1 masterha]# vim app1.conf ##将下面两行注释去掉
master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
5.给master端添加vip172.25.4.100
1.手动热切换,停掉master端(server2)数据库,并进行切换
[root@server2 masterha]# systemctl stop mysqld
[root@server1 masterha]# masterha_master_switch --conf=/etc/masterha/app1.conf --master_state=alive --new_master_host=172.25.4.1 --new_master_port=3306 --orig_master_is_new_slave
server1查看ip,vip以漂移到
server3登陆数据库查看slave状态,此时master为172.25.4.1
2.自动切换:
[root@server1 masterha]# nohup masterha_manager --conf=/etc/masterha/app1.conf &> /dev/null &
[1] 12378
[root@server1 masterha]# systemctl stop mysqld
[1]+ Done nohup masterha_manager --conf=/etc/masterha/app1.conf &>/dev/null