關於數據切分的原理能夠參見博客:http://blog.csdn.net/jhq0113/article/details/44226789
mysql
關於Atlas的介紹能夠參見博客: http://blog.csdn.net/jhq0113/article/details/44239823linux
Atlas源代碼用C語言編寫,它對於Web Server至關因而DB,相對於DB至關因而Client,若是把Atlas的邏輯放到Web Server程序裏去處理,這樣會大大增長Web Server程序的複雜度,同時Web Server和DB之間的耦合度也至關高,由於只要DB增長/減小服務,Web Server就有可能要發生代碼改變,若代碼不改變,就得經過中間關係表與心跳機制來維護Server之間的關係,這樣會帶來性能的損耗,而Atlas是架設在Web Server與DB之間的一箇中間件,Web Server與DB之間的耦合關係放到了Atlas來處理,既作到了靈活也保留了性能,這也是Atlas存在的價值。git
Atlas支持表的水平切分,支持讀寫分離,對數據實時性要求較高的項目能夠在select語句前增長/*master*/強制讀主庫,主從MySQL數據庫之間數據的同步須要本身配置,主從mysql數據庫數據主從複製的配置方法參見博客:github
http://blog.csdn.net/jhq0113/article/details/44263367
sql
1.安裝數據庫
注意:只能安裝在64位的Linux操做系統上,CentOS官方建議rpm安裝方式vim
獲取地址:https://github.com/Qihoo360/Atlas/releases
後端
目前最新的版本爲:併發
Atlas-2.2.1.el5.x86_64.rpm CentOS 5.* 版本
負載均衡
Atlas-2.2.1.el6.x86_64.rpm CentOS 6.* 版本
個人環境是CentOS 6.6 Basic Server x86_64
安裝命令:
[root@jhq0229 src]# rpm -i Atlas-2.2.1.el6.x86_64.rpm
安裝位置:
/usr/local/mysql-proxy
配置文件:
/usr/local/mysql-proxy/conf/test.cnf
重要配置文件詳解:
(1)線程數
event-threads項設置,太小沒法充分發揮多核CPU的性能,過大形成沒必要要的線程切換開銷,推薦設置爲CPU的核數。
(2)最小空閒鏈接數(2.x以上版本不須要該項,1.x版本須要)
min-idle-connections項設置,太小則在高併發下會有報錯,過大雖然不報錯但在測試時不容易看出讀寫分離效果,推薦設置爲比客戶端的併發峯值稍大,詳見《配置參數詳解》。上面的配置範例是針對Atlas 2.X版本,沒有該選項。對於Atlas 1.X版本的配置文件,須要加入該配置選項
(3)Atlas的工做端口
proxy-address項配置,例如proxy-address = 0.0.0.0:1234表明客戶端應該使用1234這個端口鏈接Atlas來發送SQL請求。
(4)Atlas的管理端口
admin-address項配置,例如admin-address = 0.0.0.0:2345表明DBA應該使用2345這個端口鏈接Atlas來執行運維管理操做。
(5)管理接口的用戶名和密碼
admin-username項和admin-password項設置,這兩項是用來進入Atlas的管理界面的,與後端鏈接的MySQL沒有關係,因此能夠任意設置,不須要MySQL在配置上作任何改動。
(6)日誌級別
以log-level項配置,分爲message、warning、critical、error、debug五個級別。
(7)日誌路徑
以log-path項配置,如log-path = /usr/local/mysql-proxy/log。
(8)主庫的IP和端口
proxy-backend-addresses = 192.168.0.12:3306
(9)從庫的IP和端口,@後面的數字表明權重,用來做負載均衡,若省略則默認爲1,可設置多項,用逗號分隔。若是想讓主庫也能分擔讀請求的話,只須要將主庫信息加入到下面的配置項中。
proxy-read-only-backend-addresses = 192.168.0.13:3306,192.168.0.14:3306
(10)用戶名與其對應的加密過的MySQL密碼,密碼使用PREFIX/bin目錄下的加密程序encrypt加密,用戶名與密碼之間用冒號分隔。主從數據庫上須要先建立該用戶並設置密碼(用戶名和密碼在主從數據庫上要一致)。好比用戶名爲myuser,密碼爲mypwd,執行./encrypt mypwd結果爲HJBoxfRsjeI=。若是有多個用戶用逗號分隔便可。則設置以下行所示:
pwds = myuser: HJBoxfRsjeI=,myuser2:HJBoxfRsjeI=
(11)分表設置,此例中person爲庫名,mt爲表名,id爲分表字段,3爲子表數量,可設置多項,以逗號分隔,若不分表則不須要設置該項,子表須要事先建好,子表名稱爲表名_數字,數字範圍爲[0,子表數-1],如本例裏,子表名稱爲mt_0、mt_一、mt_2
tables = person.mt.id.3
個人配置:
從以上配置能夠清楚看到:
主庫:192.168.1.18:3306
從庫:192.168.1.16:3306 權重爲1
注意:主從複製須要自行配置。
Atlas Proxy的ip和端口爲:192.168.1.18:8060
主從複製的用戶和密碼爲:mastt 123456,以上的pwds的密碼是通過加密處理的
若用Navicat登錄,就用Atlas Proxy的ip和端口,用戶名和密碼用主從複製的,主從複製的帳戶須要設置能夠在Navicat上登錄。
分表配置項:
個人主從庫名稱是orders,裏有三張表,分別是my_orders_0,my_orders_1,my_orders_2,按year字段進行分表,雖然分了2015張表,可是你的數據庫裏不必定有這麼多張表,這裏的2015只是取模的一個基數,按照此規律去找到相應的表,例如year=2015,數據請求會發送到my_orders_0表。
編寫簡單Atlas的啓動腳本:
[root@jhq0229 ~]# vim /etc/init.d/atlas
內容以下:
受權並加入開機啓動
[root@jhq0229 ~]# chmod +x /etc/init.d/atlas
[root@jhq0229 ~]# chkconfig atlas on
啓動atlas服務
[root@jhq0229 ~]# service atlas start
2.功能測試:
1).利用mastt用戶123456密碼Navicat登錄到192.168.1.18:8060查看數據庫表,開始數據庫中沒有數據。
表結構以下:
插入數據
此時咱們會看到my_orders_0,1,2表中分別有一條數據,15年的在0表,16年在1表,17年的在2表。
查詢測試,若是不指定表的全名,查詢時須要year字段做爲where條件,不然不會經過,測試結果以下圖:
讀寫分離測試,爲了達到測試效果,咱們在從庫的my_orders_0表手動添加一條數據,語句以下:
此時,主庫的0表只有一條數據,從表裏有兩條數據,若是咱們執行查詢語句
SELECT * FROM my_orders WHERE `year`=2015出現一條結果,則都的是主庫,若出現兩條則爲從庫,結果以下圖:
證實已經讀的是從庫。
測試強制讀主庫,若執行語句/*master*/ SELECT * FROM my_orders WHERE `year`=2015有兩條記錄則讀的是從庫,若是是一條記錄都的是主庫,測試結果只有周潤發一條記錄。