第1章 MySQL高可用介绍
1.1 企业高可用评估标准
评估标准是 全年无故障率指标:
3个9 99.9% 0.1%36524*60 = 525.6min (非计划停机时间)
4个9 99.99% 0.01% = 52.56min 互联网级别
5个9 99.999% 0.001% = 5.256min 金融级别
1.2 高可用产品介绍
常见产品:
主备系统类:
KA+双主结构+自主开发的脚本(节点监控,数据校验,数据补偿) 3个9
传统高可用服务+脚本Google公司产品 MMM 3-4个9
Facebook公司产品 MHA 4个9 , Taobao产品 TMHA , 腾讯产品TDSQL MHA
多活系统: 金融级别常用
PXC(percona), MGC(mariadb) , MySQL Cluster 5个9
MySQL产品InnoDB Cluster , 阿里PolarDB ,腾讯TiDB 分布式高可用
第2章 MHA基础架构搭建
准备环境 需要最少三台MySQL服务器+GTID主从模式 每一个mysql都是一个服务节点 需要安装node
配置关机程序的软连接 (MHA程序内写死了路径 如果不是yum安装 需要我们做个软连接)
ln -s /usr/local/mysql/bin/mysqlbinlog
/usr/bin/mysqlbinlog
ln -s /usr/local/mysql/bin/mysql
/usr/bin/mysql
- 配置个节点ssh免交户互信 截取日志恢复免交互.
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
测试: 将yes手工输入
db01:
[root@db01 ~/.ssh]# ssh 10.0.0.51 hostname
[root@db01 ~/.ssh]# ssh 10.0.0.52 hostname
[root@db01 ~/.ssh]# ssh 10.0.0.53 hostname
db02:
[root@db02 ~]# ssh 10.0.0.51 hostname
[root@db02 ~]# ssh 10.0.0.52 hostname
[root@db02 ~]# ssh 10.0.0.53 hostname
db03:
[root@db03 ~]# ssh 10.0.0.51 hostname
[root@db03 ~]# ssh 10.0.0.52 hostname
[root@db03 ~]# ssh 10.0.0.53 hostname
2.1 安装软件
下载mha软件
mha官网:https://code.google.com/archive/p/mysql-master-ha/
github下载地址:https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads
- 所有节点安装Node软件依赖包
yum install perl-DBD-MySQL -y
# 依赖包
rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
- 在db01主库中创建mha需要的用户 (主从同步状态 所有库也会有)
grant all privileges on *.* to mha@'10.0.0.%' identified by 'mha';
- Manager软件安装(db03) 需要单独占用一个服务器
yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes
# 依赖包
yum install -y mha4mysql-manager-0.56-0.el6.noarch.rpm
# 主体
2.2 准备配置文件
配置文件准备MHA安装的主机
(1) 创建配置文件目录
mkdir -p /etc/mha
(2) 创建日志目录
mkdir -p /var/log/mha/app1
(3) 编辑mha配置文件
cat > /etc/mha/app1.cnf<<EOF
[server default]
manager_log=/var/log/mha/app1/manager # manager 工作日志
manager_workdir=/var/log/mha/app1 # 工作目录
master_binlog_dir=/data/binlog # 主库的binlog位置
user=mha # MHA专用管理用户
password=mha
ping_interval=2 # 心跳检测的时间间隔,自动检测4次
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
EOF
2.3 状态检查(MHA服务端)
masterha_check_ssh --conf=/etc/mha/app1.cnf
# 检查ssh连接状态
masterha_check_repl --conf=/etc/mha/app1.cnf
# 检查repllog状态
2.4 开启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 &
参数解释:
--conf=/etc/mha/app1.cnf
: 业务配置文件,可以管理多套MHA架构
--remove_dead_master_conf
: 自动剔除故障主节点
--ignore_last_failover
: 忽略最后一次failover.
2.5 查看MHA状态
[root@db03 ~]#masterha_check_status --conf=/etc/mha/app1.cnf
2.6 停止命令
[root@db03 ~]# masterha_stop --conf=/etc/mha/app1.cnf
2.7 软件结构
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信息
Node 节点端:
这些工具通常由MHA Manager的脚本触发,无需人为操作
save_binary_logs # 保存和复制master的二进制日志
apply_diff_relay_logs # 识别差异的中继日志事件并将其差异的事件应用于其他的
purge_relay_logs # 清除中继日志(不会阻塞SQL线程)
第3章 MHA的工作原理(Fail over 过程)
通过
masterha_manger
将MHA的manager进行启动监控: 通过
masterha_master_monitor
监控主从复制的主库
利用ping_interval(参数)秒探测一次主库的状态,一共探测4次,无心跳认为主库宕机选主: 通过三种模式 顺序
1. 权重:candidate_master=1
2. 日志量
3. 配置文件顺序
建议: 设置权重,选主最快 并 开启GTID数据补偿
两种情况:
1. ssh能连: node端通过save_binary_logs自动保存主库的binlog,保存至/var/tmp临时文件,并且应用.
2. ssh不能连: node端,通过apply_diff_relay_logs自动对比差异,互相补偿.切换
manager端,masterha_master_switch
脚本进行切换
将所有node节点: 使用命令stop slave;
和reset slave all;
从库身份解除
剩余node节点,重构主从关系.change master to xxx
故障主库信息会从配置文件清楚,manager程序自杀.
额外数据补偿的功能(binlog server功能)
应用透明: vip
故障通知
自愈:待开发. 建议配合云环境.
第4章 扩展配置
4.1 MHA 的vip功能
4.1.1 准备vip脚本
需要在官网下载
[root@db03 ~]#cp master_ip_failover.txt /usr/local/bin/master_ip_failover
修改脚本配置
vi /usr/local/bin/master_ip_failover
my $vip = '10.0.0.55/24'; # 配置vip
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
注意一定要和配置文件中的ethN一致,我的是eth0:1(1是key指定的值)
赋予权限
当不提权时的 报错
dos2unix: converting file /usr/local/bin/master_ip_failover to Unix format ...
[root@db03 ~]# chmod +x /usr/local/bin/master_ip_failover
# 赋予权限
4.1.2 更改manager配置文件:
vim /etc/mha/app1.cnf
在全局设置中添加:
master_ip_failover_script=/usr/local/bin/master_ip_failover # 指定脚本位置
4.1.3 主库上,手工生成第一个vip地址
手工在主库上绑定vip,注意一定要和配置文件中的ethN一致,我的是eth0:1(1是key指定的值)
ifconfig eth0:1 10.0.0.55/24
# 重启失效
4.1.4 重启mha
masterha_stop --conf=/etc/mha/app1.cnf
启动:
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 &
binlog server 宕机补偿日志功能
思路 将主binlog日志 备份到MHA服务器上 防止断电等情况造成slave端数据缺失
4.2.1 配置参数:
vim /etc/mha/app1.cnf
添加模块
[binlog1]
no_master=1 # 开启功能
hostname=10.0.0.53 # 指定存放服务器ip
master_binlog_dir=/data/mysql/binlog # 指定MHA服务器 存放binlog备份文件地址
4.2.2 创建必要目录
mkdir -p /data/mysql/binlog
chown -R mysql.mysql /data/*
4.2.3 拉取主库binlog日志
cd /data/mysql/binlog
mysqlbinlog -R --host=10.0.0.51 --user=mha --password=mha --raw --stop-never mysql-bin.000001 &
注意: 生产中, 拉取起点从正在使用的binlog 开始
4.2.4 重启MHA
masterha_stop --conf=/etc/mha/app1.cnf
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.3 邮件提醒
4.3.1 准备脚本
官网下
[root@db03 ~]# unzip email_2019-最新.zip
[root@db03 ~]# cd email/
[root@db03 ~/email]# ll
总用量 88
-rw-r--r-- 1 root root 35 12月 27 2017 send
-rw-r--r-- 1 root root 80213 9月 30 2009 sendEmail
-rw-r--r-- 1 root root 203 4月 19 2019 testpl
转移路径:
[root@db03 ~/email]#cp -a * /usr/local/bin/
[root@db03 ~/email]# cd /usr/local/bin/
提权:
[root@db03 /usr/local/bin]# chmod +x /usr/local/bin/*
4.3.2 修改参数:
vim /etc/mha/app1.cnf
全局中添加参数
report_script=/usr/local/bin/send
4.3.3 重启MHA
关闭
masterha_stop --conf=/etc/mha/app1.cnf
开启
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章 测试MHA高可用能力,并恢复.
5.1 停主库
pkill mysqld
5.2 观察切换结果
观察点包括 但不限于
vip
主从身份
配置文件 是否将故障节点清除
binlog server
manager进程
看日志
[root@db03 ~]# vim /var/log/mha/app1/manager
5.3 修复全新的高可用环境
1 修复主从
原主 : 将原主故障修复完成后 当作从指向新主
change master to
master_host='10.0.0.52',
master_user='repl',
master_password='123' ,
MASTER_AUTO_POSITION=1;
start slave;
2 修复配置文件
MHA服务器
vim /etc/mha/app1.cnf
将丢弃的原主节点添加上
[server1]
hostname=10.0.0.51
port=3306
3 修复binlog server
[root@db03 ~]# cd /data/mysql/binlog/
删除故障节点的binlog备份
[root@db03 /data/mysql/binlog]#rm -rf /data/mysql/binlog/*
拉去新节点的binlog
mysqlbinlog -R --host=10.0.0.52 --user=mha --password=mha --raw --stop-never mysql-bin.000001 &
检查VIP
新节点ip a
4 互信检查,主从检查
masterha_check_ssh --conf=/etc/mha/app1.cnf
masterha_check_repl --conf=/etc/mha/app1.cnf
5 再次启动manager
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 检查状态
[root@db03 /data/mysql/binlog]# masterha_check_status --conf=/etc/mha/app1.cnf