MySQL MHA高可用

第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 高可用产品介绍

常见产品:

主备系统类:

  1. KA+双主结构+自主开发的脚本(节点监控,数据校验,数据补偿) 3个9
    传统高可用服务+脚本

  2. Google公司产品 MMM 3-4个9

  3. Facebook公司产品 MHA 4个9 , Taobao产品 TMHA , 腾讯产品TDSQL MHA

多活系统: 金融级别常用

  1. PXC(percona), MGC(mariadb) , MySQL Cluster 5个9

  2. MySQL产品InnoDB Cluster , 阿里PolarDB ,腾讯TiDB 分布式高可用

第2章 MHA基础架构搭建

  1. 准备环境 需要最少三台MySQL服务器+GTID主从模式 每一个mysql都是一个服务节点 需要安装node

  2. 配置关机程序的软连接 (MHA程序内写死了路径 如果不是yum安装 需要我们做个软连接)

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

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

  1. 配置个节点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

  1. 所有节点安装Node软件依赖包

yum install perl-DBD-MySQL -y# 依赖包

rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm

  1. 在db01主库中创建mha需要的用户 (主从同步状态 所有库也会有)

grant all privileges on *.* to mha@'10.0.0.%' identified by 'mha';

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

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 过程)

  1. 通过masterha_manger将MHA的manager进行启动

  2. 监控: 通过masterha_master_monitor 监控主从复制的主库
    利用ping_interval(参数)秒探测一次主库的状态,一共探测4次,无心跳认为主库宕机

  3. 选主: 通过三种模式 顺序
    1. 权重:candidate_master=1
    2. 日志量
    3. 配置文件顺序
    建议: 设置权重,选主最快 并 开启GTID

  4. 数据补偿
    两种情况:
    1. ssh能连: node端通过save_binary_logs自动保存主库的binlog,保存至/var/tmp临时文件,并且应用.
    2. ssh不能连: node端,通过apply_diff_relay_logs自动对比差异,互相补偿.

  5. 切换
    manager端,masterha_master_switch脚本进行切换
    将所有node节点: 使用命令stop slave;reset slave all;从库身份解除
    剩余node节点,重构主从关系.change master to xxx

  6. 故障主库信息会从配置文件清楚,manager程序自杀.

  7. 额外数据补偿的功能(binlog server功能)

  8. 应用透明: vip

  9. 故障通知

  10. 自愈:待开发. 建议配合云环境.

第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";
MySQL MHA高可用_第1张图片
image.png

注意一定要和配置文件中的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 /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 观察切换结果

观察点包括 但不限于

  1. vip

  2. 主从身份

  3. 配置文件 是否将故障节点清除

  4. binlog server

  5. manager进程

  6. 看日志

[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

你可能感兴趣的:(MySQL MHA高可用)