15.MySQL 高可用架构
孙富阳, 江湖人称没人称。多年互联网运维工作经验,曾负责过孙布斯大规模集群架构自动化运维管理工作。擅长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
未经允许不得转载:孙某某的运维之路 » 15.MySQL 高可用架构
评论已关闭