zoukankan      html  css  js  c++  java
  • MySQL-MHA高可用及读写分离

    MySQL-MHA高可用

    MHA FailOver过程详解

    #什么是Failover?
    故障转移.
    主库宕机一直到业务恢复正常的处理过程(自动)
    #Failover让你实现怎么做?
    (1) 快速监控到主库宕机
    (2) 选择新主
    (3) 数据补偿
    (4) 解除从库身份
    (5) 剩余从库和新主库构建主从关系
    (6) 应用透明
    (7) 故障节点自愈(待开发...)
    (8) 故障提醒
    

    架构工作原理

    #MHA的Failover如何实现?
    (1) masterha_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 &
    
    调用: masterha_check_ssh,  检测所有节点的SSH的连通性和互信情况
    调用: masterha_check_repl ,检测1主2从的主从状态
    
    (2)监控 
       通过masterha_master_monitor,每隔(ping_interval=2)秒数,检查主库状态.
       如果3-4次,还没连通,就认为主库宕机,进行failover
    
    (3) 选主
    	1. 权重,candidate_master=1,优先选择带有权重的节点 
    	2. 没有权重,根据日志量,选择最接近于主库的从库.
    	3. 没有权重,日志量相同,按照配置文件顺序.
    (4) 数据补偿 
    	1. 主库ssh能连,立即通过save_binary_logs,将各个从库缺失的部分binlog保存至/var/tmp,并立即补偿.
    	2. 主库ssh不能连,通过apply_diff_relay_logs ,自动计算从库relaylog的差异,并进行补偿
    (5) 切换 
    	通过masterha_master_switch进行切换
    	stop slave; 停止所有从库 
    	reset slave all; 解除所有从库身份.
    	change master to..;start slave; 重构新主从
    
    (6) Failover完成后,通过masterha_conf_host脚本将故障节点踢出集群, masterha_manager自杀.
    
    #Manager额外参数介绍
    (1)  ping_interval=1
    #设置监控主库,发送ping包的时间间隔,尝试三次没有回应的时候自动进行failover
    
    (2) candidate_master=1
    #设置为候选master,如果设置该参数以后,发生主从切换以后将会将此从库提升为主库,即使这个主库不是集群中事件最新的slave
    
    (3)check_repl_delay=0
    
    #默认情况下如果一个slave落后master 100M的relay logs的话,
    MHA将不会选择该slave作为一个新的master,因为对于这个slave的恢复需要花费很长时间,通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master
    

    MHA软件构成

    #Manager工具包主要包括以下几个工具:
    mha4mysql-manager-0.56-0.el6.noarch.rpm
    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工具包主要包括以下几个工具:
    mha4mysql-node-0.56-0.el6.noarch.rpm
    这些工具通常由MHA Manager的脚本触发,无需人为操作
    save_binary_logs            #保存和复制master的二进制日志 
    apply_diff_relay_logs       #识别差异的中继日志事件并将其差异的事件应用于其他的
    purge_relay_logs            #清除中继日志(不会阻塞SQL线程)
    

    MHA环境搭建

    主机名 ip地址
    sql01 10.0.1.110
    sql02 10.0.1.120
    sql03 10.0.1.130
    #下载mha软件
    mha官网:https://code.google.com/archive/p/mysql-master-ha/
    github下载地址:https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads
    
    #节点规划
    manager端: sql03
    node端: sql01,sql02,sql03
    1主2从,独立数据库实例
    
    #MHA 配置过程细节说明
    #软连接
    [root@sql01 ~]# ln -s /application/mysql/bin/mysqlbinlog    /usr/bin/mysqlbinlog
    [root@sql01 ~]# ln -s /application/mysql/bin/mysql          /usr/bin/mysql
    
    #配置各节点互信
    [root@sql01 ~]# ssh-keygen 
    [root@sql01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub 10.0.1.110
    [root@sql01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub 10.0.1.120
    [root@sql01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub 10.0.1.130
    [root@sql01 ~]# ssh 10.0.1.110 hostname
    sql01
    [root@sql01 ~]# ssh 10.0.1.120 hostname
    sql02
    [root@sql01 ~]# ssh 10.0.1.130 hostname
    sql03
    [root@sql01 ~]# 
    
    #安装软件包(所有节点)
    [root@sql01 ~]# yum install perl-DBD-MySQL -y
    [root@sql01 ~]# rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm 
    
    #在db01主库中创建mha需要的用户
    mysql> grant all privileges on *.* to mha@'10.0.1.%' identified by 'mha';
    
    #Manager软件安装(sql03)
    [root@sql03 ~]# yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes
    [root@sql03 ~]# rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm
    
    #配置文件准备(sql03)
    #创建配置文件目录
    [root@sql03 ~]# mkdir -p /etc/mha
    #创建日志目录
    [root@sql03 ~]# mkdir -p /var/log/mha/app1
    #编辑mha配置文件
    [root@sql03 ~]# 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.1.110
    port=3306                                  
    [server2]            
    hostname=10.0.1.120
    port=3306
    [server3]
    hostname=10.0.1.130
    port=3306
    [root@sql03 ~]# mkdir -p /data/binlog
    [root@sql03 ~]# chown -R mysql:mysql /data
    
    #状态检查(sql03)
    [root@sql03 ~]#  masterha_check_ssh  --conf=/etc/mha/app1.cnf
    [root@sql03 ~]#  masterha_check_repl  --conf=/etc/mha/app1.cnf
    
    #开启MHA(sql03):
    [root@sql03 ~]# 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 &
    
    #查看MHA状态
    [root@sql03 ~]# masterha_check_status --conf=/etc/mha/app1.cnf
    app1 (pid:17274) is running(0:PING_OK), master:10.0.1.110
    [root@sql03 ~]# 
    

    MHA 应用透明(vip)

    #sql03:
    [root@sql03 ~]# cp /root/master_ip_failover.txt /usr/local/bin/master_ip_failover
    [root@sql03 ~]# vim /usr/local/bin/master_ip_failover 
    my $vip = '10.0.1.55/24';
    my $key = '1';
    my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
    my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
    [root@sql03 ~]# dos2unix /usr/local/bin/master_ip_failover
    [root@sql03 ~]# chmod +x /usr/local/bin/master_ip_failover 
    [root@sql03 ~]# 
    
    #更改manager配置文件:
    [root@sql03 ~]# vim /etc/mha/app1.cnf
    master_ip_failover_script=/usr/local/bin/master_ip_failover
    
    #sql01:手工添加vip
    [root@sql01 ~]# ifconfig eth0:1 10.0.1.55/24
    
    #sql03 : 重启MHA
    [root@sql03 ~]# masterha_stop --conf=/etc/mha/app1.cnf
    [root@sql03 ~]# 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 &
    

    MHA 故障提醒

    1. 参数:
    report_script=/usr/local/bin/send
    2. 准备邮件脚本
    send_report
    (1)准备发邮件的脚本(上传 email_2019-最新.zip中的脚本,到/usr/local/bin/中)
    (2)将准备好的脚本添加到mha配置文件中,让其调用
    [root@sql03 ~]# cp -a email/* /usr/local/bin/
    [root@sql03 ~]# cd /usr/local/bin/
    [root@sql03 bin]# chmod +x *
    
    #修改manager配置文件,调用邮件脚本
    [root@sql03 ~]# vim /etc/mha/app1.cnf 
    report_script=/usr/local/bin/send
    
    #重启MHA
    [root@sql03 ~]# masterha_stop --conf=/etc/mha/app1.cnf
    [root@sql03 ~]# 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

    找一台额外的机器,必须要有5.6以上的版本,支持gtid并开启,这里直接用的第二个slave(sql03)
    [root@sql03 ~]# vim /etc/mha/app1.cnf
    [binlog1]
    no_master=1
    hostname=10.0.1.130
    master_binlog_dir=/data/mysql/binlog
    
    #创建必要目录
    [root@sql03 ~]# mkdir -p /data/mysql/binlog
    [root@sql03 ~]# chown -R mysql:mysql /data
    [root@sql03 ~]# 
    
    #拉取主库binlog日志
    [root@sql03 binlog]# mysqlbinlog  -R --host=10.0.1.110 --user=mha --password=mha --raw  --stop-never mysql-bin.000005 &
    注意:拉取日志的起点,需要按照目前主库正在使用的binlog为起点.
    
    #重启MHA
    [root@sql03 ~]# masterha_stop --conf=/etc/mha/app1.cnf
    [root@sql03 ~]# 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 &
    

    故障处理

    主库宕机,binlogserver 自动停掉,manager 也会自动停止。
    处理思路:
    1. 修故障库,并恢复1主2从
    2. 修复配置文件
    3. 修复binlogserver 
    5. 检查ssh和主从
    6. 启动MHA
    

    Atlas实现读写分离

    1. Atlas 介绍
    Atlas是由 Qihoo 360, Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。
    它是在mysql-proxy 0.8.2版本的基础上,对其进行了优化,增加了一些新的功能特性。
    360内部使用Atlas运行的mysql业务,每天承载的读写请求数达几十亿条。
    下载地址
    https://github.com/Qihoo360/Atlas/releases
    

    安装配置

    [root@sql03 ~]# yum -y install Atlas-2.2.1.el6.x86_64.rpm
    [root@sql03 ~]# cd /usr/local/mysql-proxy/conf/
    [root@sql03 conf]# mv test.cnf test.cnf.bak
    [root@sql03 conf]# vim test.cnf
    [mysql-proxy]
    admin-username = user
    admin-password = pwd
    proxy-backend-addresses = 10.0.1.55:3306
    proxy-read-only-backend-addresses = 10.0.1.110:3306,10.0.1.120:3306
    pwds = repl:3yb5jEku5h4=,mha:O2jBXONX098=
    daemon = true
    keepalive = true
    event-threads = 8
    log-level = message
    log-path = /usr/local/mysql-proxy/log
    sql-log=ON
    proxy-address = 0.0.0.0:33060
    admin-address = 0.0.0.0:2345
    charset=utf8
    
    #启动atlas
    [root@sql03 ~]# /usr/local/mysql-proxy/bin/mysql-proxyd test start
    

    atlas添加用户

    #主库创建用户
    mysql> grant select,update,insert on *.* to app@'10.0.1.%' identified by '123456';
    
    #atlas添加用户
    [root@sql03 ~]# /usr/local/mysql-proxy/bin/encrypt 123456
    /iZxz+0GRoA=
    [root@sql03 ~]# vim /usr/local/mysql-proxy/conf/test.cnf
    pwds = repl:3yb5jEku5h4=,mha:O2jBXONX098=,app:/iZxz+0GRoA=
    [root@sql03 ~]# /usr/local/mysql-proxy/bin/mysql-proxyd test restart
    [root@sql03 ~]# mysql -uapp -p123456 -h10.0.1.130 -P33060
    

    Atlas基本管理

    #连接管理接口
    mysql -uuser -ppwd -h127.0.0.1 -P2345
    #打印帮助:
    mysql> select * from help;
    #查询后端所有节点信息:
    mysql> select * from backends;
    #动态添加删除节点:
    mysql> remove backend 3;
    #动态添加节点:
    mysql> add slave 10.0.1.120:3306;
    #保存配置到配置文件:
    mysql> save config;
    
  • 相关阅读:
    关于响应式框架的定位不了元素的坑
    pychrom 中文版
    firebug定位工具很强大
    查询数据中所有表名
    java解析Json中获取Array字段值及嵌套Json对象
    mysql表操作
    集合框架(二)
    集合框架
    Java API(二)
    JDBC入门
  • 原文地址:https://www.cnblogs.com/opesn/p/12994075.html
Copyright © 2011-2022 走看看