zoukankan      html  css  js  c++  java
  • Atlas 读写分离 & Atlas + MHA 故障自动恢复

    Atals 介绍

    Atlas 主要功能

    读写分离

    从库负载均衡

    IP 过滤

    自动分表

    DBA 可平滑上下线 DB

    自动摘除宕机的 DB

    Atlas 相对于官方 MySQL-Proxy 的优势

    将主流程中所有 Lua 代码用 C 重写,Lua 仅用于管理接口

    重写网络模型、线程模型

    实现了真正意义上的连接池

    优化了锁机制,性能提高数十倍

    Atlas 使用

    Atlas 安装

    [root@db03 ~]# yum localinstall -y Atlas-2.2.1.el6.x86_64.rpm
    

    Atlas 目录

    [root@db03 ~]# ll /usr/local/mysql-proxy/
    total 0
    drwxr-xr-x 2 root root  75 Jul 29 10:15 bin
    drwxr-xr-x 2 root root  22 Jul 29 10:15 conf
    drwxr-xr-x 3 root root 331 Jul 29 10:15 lib
    drwxr-xr-x 2 root root   6 Dec 17  2014 log
    

    Atlas 配置

    [root@db03 ~]# cat /usr/local/mysql-proxy/conf/test.cnf
    [mysql-proxy]
    # 管理接口的用户名
    admin-username = user
    # 管理接口的密码
    admin-password = pwd
    # Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔
    proxy-backend-addresses = 172.16.1.55:3306
    # Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔
    proxy-read-only-backend-addresses = 172.16.1.122:3306,172.16.1.123:3306
    # 用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,下行的user1和user2为示例,将其替换为你的MySQL的用户名和加密密码!
    pwds = rep:3yb5jEku5h4=,mha:O2jBXONX098=
    # 设置Atlas的运行方式,设为true时为守护进程方式,设为false时为前台方式,一般开发调试时设为false,线上运行时设为true,true后面不能有空格。
    daemon = true
    # 设置Atlas的运行方式,设为true时Atlas会启动两个进程,一个为monitor,一个为worker,monitor在worker意外退出后会自动将其重启,设为false时只有worker,没有monitor,一般开发调试时设为false,线上运行时设为true,true后面不能有空格。
    keepalive = true
    # 工作线程数,对Atlas的性能有很大影响,可根据情况适当设置
    event-threads = 8
    # 日志级别,分为message、warning、critical、error、debug五个级别
    log-level = error
    # 日志存放的路径
    log-path = /usr/local/mysql-proxy/log
    # SQL日志的开关,可设置为OFF、ON、REALTIME,OFF代表不记录SQL日志,ON代表记录SQL日志,REALTIME代表记录SQL日志且实时写入磁盘,默认为OFF
    sql-log = OFF
    # 慢日志输出设置。当设置了该参数时,则日志只输出执行时间超过sql-log-slow(单位:ms)的日志记录。不设置该参数则输出全部日志。
    #sql-log-slow = 10
    # 实例名称,用于同一台机器上多个Atlas实例间的区分
    instance = test
    # Atlas监听的工作接口IP和端口,用来连接 MySQL 数据库
    proxy-address = 0.0.0.0:1234
    # Atlas监听的管理接口IP和端口,用来管理 MySQL 数据库节点
    admin-address = 0.0.0.0:2345
    # 分表设置,此例中person为库名,mt为表名,id为分表字段,3为子表数量,可设置多项,以逗号分隔,若不分表则不需要设置该项
    #tables = person.mt.id.3
    # 默认字符集,设置该项后客户端不再需要执行SET NAMES语句
    # charset = utf8
    #允许连接Atlas的客户端的IP,可以是精确IP,也可以是IP段,以逗号分隔,若不设置该项则允许所有IP连接,否则只允许列表中的IP连接
    #client-ips = 127.0.0.1
    

    Atlas 启动

    [root@db03 ~]# /usr/local/mysql-proxy/bin/mysql-proxyd test start
    OK: MySQL-Proxy of test is started
    
    # 检验启动
    [root@db03 conf]# netstat -lntp
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
    tcp        0      0 0.0.0.0:2345            0.0.0.0:*               LISTEN      31101/mysql-proxy     
    tcp        0      0 0.0.0.0:1234            0.0.0.0:*               LISTEN      31101/mysql-proxy   
    

    Atlas 使用

    # 1.连接 Atlas 管理端
    [root@db03 ~]# mysql -uuser -ppwd -P 2345 -h127.0.0.1
    
    # 2.执行命令
    mysql> show databases;
    ERROR 1105 (07000): use 'SELECT * FROM help' to see the supported commands
    
    mysql> SELECT * FROM help;
    +----------------------------+---------------------------------------------------------+
    | command                    | description                                             |
    +----------------------------+---------------------------------------------------------+
    | SELECT * FROM help         | 查看帮助		                                       |
    | SELECT * FROM backends     | 查看后端数据库主机列表				       |
    | SET OFFLINE $backend_id    | DBA可平滑下线DB 					       |
    | SET ONLINE $backend_id     | DBA可平滑上线DB     			               |
    | ADD MASTER $backend        | 添加主库						       |
    | ADD SLAVE $backend         | 添加从库						       |
    | REMOVE BACKEND $backend_id | 移除后端数据库				               |             
    | SELECT * FROM clients      | 客户端列表                                               |
    | ADD CLIENT $client         | 临时添加客户端					       |                   
    | REMOVE CLIENT $client      | 临时移除客户端    				       |		           
    | SELECT * FROM pwds         | 客户端用户名和密码                                        |
    | ADD PWD $pwd               | 添加客户端用户名和密码				       |                 
    | ADD ENPWD $pwd             | 添加客户端用户名和加密后的密码			       |	         
    | REMOVE PWD $pwd            | 移除客户端用户					       |                
    | SAVE CONFIG                | 保存配置到配置文件               			       |           
    | SELECT VERSION             | 查看Atlas版本			                       |        
    +----------------------------+---------------------------------------------------------+
    16 rows in set (0.00 sec)
    

    Atlas + MHA 故障恢复

    Atlas 自动恢复思路

    # 1.找到新的主库
    # 2.将新的主库从 Atlas 中配置下线,之前是作为从库由 Atlas 管理
    # 3.作出的修改,要保存到配置文件
    

    Atlas + MHA 恢复脚本

    在 MHA 切换主库后,也需要在 Atlas 的配置中修改 Master 节点和 Slave 节点,下面为主脚本,主要功能:

    将提升为主库的从库的原有记录(原有记录为:从库、只读)删除

    因为主库使用了 VIP 漂移,Atlas 管理的 Master 节点不需要修改,Master 节点的只要记录为 VIP 即可

    将宕机的原主库修复,改为从库(第五步)

    将恢复好的从库(原主库),添加到 Atlas 管理的 Slave 节点

    [root@dbtest03 bin]# vim switch_atlas.sh
    #/bin/bash
    # 1.获取新的主库IP
    new_master=`grep "as a new master" /etc/mha/app1/manager | tail -1 | awk -F '[ ,(]' '{print $2}'`  &> /dev/null
    # 2.获取新的主库在Atlas中的ID
    new_master_id=`mysql -uuser -ppwd -h127.0.0.1 -P 2345 -e "SELECT * FROM backends" | grep $new_master | awk '{print $1}'`  &> /dev/null
    # 3.移除提升为主库的从库
    mysql -uuser -ppwd -h127.0.0.1 -P 2345 -e "REMOVE BACKEND $new_master_id" &> /dev/null
    # 4.找到挂掉的主机
    down_server=`grep "Master .* is down" /etc/mha/app1/manager | tail -1 | awk -F '[ ,(]' '{print $2}'`  &> /dev/null
    # 5.远程连接执行恢复脚本
    ssh $down_server "sh /tmp/start_mha.sh" &  &> /dev/null
    # 6.获取挂掉的主机的IP加端口
    down_server_port=`grep "Master .* is down" /etc/mha/app1/manager | tail -1 | awk -F '[ ,()]' '{print $3}'`  &> /dev/null
    # 7.添加down的主库为新的从库到Atlas
    mysql -uuser -ppwd -h127.0.0.1 -P 2345 -e "add slave $down_server_port" &> /dev/null
    # 8.保存配置
    mysql -uuser -ppwd -h127.0.0.1 -P 2345 -e "save config" &> /dev/null
    

    MHA 恢复脚本

    [root@dbtest01 tmp]# vim /tmp/start_mha.sh
    #!/bin/bash
    mysql_pid=`ps -ef | grep [m]ysqld | wc -l`
    
    # 如果挂掉,重启;如果没有挂掉,杀掉重启
    if [ $mysql_pid -eq 0 ];then
        systemctl start mysqld
    else
        pkill mysqld
        systemctl stop mysqld
        systemctl start mysqld
    fi
    
    # 重新配置主从
    change=`ssh 172.16.1.123 "grep 'CHANGE MASTER TO' /etc/mha/app1/manager | tail -1 | sed s#xxx#123#g" |awk -F: '{print $4}'` &>/dev/null
    
    mysql -uroot -p12345 -e "$change;start slave;" 2>/dev/null
    
    ssh 172.16.1.123 "cp /etc/mha/app1.conf.bak /etc/mha/app1.conf" >/dev/null
    
    master_host=`ssh 172.16.1.123 "grep  'as a new master' /etc/mha/app1/manager  | tail -1"| awk -F '[ ,(]' '{print $2}'`
    
    ssh 172.16.1.123 "cd /binlog &&  mysqlbinlog -R --host=${master_host} --user=mha --password=mha --raw --stop-never mysql-bin.000001 2>/dev/null" & >/dev/null
    
    ssh 172.16.1.123 "nohup masterha_manager --conf=/etc/mha/app1.conf --remove_dead_master_conf --ignore_last_failover < /dev/null > /etc/mha/manager.log 2>&1 &"  >/dev/null
    
  • 相关阅读:
    git
    rocketMq
    mysql 擎特点
    mysql 主从复制实现步骤
    mysql数据库服务日志
    mysql 主命令总结
    linux sed
    学习进步的方法
    my-innodb-heavy-4g.cnf
    FTP主动模式和被动模式的区别【转】
  • 原文地址:https://www.cnblogs.com/zzzwqh/p/13399728.html
Copyright © 2011-2022 走看看