• 第二十章 MySQL的VIP漂移和Atlas


    一、数据库VIP漂移

    1.VIP漂移的两种方式

    1.通过keepalived的方式
    2.使用MHA自带的脚本
    

    2.配置MHA脚本

    [root@db03 ~]# vim /service/mha/app1.cnf
    [server default]
    master_ip_failover_script=/service/mha/master_ip_failover
    

    3.编写脚本

    1)上传脚本

    #解压manager节点的tar包有脚本
    [root@db01 ~/mha4mysql-manager-0.56/samples/scripts]# ll
    总用量 32
    -rwxr-xr-x 1 4984 users  3648 4月   1 2014 master_ip_failover
    
    #上传现成的脚本
    [root@db03 ~]# cd /service/mha/
    [root@db03 /service/mha]# rz master_ip_failover
    #授权执行权限
    [root@db03 /service/mha]# chmod +x master_ip_failover
    

    2)配置脚本

    [root@db03 /service/mha]# vim master_ip_failover
    ... ...
    my $vip = '172.16.1.55/24';
    my $key = '1';
    my $ssh_start_vip = "/sbin/ifconfig eth1:$key $vip";
    my $ssh_stop_vip = "/sbin/ifconfig eth1:$key down";
    ... ...
    

    4.启动前手动绑定VIP

    #绑定子网卡[root@db02 ~]# ifconfig eth1:1 172.16.1.55/243: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000    link/ether 00:0c:29:41:0e:db brd ff:ff:ff:ff:ff:ff    inet 172.16.1.52/24 brd 172.16.1.255 scope global eth1       valid_lft forever preferred_lft forever    inet 172.16.1.55/24 brd 172.16.1.255 scope global secondary eth1:1       valid_lft forever preferred_lft forever#解绑网卡[root@db02 ~]# ifconfig eth1:1 down
    

    5.启动MHA

    [root@db03 ~]# masterha_stop --conf=/service/mha/app1.cnfStopped app1 successfully.#启动mha[root@db03 ~]# nohup masterha_manager --conf=/service/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /service/mha/app1/manager.log 2>&1 &#启动失败1.检查是否有执行权限	[root@db03 ~]# chmod +x /service/mha/master_ip_failover2.语法是否正确3.文件格式	[root@db03 ~]# yum install -y dos2unix	[root@db03 ~]# dos2unix /service/mha/master_ip_failover 	dos2unix: converting file /service/mha/master_ip_failover to Unix format ...
    

    6.测试VIP漂移

    #从库查看主库信息[root@db03 ~]# mysqlmysql> show slave statusG*************************** 1. row ***************************               Slave_IO_State: Waiting for master to send event                  Master_Host: 172.16.1.52                  Master_User: rep                  Master_Port: 3306#主库查看IP[root@db02 ~]# ip addr3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000    link/ether 00:0c:29:41:0e:db brd ff:ff:ff:ff:ff:ff    inet 172.16.1.52/24 brd 172.16.1.255 scope global eth1       valid_lft forever preferred_lft forever    inet 172.16.1.55/24 brd 172.16.1.255 scope global secondary eth1:1       valid_lft forever preferred_lft forever#停止主库[root@db02 ~]# systemctl stop mysqld#再次查看主库信息[root@db03 ~]# mysqlmysql> show slave statusG*************************** 1. row ***************************               Slave_IO_State: Waiting for master to send event                  Master_Host: 172.16.1.51                  Master_User: rep                  Master_Port: 3306                Connect_Retry: 60                #查看新主库的IP[root@db01 ~]# ip addr3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000    link/ether 00:0c:29:6c:a6:c6 brd ff:ff:ff:ff:ff:ff    inet 172.16.1.51/24 brd 172.16.1.255 scope global eth1       valid_lft forever preferred_lft forever    inet 172.16.1.55/24 brd 172.16.1.255 scope global secondary eth1:1       valid_lft forever preferred_lft forever
    

    二、Atlas 读写分离

    1.Atlas主要功能

    1.读写分离2.从库负载均衡3.IP过滤4.自动分表5.DBA可平滑上下线DB6.自动摘除宕机的DB
    

    2.读写分离工具

    #工具1.Atlas2.MySQL-Proxy#Atlas相对于官方MySQL-Proxy的优势1.将主流程中所有Lua代码用C重写,Lua仅用于管理接口2.重写网络模型、线程模型3.实现了真正意义上的连接池4.优化了锁机制,性能提高数十倍
    

    3.安装Atlas

    #下载地址:https://github.com/Qihoo360/Atlas/releases1.上传安装包[root@db03 ~]# rz Atlas-sharding_1.0.1-el6.x86_64.rpm2.安装[root@db03 ~]# yum localinstall -y Atlas-sharding_1.0.1-el6.x86_64.rpm
    

    4.编辑配置文件

    1.相关目录及文件[root@db03 ~]# ll /usr/local/mysql-proxy/total 8drwxr-xr-x 2 root root  125 Nov 11 18:22 bindrwxr-xr-x 2 root root   22 Nov 11 18:22 confdrwxr-xr-x 2 root root 4096 Nov 11 18:22 includedrwxr-xr-x 4 root root 4096 Nov 11 18:22 libdrwxr-xr-x 2 root root    6 May 19  2015 libexecdrwxr-xr-x 2 root root   22 Nov 11 18:22 logdrwxr-xr-x 3 root root   17 Nov 11 18:22 share2.编辑配置文件[root@db03 ~]# vim /usr/local/mysql-proxy/conf/test.cnf[mysql-proxy]#管理接口的用户名admin-username = user#管理接口的密码admin-password = pwd#Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔proxy-backend-addresses = 172.16.1.51:3306#Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔proxy-read-only-backend-addresses = 172.16.1.52:3306,172.16.1.53: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 = message#日志存放的路径log-path = /usr/local/mysql-proxy/log#SQL日志的开关,可设置为OFF、ON、REALTIME,OFF代表不记录SQL日志,ON代表记录SQL日志,REALTIME代表记录SQL日志且实时写入磁盘,默认为OFFsql-log = ON#慢日志输出设置。当设置了该参数时,则日志只输出执行时间超过sql-log-slow(单位:ms)的日志记录。不设置该参数则输出全部日志。#sql-log-slow = 10#实例名称,用于同一台机器上多个Atlas实例间的区分instance = test#Atlas监听的工作接口IP和端口proxy-address = 0.0.0.0:1234#Atlas监听的管理接口IP和端口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前面挂接的LVS的物理网卡的IP(注意不是虚IP),若有LVS且设置了client-ips则此项必须设置,否则可以不设置#lvs-ips = 192.168.1.1
    

    5.启动Atlas

    #1.启动[root@db03 ~]# /usr/local/mysql-proxy/bin/mysql-proxyd test startOK: MySQL-Proxy of test is started#2.验证启动[root@db03 ~]# ps -ef | grep mysql-proxy[root@db03 ~]# netstat -lntp
    

    6.Atlas的使用

    #1.连接Atlas
    [root@db03 ~]# mysql -uuser -ppwd -h127.0.0.1 -P2345
    
    #2.操作命令
    mysql> SELECT * FROM help;
    +---------------------------------------+---------------------------------------------------------+
    | command                               | description                                             |
    +---------------------------------------+---------------------------------------------------------+
    | SELECT * FROM help                    | 查看帮助                                   		      |
    | SELECT * FROM backends                | 查看后端数据库列表和状态			                       |
    | SET OFFLINE $backend_id               | DBA平滑下线后端数据库								   |
    | SET ONLINE $backend_id                | DBA平滑上线后端数据库   	                              |
    | ADD MASTER $backend                   | 添加主库 add master 172.16.1.54:3306;                   |
    | ADD SLAVE $backend                    | 添加从库 add slave 172.16.1.56:3306;	                  |
    | ADD GMASTER $group_id $backend        | example: "add gmaster 1 127.0.0.1:3306", ...            |
    | ADD GSLAVE $group_id $backend         | example: "add gslave 1 127.0.0.1:3306", ...             |
    | REMOVE BACKEND $backend_id            | 摘除后端数据库 remove backend 6;                         |
    | REMOVE GBACKEND $group_id $backend_id | example: "remove gbackend 1 1", ...                     |
    | SELECT * FROM clients                 | 查看客户端列表  add client 172.16.1.53;                  |
    | ADD CLIENT $client                    | 添加客户端        					                    |
    | REMOVE CLIENT $client                 | 移除客户端    								           |
    | SELECT * FROM pwds                    | 查看用户列表                                             |
    | ADD PWD $pwd                          | 添加用户 add pwd lhd:123;				                 |
    | ADD ENPWD $pwd                        | 添加用户 add enpwd qiudao:3yb5jEku5h4=;		          |
    | REMOVE PWD $pwd                       | 移除用户					                             |
    | SAVE CONFIG                           | 永久保存到配置文件   		 	                         |
    | SELECT VERSION                        | 查看Atlas版本                            |
    +---------------------------------------+---------------------------------------------------------+
    19 rows in set (0.00 sec)
    

    三、Atlas集合MHA故障恢复

    Atlas我们写死了主库和从库的配置,如果这个时候主库挂了,怎么办?
    

    1.思路

    #MHA切换主库后,Atlas需要做什么
    1.找到挂掉的主库
    2.把Atlas对应的节点移除
    3.恢复挂掉的节点启动
    4.添加重新恢复的节点到Atlas
    5.Atlas永久保存到配置文件
    

    2.编写脚本

    [root@db03 ~]# cat /scripts/reconf_Atlas.sh
    #!/bin/bash
    #1.定义新的主库变量
    new_master=`mysql -e "show slave statusG" | awk 'NR==3 {print $2}'`
    
    #2.获取新的主库在Atlas中的从库信息
    new_master_id=`mysql -uuser -ppwd -h127.0.0.1 -P2345 -e "select * from backends;" 2> /dev/null| grep $new_master | awk '{print $5}'`
    
    #3.移除Atlas中新主库的从库信息
    mysql -uuser -ppwd -h127.0.0.1 -P2345 -e "remove backend $new_master_id;save config" 2> /dev/null
    
    #4.找到down掉的主机
    down_ip=`grep "is down" /service/mha/manager | tail -1 | awk -F '[ (]' '{print $2}'`
    
    #5.连接挂掉的机器执行恢复脚本
    ssh $down_ip "sh /scripts/start_mha.sh"
    
    #6.把新的从库信息
    new_slave=`grep "is down" /service/mha/manager | tail -1 | awk -F '[()]' '{print $2}'`
    
    #7.把新的从库加到Atlas,并永久保存配置
    mysql -uuser -ppwd -h127.0.0.1 -P2345 -e "add slave $new_slave;save config" 2> /dev/null
    
    [root@db01 ~]# cat /scripts/start_mha.sh 
    #!/bin/bash
    #1.mysql进程数赋值
    mysqlpid=`ps -ef | grep [m]ysql | wc -l`
    
    #2.判断MySQL是否假死,如果假死杀掉重启,如果关闭则启动
    if [ $mysqlpid -eq 0 ];then
        systemctl start mysqld
    else
        pkill mysqld
        systemctl start mysqld
    fi
    
    sleep 3
    
    #3.获取配置主从语句
    change=`ssh 172.16.1.53 "grep 'CHANGE MASTER TO' /service/mha/manager | tail -1 | sed 's#xxx#123#g'" | awk -F: '{print $4}'`
    
    #4.执行主从语句并启动线程
    mysql -e "$change; start slave" 2>&1
    
    #5.远程执行启动mha脚本
    ssh 172.16.1.53 "sh /scripts/recovery.sh"
    
    [root@db03 ~]# cat /scripts/recovery.sh
    #!/bin/bash
    #1.获取主节点IP
    master_ip=`mysql -e 'show slave statusG' | awk 'NR==3 {print $2}'`
    
    #2.进入保存binlog目录
    cd /data/mysql/binlog 
    
    #3.启动实时获取binlog进程
    mysqlbinlog -R --host=$master_ip --user=mha --password=mha --raw --stop-never mysql-bin.000001&> /dev/null &
    
    #4.替换MHA配置文件
    /usr/bin/cp /service/mha/app1.bak /service/mha/app1.cnf
    
    #5.启动MHA
    nohup masterha_manager --conf=/service/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /service/mha/app1/manager.log 2>&1 &
    
  • 相关阅读:
    红楼梦 + 写入 MySQL + MongoDB
    糗事百科 + 微信自动回复
    验证码处理
    IP 代理池
    Ajax工作原理
    php做APP接口开发,接口的安全性
    http与https区别
    mysql 索引优化
    php+ajax+jquery实现jsonp跨域
    SpringBoot中文乱码解决方案
  • 原文地址:https://www.cnblogs.com/jhno1/p/15324314.html
Copyright © 2020-2023  润新知