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;
    
  • 相关阅读:
    查看端口有没有被占用
    微信公众号2()
    How to insert a segment of noise to music file
    puppet practice
    Docker Commands
    LempelZiv algorithm realization
    The algorithm of entropy realization
    Java network programmingguessing game
    Deploy Openstack with RDO and Change VNC console to Spice
    puppet overview
  • 原文地址:https://www.cnblogs.com/opesn/p/12994075.html
Copyright © 2011-2022 走看看