15:MySQL 高可用架构

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

0.1 规划:
主库:
51 node
从库:
52 node
53 node manager

0.2 准备环境
略。1主2从GTID

0.3 配置关键程序软连接

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

0.4 配置各节点互信(各节点之间无密码SSH)
#db01:
rm -rf /root/.ssh
ssh-keygen
cd /root/.ssh
mv id_rsa.pub authorized_keys
scp -r /root/.ssh 10.0.0.52:/root
scp -r /root/.ssh 10.0.0.53:/root

或者:
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

0.5 安装软件
0.5.1 下载mha软件
mha官网:https://code.google.com/archive/p/mysql-master-ha/
github下载地址:https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads

0.5.2 所有节点安装Node软件依赖包
yum install perl-DBD-MySQL -y
rpm -ivh mha4mysql-node*.rpm

0.5.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.%’ ;

0.5.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

0.6 配置文件准备(db03)

0.6.1 创建配置文件目录
mkdir -p /etc/mha

0.6.2 创建日志目录
mkdir -p /var/log/mha/app1

0.6.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/
user=mha
password=mha
ping_interval=2
repl_password=123
repl_user=repl
ssh_user=root

[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

0.7 状态检查

互信检查

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

主从状态检查

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

0.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 &

0.9 查看MHA状态
[root@db03 ~]# masterha_check_status –conf=/etc/mha/app1.cnf

0.10 故障测试和修复
宕掉主库,查看现象.
修复过程:
a. 检查三个节点的状态
b. 修复1主2从
c. 修复配置文件
d. 启动前检测
e. 启动

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的软件结构
一堆perl写的脚本。

2.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.2 node 组件
save_binary_logs 保存和复制master的二进制日志
apply_diff_relay_logs 识别差异的中继日志事件并将其差异的事件应用于其他的
purge_relay_logs 清除中继日志(不会阻塞SQL线程)

3.站在产品经理角度,评估高可用软件设计
3.1 监控
3.2 选主
3.3 数据补偿
3.4 故障转移
3.5 应用透明
3.6 自动提醒
3.7 自愈

4.MHA FailOver(故障转移) 原理
看图说话。

  1. 启动manager 程序: masterha_manger

  2. 监控: masterha_master_monitor 每隔ping_interval检测主库心跳,一共检测四次.

  3. 如果出现多次检查没有心跳,进入切换流程

  4. 选主:
    alive 数组: 存活的从节点的编号.
    lastest数组: 日志最新的从节点编号. Master_Log_File ,Read_Master_Log_Pos
    pref 数组: 备选从节点的编号. candidate_master>=0
    bad 数组 : 不应该被选择的从节点编号.
    binlog没开,no_master=1,日志差异100000000 pos
    0 手工切换时,人为指定的节点,被作为新主
    ① if lastest && pref !& bad,被选择为新主
    ② elif lastest !& bad ,被选择为新主
    ③ elif pref !& bad ,被选择为新主
    ④ elif alive !& bad
    ⑤ 报错
    说明: 如果结果多个节点都满足,按照[serverN]中的N值来选主.

  5. 数据补偿
    a. 主库SSH能连
    save_binary_logs 远程保存缺失部分日志到从节点的/var/tmp/xxx,进行补偿
    b. ssh不能连
    从节点直接通过apply_diff_relay_logs,计算之间的差异并恢复

  6. 切换主从关系masterha_master_switch
    解除老的主从关系 stop slave ;reset slave;
    构建新的主从 change master to; start slave;

  7. VIP 应用透明 master_ip_failover

  8. 故障通知 send_report

  9. 将配置文件中的故障节点删掉masterha_conf_host

  10. “自杀”.

5. 模拟故障并恢复
5.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

5.1 宕主库测试
[root@db01 ~]# /etc/init.d/mysqld stop
Shutting down MySQL… SUCCESS!
[root@db01 ~]#

5.2 看日志
[root@db03 app1]# vim /var/log/mha/app1/manager

5.3 恢复
5.3.1 修复故障节点
[root@db01 ~]# /etc/init.d/mysqld start
Starting MySQL… SUCCESS!

如果生产怎么办?
按实际情况。

5.3.2 恢复主从
change master to
master_host=‘10.0.0.52’,
master_user=‘repl’,
master_password=‘123’ ,
MASTER_AUTO_POSITION=1;
start slave;

5.3.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

5.3.4 预检测脚本
[root@db03 ~]# masterha_check_ssh –conf=/etc/mha/app1.cnf
[root@db03 ~]# masterha_check_repl –conf=/etc/mha/app1.cnf

5.3.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
[root@db03 ~]#

6.应用透明—VIP
vip : 10.0.0.55/24

6.1 vip 故障转移脚本
上传脚本文件到/usr/local/bin 解压

[root@db03 mha_script]# cp -a /data/mha_script/* /usr/local/bin

6.2 修改权限
[root@db03 bin]# chmod +x /usr/local/bin/*

6.3 修改内容
[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 i f : if: if:key $vip”;
my $ssh_stop_vip = “/sbin/ifconfig i f : if: if:key down”;
my $ssh_Bcast_arp= “/sbin/arping -I $if -c 3 -A 10.0.0.55”;

6.4 修改Manager 配置文件
vim /etc/mha/app1.cnf

master_ip_failover_script=/usr/local/bin/master_ip_failover

6.5 重启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 &

6.6 手工在主库添加VIP
[root@db03 bin]# masterha_check_status –conf=/etc/mha/app1.cnf
[root@db02 ~]# ifconfig eth0:1 10.0.0.55/24

6.7 效果测试
使用navicat 连接测试MHA vip功能。

7. 故障提醒功能
7.1 准备脚本
[root@db03 bin]# cp send_report send_report.bak1

my $smtp=‘smtp.qq.com’; # smtp服务器
my $mail_from=‘22654481@qq.com’; # 发件箱
my $mail_user=‘22654481’; # 用户名 QQ号
my $mail_pass=‘gemghsvgkeyzcagh’; # 授权码
my $mail_to=[‘22654481@qq.com’]; # 收件箱

#my $mail_to=[‘to1@qq.com’,‘to2@qq.com’];

7.2 修改配置文件
vim /etc/mha/app1.cnf
#添加一行:
report_script=/usr/local/bin/send_report

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

7.4 模拟主库宕机
7.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

7.4.2 宕主库
[root@db02 ~]# /etc/init.d/mysqld stop
Shutting down MySQL… SUCCESS!

7.4.3 观察 vip 漂移

7.4.4 观察 邮件

7.5 修复MHA 架构1主2从

8. 日志补偿的冗余方案–binlog_server

8.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.000008
Read_Master_Log_Pos: 194
Relay_Master_Log_File: mysql-bin.000008
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.52 –user=mha –password=mha –raw –stop-never mysql-bin.000005 &

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

8.2 配置文件设置

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

8.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 &

8.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

8.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

9. MHA的维护操作 – 在线切换功能
9.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

9.2 master_ip_online_change_script功能实现

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

9.2.1 准备切换脚本

vim /usr/local/bin/master_ip_online_change

my $vip = “10.0.0.55/24”;
my $key = “1”;
my s s h s t a r t v i p = ” / s b i n / i f c o n f i g e n s 33 : ssh_start_vip = “/sbin/ifconfig ens33: sshstartvip=/sbin/ifconfigens33:key $vip”;
my s s h s t o p v i p = ” / s b i n / i f c o n f i g e n s 33 : ssh_stop_vip = “/sbin/ifconfig ens33: sshstopvip=/sbin/ifconfigens33:key $vip down”;
my $ssh_Bcast_arp= “/sbin/arping -I ens33 -c 3 -A 10.0.0.55”;

9.2.2 修改MHA配置文件
vim /etc/mha/app1.cnf
master_ip_online_change_script=/usr/local/bin/master_ip_online_change

===============
9.2.3 停 MHA
[root@db03 bin]# masterha_stop –conf=/etc/mha/app1.cnf

9.2.4 检查repl
[root@db03 bin]# masterha_check_repl –conf=/etc/mha/app1.cnf

9.2.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

9.2.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

9.2.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

本文地址:https://blog.csdn.net/xiaoleinb/article/details/112008891

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐