mysql高可用之MHA,一主多从

本文详细介绍使用MHA实现MySQL高可用的全过程,包括环境搭建、配置、故障切换及在线切换等关键步骤,确保数据库系统的稳定性和数据一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一主多从
mysql高可用之MHA

MHA是一套相对成熟的MySQL高可用方案,
能做到在0~30s内自动完成数据库的故障切换操作,
在master服务器不宕机的情况下,基本能保证数据的一致性
简单理解:
master slave1 slave2
当master down掉的时候,slave1顶替成为新的master,原来的master成为新的slave

一直都保持一主多从,也就是一直都是一个主,多个从
如果有多个主的话,会抢占资源

当密码找不到的时候
删除/var/log/mysql/
*

新的环境
server1,主master
server2,slave(备master)
server3,slave
server4,MHA

server1 ,server2,server3都安装好mysql环境

【1】下载mysql的rpm包

tar xf mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar

安装需要的包
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】 vim /etc/my.cnf

【server1】

server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
log_slave_updates=ON
log_bin=binlog
在这里插入图片描述
【server2】

server_id=2
gtid_mode=ON
enforce_gtid_consistency=ON
log_slave_updates=ON
log_bin=binlog
在这里插入图片描述
【server3】

server_id=3
gtid_mode=ON
enforce_gtid_consistency=ON
log_slave_updates=ON
log_bin=binlog
在这里插入图片描述
systemctl start mysqld

三个server进行安全初始化,修改新密码

cat /var/log/mysqld.log | grep password
mysql_secure_installation

【3】【server1】进行授权

mysql> grant replication slave on . to repl@‘172.25.78.%’ identified by ‘Westos+001’;
mysql> show master status;
在这里插入图片描述
【4】【server2】【server3】成为slave

mysql> CHANGE MASTER TO ##修改master信息
-> MASTER_HOST = '172.25.78.1',
-> MASTER_USER = 'repl',
-> MASTER_PASSWORD = 'Westos+001',
-> MASTER_AUTO_POSITION = 1; 
 mysql> start slave; 
 mysql> show slave status\G  ##可以看到master为server1的IP

##参数为yes
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
在这里插入图片描述
在这里插入图片描述

【5】【server4】
配置server4环境

配置高可用(再开一台server4来做master,
因为高可用一般都是奇数个节点,因为如果master挂了,
其他从节点需要投票选举一个新的master,
偶数节点可能出现投票数相同)
下载MHA-7目录,并安装
1:cd MHA-7 --> ls
yum install mha4mysql-manager-0.58-0.el7.centos.noarch.rpm perl-* mha4mysql-node-0.58-0.el7.centos.noarch.rpm -y

2:配置免密访问(server4需要连接server1 2 3都免密码)
ssh-keygen	##先生成密钥
ssh-copy-id server1
ssh-copy-id server2 #发送密钥
ssh-copy-id server3

3:【server1,server2,server3】
#其他3个节点只安装mha4mysql-node-0.58-0.el7.centos.noarch.rpm即可
cd MHA-7 -- > ls
yum install -y mha4mysql-node-0.58-0.el7.centos.noarch.rpm

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
【6】:【server4】配置mha工作目录及配置文件
#参考https://www.cnblogs.com/gomysql/p/3675429.html

1:
mkdir /etc/masterha

vim /etc/masterha/app1.cnf
[server default]
manager_workdir=/etc/masterha
manager_log=/var/log/masterha.log # manager 日志文件
master_binlog_dir=/etc/masterha
password=Westos+001 #MySQL管理帐号和密码
user=root
ping_interval=1
remote_workdir=/tmp
repl_password=Westos+001
repl_user=repl   # 复制帐号和密码
ssh_user=root    # 系统ssh用户

[server1]
hostname=172.25.78.1
port=3306

[server2]
hostname=172.25.78.2
port=3306
candidate_master=1
check_repl_delay=0

[server3]
hostname=172.25.78.3
port=3306
no_master=1    ##no_master表示这个节点不能作为master

在这里插入图片描述

2:检测ssh连接

masterha_check_ssh --conf=/etc/masterha/app1.cnf
##发现报错,server1 2 3互相之间不免密
在这里插入图片描述
3:拷贝server4上的密钥给server1 2 3

scp -r .ssh server1:
scp -r .ssh server2:
scp -r .ssh server3:
在这里插入图片描述
masterha_check_ssh --conf=/etc/masterha/app1.cnf ##再检测ssh,成功
在这里插入图片描述
4:接下来检测复制功能

masterha_check_repl --conf=/etc/masterha/app1.cnf
##发现有报错,这是因为server4默认是用root远程连接数据库,但是在配置数据库是已经禁用了root的远程连接
在这里插入图片描述
【7】 1:【server1】在主库上授权用户

mysql> grant all on . to root@’%’ identified by ‘Westos+001’ ;
在这里插入图片描述
【8】【server4】再次检测复制功能

1:masterha_check_repl --conf=/etc/masterha/app1.cnf
在这里插入图片描述
在这里插入图片描述
再检测发现可能卡住了,因为之前半同步的配置写在了配置文件里,数据不同步就会卡住,在所有节点配置文件里删除半同步配置,只保留之前的
所有节点的配置文件必须一样!!!!(前面的内容其实都不需要做 只要保持三个server的my.cnf的内容与这里的一致就可以
三台做好gtid的复制就ok )
##而且三个节点必须有数据(数据必须同步)
2:
password=Westos+001
user=root
在这里插入图片描述
3:测试自动的manager能否开启
nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf – ignore_last_failover < /dev/null > /var/log/masterha.log 2>&1 &
在这里插入图片描述

【9】测试手动failover切换

为了手动测试,先把manager关闭,不关的话手动切不了,manager会自动切,manager是自动切换的工具
1:【server4】关闭manager
masterha_stop --conf=/etc/masterha/app1.cnf
在这里插入图片描述
2:【server1】此时为master
systemctl stop mysqld ##down掉master
在这里插入图片描述
开始手动切换,当master down掉的的时候,将server2转换为新的master

3:【server4】
masterha_master_switch --master_state=dead --conf=/etc/masterha/app1.cnf --dead_master_host=172.25.78.1 --dead_master_ip=172.25.78.1 --dead_master_port=3306 --new_master_host=172.25.78.2 --new_master_port=3306
##中间都选yes
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
4:【server3】 show slave status\G
##可以看到它的master已经变成了server2
在这里插入图片描述
5:【server2】 show slave status\G ##是空的
在这里插入图片描述
6:【server1】开启mysqld,让此时的server1为slave, 因为server1 down掉以后,脱离了集群,所以要重新加入集群,成为server2的slave,并开启slave
systemctl start mysqld
mysql -uroot -pWestos+001
在这里插入图片描述
mysql> CHANGE MASTER TO
-> MASTER_HOST = ‘172.25.78.2’,
-> MASTER_USER = ‘repl’,
-> MASTER_PASSWORD = ‘Westos+001’,
-> MASTER_AUTO_POSITION = 1;

mysql> start slave;
mysql> show slave status\G
在这里插入图片描述
##看到master为server2
至此完成了一次手动切换

7:这时会在/etc/masterha目录下生成一个app1.failover.complete文件,是来记录failover情况的,
再进行failover时必须先把这个文件删除,不然不会failover
【server4】
cd /etc/masterha/ – > ls
rm -fr app1.failover.complete
在这里插入图片描述
【10】手动测试在线切换,即活切,刚才是master挂掉后切换

1:【server4】
活切: 让此时为slave的server1重新为master,而此时为master的【server2】再次为slave
masterha_master_switch --conf=/etc/masterha/app1.cnf --master_state=alive --new_master_host=172.25.78.1 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000
##其他输入YES yes YES
在这里插入图片描述
2:【server3】 show slave status\G ##看到master为server1
在这里插入图片描述
3:【server1】 show slave status\G ##是空的
在这里插入图片描述
4:【server2】 show slave status\G ##看到master为server1
在这里插入图片描述
【11】 测试半自动failover

首先清理/etc/masterha/app1.failover.complete
##masterha manager自带守护进程
1:【server4】 nohup masterha_manager --conf=/etc/masterha/app1.cnf &>/dev/null &
在这里插入图片描述
在这里插入图片描述> cat /var/log/masterha.log ##可以看到server1和server2自动切换

2:【server2】 show slave status\G ##是空的,为新的master
在这里插入图片描述
3:【server3】 show slave status\G ##master为server2
在这里插入图片描述
手动删除多余文件
rm -fr /etc/masterha/app1.failover.complete

4:【server1】查看
ps ax | grep mysql ##看到mysql的进程 kill -9 2566 ps ax |
grep mysql ##再查看,发现mysql进程又开启了
在这里插入图片描述
手动关闭mysqld
systemctl stop mysqld
在这里插入图片描述
5:【server4】 cat /var/log/masterha.log
##发现已经切换,同时manager进程退出,所以全自动需要脚本

6:【server1】把server1加回集群,
##因为此时server2为master,将server1添加到集群,成为slave

systemctl start mysqld
mysql> CHANGE MASTER TO
    -> MASTER_HOST = '172.25.78.2',
    -> MASTER_USER = 'repl',
    -> MASTER_PASSWORD = 'Westos+001',
    -> MASTER_AUTO_POSITION = 1;
mysql>  start slave;
mysql> show slave status\G
 

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值