atlas讀寫分離

Atlas是由 Qihoo 360公司Web平臺部基礎架構團隊開發維護的一個基於MySQL協議的數據中間層項目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基礎上,修改了大量bug,添加了不少功能特性。目前該項目在360公司內部獲得了普遍應用,不少MySQL業務已經接入了Atlas平臺,天天承載的讀寫請求數達幾十億條。前端

主要功能:
1.讀寫分離
2.從庫負載均衡
3.IP過濾
4.自動分表
5.DBA可平滑上下線DB
6.自動摘除宕機的DBmysql

Atlas是一個位於應用程序與MySQL之間中間件。在後端DB看來,Atlas至關於鏈接它的客戶端,在前端應用看來,Atlas至關於一個DB。Atlas做爲服務端與應用程序通信,它實現了MySQL的客戶端和服務端協議,同時做爲客戶端與MySQL通信。它對應用程序屏蔽了DB的細節,同時爲了下降MySQL負擔,它還維護了鏈接池git

Atlas相對於官方MySQL-Proxy的優點
1.將主流程中全部Lua代碼用C重寫,Lua僅用於管理接口
2.重寫網絡模型、線程模型
3.實現了真正意義上的鏈接池
4.優化了鎖機制,性能提升數十倍github

Atlas配置

下載Atlas會有兩個版本,其中有個分表的版本,可是這個須要其餘的依賴,我這邊不須要分表這種需求,因此安裝普通的版本sql

Atlas (普通) : Atlas-2.2.1.el6.x86_64.rpm
Atlas (分表) : Atlas-sharding_1.0.1-el6.x86_64.rpm數據庫

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 後端

安裝好了,它會默認在」/usr/local/mysql-proxy」下給你生成4個文件夾,以及須要配置的文件,以下:服務器

[root@localhost mysql-proxy]# ll
total 16
drwxr-xr-x 2 root root 4096 May 10  2017 bin
drwxr-xr-x 2 root root 4096 Mar 11 10:05 conf
drwxr-xr-x 3 root root 4096 May 10  2017 lib
drwxr-xr-x 2 root root 4096 Mar 11 09:10 log

bin目錄下放的都是可執行文件網絡

1. 「encrypt」是用來生成MySQL密碼加密的,在配置的時候會用到架構

2. 「mysql-proxy」是MySQL本身的讀寫分離代理

3. 「mysql-proxyd」是360弄出來的,後面有個「d」,服務的啓動、重啓、中止。都是用他來執行的

conf目錄下放的是配置文件

1.test.cnf

[mysql-proxy]
(必備,根據實際狀況配置)管理接口的用戶名
• admin-username = user
(必備,根據實際狀況配置)管理接口的密碼
• admin-password = pwd
(必備,根據實際狀況配置)主庫的IP和端口
• proxy-backend-addresses = 192.168.0.12:3306
(非必備,根據實際狀況配置)從庫的IP和端口,@後面的數字表明權重,用來做負載均衡,若省略則默認爲1,可設置多項,用逗號分隔。若是想讓主庫也能分擔讀請求的話,只須要將主庫信息加入到下面的配
置項中。
• proxy-read-only-backend-addresses = 192.168.0.13:3306@2,192.168.0.14:3306
(必備,根據實際狀況配置)用戶名與其對應的加密過的MySQL密碼,密碼使用PREFIX/bin目錄下的加密程序encrypt加密,用戶名與密碼之間用冒號分隔。主從數據庫上須要先建立該用戶並設置密碼(用戶名和密
碼在主從數據庫上要一致)。好比用戶名爲myuser,密碼爲mypwd,執行./encrypt mypwd結果爲HJBoxfRsjeI=。若是有多個用戶用逗號分隔便可。則設置以下行所示:
• pwds = myuser: HJBoxfRsjeI=,myuser2:HJBoxfRsjeI=
(必備,默認值便可)Atlas的運行方式,設爲true時爲守護進程方式,設爲false時爲前臺方式,通常開發調試時設爲false,線上運行時設爲true
• daemon = true
(必備,默認值便可)設置Atlas的運行方式,設爲true時Atlas會啓動兩個進程,一個爲monitor,一個爲worker,monitor在worker意外退出後會自動將其重啓,設爲false時只有worker,沒有monitor,通常開發
調試時設爲false,線上運行時設爲true
• keepalive = true
(必備,根據實際狀況配置)工做線程數,推薦設置成系統的CPU核數的2至4倍
• event-threads = 4

 

 

(必備)日誌級別,分爲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 = OFF
(可選項,可不設置)慢日誌輸出設置。當設置了該參數時,則日誌只輸出執行時間超過sql-logslow(單位:ms)的日誌記錄。不設置該參數則輸出所有日誌。
• sql-log-slow = 10
(可選項,可不設置)關閉不活躍的客戶端鏈接設置。當設置了該參數時,Atlas會主動關閉通過'wait-timeout'時間後一直未活躍的鏈接。單位:秒
wait-timeout = 10
(必備,默認值便可)Atlas監聽的工做接口IP和端口
proxy-address = 0.0.0.0:1234
(必備,默認值便可)Atlas監聽的管理接口IP和端口 admin-address = 0.0.0.0:2345

(可選項,可不設置)默認字符集,若不設置該項,則默認字符集爲latin1
charset = utf8
(可選項,可不設置)容許鏈接Atlas的客戶端的IP,能夠是精確IP,也能夠是IP段,以逗號分隔,若不設置該項則容許全部IP鏈接,不然只容許列表中的IP鏈接
client-ips = 127.0.0.1, 192.168.1

 

  

  

lib目錄下放的是一些包,以及Atlas的依賴

log目錄下放的是日誌,如報錯等錯誤信息的記錄

運行Atlas
進入/usr/local/mysql-proxy/bin目錄,執行下面的命令啓動、重啓或中止Atlas。
(1). sudo ./mysql-proxyd test start,啓動Atlas。
(2). sudo ./mysql-proxyd test restart,重啓Atlas。
(3). sudo ./mysql-proxyd test stop,中止Atlas

執行命令:mysql -h127.0.0.1 -P1234 -u用戶名 -p密碼,若是能連上則證實Atlas初步測試正常,能夠再嘗試發幾條SQL語句看看執行結果是否正確

查看主庫和從庫的狀態使用1234端口登陸mysql,

 

 

/home/mysql/mysql_5636/bin/mysql -uuser -ppassword -P1234 -hlocalhost

主庫和從庫的state 均爲 」up」 即爲正常

 

#Atlas後端鏈接的MySQL主庫的IP和端口,可設置多項,用逗號分隔
proxy-backend-addresses = 192.168.237.128:3308
#Atlas後端鏈接的MySQL從庫的IP和端口,@後面的數字表明權重,用來做負載均衡,若省略則默認爲1,可設置多項,用逗號分隔
proxy-read-only-backend-addresses = 192.168.237.130:3308@1

測試主從分離

• 關閉主備庫複製關係,在【主庫】上執行
mysql> select * from temp2;
+----+------+
| id | name |
+----+------+
| 3 | c |
| 1 | a |
• 在【從庫】上查看select * from temp2結果
mysql> select * from temp2;
+----+------+
| id | name |
+----+------+
| 2 | b |

• 在Atlas所在服務器上查詢
Select * from temp2;
+----+------+
| id | name |
+----+------+
| 2 | b |
• 在Atlas所在服務器上執行插入語句
Insert into temp2 values(10,’abc’);
• 在Atlas所在服務器上查詢
Select * from temp2;
+----+------+
| id | name |
+----+------+
| 2 | b |
• 在MySQL主庫上查詢數據:
mysql> select * from temp2;
+----+------+
| id | name |
+----+------+
| 10 | abc |
| 3 | c |
| 1 | a |

• 當MySQL僅有的一個從庫關閉的狀況下,寫操做成功,讀操做也漂移到主庫上執行

有兩個slave時

• 當第一個從庫崩潰時執行查詢語句,語句都在第二個節點查詢

相關文章
相關標籤/搜索