MHA高可用架构

2. MHA 架构软件结构说明

2.1 节点规划

manager端: db03

node端: db01,db02,db03

1主2从,独立数据库实例

2.2 MHA软件的构成(perl语言)

Manager工具包主要包括以下几个工具:

mha4mysql-manager-0.58-0.el7.centos.noarch.rpm  管理员

masterha_manger               启动MHA

masterha_check_ssh          检查MHA的SSH配置状况

masterha_check_repl         检查MySQL复制状况

masterha_master_monitor     监控master是否宕机

masterha_check_status       检测当前MHA运行状态

masterha_master_switch      控制故障转移(自动或者手动)

masterha_conf_host          添加或删除配置的server信息

Node工具包主要包括以下几个工具:

rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm

这些工具通常由MHA Manager的脚本触发,无需人为操作

save_binary_logs            保存和复制master的二进制日志

apply_diff_relay_logs       识别差异的中继日志事件并将其差异的事件应用于其他的

purge_relay_logs            清除中继日志(如果不清除,有可能会阻塞SQL线程)

3. MHA 配置过程细节说明

3.1 软连接

rm -rf /usr/bin/mysqlbinlog

rm -rf /usr/bin/mysql

ln -s /usr/local/mysql/bin/mysqlbinlog    /usr/bin/mysqlbinlog

ln -s /usr/local/mysql/bin/mysql          /usr/bin/mysql

3.2 互信

db01:

rm -rf /root/.ssh

ssh-keygen

cd /root/.ssh

mv id_rsa.pub authorized_keys

scp  -r  /root/.ssh  192.168.8.37:/root

scp  -r  /root/.ssh  192.168.8.38:/root

各节点验证

ssh 192.168.8.36 hostname

ssh 192.168.8.37 hostname

ssh 192.168.8.38 hostname

3.3 安装软件包(所有节点)

yum install perl-DBD-MySQL -y

rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm

3.4 在db01主库中创建mha需要的用户

grant all privileges on *.* to mha@'192.168.8.%' identified by 'mha';

3.5  Manager软件安装(db03)

yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes

rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm

3.6 配置文件准备(db03)

-- 创建配置文件目录

mkdir -p /etc/mha

-- 创建日志目录

mkdir -p /var/log/mha/app1

-- 编辑mha配置文件

cat > /etc/mha/app1.cnf <<EOF

[server default]

manager_log=/var/log/mha/app1/manager        

manager_workdir=/var/log/mha/app1            

master_binlog_dir=/usr/local/mysql/data       

user=mha                                   

password=mha                               

ping_interval=2

repl_user=repl

repl_password=123

ssh_user=root                               

[server1]                                   

hostname=192.168.8.36

port=3306                                  

[server2]            

hostname=192.168.8.37

port=3306

[server3]

hostname=192.168.8.38

port=3306

EOF

3.7 状态检查(db03)

masterha_check_ssh  --conf=/etc/mha/app1.cnf

masterha_check_repl  --conf=/etc/mha/app1.cnf

3.8 开启MHA(db03):

nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover  < /dev/null> /var/log/mha/app1/manager.log 2>&1 &

4. MHA FailOver过程详解

4.1 什么是Failover? (故障转移)

主库宕机一直到业务恢复正常的处理过程(自动)

4.2 Failover让你实现怎么做?

(1) 快速监控到主库宕机

(2) 选择新主

(3) 数据补偿(如果主服务器产生大量的数据,那么会尽可能的打包传到从服务器)

(4) 解除从库身份

(5) 剩余从库和新主库构建主从关系

(6) 应用透明(漂移地址漂移,不让前台知道服务器有故障)

(7) 故障节点自愈(待开发...)

(8) 故障提醒(发送电子邮件)

4.3 MHA的Failover如何实现?

从启动--->故障--->转移--->业务恢复

(1) MHA通过masterha_manger脚本启动MHA的功能.

(2) 在manager启动之前,会自动检查ssh互信(masterha_check_ssh)和主从状态(masterha_check_repl)

(3) MHA-manager 通过 masterha_master_monitor脚本(每隔ping_interval秒)

(4) masterha_master_monitor探测主库3次无心跳之后,就认为主库宕机了.

(5) 进行选主过程 ***

算法一:

读取配置文件中是否有强制选主的参数?

candidate_master=1(强制选主)

check_repl_delay=0(不做从)

扩展一下:

candidate_master=1 应用场景?

(a) MHA+KeepAlive VIP(早期MHA架构)

(b) 多地多中心

算法二:

自动判断所有从库的日志量,将最接近主库数据的从库作为新主.

法三:

按照配置文件先后顺序的进行选新主.

(6) 数据补偿

判断主库SSH的连通性

情况一: SSH能连

调用 save_binary_logs脚本,立即保存缺失部分的binlog到各个从节点,恢复

情况二: SSH无法连接

调用 apply_diff_relay_logs 脚本,计算从库的relaylog的差异,恢复到2号从库(哪个从库更全面,就用谁当作主)

(6.1) 提供额外的数据补偿的功能@@

(7) 解除从库身份

(8) 剩余从库和新主库构建主从关系

(9) 应用透明  @@

(10) 故障节点自愈(待开发...)@@

(11) 故障提醒@@

5. MHA 应用透明(vip)(以前用keepalived才能实现)

db03:

cp /root/master_ip_failover.txt /usr/local/bin/master_ip_failover

vim /usr/local/bin/master_ip_failover

my $vip = '192.168.8.254/24';

my $key = '1';

my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";

my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";

[root@db03 bin]# yum install -y  dos2unix

[root@db03 bin]# dos2unix /usr/local/bin/master_ip_failover

[root@db03 bin]# chmod +x /usr/local/bin/master_ip_failover

[root@db03 bin]# vim /etc/mha/app1.cnf

添加至第二行:

master_ip_failover_script=/usr/local/bin/master_ip_failover

db01:手工添加vip

[root@db01 ~]# ifconfig ens33:1 192.168.8.254/24

db03 : 重启MHA

[root@db03]masterha_stop --conf=/etc/mha/app1.cnf

[root@db03]nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover  < /dev/null> /var/log/mha/app1/manager.log 2>&1 &

[root@db03]masterha_check_status --conf=/etc/mha/app1.cnf

6. MHA 故障提醒

systemctl stop postfix

systemctl disable postfix

cat >> /etc/mail.rc << EOF

set from=1793594335@qq.com

set smtp=smtps://smtp.qq.com:465

set smtp-auth-user=1793594335@qq.com

set smtp-auth-password=yuemqwmhdizdbjeg

set smtp-auth=login

set ssl-verify=ignore

set nss-config-dir=/etc/pki/nssdb/

EOF

 

cat >> /usr/local/bin/send << EOF

#!/bin/bash

echo "mha is failover,hehe" | mail -s mha_alert 1793594335@qq.com

EOF

chmod +x /usr/local/bin/send

vim /etc/mha/app1.cnf

添加第三行:

report_script=/usr/local/bin/send

保存退出

重启mha

[root@db03]masterha_stop --conf=/etc/mha/app1.cnf

[root@db03]nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover  < /dev/null> /var/log/mha/app1/manager.log 2>&1 &

[root@db03]masterha_check_status --conf=/etc/mha/app1.cnf

7. 额外的数据补偿(binlog_server)

(1)

找一台额外的机器,必须要有5.6以上的版本,支持gtid并开启,我们直接用的第二个slave(db03)

mkdir -p /data/mysql/binlog

chown -R mysql.mysql /data/mysql

 

vim /etc/mha/binlogserver.cnf

[binlog1]

no_master=1

hostname=192.168.8.38

master_binlog_dir=/data/mysql/binlog/

(2) 拉取主库binlog日志

cd /data/mysql/binlog    

mysqlbinlog  -R --host=192.168.8.36 --user=mha --password=mha --raw  --stop-never mysql-bin.000003 &

注意:

拉取日志的起点,需要按照目前主库正在使用的binlog为起点.

(4) 重启MHA-manager

masterha_stop --conf=/etc/mha/app1.cnf

nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover  < /dev/null> /var/log/mha/app1/manager.log 2>&1 &

masterha_check_status --conf=/etc/mha/app1.cnf

8. 故障模拟及故障处理

8.1 宕掉 db01 数据库

systemctl stop mysqld

在db03上查看日志:

grep "CHANGE MASTER TO"  /var/log/mha/app1/manager

8.2 恢复故障

(1) 启动故障节点

[root@db01 ~]# systemctl start mysqld

(2) 恢复1主2从(db01)

db01>CHANGE MASTER TO MASTER_HOST='192.168.8.37', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='123';

db01>start slave;

(3) 恢复配置文件(db03)

[server1]

hostname=192.168.8.36

port=3306

[server2]

hostname=192.168.8.37

port=3306

[server3]

hostname=192.168.8.38

port=3306

(4) 启动MHA

[root@db03 bin]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover  < /dev/null> /var/log/mha/app1/manager.log 2>&1 &

[1] 16543

[root@db03 bin]# masterha_check_status --conf=/etc/mha/app1.cnf

app1 (pid:16543) is running(0:PING_OK), master:192.168.8.37

(5)恢复binlogserver (8.37)

cd /data/mysql/binlog  

mv mysql-bin.*  /tmp

mysqlbinlog  -R --host=192.168.8.37 --user=mha --password=mha --raw  --stop-never mysql-bin.000003 &

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值