MySQL的高可用(MHA)

一.MHA简介:
  • 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服务器上,因此可以保证所有节点的数据一致性。

二.实验环境(RHEL7.3):
主机应用ip
server1MHA manager(管理节点)172.25.4.1
server2MHA node(数据节点)172.25.4.2
server3MHA node(数据节点)172.25.4.3
三.MHA实验前提:搭建好基于gtid的一主二从复制及半同步复制
1.基于gtid的主从复制:

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

在这里插入图片描述
将需要的安装包拷贝到server2与server3上

[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 root@172.25.4.2:/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 root@172.25.4.3:/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

在这里插入图片描述
3.查看初始密码并进行初始化

[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 

在这里插入图片描述
4.登陆数据库进行用户授权,并刷新授权表

[root@server1 ~]# mysql -p
mysql> grant replication slave on *.* to yang@'172.25.4.%' identified by 'Yang+0428';
mysql> flush privileges;

在这里插入图片描述
slave端(server2):
1.安装数据库

[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即可 ==

2.半同步复制:

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:
在这里插入图片描述

四.MHA配置:

== 主从端都有相应的解析==
在这里插入图片描述

MHA manager端(server1)配置:

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

在这里插入图片描述
在这里插入图片描述
测试:
在这里插入图片描述
2).管理节点与数据节点相互免密

[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:

在这里插入图片描述
测试:
在这里插入图片描述
在这里插入图片描述
3.编辑mha manager配置文件

[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

在这里插入图片描述
在这里插入图片描述
2).检测复制过程

[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;

在这里插入图片描述

实现ip漂移:

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;

在这里插入图片描述
在这里插入图片描述
3.给脚本执行权限

[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

在这里插入图片描述
4.编辑配置文件

[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

在这里插入图片描述
server2端查看vip以漂移到此
在这里插入图片描述
server3查看slave状态,master为172.25.4.2
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值