一主多从
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】成为slavemysql> 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 3scp -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转换为新的master3:【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.complete4:【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