欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

15:MySQL 高可用架构

程序员文章站 2022-06-19 10:07:11
0. MHA高可用架构介绍及搭建过程0.1 规划:主库:51 node从库:52 node53 node manager0.2 准备环境略。1主2从GTID0.3 配置关键程序软连接ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlogln -s /usr/local/mysql/bin/mysql /usr/bin/mysql0....

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

相关标签: mysql