數據切分——Atlas讀寫分離Mysql集羣的搭建

        關於數據切分的原理能夠參見博客: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


   個人配置:

  1. [mysql-proxy]  
  2.   
  3. #管理接口的用戶名  
  4. admin-username = user  
  5.   
  6. #管理接口的密碼  
  7. admin-password = pwd  
  8.   
  9. #Atlas後端鏈接的MySQL主庫的IP和端口,可設置多項,用逗號分隔  
  10. proxy-backend-addresses = 192.168.1.18:3306  
  11.   
  12. #從庫  
  13. proxy-read-only-backend-addresses = 192.168.1.16:3306@1  
  14. #用戶名和密碼配置項,須要和主從複製配置的用戶名和密碼配置同樣  
  15. #pwds = user1:+jKsgB3YAG8=, user2:GS+tr4TPgqc=  
  16. pwds = mastt:/iZxz+0GRoA=  
  17.   
  18. #後臺運行  
  19. daemon = true  
  20.   
  21. keepalive = true  
  22.   
  23. #工做線程數,對Atlas的性能有很大影響,可根據狀況適當設置  
  24. event-threads = 8  
  25.   
  26. #日誌級別,分爲message、warning、critical、error、debug五個級別  
  27. log-level = message  
  28.   
  29. #日誌存放的路徑  
  30. log-path = /usr/local/mysql-proxy/log  
  31.   
  32. #SQL日誌的開關,可設置爲OFF、ON、REALTIME,OFF表明不記錄SQL日誌,ON表明記錄SQL日誌,REALTIME表明記錄SQL日>志且實時寫入磁盤,默認爲OFF  
  33. #sql-log = OFF  
  34.   
  35. #慢日誌輸出設置。當設置了該參數時,則日誌只輸出執行時間超過sql-log-slow(單位:ms)的日誌記錄。不設置該參數  
  36. 則輸出所有日誌。  
  37. #sql-log-slow = 10  
  38.   
  39. #實例名稱,用於同一臺機器上多個Atlas實例間的區分  
  40. #instance = test  
  41.   
  42. #Atlas監聽的工做接口IP和端口  
  43. proxy-address = 192.168.1.18:8060  
  44.   
  45. #Atlas監聽的管理接口IP和端口  
  46. admin-address = 192.168.1.18:2345  
  47.   
  48. #分表設置,此例中person爲庫名,mt爲表名,id爲分表字段,3爲子表數量,可設置多項,以逗號分隔,若不分表則不需  
  49. 要設置該項  
  50. #tables = person.mt.id.3  
  51. tables=orders.my_orders.year.2015  
  52.   
  53. #默認字符集,設置該項後客戶端再也不須要執行SET NAMES語句  
  54. charset = utf8  
  55.   
  56. #容許鏈接Atlas的客戶端的IP,能夠是精確IP,也能夠是IP段,以逗號分隔,若不設置該項則容許全部IP鏈接,不然只允  
  57. 許列表中的IP鏈接  
  58. #client-ips = 127.0.0.1, 192.168.1  
  59.   
  60. #Atlas前面掛接的LVS的物理網卡的IP(注意不是虛IP),如有LVS且設置了client-ips則此項必須設置,不然能夠不設置  
  61. #lvs-ips = 192.168.1.1  


從以上配置能夠清楚看到:

主庫: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上登錄。


分表配置項:

 

  1. tables=orders.my_orders.year.2015  


個人主從庫名稱是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


內容以下:

 

  1. #!/bin/sh  
  2. #  
  3. #atlas:    Atlas Daemon  
  4. #  
  5. # chkconfig:    - 90 25  
  6. # description:  Atlas Daemon  
  7. #  
  8. # Source function library.  
  9. start()  
  10. {  
  11.         echo -n $"Starting atlas: "  
  12.         /usr/local/mysql-proxy/bin/mysql-proxyd test start  
  13.         echo   
  14. }  
  15. stop()  
  16. {  
  17.         echo -n $"Shutting down atlas: "  
  18.         /usr/local/mysql-proxy/bin/mysql-proxyd test stop  
  19.         echo  
  20. }  
  21. ATLAS="/usr/local/mysql-proxy/bin/mysql-proxyd"  
  22. [ -f $ATLAS ] || exit 1  
  23. # See how we were called.  
  24. case "$1" in  
  25.         start)  
  26.                 start  
  27.                 ;;  
  28.         stop)  
  29.                 stop  
  30.                 ;;  
  31.         restart)  
  32.                 stop  
  33.                 sleep 3  
  34.                 start  
  35.                 ;;  
  36.         *)  
  37.                 echo $"Usage: $0 {start|stop|restart}"  
  38.                 exit 1  
  39. esac  
  40. exit 0  


受權並加入開機啓動

[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查看數據庫表,開始數據庫中沒有數據。

表結構以下:

 

  1. CREATE TABLE `my_orders_0` (  
  2.   `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '表主鍵',  
  3.   `pid` int(10) unsigned NOT NULL COMMENT '產品ID',  
  4.   `price` decimal(15,2) NOT NULL COMMENT '單價',  
  5.   `num` int(11) NOT NULL COMMENT '購買數量',  
  6.   `person` varchar(255) NOT NULL COMMENT '客戶姓名',  
  7.   `atime` int(10) unsigned NOT NULL COMMENT '下單時間',  
  8.   `utime` int(10) unsigned NOT NULL COMMENT '修改時間',  
  9.   `isdel` tinyint(4) NOT NULL DEFAULT '0' COMMENT '軟刪除標識',  
  10.   `year` smallint(5) unsigned NOT NULL COMMENT '年',  
  11.   PRIMARY KEY (`id`)  
  12. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;  


插入數據

 

  1. INSERT INTO `my_orders`(`pid`,`price`,`num`,`person`,`atime`,`utime`,`year`) VALUES ('1', '123.54', '1', '周潤發', '1426335606', '1426335606','2015');  
  2. INSERT INTO `my_orders`(`pid`,`price`,`num`,`person`,`atime`,`utime`,`year`) VALUES ('3', '13.67', '4', '周迅', '1426338765', '1426338765', '2016');  
  3. INSERT INTO `my_orders`(`pid`,`price`,`num`,`person`,`atime`,`utime`,`year`) VALUES ('4', '44.44', '4', '郭敬明', '1426754324', '1426754324','2017');  


此時咱們會看到my_orders_0,1,2表中分別有一條數據,15年的在0表,16年在1表,17年的在2表。


查詢測試,若是不指定表的全名,查詢時須要year字段做爲where條件,不然不會經過,測試結果以下圖:

       


讀寫分離測試,爲了達到測試效果,咱們在從庫的my_orders_0表手動添加一條數據,語句以下:

 

  1. INSERT INTO `my_orders_0`(`pid`,`price`,`num`,`person`,`atime`,`utime`,`year`) VALUES ('2', '212.54', '1', '梁朝偉', '1426335606', '1426335606','2015');  


此時,主庫的0表只有一條數據,從表裏有兩條數據,若是咱們執行查詢語句

SELECT * FROM my_orders WHERE `year`=2015出現一條結果,則都的是主庫,若出現兩條則爲從庫,結果以下圖:

        


證實已經讀的是從庫。


測試強制讀主庫,若執行語句/*master*/ SELECT * FROM my_orders WHERE `year`=2015有兩條記錄則讀的是從庫,若是是一條記錄都的是主庫,測試結果只有周潤發一條記錄。

相關文章
相關標籤/搜索