MHA架构图:
MHA由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点),MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。MHA Node运行在每台MySQL服务器及Manager服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将拥有最新数据的slave提升为新的master,然后将所有其他的slave重新指向新提升的master。整个故障转移过程对应用程序层面完全透明。
MHA工作原理
- 主库实例挂掉但是ssh还能连接
1、监控到主库宕机,选择一个新的主,被选择的新主会取消从库的角色( reset slave)
选择标准:
一是根据其他从库的binlog日志的位置选择最新的从库作为新的主库
二是如果设置了半同步从库,直接选择半同从库作为新的主库
2、从库通过MHA自带的脚本程序,通过ssh向主库索取缺失部分的binlog
3、其他从库与新的主库从新构建主从,继续提供服务
4、如果由vip机制,将VIP从原来的主库漂移到新的主库,让应用无感知 - 主节点服务器宕机(ssh已经连接不上了)
1、监控到主机宕机后,尝试ssh连接,连接失败
2、通过上边所讲的选择标准选择新的主库
3、计算从库之间的relay-log的差异,补偿到新的其他从库
4、其他从库从新与新主构建主从关系,继续提供服务
5、如果由VIP机制,将VIP从原主漂移到新主,让应用无感知
6、如果有binlog server 机制,会继续将binlog server中缺失的事物,补偿到新的主库
MHA高可用:
停掉server1到server4的mysqld。并且重新配置初始化mysql
server1中:
cd ~
/etc/init.d/mysqld stop
cd /data/mysql/
ls
rm -rf * #删的是/data/mysql目录里的文件
cd ~
vim /etc/my.cnf
#删掉多余的
[mysqld]
datadir=/usr/local/mysql
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
log-error=/data/mysql/mysqld.log
pid-file=/data/mysql/mysqld.pid
server-id=1
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
log_slave_updates=ON
log_bin=binlog
mysqld --initialize --user=mysql #初始化
cd /data/mysql/
cat mysqld.log | grep password #查看原始密码
/etc/init.d/mysqld start #启动数据库
mysql -p
--> alter user root@localhost identified by 'westos';
--> show master status;
--> grant replication slave on *.* to repl@'%' identified by 'westos';
安全初始化前清空/data/mysql/下的文件,安全初始化后要开启mysql服务
创建master主机用户和密码,供slave机子使用
server2:同理,先停掉mysqld服务
/etc/init.d/mysqld stop
cd /data/mysql/
ls
rm -rf * #删的是/data/mysql目录里的文件
cd ~
vim /etc/my.cnf
#删掉多余的
[mysqld]
datadir=/usr/local/mysql
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
log-error=/data/mysql/mysqld.log
pid-file=/data/mysql/mysqld.pid
server-id=2
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
log_slave_updates=ON
log_bin=binlog
mysqld --initialize --user=mysql #初始化
cd /data/mysql/
cat mysqld.log | grep password #查看原始密码
/etc/init.d/mysqld start #启动数据库
mysql -p
--> alter user root@localhost identified by 'westos';
--> change master to master_host='172.25.11.1',master_user='repl', master_password='westos', master_auto_position=1;
--> start slave;
--> show slave status\G;
创建用户,密码和server1一样,并且设置server1为master主机,设置完之后开启slave
查看slave主机状态
server3中:同理
/etc/init.d/mysqld stop
cd /data/mysql/
ls
rm -rf * #删的是/data/mysql目录里的文件
cd ~
vim /etc/my.cnf
#删掉多余的
[mysqld]
datadir=/usr/local/mysql
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
log-error=/data/mysql/mysqld.log
pid-file=/data/mysql/mysqld.pid
server-id=3
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
log_slave_updates=ON
mysqld --initialize --user=mysql #初始化
cd /data/mysql/
cat mysqld.log | grep password #查看原始密码
/etc/init.d/mysqld start #启动数据库
mysql -p
--> alter user root@localhost identified by 'westos';
--> change master to master_host='172.25.11.1',master_user='repl', master_password='westos', master_auto_position=1;
--> start slave;
--> show slave status\G;
server4中:暂停服务、将node的安装包传给server1、2、3
systemctl stop mysqlrouter.service
lftp 172.25.254.250
~> cd pub/docs/mysql/
/pub/docs/mysql> mirror MHA-7/
/pub/docs/mysql> exit
ls
cd MHA-7/
ls
yum install -y *.rpm
ls
scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm server1:
scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm server2:
scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm server3:
在 server1、2、3中安装node包:
server2中:
mysql -pwestos
--> select * from mysql.user; #查看repl用户
server4中:
cd MHA-7/
ls
tar zxf mha4mysql-manager-0.58.tar.gz
ls
cd mha4mysql-manager-0.58/
ls
cd samples/
cd conf/
ls
mkdir /etc/mha
ls
cp app1.cnf masterha_default.cnf /etc/mha/
ls
cd /etc/mha/
ls
cat app1.cnf
cat masterha_default.cnf
#把masterha_default.cnf文件里的内容全部放到app1.cnf文件中
vim app1.cnf #把masterha_default.cnf文件里的内容全部放到app1.cnf文件中
[server default]
user=root #mysql主从节点的管理员用户密码,确保可以从远程登录
password=westos
ssh_user=root #ssh用户名
repl_user=repl #主从复制用户
repl_password=westos
master_binlog_dir= /data/mysql
remote_workdir=/tmp #远端mysql在发生切换时binlog的保存位置
secondary_check_script= masterha_secondary_check -s server2 -s server3
ping_interval=3 #发送ping包的时间间隔,默认3秒,尝试3次没有回应会自动进行failover
#master_ip_failover_script= /script/masterha/master_ip_failover
# shutdown_script= /script/masterha/power_manager
# report_script= /script/masterha/send_report
#master_ip_online_change_script= /script/masterha/master_ip_online_change
manager_workdir=/etc/mha/app1
manager_log=/etc/mha/app1/manager.log
[server1]
hostname=172.25.11.1
candidate_master=1
[server2]
hostname=172.25.11.2
candidate_master=1
check_repl_delay=0
[server3]
hostname=172.25.11.3
ls
rm -f masterha_default.cnf
ls
mkdir app1 #在/etc/mha下建立
masterha_check_ssh --help
masterha_check_ssh --conf=/etc/mha/app1.cnf #没有成功,四个节点没有免密
ssh-keygen #生成免密认证,[一直回车]
ssh-copy-id server4
ssh server4 #连接4不需要密码
logout
cd
scp -r .ssh/ server1:
scp -r .ssh/ server2:
scp -r .ssh/ server3:
ssh server1 #测试连接1不需要密码
logout
注意以上可以在每个ip都试一下,连接其他ip不需要密码
server1中:
mysql -pwestos
--> alter user root@'%' identified by 'westos';
--> create user root@'%' identified by 'westos';
--> grant all on *.* to root@'%';
--> flush privileges;
server4中:
masterha_check_ssh --conf=/etc/mha/app1.cnf #ok了
server4:
masterha_master_switch --conf=/etc/mha/app1.cnf --master_state=alive --
new_master_host=172.25.11.2 --new_master_port=3306 --orig_master_is_new_slave --
running_updates_limit=10000
ls
cd /etc/mha/
ls
cd app1/
ls
cd..
ls
srever1:查看master是否手动切换成server2
mysql -p
--> show master status;
--l> show slave status\G;
server3:
mysql -p
--> show slave status\G;
server2:
mysql -p
--> show slave status\G; #是主机所以不会出现从机的信息
/etc/init.d/mysqld stop #停掉mysql
server4:手动在把server1改为master
masterha_master_switch --master_state=dead --conf=/etc/mha/app1.cnf --
dead_master_host=172.25.11.2 --dead_master_port=3306 --new_master_host=172.25.11.1 --
new_master_port=3306 --ignore_last_failover #全部yes
ls
cd app1/
ls
cat app1.failover.complete
server1:查看是否手动改回master成功
mysql -pwestos
--> mysql> show slave status\G; #是主机所以不会出现从机的信息
server3:
mysql -pwestos
--> show slave status\G; #主机变成1
server2:开启服务,并把server1设成master主机
/etc/init.d/mysqld start #开启
mysql -p
--> stop slave;
--> change master to master_host='172.25.11.1',master_user='repl',
master_password='westos', master_auto_position=1;
--> start slave;
--> show slave status\G;
从真机中把master*传到4的/etc/mha/
server4:
cd /etc/mha/
ls
chmod +x master_ip_*
ll
cd
cd MHA-7/
ls
cd mha4mysql-manager-0.58/
cd samples/
ls
cd scripts/
ls
cd /etc/mha/
vim master_ip_failover
#第7行:my $vip = '172.25.11.100/24';
vim master_ip_online_change
#第7行:my $vip = '172.25.11.100/24';
cd app1/
ls
rm -rf app1.failover.complete
masterha_manager --conf=/etc/mha/app1.cnf & #打入后台。后回车
ps ax
在server1和2中输入ip addr 命令查看
server1中:
ip addr add 172.25.11.100/24 dev eth0 给1加vip
ip addr
真机中:
mysql -h 172.25.11.100 -u root -p #进入是1的
server1中:
/etc/init.d/mysqld stop
server4:
ps ax
masterha_master_switch --master_state=dead --conf=/etc/mha/app1.cnf --
dead_master_host=172.25.11.1 --dead_master_port=3306 --new_master_host=172.25.11.2 --
new_master_port=3306 --ignore_last_failove
server2中:
ip addr
server3:
mysql -pwestos
--> show slave status\G; #主机变成2
server1中:
/etc/init.d/mysqld start
mysql -p
--> stop slave;
--> change master to master_host='172.25.11.1',master_user='repl', master_password='westos', master_auto_position=1;
--l> start slave;
--> show slave status\G; #主机变成2