zoukankan      html  css  js  c++  java
  • [MySQL]-10MySQL高可用-MHA

    第1章 MHA介绍

    1.MHA介绍

    MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案。
    它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为 MySQL高可用性环境下故障切换和主从提升的高可用软件。
    
    在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。
    
    MHA还提供在线主库切换的功能,能够安全地切换当前运行的主库到一个新的主库中 (通过将从库提升为主库),大概0.5-2秒内即可完成。
    

    2.MHA的优势

    1.自动故障转移快
    2.主库崩溃不存在数据一致性问题
    3.配置不需要对当前mysql环境做重大修改
    4.不需要添加额外的服务器(仅一台manager就可管理上百个replication)
    5.性能优秀,可工作在半同步复制和异步复制,当监控mysql状态时,仅需要每隔N秒 向master发送ping包(默认3秒),所以对性能无影响。你可以理解为MHA的性能和简 单的主从复制框架性能一样。
    6.只要replication支持的存储引擎,MHA都支持,不会局限于innodb
    

    3.MHA功能

    1.监控
    2.选主
    3.应用透明(vip)
    4.故障提醒
    5.额外数据补偿
    6.剔除故障节点
    7.manager 程序"自杀"
    

    4.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 组件
    save_binary_logs            保存和复制master的二进制日志 
    apply_diff_relay_logs       识别差异的中继日志事件并将其差异的事件应用于其他的
    purge_relay_logs            清除中继日志(不会阻塞SQL线程)
    

    第2章 基础主从复制环境搭建部署

    0.部署环境说明

    三个MySQL节点,GTID,主从复制
    

    1.mysql环境

    mkdir -p /data/mysql_3306/
    mkdir -p /mysql_binlog/
    
    yum remove mariadb-libs -y
    rm -rf /etc/my.cnf
    yum install -y libaio-devel
    
    tar zxf mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz -C /opt/
    mv /opt/mysql-5.7.28-linux-glibc2.12-x86_64 /opt/mysql-5.7.28
    ln -s /opt/mysql-5.7.28 /opt/mysql 
    echo 'export PATH=$PATH:/opt/mysql/bin' >>/etc/profile
    source /etc/profile
    mysql -V
    
    useradd -s /sbin/nologin -M mysql
    
    chown -R mysql.mysql /opt/mysql*
    chown -R mysql.mysql /data/
    chown -R mysql.mysql /mysql_binlog/
    
    mysqld --initialize-insecure --user=mysql --basedir=/opt/mysql --datadir=/data/mysql_3306/
    
    #db-51的配置
    cat > /etc/my.cnf <<EOF
    [mysqld]
    user=mysql
    datadir=/data/mysql_3306
    basedir=/opt/mysql/
    socket=/tmp/mysql.sock
    port=3306
    server_id=51
    log_bin=/mysql_binlog/mysql-bin
    autocommit=0
    binlog_format=row
    gtid-mode=on
    enforce-gtid-consistency=true
    log-slave-updates=1
    
    [mysql]
    socket=/tmp/mysql.sock
    
    [client]
    socket=/tmp/mysql.sock
    EOF
    
    #db-52的配置
    cat > /etc/my.cnf <<EOF
    [mysqld]
    user=mysql
    datadir=/data/mysql_3306
    basedir=/opt/mysql/
    socket=/tmp/mysql.sock
    port=3306
    server_id=52
    log_bin=/mysql_binlog/mysql-bin
    autocommit=0
    binlog_format=row
    gtid-mode=on
    enforce-gtid-consistency=true
    log-slave-updates=1
    
    [mysql]
    socket=/tmp/mysql.sock
    
    [client]
    socket=/tmp/mysql.sock
    EOF
    
    #db-53的配置
    cat > /etc/my.cnf <<EOF
    [mysqld]
    user=mysql
    datadir=/data/mysql_3306
    basedir=/opt/mysql/
    socket=/tmp/mysql.sock
    port=3306
    server_id=53
    log_bin=/mysql_binlog/mysql-bin
    autocommit=0
    binlog_format=row
    gtid-mode=on
    enforce-gtid-consistency=true
    log-slave-updates=1
    
    [mysql]
    socket=/tmp/mysql.sock
    
    [client]
    socket=/tmp/mysql.sock
    EOF
    
    cp /opt/mysql/support-files/mysql.server  /etc/init.d/mysqld
    chkconfig --add mysqld
    systemctl start mysqld
    netstat -lntup|grep 3306
    mysqladmin password '123'
    

    2.主从复制环境

    #db-51创建复制用户
    grant replication slave on *.* to repl@'10.0.0.%' identified by '123';
    
    #db-52和db-53配置复制信息
    change master to 
    master_host='10.0.0.51',
    master_user='repl',
    master_password='123' ,
    MASTER_AUTO_POSITION=1;
    start slave;
    
    #检查复制状态
    show slave statusG
    

    第3章 MHA服务搭建部署

    1.创建软连接

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

    2.节点互信-所有机器都操作

    ssh-keygen
    ssh-copy-id 10.0.0.51
    ssh-copy-id 10.0.0.52
    ssh-copy-id 10.0.0.53
    

    3.各节点验证-所有机器都操作

    ssh 10.0.0.51 hostname
    ssh 10.0.0.52 hostname
    ssh 10.0.0.53 hostname
    

    4.所有节点安装node软件

    yum install perl-DBD-MySQL -y
    rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm 
    

    5.db-03安装Manager软件

    yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes
    yum install -y mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
    

    6.在db-01主库中创建mha需要的用户

    grant all privileges on *.* to mha@'10.0.0.%' identified by 'mha';
    select user,host from mysql.user;
    

    7.Manager配置文件准备(db03)

    #创建配置文件目录
    mkdir -p /etc/mha
    
    #创建日志目录
    mkdir -p /var/log/mha/app1
    
    #编辑mha配置文件
    cat > /etc/mha/app1.cnf <<EOF
    [server default]
    manager_log=/var/log/mha/app1/manager
    manager_workdir=/var/log/mha/app1
    master_binlog_dir=/mysql_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
    port=3306
    [server3]
    hostname=10.0.0.53
    port=3306
    EOF
    
    #配置文件解释
    [server default]
    manager_log=/var/log/mha/app1/manager         # MHA的工作日志设置
    manager_workdir=/var/log/mha/app1             # MHA工作目录        
    master_binlog_dir=/data/binlog                # 主库的binlog目录
    user=mha                                      # 监控用户                      
    password=mha                                  # 监控密码
    ping_interval=2                               # 心跳检测的间隔时间
    repl_password=123                             # 复制用户
    repl_user=repl                                # 复制密码
    ssh_user=root                                 # ssh互信的用户
    [server1]                                     # 节点信息....
    

    8.状态检查(db03)

    masterha_check_ssh   --conf=/etc/mha/app1.cnf
    masterha_check_repl  --conf=/etc/mha/app1.cnf
    

    9.开启MHA-manager(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 &
    

    10.查看MHA状态

    masterha_check_status --conf=/etc/mha/app1.cnf
    

    第4章 MHA工作原理

    1.选主策略

    1.日志量最新
    2.备选主
    3.不被选主
    

    2.故障转移流程

    1.从宕机崩溃的master保存二进制日志事件(binlog events);
    2.识别含有最新更新的slave;
    3.应用差异的中继日志(relay log)到其他的slave;
    4.应用从master保存的二进制日志事件(binlog events);
    5.提升一个slave为新的master;
    6.使其他的slave连接新的master进行复制;
    

    第5章 MHA应用透明

    1.vip故障转移脚本

    上传脚本文件到/usr/local/bin 
    cp -a * /usr/local/bin
    

    2.修改权限

    chmod +x /usr/local/bin/*
    

    3.替换字符

    dos2unix /usr/local/bin/*
    

    4.修改内容

    vim  /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";
    my $ssh_Bcast_arp= "/sbin/arping -I eth0 -c 3 -A 10.0.0.55";
    

    5.修改配置文件

    vim /etc/mha/app1.cnf 
    master_ip_failover_script=/usr/local/bin/master_ip_failover
    

    6.重启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.手工在主库添加VIP

    ifconfig eth0:1 10.0.0.55/24
    

    第6章 MHA故障提醒

    1.准备脚本

    vim /usr/local/bin/send_report
    my $smtp='smtp.qq.com';
    my $mail_from='526195417@qq.com';
    my $mail_user='526195417';
    my $mail_pass='njwygmkbvzlubiji';
    my $mail_to='526195417@qq.com';
    

    2.修改配置文件

    vim /etc/mha/app1.cnf 
    report_script=/usr/local/bin/send_report
    

    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 &
    

    第7章 MHA数据补偿

    1.创建必要目录(db03)

    mkdir -p /data/binlog_server/
    
    chown -R mysql.mysql /data/*
    cd  /data/binlog_server/
    

    2.拉取最新日志

    注意:
    拉取日志的起点,需要按照目前从库的已经获取到的二进制日志点为起点

    mysql -e "show slave status G"|grep "Master_Log"
    mysqlbinlog  -R --host=10.0.0.51 --user=mha --password=mha --raw  --stop-never mysql-bin.000003 &
    ll /data/binlog_server
    

    3.MHA配置文件设置

    vim /etc/mha/app1.cnf 
    [binlog1]
    no_master=1
    hostname=10.0.0.53
    master_binlog_dir=/data/binlog_server/
    

    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 &
    

    第8章 MHA模拟故障演练

    1.停掉主库
    2.查看VIP是否会漂移
    3.查看从库是否升为新的主库
    4.查看从库是否切换为新的复制关系
    

    第9章 MHA修复方案

    1.确定三个数据库节点都在线

    #db-51启动数据库
    systemctl start mysqld
    

    2.db-51修复主从复制关系

    change master to 
    master_host='10.0.0.52',
    master_user='repl',
    master_password='123' ,
    MASTER_AUTO_POSITION=1;
    start slave;
    show slave statusG
    

    3.判断VIP是否存在

    #db-52确认是否存在VIP
    ip a|grep 10.0.0.55
    

    4.检查binlogserver并修复

    ps -ef|grep mysqlbinlog
    rm -rf /data/binlog_server/*
    cd  /data/binlog_server/
    mysql -e "show slave status G"|grep "Master_Log"
    mysqlbinlog  -R --host=10.0.0.51 --user=mha --password=mha --raw  --stop-never mysql-bin.000003 &
    

    5.检查配置文件确认三个节点是否存在

    #添加新节点到配置文件
    masterha_conf_host --command=add --conf=/etc/mha/app1.cnf --hostname=10.0.0.51 --block=server1 --params="port=3306"
    ---------------------删除命令------------------
    masterha_conf_host --command=delete --conf=/etc/mha/app1.cnf --block=server1
    

    6.检查ssh互信和repl

    masterha_check_ssh  --conf=/etc/mha/app1.cnf
    masterha_check_repl  --conf=/etc/mha/app1.cnf 
    

    7.启动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 &
    

    8.检查MHA

    masterha_check_status   --conf=/etc/mha/app1.cnf 
    

    第10章 MHA维护

    1.master_ip_online_change_script功能

    在线切换时,自动锁原主库,VIP自动切换
    

    2.准备切换脚本

    vim /usr/local/bin/master_ip_online_change
    
    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 $vip down";
    my $ssh_Bcast_arp= "/sbin/arping -I eth0 -c 3 -A 10.0.0.55";
    

    3.修改MHA配置文件

    vim /etc/mha/app1.cnf
    master_ip_online_change_script=/usr/local/bin/master_ip_online_change
    

    4.停 MHA

    masterha_stop  --conf=/etc/mha/app1.cnf 
    

    5.检查repl

    masterha_check_repl   --conf=/etc/mha/app1.cnf 
    

    6.在线切换

    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
    

    7.重构binlogserver

    [root@db-53 ~]# ps -ef |grep [m]ysqlbinlog
    root      33698  23489  0 21:18 pts/0    00:00:00 mysqlbinlog -R --host=10.0.0.52 --user=mha --password=x x --raw --stop-never mysql-bin.000003
    [root@db-53 ~]# kill 33698
    [root@db-53 ~]# cd /data/binlog_server/
    [root@db-53 binlog_server]# rm -rf *
    [root@db-53 binlog_server]# mysqlbinlog  -R --host=10.0.0.51 --user=mha --password=mha --raw  --stop-never mysql-bin.000003 &
    [1] 36893
    

    8.启动MHA

    [root@db-53 ~]# 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] 36915
    
    [root@db-53 ~]# masterha_check_status   --conf=/etc/mha/app1.cnf 
    app1 (pid:36915) is running(0:PING_OK), master:10.0.0.51
    
  • 相关阅读:
    SQL Data Services Abandons REST for TDS API and Knocks My Socks Off
    C# Lambda Expressions 简介
    Web.config 和 App.config 区别
    XPO 第三方控件学习(DevExpress Persistent Object )系列查询
    进销存管理系统 系列
    MOSS 学习系列(十万个为什么)--为什么我要定制审批流程的时候找不到审批的选项?
    XPO 第三方控件学习(DevExpress Persistent Object )系列 其他(session,事务,有效性检查...
    如何使用三态工作流(一)
    english interview example
    How to build a K2 SharePoint Workflow(2)
  • 原文地址:https://www.cnblogs.com/alaska/p/14961713.html
Copyright © 2011-2022 走看看