Atlas是由 Qihoo 360公司Web平臺部基礎架構團隊開發維護的一個基於MySQL協議的數據中間層項目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基礎上,修改了大量bug,添加了不少功能特性。目前該項目在360公司內部獲得了普遍應用,不少MySQL業務已經接入了Atlas平臺,天天承載的讀寫請求數達幾十億條。同時,有超過50家公司在生產環境中部署了Atlas,超過800人已加入了咱們的開發者交流羣,而且這些數字還在不斷增長。前端
Atlas是由 Qihoo 360, Web平臺部基礎架構團隊開發維護的一個基於MySQL協議的數據中間層項目。它是在mysql-proxy 0.8.2版本的基礎上,對其進行了優化,增長了一些新的功能特性。360內部使用Atlas運行的mysql業務,天天承載的讀寫請求數達幾十億條。mysql
Atlas是一個位於應用程序與MySQL之間中間件。在後端DB看來,Atlas至關於鏈接它的客戶端,在前端應用看來,Atlas至關於一個DB。Atlas做爲服務端與應用程序通信,它實現了MySQL的客戶端和服務端協議,同時做爲客戶端與MySQL通信。它對應用程序屏蔽了DB的細節,同時爲了下降MySQL負擔,它還維護了鏈接池。Atlas的總體架構,可參考下面這兩幅圖:sql
由於條件限制,使用額都是vm的虛擬機數據庫
主機名 | IP | 系統 | 備註 |
---|---|---|---|
SH-DATA-01 | 192.168.31.11 | CENTOS 6.8 x86-84 | 中間件端 |
SH-DATA-02 | 192.168.31.12 | CENTOS 6.8 x86-84 | 數據庫主庫 |
SH-DATA-03 | 192.168.31.13 | CENTOS 6.8 x86-84 | 數據庫從庫1 |
SH-DATA-04 | 192.168.31.14 | CENTOS 6.8 x86-84 | 數據庫從庫2 |
這裏說明一下,第一臺虛機是手動安裝的的,安裝的時候MySQL也已經部署上了,這樣每臺啓動的MySQL的uuid都是同樣的,同步會出現如下問題vim
Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs;
these UUIDs must be different for replication to work.後端
解決方法是,刪除或者備份data/ 下面的auto.cnf,而後重啓數據庫就能夠了。架構
wget http://olvimidkv.bkt.clouddn.com/Atlas-sharding_1.0.1-el6.x86_64.rpm rpm -ivh Atlas-sharding_1.0.1-el6.x86_64.rpm
Atlas運行須要依賴一個配置文件(test.cnf)。在運行Atlas以前,須要對該文件進行配置。Atlas的安裝目錄是/usr/local/mysql-proxy,進入安裝目錄的conf目錄,能夠看到已經有一個test.cnf默認配置文件,咱們只須要對這個文件進行修改便可。併發
[mysql-proxy] #帶#號的爲非必需的配置項目 #管理接口的用戶名 admin-username = user #管理接口的密碼 admin-password = pwd #Atlas後端鏈接的MySQL主庫的IP和端口,可設置多項,用逗號分隔 proxy-backend-addresses = 127.0.0.1:3306 #Atlas後端鏈接的MySQL從庫的IP和端口,@後面的數字表明權重,用來做負載均衡,若省略則默認爲1,可設置多項,用逗號分隔 #proxy-read-only-backend-addresses = 127.0.0.1:3305@1 #用戶名與其對應的加密過的MySQL密碼,密碼使用PREFIX/bin目錄下的加密程序encrypt加密,下行的user1和user2爲示例,將其替換爲你的MySQL的用戶名和加密密碼! pwds = user1:+jKsgB3YAG8=, user2:GS+tr4TPgqc= #設置Atlas的運行方式,設爲true時爲守護進程方式,設爲false時爲前臺方式,通常開發調試時設爲false,線上運行時設爲true,true後面不能有空格。 daemon = true #設置Atlas的運行方式,設爲true時Atlas會啓動兩個進程,一個爲monitor,一個爲worker,monitor在worker意外退出後會自動將其重啓,設爲false時只有worker,沒有monitor,通常開發調試時設爲false,線上運行時設爲true,true後面不能有空格。 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 = OFF #慢日誌輸出設置。當設置了該參數時,則日誌只輸出執行時間超過sql-log-slow(單位:ms)的日誌記錄。不設置該參數則輸出所有日誌。 #sql-log-slow = 10 #實例名稱,用於同一臺機器上多個Atlas實例間的區分 #instance = test #Atlas監聽的工做接口IP和端口 proxy-address = 0.0.0.0:1234 #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, 192.168.1 #Atlas前面掛接的LVS的物理網卡的IP(注意不是虛IP),如有LVS且設置了client-ips則此項必須設置,不然能夠不設置 #lvs-ips = 192.168.1.1
如下幾項配置參數對性能和正常運行起到重要做用,須要正確設置。負載均衡
(1)線程數 event-threads項設置,太小沒法充分發揮多核CPU的性能,過大形成沒必要要的線程切換開銷,推薦設置爲CPU的核數。 (2)最小空閒鏈接數(2.x以上版本不須要該項,1.x版本須要) min-idle-connections項設置,太小則在高併發下會有報錯,過大雖然不報錯但在測試時不容易看出讀寫分離效果,推薦設置爲比客戶端的併發峯值稍大,詳見《配置參數詳解》。上面的配置範例是針對Atlas 2.X版本,沒有該選項。對於Atlas 1.X版本的配置文件,須要加入該配置選項。
如下幾項能夠設置,也可使用默認值,區別不大。運維
(1)Atlas的工做端口 proxy-address項配置,例如proxy-address = 0.0.0.0:1234表明客戶端應該使用1234這個端口鏈接Atlas來發送SQL請求。 (2)Atlas的管理端口 admin-address項配置,例如admin-address = 0.0.0.0:2345表明DBA應該使用2345這個端口鏈接Atlas來執行運維管理操做。 (3)管理接口的用戶名和密碼 admin-username項和admin-password項設置,這兩項是用來進入Atlas的管理界面的,與後端鏈接的MySQL沒有關係,因此能夠任意設置,不須要MySQL在配置上作任何改動。 (4)日誌級別 以log-level項配置,分爲message、warning、critical、error、debug五個級別。 (5)日誌路徑 以log-path項配置,如log-path = /usr/local/mysql-proxy/log。
如下是咱們的配置
[mysql-proxy] #帶#號的爲非必需的配置項目 #管理接口的用戶名 admin-username = admin #管理接口的密碼 admin-password = admin #Atlas後端鏈接的MySQL主庫的IP和端口,可設置多項,用逗號分隔 proxy-backend-addresses = 192.168.31.12:3306 #Atlas後端鏈接的MySQL從庫的IP和端口,@後面的數字表明權重,用來做負載均衡,若省略則默認爲1,可設置多項,用逗號分隔 #proxy-read-only-backend-addresses = 127.0.0.1:3305@1 proxy-read-only-backend-addresses = 192.168.31.13:3306@1, 192.168.31.14:3306@1 #用戶名與其對應的加密過的MySQL密碼,密碼使用PREFIX/bin目錄下的加密程序encrypt加密,下行的user1和user2爲示例,將其替換爲你的MySQL的用戶名和加密密碼! #pwds = user1:+jKsgB3YAG8=, user2:GS+tr4TPgqc= pwds = center:/iZxz+0GRoA= #設置Atlas的運行方式,設爲true時爲守護進程方式,設爲false時爲前臺方式,通常開發調試時設爲false,線上運行時設爲true,true後面不能有空格。 daemon = true #設置Atlas的運行方式,設爲true時Atlas會啓動兩個進程,一個爲monitor,一個爲worker,monitor在worker意外退出後會自動將其重啓,設爲false時只有worker,沒有monitor,通常開發調試時設爲false,線上運行時設爲true,true後面不能有空格。 keepalive = true #工做線程數,對Atlas的性能有很大影響,可根據狀況適當設置 event-threads = 1 #日誌級別,分爲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 = REALTIME #慢日誌輸出設置。當設置了該參數時,則日誌只輸出執行時間超過sql-log-slow(單位:ms)的日誌記錄。不設置該參數則輸出所有日誌。 #測試環境打開 sql-log-slow = 1 #實例名稱,用於同一臺機器上多個Atlas實例間的區分 #instance = test #Atlas監聽的工做接口IP和端口 proxy-address = 0.0.0.0:1234 #Atlas監聽的管理接口IP和端口 admin-address = 0.0.0.0:2345 #分表設置,此例中person爲庫名,mt爲表名,id爲分表字段,3爲子表數量,可設置多項,以逗號分隔,若不分表則不須要設置該項 #tables = person.mt.id.3 tables=business_center.fc_attendances.id.10 #默認字符集,設置該項後客戶端再也不須要執行SET NAMES語句 charset = utf8 #容許鏈接Atlas的客戶端的IP,能夠是精確IP,也能夠是IP段,以逗號分隔,若不設置該項則容許全部IP鏈接,不然只容許列表中的IP鏈接 client-ips = 192.168.31.12, 192.168.31.13, 192.168.31.14 #Atlas前面掛接的LVS的物理網卡的IP(注意不是虛IP),如有LVS且設置了client-ips則此項必須設置,不然能夠不設置 #lvs-ips = 192.168.1.1
進入/usr/local/mysql-proxy/bin目錄,執行下面的命令啓動、重啓或中止Atlas。
數據庫的受權不要忘了
grant all privileges on *.* to 'center'@'192.168.31.%' identified by '123456';
注意
執行命令:mysql -h127.0.0.1 -P1234 -u用戶名 -p密碼,若是能連上則證實Atlas初步測試正常,能夠再嘗試發幾條SQL語句看看執行結果是否正確
須要把127.0.0.1加到容許IP列表裏面,用戶名密碼使用 加密那個。
進入Atlas的管理界面的命令:mysql -h127.0.0.1 -P2345 -uuser -ppwd,進入後執行:select * from help;查看管理DB的各種命令。
mysql -h127.0.0.1 -P2345 -uadmin -padmin
若是提示密碼錯誤之類的,多是密碼沒有加密,使用/usr/local/mysql-proxy/bin/encrypt 123456 獲取加密值,而後修改配置文件,並建立用戶。
測試
mysql -h127.0.0.1 -P1234 -ucenter -p123456
create database hehe; create table lala ( id int not null, name varchar(20) not null); insert into lala values(1,"sunhong");
其它數據隨便插入,打開日誌
能夠看到,查詢是一比一的,插入就直連主庫了,錯誤的也會顯示出來,可是不顯示錯誤緣由。