MHA+Atlas高可用讀寫分離架構
阿新 • • 發佈:2021-09-30
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(讀)的配置