MHA高可用

软件简介

MHA(Master High Availability)是一种用于提高 MySQL 数据库可用性的解决方案。它通过实现主备复制、监测和故障检测以及故障切换等功能,确保数据库的高可用性。

MHA 的工作原理可以细分为以下几个步骤:

  1. 从宕机崩溃的 Master 保存二进制日志事件(binlog events):MHA 会从宕机崩溃的 Master 节点中保存二进制日志事件,这些日志事件包含了最新的数据更新操作。
  2. 识别含有最新更新的 Slave:MHA 会识别哪些 Slave 节点包含了最新的数据更新操作,这将用于后续的故障切换过程。
  3. 应用差异的中继日志(relay log)到其他 Slave:MHA 将识别出最新的中继日志事件,并将这些事件应用到其他 Slave 节点上,以保证所有 Slave 节点上的数据一致性。
  4. 应用从 Master 保存的二进制日志事件:MHA 将从 Master 节点保存的二进制日志事件应用到新的 Master 节点上,以保证新 Master 节点上的数据与原 Master 节点一致。
  5. 提升一个 Slave 为新的 Master:MHA 将选择一个 Slave 节点提升为新的 Master 节点,新的 Master 节点将替代原 Master 节点的角色,继续提供数据库服务。
  6. 使其他的 Slave 连接新的 Master 进行复制:其他 Slave 节点将连接到新的 Master 节点,并继续进行数据复制操作,以保证所有节点的数据一致性。

MHA 的内部使用了 SSH(Secure Shell)来实现远程连接和管理。SSH 是一种安全的网络协议,用于在远程计算机上执行命令或传输文件。在 MHA 的工作过程中,SSH 被用于以下方面:

  1. 远程连接和管理:MHA 使用 SSH 来连接到远程 MySQL 服务器,并进行各种管理和监测操作。例如,MHA 使用 SSH 执行一些管理脚本,以监控和清理日志文件等。
  2. 安全认证:SSH 为 MHA 提供了一个安全的方式来对远程 MySQL 服务器进行认证。MHA 使用 SSH 密钥或密码来验证其对远程服务器的访问权限。
  3. 控制访问:SSH 还提供了控制访问的功能,MHA 可以根据需要限制对远程 MySQL 服务器的访问权限,以确保数据的安全性。

MHA还提供在线主库切换的功能,能够安全地切换当前运行的主库到一个新的主库中(通过将从库提升为主库),大概0.5-2秒内即可完成。

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

工作流程

1)把宕机的master二进制日志保存下来。
2)找到binlog位置点最新的slave。
3)在binlog位置点最新的slave上用relay log(差异日志)修复其它slave。
4)将宕机的master上保存下来的二进制日志恢复到含有最新位置点的slave上。
5)将含有最新位置点binlog所在的slave提升为master。
6)将其它slave重新指向新提升的master,并开启主从复制。

MHA工具介绍

MHA软件由两部分组成,Manager工具包和Node工具包,具体的说明如下:

Manager工具包主要包括以下几个工具:

masterha_check_ssh              #检查MHA的ssh-key
masterha_check_repl             #检查主从复制情况
masterha_manger                 #启动MHA
masterha_check_status           #检测MHA的运行状态
masterha_master_monitor         #检测master是否宕机
masterha_master_switch          #手动故障转移
masterha_conf_host              #手动添加server信息
masterha_secondary_check        #建立TCP连接从远程服务器
masterha_stop                   #停止MHA

Node工具包主要包括以下几个工具:

save_binary_logs                #保存宕机的master的binlog
apply_diff_relay_logs           #识别relay log的差异
filter_mysqlbinlog              #防止回滚事件
purge_relay_logs                #清除中继日志

MHA优点总结

1)Masterfailover and slave promotion can be done very quickly
自动故障转移快

2)Mastercrash does not result in data inconsistency
主库崩溃不存在数据一致性问题

3)Noneed to modify current MySQL settings (MHA works with regular MySQL)
不需要对当前mysql环境做重大修改

4)Noneed to increase lots of servers
不需要添加额外的服务器(仅一台manager就可管理上百个replication)

5)Noperformance penalty
性能优秀,可工作在半同步复制和异步复制,当监控mysql状态时,仅需要每隔N秒向master发送ping包(默认3秒),所以对性能无影响。你可以理解为MHA的性能和简单的主从复制框架性能一样。

6)Works with any storage engine
只要replication支持的存储引擎,MHA都支持,不会局限于innodb

传统主从复制

  1. binglog: 主库开启binlog 从库不需要开启binlog
  2. server_id: 主库和从库不同,从库可以相同
  3. 主库要有主从复制用户,从库不需要

MHA主从先决条件

  1. binlog: 主库和从库都要开启binlog
  2. server_id: 主库和从库server-id不同,从库也不能相同
  3. 要有主从复制用户,从库也必须要有主从复制用户

部署MHA

1)环境准备(所有节点)

#安装依赖包
[root@mysql-db01 ~]\# yum install perl-DBD-MySQL -y
#进入安装包存放目录
[root@mysql-db01 ~]\# cd /home/oldboy/tools/
#上传mha安装包
[root@mysql-db01 tools]\# rz -be
mha4mysql-manager-0.56-0.el6.noarch.rpm
mha4mysql-manager-0.56.tar.gz
mha4mysql-node-0.56-0.el6.noarch.rpm
mha4mysql-node-0.56.tar.gz
#安装node包
[root@mysql-db01 tools]\# rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
Preparing...                ########################################### [100%]
   1:mha4mysql-node         ########################################### [100%]
#登录数据库
[root@mysql-db01 tools]\# mysql -uroot -pecho
#添加mha管理账号
mysql> grant all privileges on *.* to mha@'172.16.1.%' identified by 'echo';
#查看是否添加成功
mysql> select user,host from mysql.user;
#主库上创建,从库会自动复制(在从库上查看)
mysql> select user,host from mysql.user;

命令软连接(所有节点)

#如果不创建命令软连接,检测mha复制情况的时候会报错
[root@mysql-db01 ~]\# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
[root@mysql-db01 ~]\# ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql

部署管理节点(mha-manager:mysql-db03)

#使用epel源
[root@mysql-db03 ~]\# wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
#安装manager依赖包
[root@mysql-db03 ~]\# yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes
#安装manager包
[root@mysql-db03 tools]\# rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm 
Preparing...              ########################################### [100%]
1:mha4mysql-manager       ########################################### [100%]

编辑配置文件

#创建配置文件目录
[root@mysql-db03 ~]\# mkdir -p /etc/mha
#创建MHA工作目录
[root@mysql-db03 ~]\# mkdir -p /etc/mha/app1
#创建日志目录
[root@mysql-db03 ~]\# mkdir -p /var/log/mha/app1
#编辑mha配置文件
[root@mysql-db03 ~]\# vim /etc/mha/app1.cnf
[server default]
manager_log=/var/log/mha/app1/manager.log
manager_workdir=/etc/mha/app1
master_binlog_dir=/data
user=mha
password=echo
ping_interval=2
repl_user=slave
repl_password=echo
ssh_user=root
ssh_port=22 

[server1]
candidate_master=1
check_repl_delay=0
hostname=172.16.1.52
port=3306

[server2]
hostname=172.16.1.53
port=3306

[server3]
hostname=172.16.1.54
port=3306

[server4]
hostname=172.16.1.55
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=echo
#设置监控用户mha
user=mha
#设置监控主库,发送ping包的时间间隔,尝试三次没有回应的时候自动进行failover
ping_interval=1
#设置远端mysql在发生切换时binlog的保存位置
remote_workdir=/tmp
#设置复制用户的密码
repl_password=echo
#设置复制环境中的复制用户名 
repl_user=slave
#设置发生切换后发送的报警的脚本
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=172.16.1.51
port=3306

[server2]
hostname=172.16.1.52
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

配置ssh信任(所有节点)

#创建秘钥对
[root@mysql-db01 ~]\# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1
#发送公钥,包括自己
[root@mysql-db01 ~]\# ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.51
[root@mysql-db01 ~]\# ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.52
[root@mysql-db01 ~]\# ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.53
或者
#安装sshpass 进行免密下发
前提(vim /etc/ssh/ssh_config  修改 StrictHostKeyChecking no 对于未连接过的主机。而又不输入yes进行确认 )
[root@mysql-db01 ~]\# yum install sshpass  -y
[root@mysql-db01 ~]\# for i in {52..55}; do  sshpass -p 'echo' ssh-copy-id  -i /root/.ssh/id_rsa.pub root@172.16.1.$i; done

启动测试

#测试ssh
[root@mysql-db03 ~]\# masterha_check_ssh --conf=/etc/mha/app1.cnf
#看到如下字样,则测试成功
Tue Mar  7 01:03:33 2017 - [info] All SSH connection tests passed successfully.
#测试复制
[root@mysql-db03 ~]\# 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 &
#查看是否启动
masterha_check_status --conf=/etc/mha/app1.cnf
#停止MHA
masterha_stop --conf=/etc/mha/app1.cnf

--conf=/etc/mha/app1.cnf 指定配置文件
-remove_dead_master_conf  自动摘除配置文件中相关主库配置
--ignore_last_failover  忽略上一次切换(不生成锁文件)
MHA工作机制
MHA在做完一次切换后,会在工作目录下生成一个锁文件 8小时之内不作第二次切换

手动切换
masterha_master_switch --master_state=dead --conf=/etc/mha/app1.cnf --dead_master_host=172.16.1.52 --dead_master_port=3306 --new_master_host=172.16.1.53 --new_master_port=3306 --ignore_last_failover

--master_state=dead
强制参数. 可选有: "dead" or "alive". 如果设置为 alive,将执行在线切主操作

--dead_master_host=(hostname)
强制参数,--dead_master_ip 和 --dead_master_port 也可以指定。

--new_master_host=(hostname)
可选参数。如果不指定,程序自动选举。

切换master测试

#登录数据库(db02)
[root@mysql-db02 ~]\#mysql -uroot -pecho
#检查复制情况
mysql> show slave status\G
*************************** 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
              Master_Log_File: mysql-bin.000006
          Read_Master_Log_Pos: 191
               Relay_Log_File: mysql-db02-relay-bin.000002
                Relay_Log_Pos: 361
        Relay_Master_Log_File: mysql-bin.000006
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
#登录数据库(db03)
[root@mysql-db03 ~]\# mysql -uroot -pecho
#检查复制情况
mysql> show slave status\G
*************************** 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
              Master_Log_File: mysql-bin.000006
          Read_Master_Log_Pos: 191
               Relay_Log_File: mysql-db03-relay-bin.000002
                Relay_Log_Pos: 361
        Relay_Master_Log_File: mysql-bin.000006
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

#停掉主库
[root@mysql-db01 ~]\# /etc/init.d/mysqld stop
Shutting down MySQL..... SUCCESS!
#登录数据库(db02)
[root@mysql-db02 ~]\#mysql -uroot -pecho
#查看slave状态
mysql> show slave status\G
#db02的slave已经为空
Empty set (0.00 sec)
#登录数据库(db03)
[root@mysql-db03 ~]\# mysql -uroot -pecho
#查看slave状态
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.16.1.52
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000006
          Read_Master_Log_Pos: 191
               Relay_Log_File: mysql-db03-relay-bin.000002
                Relay_Log_Pos: 361
        Relay_Master_Log_File: mysql-bin.000006
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

MHA环境恢复

1. 修复主库并启动主库
/etc/init.d/mysqld start
2. 在MHA日志中找到change master to 语句
grep -i "change master to" /var/log/mha/app/manager.log
3. 在原来旧主库上执行change master to语句
CHANGE MASTER TO MASTER_HOST='172.16.1.53', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='slave', MASTER_PASSWORD='echo';
4. 启动slave
start slave;
5.编辑MHA配置文件加入server标签
6. 启动MHA
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_fileover < /dev/null > /var/log/mha/app/manager.log 2>&1 &

配置VIP漂移

VIP漂移的两种方式
1)通过keepalived的方式,管理虚拟IP的漂移
2)通过MHA自带脚本方式,管理虚拟IP的漂移

MHA脚本方式

修改配置文件

vim /etc/mha/app1.cnf 加入
master_ip_failover_script=/etc/mha/app1/master_ip_failover
从准备好的master_ip_failover 复制到指定位置

ls -l /root/mha4mysql-manager/samples/scripts/master_ip_failover 脚本路径


注意要给脚本加上可执行权限
chmod +x master_ip_failover 

编辑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
);
my $vip = '10.0.0.55/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig eth1:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth1:$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";
}




PS:

my $vip = '172.16.1.253/24';   VIP 地址
my $key = '1';     eth0:$key 例 ifconfig eth1:1
my $ssh_start_vip = "/sbin/ifconfig eth1:$key $vip";  此处网卡为内网网卡(配置时根据情况设定)
my $ssh_stop_vip = "/sbin/ifconfig eth1:$key down";




如果是从win拷贝的脚本要转下格式
dos2unix master_ip_failover 


主库绑定vip
ifconfig eth1:1 172.16.1.253/24 (删除ip命令 ifconfig eth1:1 down)
查看vip
ip a| grep eth1
 eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 172.16.1.55/24 brd 172.16.1.255 scope global noprefixroute eth1
    inet 172.16.1.253/24 brd 172.16.1.255 scope global secondary eth1:0
启动mha

测试ip漂移

#登录db02
[root@mysql-db03 ~]# mysql -uroot -p
#查看slave信息
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.16.1.52
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.0000033
          Read_Master_Log_Pos: 911
               Relay_Log_File: mysql-db02-relay-bin.000002
                Relay_Log_Pos: 317
        Relay_Master_Log_File: mysql-bin.000007
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
#停掉主库
[root@mysql-db01 ~]# /etc/init.d/mysqld stop
Shutting down MySQL..... SUCCESS!
#在db03上查看从库slave信息

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host:172.16.1.53
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 911
               Relay_Log_File: mysql-db03-relay-bin.000002
                Relay_Log_Pos: 317
        Relay_Master_Log_File: mysql-bin.000006
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
#在db01上查看vip信息
[root@mysql-db01 ~]# ip a |grep eth1
2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
inet 172.16.1.53/24 brd 10.0.0.255 scope global eth1
#在db02上查看vip信息
[root@mysql-db02 ~]# ip a |grep eth1
2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    inet172.16.1.53/24 brd 10.0.0.255 scope global eth1
    inet 172.16.1.253/24 brd 10.0.0.255 scope global secondary eth1:1

配置binlog_server

编辑配置文件

vim /etc/mha/app1.cnf 加入
[binlog1]
no_master=1   #此主机永远不会切成主库(额外主机)
hostname=172.16.1.55 #binlogserver主机地址
master_binlog_dir=/data/binlog/  #binlog存放位置
#创建备份目录
mkdir -p /data/binlog
#进入备份目录
cd /data/binlog
#到主库拉取binlog (注意主库binlog名)
mysqlbinlog -R --host=172.16.1.253 --user=mha --password=echo --raw --stop-never mysql_bin.000001  &

-R   --read-from-remote-server   #从远程MySQL服务器读取二进制日志      
--host=172.16.1.253  #vip地址 (change master to 也要改成vip)
--raw  #需要-R 输出原始binlog数据,而不是SQL语句,输出到日志文件。
--stop-never #永不停止

#启动mha
nohup master_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /etc/mha/app/manager.log 2>&1 &

测试binlog备份

#查看binlog目录中的binlog
[root@mysql-db03 binlog]# ll
total 44
-rw-r--r-- 1 root root 285 Mar  8 03:11 mysql-bin.000001
#登录主库
[root@mysql-db01 ~]# mysql -uroot -pecho
#刷新binlog
mysql> flush logs;
#再次查看binlog目录
[root@mysql-db03 binlog]# ll
total 48
-rw-r--r-- 1 root root 285 Mar  8 03:11 mysql-bin.000001
-rw-r--r-- 1 root root 143 Mar  8 04:00 mysql-bin.000002

MySQL中间件Atlas

Atlas简介

Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bug,添加了很多功能特性。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bug,添加了很多功能特性。

Atlas主要功能


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

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


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

安装Atlas

1)Atlas (普通) : Atlas-2.2.1.el6.x86_64.rpm
2)Atlas (分表) : Atlas-sharding_1.0.1-el6.x86_64.rpm

这里我们只需要下载普通的即可。

下载atlas
wget https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm
安装
rpm -ivh Atlas-2.2.1.el6.x86_64.rpm 
Preparing...        ################################# [100%]
Updating / installing...
   1:Atlas-2.2.1-1  ################################# [100%]
查看安装路径
rpm -ql Atlas 

编辑配置文件

#进入Atlas工具目录
[root@mysql-db01 ~]# cd /usr/local/mysql-proxy/bin/
#生成密码
[root@mysql-db01 bin]# ./encrypt echo
#修改Atlas配置文件(注意记录好管理接口的用户名密码和管理地址端口等信息)
[root@mysql-db01 ~]# vim /usr/local/mysql-proxy/conf/test.cnf
#Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔(可写vip)
proxy-backend-addresses = 172.16.1.253:3306
#Atlas后端连接的MySQL从库的IP和端口
proxy-read-only-backend-addresses = 172.16.1.53:3306,172.16.1.54:3306,172.16.1.55:3306
#用户名与其对应的加密过的MySQL密码
pwds = root:O9ocLryc5vQ=,slave:O9ocLryc5vQ=,mha:O9ocLryc5vQ=
#日志错误级别
log-level = error
#SQL日志的开关
sql-log = ON
#Atlas监听的工作接口IP和端口
proxy-address = 0.0.0.0:3307
#默认字符集,设置该项后客户端不再需要执行SET NAMES语句
charset = utf8

启动Atlas

[root@mysql-db01 ~]# /usr/local/mysql-proxy/bin/mysql-proxyd test start
OK: MySQL-Proxy of test is started  (test 为配置文件名 )

Atlas管理操作

#用atlas管理用户登录
[root@mysql-db01 ~]# mysql -uhanjy -pecho -h127.0.0.1 -P2345
#查看可用命令帮助
mysql> select * from help;
mysql> select * from help;
+----------------------------+---------------------------------------------------------+
| command                    | description                                             |
+----------------------------+---------------------------------------------------------+
| SELECT * FROM help         | shows this help                                         |  查看帮助
| SELECT * FROM backends     | lists the backends and their state                      |  查看后端代理服务器
| SET OFFLINE $backend_id    | offline backend server, $backend_id is backend_ndx   id |  平滑下线数据库  例如:set offline  接后端id
| SET ONLINE $backend_id     | online backend server, ...                              |  平滑上线数据库  例如:set online  接后端id
| ADD MASTER $backend        | example: "add master 127.0.0.1:3306", ...               |  添加一个主库    例如: add master 172.16.1.54:3306
| ADD SLAVE $backend         | example: "add slave 127.0.0.1:3306", ...                |  添加一个从库    例如: add slave 172.16.1.55:3306
| REMOVE BACKEND $backend_id | example: "remove backend 1", ...                        |  删除一个后端库  例如: remove backend 接后端id
| SELECT * FROM clients      | lists the clients                                       |  查看可连接管理接口客户端
| ADD CLIENT $client         | example: "add client 192.168.1.2", ...                  |  添加一个客户端  例如:add client 172.16.1.54
| REMOVE CLIENT $client      | example: "remove client 192.168.1.2", ...               |  删除一个客户端  例如:remove client 172.16.1.54
| SELECT * FROM pwds         | lists the pwds                                          |  查询atlas可连接用户
| ADD PWD $pwd               | example: "add pwd user:raw_password", ...               |  添加用户 密码会自动加密  例如:add pwd hjy:密码
| ADD ENPWD $pwd             | example: "add enpwd user:encrypted_password", ...       |  添加用户 加密后的密码    例如:add enpwd hjy:加密后密码
| REMOVE PWD $pwd            | example: "remove pwd user", ...                         |  删除用户        例如: remove pwd hjy
| SAVE CONFIG                | save the backends to config file                        |  保存到配置文件
| SELECT VERSION             | display the version of Atlas                            |  查看版本
+----------------------------+---------------------------------------------------------+
16 rows in set (0.00 sec)


#查看后端代理的库
mysql> SELECT * FROM backends ;
+-------------+------------------+-------+------+
| backend_ndx | address          | state | type |
+-------------+------------------+-------+------+
|           1 | 172.16.1.52:3306 | up    | rw   |
|           2 | 172.16.1.53:3306 | up    | ro   |
|           3 | 172.16.1.54:3306 | up    | ro   |
|           4 | 172.16.1.55:3306 | up    | ro   |
+-------------+------------------+-------+------+
#平滑摘除mysql
mysql> REMOVE BACKEND 2;

Empty set (0.00 sec)
#检查是否摘除成功
mysql> SELECT * FROM backends ;
+-------------+------------------+-------+------+
| backend_ndx | address          | state | type |
+-------------+------------------+-------+------+
|           1 | 172.16.1.52:3306 | up    | rw   |
|           2 | 172.16.1.54:3306 | up    | ro   |
|           3 | 172.16.1.55:3306 | up    | ro   |
+-------------+------------------+-------+------+
3 rows in set (0.00 sec)
#添加一个从库
mysql> add slave 172.16.1.53:3306;
Empty set (0.00 sec)

#保存到配置文件中
mysql> SAVE CONFIG;
Empty set (0.06 sec)