1. 程式人生 > 其它 >MHA+Atlas高可用讀寫分離架構

MHA+Atlas高可用讀寫分離架構

MHA+Atlas高可用讀寫分離架構

  • 需求:

    要求: 畫出實驗拓撲圖,標準清楚IP/hostname/作用
    (1)實現1主2從GTID主從複製環境      
    (2)構建MHA高可用環境    30分  
    (3)模擬損壞主庫,並實現修復    10分
    (4)實現應用透明(VIP)     20分
    (5)實現外部資料補償(binlog server)    10分
    (6)基於MHA環境實現Atlas讀寫分離    20分
    (7)線上增加刪除節點管理Atlas    10分
    

搭建步驟記錄:

1.實驗拓撲圖

2、MySQL實現主從、MHA、Atlas操作記錄

ip           主機名      			應用            				  埠
10.0.0.100   DB_master    mysql-5.7.26     		  			 3306
10.0.0.101   DB_slave     mysql-5.7.26   						   3306
10.0.0.102   DB_slave     mysql-5.7.26     		 				 3306	
10.0.0.103   MHA_Atlas  	MHA-Atlas 		               2345

3.MySQL 主從環境準備

主從架構前提

## 3.1 兩臺以上mysql例項 ,server_id,server_uuid不同
## 3.2 主庫開啟二進位制日誌
## 3.3 專用的複製使用者
## 3.4 保證主從開啟之前的某個時間點,從庫資料是和主庫一致(補課)
## 3.5 告知從庫,複製user,passwd,IP port,以及複製起點(change master to)
## 3.6 執行緒(三個):Dump thread  IO thread  SQL thread 開啟(start slave)

4.構建主從複製過程文件

  • 部署二進位制mysql-5.7.26

    shell部署

    [root@lb02 ~]# cat install.sh 
    #!/bin/bash
    . /etc/init.d/functions 
    Tmpdir=/opt
    Mysql_version=mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz
    Destdir=/application
    Datadir=/data/3307/data
    Binlogdir=/data/binlog/3307
    COLOR="echo -e \\033[01;31m"
    END='\033[0m'
    
    Status(){
       if [ $? -ne 0 ];then
           echo $1
           exit
       fi
    }
    
    Init_base(){
        $COLOR "開始安裝依賴...."$END
        sleep 1
        yum install -y  libaio-devel libaio numactl-libs   libaio &> /dev/null
        Status "安裝依賴失敗..." 
    }
        
    check(){
    cd  $Tmpdir
    if [ !  -e $Mysql_version ];then
            $COLOR"缺少${Mysql_version}檔案"$END
            $COLOR"請將相關軟體放在${Tmpdir}目錄下"$END
            exit
    elif [ -e $Destdir/mysql ];then
            action "資料庫已存在,安裝失敗" false
            exit
    else
        return
    fi
    } 
        
    Mysql_install(){
        $COLOR"開始安裝MySQL資料庫..."$END
        Init_base 
        [ -d $Destdir ] || mkdir -p $Destdir
        cd $Tmpdir && \
        tar xf $Mysql_version -C $Destdir
        MYSQL_DIR=`echo $Mysql_version | sed -nr 's/^(.*[0-9]).*/\1/p'`
        mv $Destdir/$MYSQL_DIR $Destdir/mysql
        #ln -s  $Destdir/$MYSQL_DIR  $Destdir/mysql
        id mysql &>/dev/null || useradd mysql -s /sbin/nologin -M
        cp $Destdir/mysql/support-files/mysql.server /etc/init.d/mysqld 
        chown -R mysql. $Destdir/mysql
        echo "PATH=$Destdir/mysql/bin/:$PATH" > /etc/profile.d/mysql.sh
        source /etc/profile.d/mysql.sh
        [ -d $Datadir ] || mkdir -p $Datadir
        [ -d $Binlogdir ] || mkdir -p $Binlogdir
    
    cat >/data/3307/my.cnf <<-EOF
    [mysqld]
    user=mysql
    basedir=/application/mysql
    datadir=$Datadir
    socket=/tmp/mysql.socket
    port=3307
    server_id=17
    gtid-mode=on
    enforce-gtid-consistency=true
    log_error=$Datadir/mysql.log
    log_bin=$Binlogdir/mysql3307-bin
    log-slave-updates
    slow_query_log=1
    slow_query_log_file=$Datadir/slow.log
    long_query_time=0.1
    log_queries_not_using_indexes
    secure-file-priv=/tmp
    
    [client]
    socket=/tmp/mysql.socket
    EOF
    cat >/etc/systemd/system/mysqld3307.service <<EOF
    [Unit]
    Description=MySQL Server
    Documentation=man:mysqld(8)
    Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
    After=network.target
    After=syslog.target
    [Install]
    WantedBy=multi-user.target
    [Service]
    User=mysql
    Group=mysql
    ExecStart=/$Destdir/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf
    LimitNOFILE = 5000
    EOF
        chown -R mysql. /data
        mysqld --initialize-insecure --user=mysql --datadir=$Datadir --basedir=$Destdir/mysql
        Status "MySQL 初始化失敗,請檢查依賴"
        systemctl start mysqld3307
        [ $? -eq 0 ] && $COLOR "MySQL服務啟動成功"$END || $COLOR "MySQL服務啟動失敗"$END
        systemctl daemon-reload
    }
    
    exec_install(){
        check
        Mysql_install
    }
    
    exec_install
    
    1.下載,上傳,解壓
    2. 建立使用者
    3. 建立相關目錄並授權
    4. 設定環境變數
    5. 初始化資料
    6. 配置檔案
    7. 配置啟動指令碼
    ps:我這裡採用的是指令碼的方式部署
    
  • 重新初始化3臺伺服器的Mysql

    mysqld --initialize-insecure --user=mysql --basedir=/application/mysql --datadir=/data/3307/data
    
  • 修改my.cnf ,開啟二進位制日誌功能

    [root@db01 3306]# vim /data/3306/my.cnf 
    log_bin=/data/3306/data/mysql-bin
    
  • 3啟動所有節點,並驗證

    [root@db01 3306]# systemctl start mysqld3306
    [root@db01 3306]# ps -ef |grep mysqld
    [root@db01 3306]# mysql -S /data/3306/mysql.sock -e "select @@server_id"
    
  • 主庫中建立複製使用者

    [root@db01 3306]# mysql -S /data/3306/mysql.sock 
    db01 [(none)]>grant replication slave on *.* to repl@'10.0.0.%' identified by '123';
    db01 [(none)]>select user,host from mysql.user;
    
  • 備份主庫並恢復到從庫

    [root@db01 3306]# mysqldump -S /data/3306/mysql.sock -A --master-data=2 --single-transaction  -R --triggers >/backup/full.sql
    
    # 備份檔案中標記的binlog日誌的名字和pos號
    -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=653;
    [root@db01 3307]# mysql -S /data/3308/mysql.sock
    db01 [(none)]>source /backup/full.sql
    
  • 告知從庫關鍵複製資訊-構建主從

    ip port user  password  binlog position 
    [root@db01 3307]# mysql -S /data/3308/mysql.sock
    db01 [mysql]>help change master to
    
    CHANGE MASTER TO
      MASTER_HOST='10.0.0.100',
      MASTER_USER='repl',
      MASTER_PASSWORD='123',
      MASTER_PORT=3307,
      MASTER_LOG_FILE='mysql-bin.000001',
      MASTER_LOG_POS=653,
      MASTER_CONNECT_RETRY=10;
    
  • 開啟主從專用執行緒

    start slave ;
    
  • 檢查複製狀態

    db01 [mysql]>show slave  status \G
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes
    

5.主從複製的故障分析

5.1 IO 執行緒故障

連線主庫

(1) 使用者 密碼  IP  port
Last_IO_Error: error reconnecting to master '[email protected]:3306' - retry-time: 10  retries: 7
[root@db01 ~]# mysql -urepl  -p123333  -h 10.0.0.100 -P 3306
ERROR 1045 (28000): Access denied for user 'repl'@'db01' (using password: YES)

原因:
密碼錯誤 
使用者錯誤 
skip_name_resolve
地址錯誤
埠

處理方法

stop  slave  
reset slave all 
change master to 
start slave

主庫連線數上線,或者是主庫太繁忙

show slave  staus \G 
Last_IO_Errno: 1040
Last_IO_Error: error reconnecting to master '[email protected]:3306' - retry-time: 10  retries: 7
處理思路:
拿複製使用者,手工連線一下

[root@db01 ~]# mysql -urepl -p123 -h 10.0.0.100 -P 3306 
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1040 (HY000): Too many connections
處理方法:
db01 [(none)]>set global max_connections=300;

(3) 防火牆,網路不通

請求二進位制日誌

主庫缺失日誌
ps:例如主庫reset master 
從庫方面,二進位制日誌位置點不對
Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'could not find next log; the first event 'mysql-bin.000001' at 154, the last event read from '/data/3307/data/mysql-bin.000002' at 154, the last byte read from '/data/3307/data/mysql-bin.000002' at 154.'
注意: 在主從複製環境中,嚴令禁止主庫中reset master; 可以選擇expire 進行定期清理主庫二進位制日誌
解決方案:
重新構建主從
5.2 SQL 執行緒故障
(1)讀寫relay-log.info 
(2)relay-log損壞,斷節,找不到
(3)接收到的SQL無法執行

導致SQL執行緒故障原因分析:

1. 版本差異,引數設定不同,比如:資料型別的差異,SQL_MODE影響
2.要建立的資料庫物件,已經存在
3.要刪除或修改的物件不存在  
4.DML語句不符合表定義及約束時.  
歸根揭底的原因都是由於從庫發生了寫入操作.
Last_SQL_Error: Error 'Can't create database 'db'; database exists' on query. Default database: 'db'. Query: 'create database db'

處理方法(以從庫為核心的處理方案):

方法一:
stop slave; 
set global sql_slave_skip_counter = 1;
#將同步指標向下移動一個,如果多次不同步,可以重複操作。
start slave;
方法二:
/etc/my.cnf
slave-skip-errors = 1032,1062,1007
常見錯誤程式碼:
1007:物件已存在
1032:無法執行DML
1062:主鍵衝突,或約束衝突

但是,以上操作有時是有風險的,最安全的做法就是重新構建主從。把握一個原則,一切以主庫為主.

一勞永逸的方法:

(1) 可以設定從庫只讀.
db01 [(none)]>show variables like '%read_only%';
注意:
只會影響到普通使用者,對管理員使用者無效。
(2)加中介軟體
讀寫分離。
**5.3主從延時監控及原因 **
主庫做了修改操作,從庫比較長時間才能追上.
  • 外在因素

    網路 
    主從硬體差異較大
    版本差異
    引數因素
    
  • 主庫

(1) 二進位制日誌寫入不及時
[rep]>select @@sync_binlog;
(2) CR的主從複製中,binlog_dump執行緒,事件為單元,序列傳送二進位制日誌(5.6 5.5)

1. 主庫併發事務量大,主庫可以並行,傳送時是序列
2. 主庫發生了大事務,由於是序列傳送,會產生阻塞後續的事務.

解決方案:
1. 5.6 開始,開啟GTID,實現了GC(group commit)機制,可以並行傳輸日誌給從庫IO
2. 5.7 開始,不開啟GTID,會自動維護匿名的GTID,也能實現GC,我們建議還是認為開啟GTID
3. 大事務拆成多個小事務,可以有效的減少主從延時.
  • 從庫
SQL執行緒導致的主從延時
在CR複製情況下: 從庫預設情況下只有一個SQL,只能序列回放事務SQL
1. 主庫如果併發事務量較大,從庫只能序列回放
2. 主庫發生了大事務,會阻塞後續的所有的事務的執行

解決方案:
1. 5.6 版本開啟GTID之後,加入了SQL多執行緒的特性,但是隻能針對不同庫(database)下的事務進行併發回放.
2. 5.7 版本開始GTID之後,在SQL方面,提供了基於邏輯時鐘(logical_clock),binlog加入了seq_no機制,
真正實現了基於事務級別的併發回放,這種技術我們把它稱之為MTS(enhanced multi-threaded slave).
3. 大事務拆成多個小事務,可以有效的減少主從延時.

MHA 高可用架構搭建

1. 規劃:

ip           主機名      			應用            				  埠
10.0.0.100   DB_master    mysql-5.7.26     		  			 3306
10.0.0.101   DB_slave     mysql-5.7.26   						   3306
10.0.0.102   DB_slave     mysql-5.7.26     		 				 3306	
10.0.0.103   MHA_Atlas  	MHA-Atlas 		               2345

2.準備環境(略。1主2從GTID)

3. 配置關鍵程式軟連線

ln -s /data/mysql/bin/mysqlbinlog    /usr/bin/mysqlbinlog
ln -s /data/mysql/bin/mysql          /usr/bin/mysql

4. 配置各節點互信

[root@test ~]# ssh-keygen 
#!/bin/sh
# ssh_fenfa_pub_key 
for ip in `cat /server/scripts/ip.txt` 
do
sshpass -p1a2s3d4f ssh-copy-id -i /root/.ssh/id_rsa.pub root@$ip "-o StrictHostKeyChecking=no" &>/dev/n
ull
done

5 安裝軟體

下載mha軟體

mha官網:https://code.google.com/archive/p/mysql-master-ha/
github下載地址:https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads

所有節點安裝Node軟體依賴包

yum install perl-DBD-MySQL -y
rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm

在主庫中建立mha需要的使用者

 grant all privileges on *.* to mha@'10.0.0.%' identified by 'mha';

Manager軟體安裝(MHA_Atlas-103)

yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes
rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm

6 配置檔案準備(MHA_Atlas-103)

建立配置檔案目錄
 mkdir -p /etc/mha
建立日誌目錄
 mkdir -p /var/log/mha/app1
編輯mha配置檔案
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.0.51
port=3306                                  
[server2]            
hostname=10.0.0.52
port=3306
[server3]
hostname=10.0.0.53
port=3306

7 狀態檢查

互信檢查

### 互信檢查
masterha_check_ssh  --conf=/etc/mha/app1.cnf 
Fri Apr 19 16:39:35 2019 - [debug]  Connecting via SSH from [email protected](10.0.0.53:22) to [email protected](10.0.0.52:22)..
Fri Apr 19 16:39:36 2019 - [debug]   ok.
Fri Apr 19 16:39:37 2019 - [info] All SSH connection tests passed successfully

主從狀態檢查

masterha_check_repl  --conf=/etc/mha/app1.cnf 
Fri Apr 19 16:40:51 2019 - [warning] master_ip_failover_script is not defined.
Fri Apr 19 16:40:51 2019 - [warning] shutdown_script is not defined.
Fri Apr 19 16:40:51 2019 - [info] Got exit code 0 (Not master dead).
MySQL Replication Health is OK..8 開啟MHA(MHA_Atlas-103)

8 開啟MHA(MHA_Atlas-103):

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 &

9 檢視MHA狀態

[root@db03 ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:4719) is running(0:PING_OK), master:10.0.0.100

10 故障模擬及處理

### 停主庫:    
/etc/init.d/mysqld stop

觀察manager  日誌 tail -f /var/log/mha/app1/manager
末尾必須顯示successfully,才算正常切換成功

修復主庫

[root@db01 ~]# /etc/init.d/mysqld start

恢復主從結構

CHANGE MASTER TO 
MASTER_HOST='10.0.0.52',
MASTER_PORT=3306, 
MASTER_AUTO_POSITION=1, 
MASTER_USER='repl', 
MASTER_PASSWORD='123';
start slave ;

修改配置檔案

[server1]
hostname=10.0.0.100
port=3306

啟動MHA

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 &

11 MHA 的vip功能

11.1 引數

master_ip_failover_script=/usr/local/bin/master_ip_failover
注意:/usr/local/bin/master_ip_failover,必須事先準備好

11.2修改指令碼內容

vi  /usr/local/bin/master_ip_failover
my $vip = '10.0.0.55/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";

11.3 更改manager配置檔案:

vi /etc/mha/app1.cnf
新增:
master_ip_failover_script=/usr/local/bin/master_ip_failover
注意:
[root@db03 ~]# dos2unix /usr/local/bin/master_ip_failover 
dos2unix: converting file /usr/local/bin/master_ip_failover to Unix format ...
[root@db03 ~]# chmod +x /usr/local/bin/master_ip_failover 

11.4 主庫上,手工生成第一個vip地址

手工在主庫上繫結vip,注意一定要和配置檔案中的ethN一致,我的是eth0:1(1是key指定的值)
ifconfig eth0:1 10.0.0.55/24

11.5 重啟mha

masterha_stop --conf=/etc/mha/app1.cnf
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 &

12 郵件提醒(send)

1. 引數:
vim /etc/mha/app1.cnf 
report_script=/usr/local/bin/send_report

2. 準備郵件指令碼
[root@ybj ~]# cat /usr/local/bin/send_report
#!/usr/bin/perl  
use strict;  
use warnings FATAL => 'all';  
use Mail::Sender;  
use Getopt::Long;  
  
#new_master_host and new_slave_hosts are set only when recovering master succeeded  
my ( $dead_master_host, $new_master_host, $new_slave_hosts, $subject, $body );  
  
my $smtp='smtp.163.com';  
my $mail_from='[email protected]';         #發件人郵箱
my $mail_user='[email protected]';  				#發件人郵箱
my $mail_pass='GHxxxxxxxxxxCL';  							#發件人郵箱授權密碼
#my $mail_to=['[email protected]','[email protected]'];  
my $mail_to='[email protected]';  							#收件人郵箱
  
GetOptions(  
  'orig_master_host=s' => \$dead_master_host,  
  'new_master_host=s'  => \$new_master_host,  
  'new_slave_hosts=s'  => \$new_slave_hosts,  
  'subject=s'          => \$subject,  
  'body=s'             => \$body,  
);  
  
# Do whatever you want here  
mailToContacts($smtp,$mail_from,$mail_user,$mail_pass,$mail_to,$subject,$body);  
  
sub mailToContacts {  
    my ($smtp, $mail_from, $mail_user, $mail_pass, $mail_to, $subject, $msg ) = @_;  
    open my $DEBUG, ">/var/log/mha/app1/mail.log"  
        or die "Can't open the debug    file:$!\n";  
    my $sender = new Mail::Sender {  
        ctype       => 'text/plain;charset=utf-8',  
        encoding    => 'utf-8',  
        smtp        => $smtp,  
        from        => $mail_from,  
        auth        => 'LOGIN',  
        TLS_allowed => '0',  
        authid      => $mail_user,  
        authpwd     => $mail_pass,  
        to      => $mail_to,  
        subject     => $subject,  
        debug       => $DEBUG  
    };  
    $sender->MailMsg(  
        {  
            msg => $msg,  
            debug => $DEBUG  
        }  
    ) or print $Mail::Sender::Error;  
    return 1;  
}  
  
exit 0;
(3)停止MHA
masterha_stop --conf=/etc/mha/app1.cnf
(4)開啟MHA    
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 &
        
(5) 關閉主庫,看警告郵件  
故障修復:
1. 恢復故障節點
(1)例項宕掉
/etc/init.d/mysqld start 
(2)主機損壞,有可能資料也損壞了
備份並恢復故障節點。
2.恢復主從環境
看日誌檔案:
CHANGE MASTER TO MASTER_HOST='10.0.0.101', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='123';
start slave ;
3.恢復manager
3.1 修好的故障節點配置資訊,加入到配置檔案
[server1]
hostname=10.0.0.100
port=3306
3.2 啟動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 &

13 binlog server(MHA_Atlas-103)

引數:

binlogserver配置:
找一臺額外的機器,必須要有5.6以上的版本,支援gtid並開啟
vim /etc/mha/app1.cnf 
[binlog1]
no_master=1            #表示不參與master的選舉
hostname=10.0.0.103
master_binlog_dir=/data/mysql/binlog

建立必要目錄:

mkdir -p /data/mysql/binlog
chown -R mysql.mysql /data/*
修改完成後,將主庫binlog拉過來(從000001開始拉,之後的binlog會自動按順序過來)

拉取主庫binlog日誌

cd /data/mysql/binlog     -----》必須進入到自己建立好的目錄
mysqlbinlog  -R --host=10.0.0.52 --user=mha --password=mha --raw  --stop-never mysql-bin.000001 &
注意:
拉取日誌的起點,需要按照目前從庫的已經獲取到的二進位制日誌點為起點

配合指令碼拉去VIP日誌,故障轉移後執行次指令碼拉取到新master的binlog日誌

#!/bin/bash
port=3306
master_binlog=`mysql -umha -pmha -P3306 -h 10.0.0.55 -e "show master logs;" |awk 'END{print $1}'`
mysqlbinlog  -R --host=10.0.0.55 --user=mha --password=mha --port=$port --raw  --stop-never ${master_bi
nlog} &

重啟MHA

masterha_stop --conf=/etc/mha/app1.cnf
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、重新獲取新主庫的binlog到binlogserver中
2、重新配置檔案binlog server資訊
3、最後再啟動MHA

Atlas(中介軟體) 讀寫分離 搭建

下載地址
https://github.com/Qihoo360/Atlas/releases
注意:
1、Atlas只能安裝執行在64位的系統上
2、Centos 5.X安裝 Atlas-XX.el5.x86_64.rpm,Centos 6.X安裝Atlas-XX.el6.x86_64.rpm。
3、後端mysql版本應大於5.1,建議使用Mysql 5.6以上

1.安裝配置

下載:Atlas-2.2.1.el6.x86_64.rpm
yum localinstall -y Atlas-2.2.1.el6.x86_64.rpm
rpm -ivh Atlas-2.2.1.el6.x86_64.rpm
----------------------------------------------------
yum install -y Atlas*
cd /usr/local/mysql-proxy/conf
mv test.cnf test.cnf.bak

cat > test.cnf <<EOF
[mysql-proxy]
admin-username = user          						  #atlas管理使用者
admin-password = pwd										  	#atlas管理密碼
proxy-backend-addresses = 10.0.0.55:3306    
proxy-read-only-backend-addresses = 10.0.0.51:3306,10.0.0.53: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
EOF

配置詳解:

[root@ybj ~]# more /usr/local/mysql-proxy/conf/hhm.cnf 
[mysql-proxy]

#帶#號的為非必需的配置專案

#管理介面的使用者名稱
admin-username=user

#管理介面的密碼
admin-password=pwd

#Atlas後端連線的MySQL主庫的IP和埠,可設定多項,用逗號分隔,一般多用於VIP應用透明(寫)的操作
proxy-backend-addresses=10.0.0.55:3307

#Atlas後端連線的MySQL從庫的IP和埠,@後面的數字代表權重,用來作負載均衡,若省略則預設為1,可設定多項,
用逗號分隔(讀的操作)
proxy-read-only-backend-addresses=10.0.0.100:3307,10.0.0.101:3307,10.0.0.81:3307

#使用者名稱與其對應的加密過的MySQL密碼,密碼使用PREFIX/bin目錄下的加密程式encrypt加密,下行的user1和user2為
示例,將其替換為你的MySQL的使用者名稱和加密密碼!
pwds=root:DAJnl8cVzy8=,wordpress:HXPORNtwJiMa8s/oWZlMvQ==,hhm:cq344dJ5lTw=

#設定Atlas的執行方式,設為true時為守護程序方式,設為false時為前臺方式,一般開發除錯時設為false,線上運
行時設為true,true後面不能有空格。
daemon=true

#設定Atlas的執行方式,設為true時Atlas會啟動兩個程序,一個為monitor,一個為worker,monitor在worker意外退
出後會自動將其重啟,設為false時只有worker,沒有monitor,一般開發除錯時設為false,線上執行時設為true,tru
e後面不能有空格。
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
日誌且實時寫入磁碟,預設為OFF
sql-log=on

#慢日誌輸出設定。當設定了該引數時,則日誌只輸出執行時間超過sql-log-slow(單位:ms)的日誌記錄。不設定該
引數則輸出全部日誌。
sql-log-slow=10

#例項名稱,用於同一臺機器上多個Atlas例項間的區分
instance=hhm 

#Atlas監聽的工作介面IP和埠
proxy-address=0.0.0.0:30001

#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,10.0.0.200

#Atlas前面掛接的LVS的物理網絡卡的IP(注意不是虛IP),若有LVS且設定了client-ips則此項必須設定,否則可以不設
置
#lvs-ips = 192.168.1.1
client-ips=

編寫Atlas啟動指令碼

[root@ybj ~]# more atlas.sh 
#!/bin/bash  
Config_file=hhm

start(){  
        /usr/local/mysql-proxy/bin/mysql-proxyd  $Config_file  start
}  
stop(){  
        /usr/local/mysql-proxy/bin/mysql-proxyd $Config_file stop
}
status(){       
        /usr/local/mysql-proxy/bin/mysql-proxyd $Config_file status  
}
restart(){  
        /usr/local/mysql-proxy/bin/mysql-proxyd  $Config_file restart
} 
ATLAS="/usr/local/mysql-proxy/bin/mysql-proxyd"  
[ -f $ATLAS ] || (echo "啟動指令碼mysql-proxyd is not exist " ; exit 1)  
case "$1" in  
        start)  
                start  
                ;;  
        stop)  
                stop  
                ;;  
        restart)  
                restart
                ;;  
        status)  
                status 
                ;;  
        *)  
                echo $"Usage: $0 {start|stop|status|restart}"  
                exit 1  
esac  
exit 0 

2.啟動Atlas

啟動atlas
sh atlas.sh start

/usr/local/mysql-proxy/bin/mysql-proxyd test start
ps -ef |grep proxy

3. Atlas功能測試

測試讀操作:
mysql -umha -pmha  -h 10.0.0.103 -P 30001 
db03 [(none)]>select @@server_id;
測試寫操作:
mysql> begin;select @@server_id;commit;

4. Atlas基本管理

mysql -uuser -ppwd -h127.0.0.1 -P2345

列印幫助:

mysql> select * from help;

查詢後端所有節點資訊:

mysql>  SELECT * FROM backends    ;
+-------------+----------------+-------+------+
| backend_ndx | address        | state | type |
+-------------+----------------+-------+------+
|           1 | 10.0.0.55:3306 | up    | rw   |
|           2 | 10.0.0.101:3306 | up    | ro   |
|           3 | 10.0.0.102:3306 | up    | ro   |
+-------------+----------------+-------+------+
3 rows in set (0.00 sec)

動態新增刪除節點

REMOVE BACKEND 3;

動態新增節點

ADD SLAVE 10.0.0.53:3306;

儲存配置到配置檔案

SAVE CONFIG;

自動化Atlas指令碼踢出新Master節點的salve(讀)節點功能

[root@ybj ~]# cat atlas_onlin.sh 
#!/bin/bash

Master_ip=`grep -i "change master to " /var/log/mha/app1/manager |awk 'END{print $22}' |sed -r "s#(^.*')(.*)('.)#\2#g"`

mysql -uuser -ppwd -h 127.0.0.1 -P 2345 -e "SELECT * FROM backends" |awk -F '[ :]' '$1~/^[0-9]/{print $1}' >/tmp/atlas_info.txt

a=$Master_ip

Atlas_salve_num=`awk '$2~/'"$a"'/{print \$1}' /tmp/atlas_info.txt`

mysql -uuser -ppwd -h 127.0.0.1 -P 2345 -e "REMOVE BACKEND ${Atlas_salve_num};save config"

ps:awk 呼叫外部變數的時候 需要將變數 單引號+雙引號

master_ip_failover :vip應用透明指令碼呼叫 Atlas 指令碼

more /usr/local/bin/master_ip_failover

.......
sub start_vip() {
    `ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
    `bash /usr/local/bin/atlas_onlin.sh`;
}
.......
新增到master_ip_failover指令碼中

經過測試在MHA vip地址漂移後,自動執行Atlas指令碼,將新Master在Altas中刪除salve(讀)的配置