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(故障转移) 原理
看图说话。
-
启动manager 程序: masterha_manger
-
监控: masterha_master_monitor 每隔ping_interval检测主库心跳,一共检测四次.
-
如果出现多次检查没有心跳,进入切换流程
-
选主:
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值来选主. -
数据补偿
a. 主库SSH能连
save_binary_logs 远程保存缺失部分日志到从节点的/var/tmp/xxx,进行补偿
b. ssh不能连
从节点直接通过apply_diff_relay_logs,计算之间的差异并恢复 -
切换主从关系masterha_master_switch
解除老的主从关系 stop slave ;reset slave;
构建新的主从 change master to; start slave; -
VIP 应用透明 master_ip_failover
-
故障通知 send_report
-
将配置文件中的故障节点删掉masterha_conf_host
-
“自杀”.
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
- 此种方法 切换,要注意将原主库,FTWRL,否则会造成主从不一致。
- 手工切换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
上一篇: Elastic Stack:ELK