大兵是
一个想全能的运维

MySQL的MHA高可用方案及Altas读写分离

软件简介:

    MHA(master high   availability)目前是MySQL高可用方面是一个相对成熟的解决方案。在切换过程中,mha能做到0-30s内自动完成数据库的切换,并且在切换过程中最大的保持数据的一致性,以达到真正意义上的高可用。

    MHA由两部分组成,MHA Manager(管理节点)和MHA Node(数据节点)。MHA Manager可以独立部署在一台独立的机器上,管理多个集群,也可以部署在从从库上。当Master出现故障的时候,它可以自动将最新数据的Slave提升为新的Master,然后将所有的Slave重新指向新的Master,整个故障转移过程是完全透明的。

工作流程:

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

工具介绍:

    我们可以通过解压tar包来看看mha都有哪些工具提供使用:这里为大家提供一下软件包:链接:http://pan.baidu.com/s/1dFBspHn 密码:lk0u。期中包括管理节点的rpm包和tar包,数据节点的rpm包和tar包,另外还有一个atlas的rpm安装包。

manager工具包包括:

  • masterha_check_ssh             #检查MHA的SSH状况
  • masterha_check_repl            #检查MySQL复制状况
  • masterha_manger                 #启动MHA
  • masterha_check_status          #检测当前MHA运行状态
  • masterha_master_monitor         #检测master是否宕机
  • masterha_master_switch          #控制故障转移(自动或者手动)
  • masterha_conf_host              #添加或删除配置的server信息
  • masterha_seconder_check         #视图建立TCP连接从远程服务器
  • masterha_stop                   #停止MHA

node工具包(由manager自动调用执行):

  • save_binary_logs                保存和复制master的二进制日志
  • apply_diff_relay_logs           识别差异的中继日志事件并将其差异的事件应用于其他的slave
  • filter_mysqlbinlog              去除不必要的ROLLBACK事件(MHA已不再使用这个工具)
  • purge_relay_logs                清除中继日志(不会阻塞SQL线程)

    介绍的差不多了,我们可以开始搭建mha环境了。

MySQL的MHA方案

一、环境

[root@mysql-db01 data]# cat /etc/redhat-release 
CentOS release 6.8 (Final)
[root@mysql-db01 data]# uname -r
2.6.32-642.el6.x86_64
[root@mysql-db01 data]# /etc/init.d/iptables status
iptables: Firewall is not running.
[root@mysql-db01 data]# getenforce 
Disabled

    这次我们还是使用三个数据库。一主二从。

#主库
[root@mysql-db01 ~]# hostname 
mysql-db01
[root@mysql-db01 data]# hostname -I
10.0.0.20 

#从库1
[root@mysql-db01 ~]# hostname 
mysql-db02
[root@mysql-db02 data]# hostname -I
10.0.0.21 
#从库2
[root@mysql-db01 ~]# hostname 
mysql-db03
[root@mysql-db03 data]# hostname -I
10.0.0.22 

注意:这次使用的是MySQL版本5.6.34。不会安装可以观看另外一篇分享的mysql主从。

二、配置

    这次我们使用gtid做主从,如何已做好主从的数据库,我们可以使用命令重置从库

mysql> stop slave;
mysql> reset slave all;

    主库的配置文件:

[root@mysql-db01 ~]# egrep -v "#|^$" /etc/my.cnf 
[client]
user=root #快捷不用每次输入密码、
password=123456 
[mysqld]
log_bin=mysql-bin #开启log_bin
server_id = 1 #三台机器id不同
gtid_mode=ON #开启gtid功能
enforce_gtid_consistency
log-slave-updates 
relay_log_purge = 0 #关闭自动删除relay的功能。

    从库1的配置文件:

[root@mysql-db02 ~]# egrep -v "#|^$" /etc/my.cnf 
[client]
user=root
password=123456
[mysqld]
log_bin=mysql-bin
server_id = 5
gtid_mode=ON
enforce_gtid_consistency
log-slave-updates
relay_log_purge = 0

    从库2的配置文件:

[root@mysql-db03 ~]# egrep -v "#|^$" /etc/my.cnf 
[client]
user=root
password=123456
[mysqld]
log_bin=mysql-bin
server_id = 10
gtid_mode=ON
enforce_gtid_consistency
log-slave-updates
relay_log_purge = 0

    修改完配置文件需要重启数据库。

    主从复制的账号,因为会试验切库,所以所有库都执行。

[root@mysql-db01 ~]# mysql
mysql> grant replication slave on *.* to rep@'10.0.0.%' identified by '123456';

    从库1和从库2执行:

[root@mysql-db02 ~]# mysql
mysql> change master to master_host='10.0.0.20',master_user='rep',master_password='123456',master_auto_position=1 ;#不会自己记录binlog位置点了,gtid帮助完成。
mysql> start slave;
mysql> show slave status\G #查看从库状态。

三、安装mha

#安装依赖,下面的命令所有的数据库都需要安装,不需要全部安装的我会说明
[root@mysql-db01 ~]# yum install perl-DBD-MySQL -y
[root@mysql-db01 ~]# yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes
#安装数据节点,请上传安装包
[root@mysql-db01 tools]# cd /tools/ 
[root@mysql-db01 tools]# rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm 
#mha管理用户
[root@mysql-db01 tools]# mysql
mysql> grant all privileges on *.* to mha@'10.0.0.%' identified by 'mha';
#创建命令的软链接
[root@mysql-db01 tools]# ln -s /application/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
[root@mysql-db01 tools]# ln -s /application/mysql/bin/mysql /usr/bin/mysql
#仅挑选一台安装管理端,我这里装在了mysql-db03上
[root@mysql-db03 tools]# rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm

四、配置mha

    在管理端执行。mysql-db03。

[root@mysql-db03 tools]# mkdir /etc/mha -p #创建配置文件目录
[root@mysql-db03 tools]# mkdir /var/log/mha/app1 -p #创建日志存放目录
[root@mysql-db03 tools]# vim /etc/mha/app1.cnf #新建配置文件
[server default]
manager_log=/var/log/mha/app1/manager
manager_workdir=/var/log/mha/app1
master_binlog_dir=/application/mysql/data
user=mha
password=mha
ping_interval=2
repl_password=123456
repl_user=rep
ssh_user=root

[server1]
hostname=10.0.0.20
port=3306

[server2]
hostname=10.0.0.21
port=3306

[server3]
hostname=10.0.0.22
port=3306

    下面对配置文件进行详细的说明。

[server default]
#设置manager的工作目录
manager_workdir=/var/log/masterha/app1
#设置manager的日志
manager_log=/var/log/masterha/app1/manager.log 
#设置master 保存binlog的位置,以便MHA可以找到master的日志,我这里的也就是mysql的数据目录
master_binlog_dir=/data/mysql
#设置自动failover时候的切换脚本
master_ip_failover_script= /usr/local/bin/master_ip_failover
#设置手动切换时候的切换脚本
master_ip_online_change_script= /usr/local/bin/master_ip_online_change
#设置mysql中root用户的密码,这个密码是前文中创建监控用户的那个密码
password=123456
#设置监控用户root
user=root
#设置监控主库,发送ping包的时间间隔,尝试三次没有回应的时候自动进行failover
ping_interval=1
#设置远端mysql在发生切换时binlog的保存位置
remote_workdir=/tmp
#设置复制用户的密码
repl_password=123456
#设置复制环境中的复制用户名 
repl_user=rep
#设置发生切换后发送的报警的脚本
report_script=/usr/local/send_report
#一旦MHA到server02的监控之间出现问题,MHA Manager将会尝试从server03登录到server02
secondary_check_script= /usr/local/bin/masterha_secondary_check -s server03 -s server02 --user=root --master_host=server02 --master_ip=192.168.0.50 --master_port=3306
#设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机放在发生脑裂,这里没有使用)
shutdown_script=""
#设置ssh的登录用户名
ssh_user=root 

[server1]
hostname=10.0.0.20
port=3306

[server2]
hostname=10.0.0.21
port=3306
#设置为候选master,如果设置该参数以后,发生主从切换以后将会将此从库提升为主库,即使这个主库不是集群中事件最新的slave
candidate_master=1
#默认情况下如果一个slave落后master 100M的relay logs的话,MHA将不会选择该slave作为一个新的master,因为对于这个slave的恢复需要花费很长时间,通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master
check_repl_delay=0

五、最后的配置及测试

#配置信任,配置所有的数据库,自己也要发送
[root@mysql-db01 tools]# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
[root@mysql-db01 tools]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@10.0.0.20
[root@mysql-db01 tools]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@10.0.0.21
[root@mysql-db01 tools]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@10.0.0.22
#管理端测试配置
#测试ssh连通性
[root@mysql-db03 tools]# masterha_check_ssh --conf=/etc/mha/app1.cnf
.......
Mon Mar 27 10:31:53 2017 - [info] All SSH connection tests passed successfully.
#测试复制。
[root@mysql-db03 tools]# masterha_check_repl --conf=/etc/mha/app1.cnf
......
MySQL Replication Health is OK. 

六、启动mha

[root@mysql-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 &
#注意:因为本文只有一个配置文件,如果有主配置文件,使用这个参数 --master_default_conf=

    如果启动不起来,分析日志

[root@mysql-db03 tools]# tail -f /var/log/mha/app1/manager
10.0.0.20(10.0.0.20:3306) (current master)
 +--10.0.0.21(10.0.0.21:3306)
 +--10.0.0.22(10.0.0.22:3306)

Mon Mar 27 10:54:24 2017 - [warning] master_ip_failover_script is not defined.
Mon Mar 27 10:54:24 2017 - [warning] shutdown_script is not defined.
Mon Mar 27 10:54:24 2017 - [info] Set master ping interval 2 seconds.
Mon Mar 27 10:54:24 2017 - [warning] secondary_check_script is not defined. It is highly recommended setting it to check master reachability from two or more routes.
Mon Mar 27 10:54:24 2017 - [info] Starting ping health check on 10.0.0.20(10.0.0.20:3306)..
Mon Mar 27 10:54:24 2017 - [info] Ping(SELECT) succeeded, waiting until MySQL doesn't respond..

七、宕机测试

    现在主库是mysql-db01,我们使用关闭数据库来模仿数据库宕机。

[root@mysql-db01 tools]# /etc/init.d/mysqld stop
Shutting down MySQL...SUCCESS!
#日志,仅列出部分,大家可以通过日志分析切换的过程,整个切换过程是非常快的。
[root@mysql-db03 tools]# tail -f /var/log/mha/app1/manager
10.0.0.20(10.0.0.20:3306) (current master)
 +--10.0.0.21(10.0.0.21:3306)
 +--10.0.0.22(10.0.0.22:3306)
......
Started automated(non-interactive) failover.
Selected 10.0.0.21(10.0.0.21:3306) as a new master.
10.0.0.21(10.0.0.21:3306): OK: Applying all logs succeeded.
10.0.0.22(10.0.0.22:3306): OK: Slave started, replicating from 10.0.0.21(10.0.0.21:3306)
10.0.0.21(10.0.0.21:3306): Resetting slave info succeeded.
Master failover to 10.0.0.21(10.0.0.21:3306) completed successfully.
#已经提示切换到10.0.0.21。
#登录查看mysql-db03
[root@mysql-db03 ~]# mysql
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.0.0.21
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000005
          Read_Master_Log_Pos: 1859
               Relay_Log_File: mysql-db03-relay-bin.000002
                Relay_Log_Pos: 1289
        Relay_Master_Log_File: mysql-bin.000005
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

    OK了,数据库故障切换成功了。宕机操作后,mha的配置文件中,会自动把这台数据库的server标签去掉。恢复故障后,需要手动将宕机恢复的机器再次做为从。

    分享一个小技巧,不用自己敲change master命令了,你可以复制这条命令去恢复的机器上执行了。。

[root@mysql-db03 ~]# grep -i "change master " /var/log/mha/app1/manager
Mon Mar 27 11:01:59 2017 - [info]  All other slaves should start replication from here. Statement should be: CHANGE MASTER TO MASTER_HOST='10.0.0.21', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='rep', MASTER_PASSWORD='xxx';
[root@mysql-db01 tools]# /etc/init.d/mysqld start 
Starting MySQL... SUCCESS! 
[root@mysql-db01 tools]# mysql
mysql> CHANGE MASTER TO MASTER_HOST='10.0.0.21', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='rep', MASTER_PASSWORD='123456';
mysql> start slave ;
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.0.0.21
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000005
          Read_Master_Log_Pos: 1859
               Relay_Log_File: mysql-db01-relay-bin.000002
                Relay_Log_Pos: 1289
        Relay_Master_Log_File: mysql-bin.000005
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

    基础的完成了,那我可以继续分享参数了。

    注意注意注意:mha切换是从所有从库中找出一台binlog最新的提升为主库

    如果集群中,有某台配置很好,你想这台服务器提示为主库,可以增加两行参数,这样会导致数据的丢失

[root@mysql-db03 ~]# vim /etc/mha/app1.cnf 
......
[server3]
candidate_master=1 #优先提升为主库
check_repl_delay=0 #忽略复制延迟。
hostname=10.0.0.22
port=3306

   这里仅对参数进行说明,篇幅有限,测试结果就赘述了。

八、备份binlog

    前面说了主库宕机数据的危险性,如果主从之间还没有完成binlog的传输,就宕机了,那么有一部分的数据就可能丢失了,这里我们可以binlog备份功能。

    配置如下:

[root@mysql-db03 ~]# vim /etc/mha/app1.cnf 
[server default]
manager_log=/var/log/mha/app1/manager
manager_workdir=/var/log/mha/app1
master_binlog_dir=/application/mysql/data
password=mha
ping_interval=2
repl_password=123456
repl_user=rep
ssh_user=root
user=mha

[server1]
hostname=10.0.0.20
port=3306

[server2]
hostname=10.0.0.21
port=3306

[server3]
candidate_master=1
check_repl_delay=0
hostname=10.0.0.22
port=3306
#增加的配置
[binlog1]
no_master=1
hostname=10.0.0.22
master_binlog_dir=/data/mysql/binlog/

[root@mysql-db03 ~]# mkdir /data/mysql/binlog/ -p #创建存放binlog的目录
[root@mysql-db03 ~]# cd /data/mysql/binlog/ #进入目录
#这里--host是主库的ip地址,mysql-bin.000001是你定义的binlog文件名
[root@mysql-db03 binlog]# mysqlbinlog  -R --host=10.0.0.21 --user=mha --password=mha --raw --stop-never mysql-bin.000001 &
[root@mysql-db03 binlog]# ll
total 24
-rw-rw---- 1 root root  285 Mar 27 14:07 mysql-bin.000001
-rw-rw---- 1 root root  426 Mar 27 14:07 mysql-bin.000002
-rw-rw---- 1 root root  214 Mar 27 14:07 mysql-bin.000003
-rw-rw---- 1 root root  214 Mar 27 14:07 mysql-bin.000004
-rw-rw---- 1 root root 1906 Mar 27 14:07 mysql-bin.000005
-rw-rw---- 1 root root  120 Mar 27 14:07 mysql-bin.000006
#可在主库中使用flush logs刷新binlog来测试
[root@mysql-db03 binlog]# ps -ef|grep mha
root      13102   7713  0 14:07 pts/2    00:00:00 mysqlbinlog -R --host=10.0.0.21 --user=mha --password=x x --raw --stop-never mysql-bin.000001
root      13283   6610  0 14:13 pts/0    00:00:00 perl 
root      13361   7713  0 14:14 pts/2    00:00:00 grep mha

九、配置IP漂移

    功能都配置全,我们现在要来学主库vip漂移了。

#修改配置文件,在default标签中添加
[root@mysql-db03 binlog]# vim /etc/mha/app1.cnf 
[server default]
......
master_ip_failover_script=/usr/local/bin/master_ip_failover
......
#准备脚本
[root@mysql-db03 binlog]# vim /usr/local/bin/master_ip_failover
#!/usr/bin/env perl

use strict;
use warnings FATAL => 'all';

use Getopt::Long;

my (
    $command,          $ssh_user,        $orig_master_host, $orig_master_ip,
    $orig_master_port, $new_master_host, $new_master_ip,    $new_master_port
);

#高可用ip
my $vip = '10.0.0.25/24';
#是配置在eth0:1上的,如果是别的,自行修改配置文件
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";

GetOptions(
    'command=s'          => \$command,
    'ssh_user=s'         => \$ssh_user,
    'orig_master_host=s' => \$orig_master_host,
    'orig_master_ip=s'   => \$orig_master_ip,
    'orig_master_port=i' => \$orig_master_port,
    'new_master_host=s'  => \$new_master_host,
    'new_master_ip=s'    => \$new_master_ip,
    'new_master_port=i'  => \$new_master_port,
);

exit &main();

sub main {

    print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";

    if ( $command eq "stop" || $command eq "stopssh" ) {

        my $exit_code = 1;
        eval {
            print "Disabling the VIP on old master: $orig_master_host \n";
            &stop_vip();
            $exit_code = 0;
        };
        if ($@) {
            warn "Got Error: $@\n";
            exit $exit_code;
        }
        exit $exit_code;
    }
    elsif ( $command eq "start" ) {

        my $exit_code = 10;
        eval {
            print "Enabling the VIP - $vip on the new master - $new_master_host \n";
            &start_vip();
            $exit_code = 0;
        };
        if ($@) {
            warn $@;
            exit $exit_code;
        }
        exit $exit_code;
    }
    elsif ( $command eq "status" ) {
        print "Checking the Status of the script.. OK \n";
        exit 0;
    }
    else {
        &usage();
        exit 1;
    }
}

sub start_vip() {
    `ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
sub stop_vip() {
     return 0  unless  ($ssh_user);
    `ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}

sub usage {
    print
    "Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";
}
[root@mysql-db03 tools]# chmod +x /usr/local/bin/master_ip_failover #添加执行权限
#现在在主库上添加一条ip地址10.0.0.25/24
[root@mysql-db02 tools]# ifconfig eth0:1 10.0.0.25/24 
[root@mysql-db02 tools]# ip a|grep 10.0.0.25
    inet 10.0.0.21/24 brd 10.0.0.255 scope global eth0
    inet 10.0.0.25/24 brd 10.0.0.255 scope global secondary eth0:1
#管理节点开启mha,如果开启的需要重启,这里提供一条,关闭mha的命令
[root@mysql-db03 binlog]#  masterha_stop --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1
#开启mha
[root@mysql-db03 tools]# 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 &
#宕机主库。
[root@mysql-db02 tools]# /etc/init.d/mysqld stop
Shutting down MySQL...... SUCCESS! 
#切换到了10.0.0.22
[root@mysql-db03 tools]# tail -5 /var/log/mha/app1/manager
10.0.0.22(10.0.0.22:3306): OK: Applying all logs succeeded.
10.0.0.22(10.0.0.22:3306): OK: Activated master IP address.
10.0.0.20(10.0.0.20:3306): OK: Slave started, replicating from 10.0.0.22(10.0.0.22:3306)
10.0.0.22(10.0.0.22:3306): Resetting slave info succeeded.
Master failover to 10.0.0.22(10.0.0.22:3306) completed successfully.
#查看vip,切换了过来
[root@mysql-db03 binlog]# ip a|grep 10.0.0.25
    inet 10.0.0.22/24 brd 10.0.0.255 scope global eth0
    inet 10.0.0.25/24 brd 10.0.0.255 scope global secondary eth0:1

    这样我们以后做读写分离的时候,配置主库ip地址,直接填写vip即可。

MySQL数据的Altas读写分离

一、相对于官方mysql-Proxy的优势

  1. 将主流程中的所有Lua代码用C重写,Lua仅用于管理接口;
  2. 重写网络模型,线程模型;
  3. 实现了真正意义上的连接池;
  4. 优化了锁机制,性能提高了数十倍。

二、安装Atlas

    同样使用我前面分享的百度云链接,可以下载atlas软件。

[root@mysql-db03 binlog]# cd /tools/
[root@mysql-db03 tools]# rpm -ivh Atlas-2.2.1.el6.x86_64.rpm 
Preparing...                ########################################### [100%]
   1:Atlas                  ########################################### [100%]
#博主的建议:mha的管理节点和altas可以状态一台机器上,部署高可用防止单点故障即可,这里由于篇幅和服务器数量限制,我们装在db03上。
[root@mysql-db03 tools]# ll /usr/local/mysql-proxy/bin/encrypt #加密密码的
-rwxr-xr-x 1 root root 9696 Dec 17  2014 /usr/local/mysql-proxy/bin/encrypt
[root@mysql-db03 tools]# ll /usr/local/mysql-proxy/conf/test.cnf #配置文件
-rw-r--r-- 1 root root 2810 Dec 17  2014 /usr/local/mysql-proxy/conf/test.cnf
#这是360出品的,这可能是少见的带中文注释的配置文件,英语不好的读者可以恭喜大家了
[root@mysql-db03 tools]# cd /usr/local/mysql-proxy/ #进入目录
[root@mysql-db03 mysql-proxy]# ./bin/encrypt 123456 #加密密码
/iZxz+0GRoA=
[root@mysql-db03 mysql-proxy]# egrep -v "#|^$" conf/test.cnf  #这里列出我的说明。官方的说明 大家自己进到配置文件看
[mysql-proxy]
admin-username = user #管理端用户名
admin-password = pwd #管理端密码
proxy-backend-addresses = 10.0.0.25:3306 #主库  #这里优于之前的数据库配置到了3306,这里如果修改的话,工作量大,工作这里一般不配置3306,要把3306让给atlas使用
proxy-read-only-backend-addresses = 10.0.0.20:3306,10.0.0.21:3306 #从库,可以写多个
pwds = atlas:/iZxz+0GRoA= #管理数据的用户名和密码,也可配置多个
daemon = true
keepalive = true
event-threads = 32
log-level = message
log-path = /usr/local/mysql-proxy/log
sql-log = true
proxy-address = 0.0.0.0:3305 #这里应该是3306,为了程序方便,直连3306,让我atlas连接3307,实际环境到家可以替换
admin-address = 0.0.0.0:2345 #管理员端
charset = utf8
[root@mysql-db03 mysql-proxy]# /usr/local/mysql-proxy/bin/mysql-proxyd test start  #启动
OK: MySQL-Proxy of test is started
#登录数据库,三台
mysql> grant all privileges on *.* to mha@'%' identified by '123456';
#登录管理端口
[root@mysql-db03 mysql-proxy]# mysql -uuser -ppwd -h127.0.0.1 -P2345
mysql> SELECT * FROM backends;
+-------------+----------------+-------+------+
| backend_ndx | address        | state | type |
+-------------+----------------+-------+------+
|           1 | 10.0.0.25:3306 | up    | rw   |
|           2 | 10.0.0.20:3306 | up    | ro   |
|           3 | 10.0.0.21:3306 | up    | ro   |
+-------------+----------------+-------+------+
3 rows in set (0.00 sec)
mysql> select * from help; #可查看帮助,有添加节点和删除节点,操作完一定要save config

三、宕机分析

    主库坏了之后,需要从连接池中将其拆除。这里写了一个脚本。

[root@mysql-db03 bin]# vim remove_old_master.sh 
#!/bin/bash
MysqlLogin="mysql -uuser -ppwd -h127.0.0.1 -P2345"

NEW_MASTER_HOST=`ssh 10.0.0.22 tail -1 /var/log/mha/app1/manager|awk -F "[ (]" '{print $11}'` &>/dev/null
RO_NUM=`$MysqlLogin -e 'SELECT * FROM backends' |grep "$NEW_MASTER_HOST" |awk '{print $1}'` &>/dev/null
$MysqlLogin -e "REMOVE BACKEND $RO_NUM" &>/dev/null
$MysqlLogin -e 'SAVE CONFIG' &>/dev/null
echo "`date +%F_%T` $NEW_MASTER_HOST is become master, remove it in atlas." &>>/var/log/remove_ro.log

    然后从前面添加的脚本套用即可。

[root@mysql-db03 bin]# vim /usr/local/bin/master_ip_failover
......
 52     elsif ( $command eq "start" ) {
 53 
 54         my $exit_code = 10;
 55         eval {
 56             print "Enabling the VIP - $vip on the new master - $new_master_host \n";
 57             &start_vip();
 58                 `/bin/sh /usr/local/bin/remove_old_master.sh`; #新插入的一行
 59             $exit_code = 0;
 60         };
 61         if ($@) {
 62             warn $@;
 63             exit $exit_code;
 64         }
 65         exit $exit_code;
 66     }

......

    模拟宕机,切换查看脚本输出的日志

[root@mysql-db03 bin]# cat /var/log/remove_ro.log 
2017-03-28_06:27:24 10.0.0.20 is become master, remove it in atlas.
#从altes连接池移除
[root@mysql-db03 bin]# mysql -uuser -ppwd -h127.0.0.1 -P2345
mysql> select * from backends;
+-------------+----------------+-------+------+
| backend_ndx | address        | state | type |
+-------------+----------------+-------+------+
|           1 | 10.0.0.25:3306 | up    | rw   |
|           2 | 10.0.0.21:3306 | up    | ro   |
+-------------+----------------+-------+------+
2 rows in set (0.00 sec)

打赏

未经允许不得转载: » MySQL的MHA高可用方案及Altas读写分离

分享到:更多 ()

评论 3

  • 昵称 (必填)
  1. #3

    点赞

    mr 孙、2年前 (2017-03-27)回复
  2. #2

    太厉害了 膜拜

    桃谷绘里香2年前 (2017-03-28)回复
  3. #1

    牛牛牛牛牛牛

    小刀2年前 (2017-03-31)回复