第九章 MySQL 高可用架构-MHA

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 金融级别

2. MySQL数据库高可用架构产品
  • 主备系统:
    (1) KA+双主结构+自主开发的脚本(节点监控,数据校验,数据补偿) 3个9
    (2) Google MMM 3-4个
    (3) Facebook MHA 4个9 , Taobao TMHA , TDSQL MHA
  • 多活系统:
    (5) PXC(percona), MGC(mariadb) , MySQL Cluster 5个9
    (6) InnoDB Cluster , PolarDB ,TiDB 分布式高可用

在这里插入图片描述

3. MHA 软件结构
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线程)
4. MHA的工作原理(Failover 过程)

(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
(6) 故障主库信息会从配置文件清除,manager程序自杀.
(7) 额外数据补偿的功能(binlog server功能)
(8) 应用透明: vip
vip只适用于局域网,
跨机房使用:keepalive或者DNS
(9) 故障通知
(10) 自愈:待开发. 建议配合云环境.

5. MHA基础架构搭建
  • 5.1 准备环境(略。1主2从GTID)

    #### 10.0.0.51主,10.0.0.52从,10.0.0.53从
    [root@db02 ~]# mysql -e "show slave status\G"|grep Running:
    [root@db03 ~]# mysql -e "show slave status\G"|grep Running:
    说明: MHA 要求至少1主2从结构,独立节点,不能是多实例.GTID复制更好一些.
    
  • 5.2 配置关键程序软连接

    ln -s /usr/local/mysql/bin/mysqlbinlog    /usr/bin/mysqlbinlog
    ln -s /usr/local/mysql/bin/mysql          /usr/bin/mysql
    说明:  MHA工作过程中需要调用命令.
    
  • 5.3 配置各节点互信

    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 
    测试:   将yes手工输入
    ssh 10.0.0.51 hostname
    ssh 10.0.0.52 hostname
    ssh 10.0.0.53 hostname
    说明: 截取日志恢复免交互.
    
  • 5.4 安装软件

    (1) 下载mha软件
    mha官网:https://code.google.com/archive/p/mysql-master-ha/
    github下载地址:https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads
    (2) 所有节点安装Node软件依赖包
    yum install perl-DBD-MySQL -y
    rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
    (3) 在db01主库中创建mha需要的用户
    grant all privileges on *.* to mha@'10.0.0.%' identified by 'mha';
    (5) 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
    
  • 5.5 配置文件准备(db03)

    (1) 创建配置文件目录
     mkdir -p /etc/mha
    (2) 创建日志目录
    mkdir -p /var/log/mha/app1
    (3) 编辑mha配置文件
    cat > /etc/mha/app1.cnf<<EOF
    [server default]
    # manager 工作日志
    manager_log=/var/log/mha/app1/manager      
    # 工作目录
    manager_workdir=/var/log/mha/app1   
    # 主库的binlog位置         
    master_binlog_dir=/data/binlog    
    # MHA专用管理用户 
    user=mha                                   
    password=mha   
    # 心跳检测的时间间隔,自动检测4次                  
    ping_interval=2
    # 复制用户
    repl_password=123
    repl_user=repl
    # ssh的互信用户
    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
    EOF
    
  • 5.6 状态检查(db03)

    masterha_check_ssh  --conf=/etc/mha/app1.cnf 
    masterha_check_repl  --conf=/etc/mha/app1.cnf 
    
  • 5.7 开启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 &
    
    --conf=/etc/mha/app1.cnf  :   业务配置文件,可以管理多套MHA架构
    --remove_dead_master_conf :   自动剔除故障主节点
    --ignore_last_failover    :   忽略最后一次failover.
    
  • 5.8 查看MHA状态

    [root@db03 ~]# masterha_check_status --conf=/etc/mha/app1.cnf
    [root@db03 ~]# masterha_stop  --conf=/etc/mha/app1.cnf
    
6. MHA 的vip功能(db03)
  • 6.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';
    my $key = '1';
    my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
    my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
    注意:
    [root@db03 ~]# dos2unix /usr/local/bin/master_ip_failover 
    [root@db03 ~]# chmod +x /usr/local/bin/master_ip_failover 
    
  • 6.2 更改manager配置文件:

    vim /etc/mha/app1.cnf
    添加:
    master_ip_failover_script=/usr/local/bin/master_ip_failover
    
  • 6.3 主库上,手工生成第一个vip地址

    手工在主库上绑定vip,注意一定要和配置文件中的ethN一致,我的是eth0:1(1是key指定的值)
    ifconfig eth0:1 10.0.0.55/24
    
  • 6.5 重启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 &
    
7. binlog server(db03)
  • 7.1 配置参数:

    vim /etc/mha/app1.cnf 
    [binlog1]
    no_master=1
    hostname=10.0.0.53
    master_binlog_dir=/data/mysql/binlog
    
  • 7.2 创建必要目录

    mkdir -p /data/mysql/binlog
    chown -R mysql.mysql /data/*
    
  • 7.3 拉取主库binlog日志

    cd /data/mysql/binlog   
    mysqlbinlog  -R --host=10.0.0.51 --user=mha --password=mha --raw  --stop-never mysql-bin.000001 &
    *****注意: 生产中, 拉取起点从正在使用的binlog开启
    
  • 7.5 重启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 &
    
8. 邮件提醒(db03)
  • 8.1 准备脚本

    [root@db03 ~]# unzip email_2019-最新.zip 
    [root@db03 ~]# cd email/
    [root@db03 ~/email]# cp -a * /usr/local/bin/
    [root@db03 ~/email]# cd /usr/local/bin/
    [root@db03 /usr/local/bin]# chmod +x ./*
    
  • 8.2 修改参数:

    vim /etc/mha/app1.cnf 
    report_script=/usr/local/bin/send
    
  • 8.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 &
    
9. 测试MHA高可用能力,并恢复.
  • 9.1 停主库

    pkill mysqld 
    
  • 9.2 观察切换结果

    (1) vip 地址
    (2) 主从身份 
    (3) 配置文件
    (4) binlogserver 
    (5) manager进程
    (6) 看日志
    
  • 9.3 修复全新的高可用环境

    (1) 修复主从 db01: 
    change master to 
    master_host='10.0.0.52',
    master_user='repl',
    master_password='123' ,
    MASTER_AUTO_POSITION=1;
    start slave;
    (2) 修复配置文件 db03 : 
    vim /etc/mha/app1.cnf 
    [server1]
    hostname=10.0.0.51
    port=3306
    (3) 修复binlogserver (实时同步)
    [root@db03 ~]# cd /data/mysql/binlog/
    [root@db03 /data/mysql/binlog]# rm -rf *
    mysqlbinlog  -R --host=10.0.0.52 --user=mha --password=mha --raw  --stop-never mysql-bin.000001 &
    (5) 检查VIP
    略.
    (6) 互信检查,主从检查
    masterha_check_ssh  --conf=/etc/mha/app1.cnf 
    masterha_check_repl  --conf=/etc/mha/app1.cnf 
    (7) 启动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 &
    [root@db03 /data/mysql/binlog]# masterha_check_status --conf=/etc/mha/app1.cnf
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值