15.MySQL 高可用架构

2022-03-30 分类:mysql 阅读(537) 评论(0)

孙富阳, 江湖人称没人称。多年互联网运维工作经验,曾负责过孙布斯大规模集群架构自动化运维管理工作。擅长Web集群架构与自动化运维,曾负责国内某大型博客网站运维工作。

1.什么是高可用?

企业高可用标准:全年无故障时间
无故障时间           故障时间      
99.9%                0.1%     = 525.6  min        KA+双主                 :人为干预 
99.99%               0.01%    = 52.56  min        MHA+增强半同步+GTID     :半自动化
99.999%              0.001%   = 5.256  min        PXC 、 MGR 、MGC        : 多活
99.9999%             0.0001%  = 0.5256 min        自动化、云化、平台化    :

2.MHA高可用架构介绍及搭建过程

1.规划

主库:
51       node 
从库: 
52       node
53       node    manager

2.准备环境

略。1主2从GTID,参考上一篇文章搭建

3.配置关键程序软连接

ln -s /usr/local/mysql/bin/mysqlbinlog          /usr/bin/mysqlbinlog
ln -s /usr/local/mysql/bin/mysql                /usr/bin/mysql
ps: 为什么要创建软连接,这是因为mha调用的是绝对路径

4.配置各节点互信(各节点之间无密码SSH)

# db01:
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub 10.0.0.51
scp -rp ./.ssh 10.0.0.52:/root/.ssh
scp -rp ./.ssh 10.0.0.53:/root/.ssh
各节点验证
db01:
ssh 10.0.0.51 date
ssh 10.0.0.52 date
ssh 10.0.0.53 date
db02:
ssh 10.0.0.51 date
ssh 10.0.0.52 date
ssh 10.0.0.53 date
db03:
ssh 10.0.0.51 date
ssh 10.0.0.52 date
ssh 10.0.0.53 date

5.安装软件

1.下载mha软件

mha官网:https://code.google.com/archive/p/mysql-master-ha/
github下载地址:https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads
对于mysql8.0以上版本要用5.7以上的MHA软件

2.所有节点安装Node软件依赖包

yum -y localinstall mha4mysql-node-0.58-0.el7.centos.noarch.rpm

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

create user mha@'10.0.0.%' identified with mysql_native_password by 'mha';
grant all privileges on *.* to mha@'10.0.0.%' ;

4.Manager软件安装(db03)

yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes
yum install -y  mha4mysql-manager*.rpm

6.配置文件准备(db03)

1创建配置文件目录
mkdir -p /etc/mha
2 创建日志目录
 mkdir -p /var/log/mha/app1
3 编辑mha配置文件
vim /etc/mha/app1.cnf
[server default]
manager_log=/var/log/mha/app1/manager        
manager_workdir=/var/log/mha/app1            
master_binlog_dir=/data/binlog/   ###主库binlog位置   
user=mha                                   ###数据库用户
password=mha                               ###数据库密码
ping_interval=2                             ###检测心跳间隔
repl_password=123                       ###主从复制用户的密码
repl_user=repl                               ###
ssh_user=root                              ###ssh互信的用户

[server1]                                   
hostname=10.0.0.51
port=3306                                  
[server2]            
hostname=10.0.0.52
candidate_master=1 ###备选主库
port=3306
[server3]
hostname=10.0.0.53
port=3306

7.状态检查

### 互信检查
masterha_check_ssh  --conf=/etc/mha/app1.cnf 
### 主从状态检查
masterha_check_repl --conf=/etc/mha/app1.cnf 

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 &

9.查看MHA状态

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

3.MHA的软件结构及工作原理

1.manager 组件

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信息

2.node 组件

save_binary_logs            保存和复制master的二进制日志 
apply_diff_relay_logs       识别差异的中继日志事件并将其差异的事件应用于其他的
purge_relay_logs            清除中继日志(不会阻塞SQL线程)

3.原理

0.通过masterha_manger启动MHA manager进程。
1.监控
manager自动调用,masterha_master_monitor脚本,每隔ping _interval秒检测主库心跳,最多四次机会,如果都没有心跳,主库宕机.
2.选主
alive数组:所有存活节点
lastest数组:最接近主库日志量的节点(pos或者gtid )
pref数组:设置了candidate_master>0节点
bad数组︰不适合做主库节点(没开启binlog、日志差异在100000000字节以上的、设定了no_master )
a.满足lastest并且满足pref数组,并且不在bad数组中的节点,优先选择为新主.如果存在多个,则按照节点号码顺序选择
b.满足lastest,并且不在bad数组中的节点,选择为新主,,如果存在多个,则按照节点号码顺序选择
c.满足pref数组,并且不在bad数组中的节点,选择为新主,.如果存在多个,则按照节点号码顺序选择
d.满足alive数组,并且不在bad数组中的节点,选择为新主,.如果存在多个,则按照节点号码顺序选择
e.如果还没找到,就选主失败。
3.数据补偿
a.如果ssh如果能连接到主库,调用save binary_logs脚本,立即保存缺失部分binlog , scp到各个从库(/var/tmp/o.x临时文件)进行恢复
b.如果ssh连接不上,通过apply_diff_relay_logs脚本计算从库之间的日志差异,并且恢复。
c.冗除方案,MHA提供了一个binlogserver功能,实时拉取主库的binlog日志到备份节点。可以进行数据补偿。
最靠谱办法:5.7+GTID+增强半同步
4.主从身份切换(masterha master switch)
a.所有从库解除身份
b.构建新的主从关系
5.应用透明
ip漂移( master ip failover )
6.告警
send report
7.自愈(待开发)

4.模拟故障并恢复

0 .工作状态查看

[root@db03 app1]# masterha_check_status --conf=/etc/mha/app1.cnf 
app1 (pid:17501) is running(0:PING_OK), master:10.0.0.51

1.宕主库测试

[root@db01 ~]# /etc/init.d/mysqld stop
Shutting down MySQL............ SUCCESS! 

2.看日志

[root@db03 app1]# vim /var/log/mha/app1/manager

3.恢复

1.修复故障节点

[root@db01 ~]# /etc/init.d/mysqld start
Starting MySQL.. SUCCESS! 
如果生产怎么办? 
按实际情况。

2.恢复主从

db01
change master to 
master_host='10.0.0.52',
master_user='repl',
master_password='123' ,
MASTER_AUTO_POSITION=1;
start slave;

3.修复配置文件

方法一:  
vim /etc/mha/app1.cnf
[server1]
hostname=10.0.0.51
port=3306
方法二: 
masterha_conf_host --command=add --conf=/etc/mha/app1.cnf --hostname=10.0.0.51 --block=server10 --params="port=3306"
masterha_conf_host --command=delete --conf=/etc/mha/app1.cnf --block=server1

4.预检测脚本

[root@db03 ~]# masterha_check_ssh  --conf=/etc/mha/app1.cnf
[root@db03 ~]# masterha_check_repl  --conf=/etc/mha/app1.cnf 

5.启动MHA

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 
app1 (pid:24316) is running(0:PING_OK), master:10.0.0.52

5.应用透明--VIP

vip :   10.0.0.55/24

1.vip 故障转移脚本

上传脚本文件到/usr/local/bin 解压
[root@db03 mha_script]# cp -a /data/mha_script/*  /usr/local/bin
[root@db03 bin]# chmod +x /usr/local/bin/*

2.修改内容

[root@db03 bin]# cp master_ip_failover master_ip_failover.bak

my $vip = '10.0.0.55/24';
my $key = '1';
my $if  = 'ens33';
my $ssh_start_vip = "/sbin/ifconfig $if:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig  $if:$key down";
my $ssh_Bcast_arp= "/sbin/arping -I $if -c 3 -A 10.0.0.55";

3.修改Manager 配置文件

vim /etc/mha/app1.cnf 
master_ip_failover_script=/usr/local/bin/master_ip_failover

4.重启MHA

[root@db03 bin]# masterha_stop  --conf=/etc/mha/app1.cnf 
[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 &

5.手工在主库添加VIP

[root@db03 bin]# masterha_check_status --conf=/etc/mha/app1.cnf
[root@db02 ~]# ifconfig eth0:1 10.0.0.55/24

6.效果测试

使用navicat 连接测试MHA vip功能

6.故障提醒功能

1.准备脚本

[root@db03 bin]# cp send_report send_report.bak1

my $smtp='smtp.qq.com';             # smtp服务器
my $mail_from='281@qq.com';    # 发件箱
my $mail_user='21';           # 用户名 QQ号
my $mail_pass='gemghsvgkeyzcagh';   # 授权码
my $mail_to=['21@qq.com'];    # 收件箱
#my $mail_to=['to1@qq.com','to2@qq.com'];

2.修改配置文件

vim /etc/mha/app1.cnf 
# 添加一行: 
report_script=/usr/local/bin/send_report

3.重启MHA

[root@db03 bin]# masterha_stop  --conf=/etc/mha/app1.cnf 
[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 &

4.模拟主库宕机 

1.确认主库

[root@db03 bin]# masterha_check_status  --conf=/etc/mha/app1.cnf 
app1 (pid:27096) is running(0:PING_OK), master:10.0.0.52

2.宕主库

[root@db02 ~]# /etc/init.d/mysqld stop 
Shutting down MySQL............ SUCCESS! 

3.观察vip漂移、观察邮件

5.修复MHA 架构1主2从

7.日志补偿的冗余方案--binlog_server

1.创建必要目录(db03)

mkdir -p /data/binlog_server/
chown -R mysql.mysql /data/*
cd  /data/binlog_server/
[root@db03 ~]# mysql -e "show slave status \G"|grep "Master_Log"
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 194
        Relay_Master_Log_File: mysql-bin.000002
          Exec_Master_Log_Pos: 194
[root@db03 ~]# 
[root@db03 binlog_server]# masterha_check_status --conf=/etc/mha/app1.cnf 
app1 (pid:7057) is running(0:PING_OK), master:10.0.0.51

mysqlbinlog  -R --host=10.0.0.51 --user=mha --password=mha --raw  --stop-never mysql-bin.000002 &

注意:
拉取日志的起点,需要按照目前从库的已经获取到的二进制日志点为起点

2.配置文件设置

vim /etc/mha/app1.cnf 
[binlog1]
no_master=1
hostname=10.0.0.53
master_binlog_dir=/data/binlog_server/

3.重启MHA

[root@db03 bin]# masterha_stop  --conf=/etc/mha/app1.cnf 
[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 &

4.故障演练及修复

额外修复binlog server 
[root@db03 binlog_server]# cd /data/binlog_server/
[root@db03 binlog_server]# 
[root@db03 binlog_server]# ll
total 4
-rw-r----- 1 root root 485 Jul 15 12:09 mysql-bin.000004
[root@db03 binlog_server]# rm -rf *
[root@db03 binlog_server]#  mysql -e "show slave status \G"|grep "Master_Log"
              Master_Log_File: mysql-bin.000004
          Read_Master_Log_Pos: 234
        Relay_Master_Log_File: mysql-bin.000004
          Exec_Master_Log_Pos: 234

[root@db03 binlog_server]# mysqlbinlog  -R --host=10.0.0.51 --user=mha --password=mha --raw  --stop-never mysql-bin.000006 &


[root@db03 binlog_server]# 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 &
[2] 8375
[root@db03 binlog_server]# masterha_check_status --conf=/etc/mha/app1.cnf 
app1 (pid:8375) is running(0:PING_OK), master:10.0.0.51

5.MHA 故障修复大法

a. 检查修复故障节点(硬件 OS  网络).
b. 检查修复数据库实例 
c. 检查和修复1主2从.
db01  <---->  db02 
stop slave  ; 
reset slave;
db01  ---->  db02 
d. 检查和修复配置文件
e. 检查和修复VIP 
f. 检查和修复binlog server 
g. 使用检查脚本最后确认
h.  启动MHA

2.MHA的维护操作 - 在线切换功能

1.只切换角色(了解即可)

masterha_master_switch  --conf=/etc/mha/app1.cnf --master_state=alive --new_master_host=10.0.0.52 --orig_master_is_new_slave --running_updates_limit=10000
注意: 
master_ip_online_change_script is not defined. If you do not disable writes on the current master manually, applications keep writing on the current master. Is it ok to proceed? (yes/NO): yes
1. 此种方法 切换,要注意将原主库,FTWRL,否则会造成主从不一致。
2. 手工切换vip

2.master_ip_online_change_script功能实现

功能: 在线切换时,自动锁原主库,VIP自动切换

1.准备切换脚本

vim /usr/local/bin/master_ip_online_change
my $vip = "10.0.0.55/24";
my $key = "1";
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key $vip down";
my $ssh_Bcast_arp= "/sbin/arping -I ens33 -c 3 -A 10.0.0.55";

2.修改MHA配置文件

vim /etc/mha/app1.cnf
master_ip_online_change_script=/usr/local/bin/master_ip_online_change

3.停 MHA

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

4.检查repl

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

5.在线切换

masterha_master_switch  --conf=/etc/mha/app1.cnf --master_state=alive --new_master_host=10.0.0.51 --orig_master_is_new_slave --running_updates_limit=10000

6.重构binlogserver

[root@db03 bin]# ps -ef |grep mysqlbinlog
root      28144  16272  0 17:50 pts/1    00:00:00 mysqlbinlog -R --host=10.0.0.52 --user=mha --password=x x --raw --stop-never mysql-bin.000005
root      28529  16272  0 18:03 pts/1    00:00:00 grep --color=auto mysqlbinlog
[root@db03 bin]# kill -9 28144
[root@db03 bin]# cd /data/binlog_server/
[root@db03 binlog_server]# ll
total 4
-rw-r----- 1 root root 194 Apr  1 17:50 mysql-bin.000005
[root@db03 binlog_server]# rm -rf *
[root@db03 binlog_server]# mysqlbinlog  -R --host=10.0.0.51 --user=mha --password=mha --raw  --stop-never mysql-bin.000004 &
[1] 28534

7.启动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 &

[root@db03 binlog_server]# masterha_check_status   --conf=/etc/mha/app1.cnf 
app1 (pid:28535) is running(0:PING_OK), master:10.0.0.51

评论已关闭

登录

忘记密码 ?

切换登录

注册

鲁ICP备2021019243号-1