mySql 數據庫中間件 atlas的使用

MySQL 中間件Atlas 實現讀寫分離

原創 MySQL 做者:神諭丶 時間:2016-08-05 17:07:51  2410  0
〇 Atlas架構介紹

<span "="">Atlas是Qihoo360開發的一箇中間件,位於Client和MySQL Server中間層,能夠做爲讀寫分離,分庫分表中間件。
<span "="">對於MySQL Server而言,Atlas像是個Client,而對於Client而言,Atlas則是一個DB server。







〇 實驗結構
<span "="">
OS: CentOS 6.5 64bit
MySQL version: 5.6.30

Master:192.168.1.185
Slave:192.168.1.186
proxy(Atlas):192.168.1.187
客戶端:192.168.1.192
<span "="">




〇 MySQL部分: <span "="">
(主從創建步驟略)
主/從上創建具備增刪改查帳號:
  1. <span "="">GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'dev'@'192.168.1.187' IDENTIFIED BY 'dev';
  • <span "="">FLUSH PRIVILEGES;

從庫上能夠設置:
  1. SET GLOBAL read_only=1;
<span "="">若是該從庫永遠不用作master,能夠寫到配置文件中。



〇 Atlas部分:
Atlas開發者給出部分建議:
<span "="">一、Atlas只能運行在64bit的發行版本上
<span "="">二、若曾經安裝過,在新安裝時會報錯:如「file /usr/local/mysql-proxy/bin/encrypt from install of Atlas-2.0.1-1.x86_64 conflicts with file from package Atlas-1.0.3-1.x86_64」,此時須要sudo rpm –e Atlas-1.0.3-1.x86_64,再執行新的安裝。
<span "="">三、建議使用MySQL 5.6,此外,不宜小於MySQL 5.1

在proxy機上安裝Atlas:
  1. wget https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm
  2. rpm -ivh Atlas-2.2.1.el6.x86_64.rpm

經過rpm包安裝方式,默認的配置文件在
/usr/local/mysql-proxy/conf/test.cnf


首先能夠先獲取一下以前步驟中,dev@'192.168.1.187'這個用戶加密後的密碼:
# /usr/local/mysql-proxy/bin/encrypt dev
A2OS3vFVUmY=
由於以前給dev用戶的密碼的明文是dev,因此此處也對dev加密,加密後的密碼輸出在其後,也就是A2OS3vFVUmY=這個密碼稍後要添加到Atlas配置文件中。


test.cnf配置文件內容能夠參考這個:
  1. [mysql-proxy]
  2. # 基礎設置
  3. # 以守護進程方式啓動 
  4. daemon = true
  5. # 設置atlas的運行方式,若爲true,則表示多一個monitor,該進程會在woker進程掛掉後將其重啓。若爲false,則只有一個工做進程woker。
  6. keepalive = true
  7. # atlas實例名,便於區分一臺機子上的不一樣atlas
  8. instance = test
  9. # 工做線程數,atlas開發人員推薦將其設置爲CPU個數的2~4倍。
  10. event-threads = 8
  11. # SQL日誌的開關,共有三個可選項:OFF、ON、REALTIME,分別爲:不記錄sql日誌、記錄sql日誌,並等待緩衝區填滿後,纔會落地到磁盤、記錄sql日誌並實時寫入磁盤。
  12. sql-log = OFF
  13. # 等同於客戶端鏈接到mysql-server後輸入SET names utf8;
  14. charset = utf8
  15. # 若是這樣配置,能夠經過mysql -h127.0.0.1 -P2345 -uadmin -padmin能夠鏈接到Atlas管理界面
  16. admin-username = admin
  17. admin-password = admin
  18. # 該參數設置Atlas後臺管理地址和端口
  19. admin-address = 192.168.1.187:2345
  20. # 設置主庫和從庫的地址,其中主庫爲寫庫,從庫爲只讀庫
  21. # 主庫地址
  22. proxy-backend-addresses = 192.168.1.185:3306
  23. # 設置讀庫地址和端口
  24. proxy-read-only-backend-addresses = 192.168.1.186:3306
  25. # 若配置爲主庫也分擔讀請求,而且設置權重爲 (主:從)=(1:3),則能夠寫做
  26. #proxy-read-only-backend-addresses = 192.168.1.185:3306@1, 192.168.1.186:3306@3
  27. # 設置Atlas工做監聽的地址和端口,應用程序將鏈接到這個地址,既然客戶端把Atlas當作一個mysql-server,故此處直接寫成3306端口
  28. proxy-address = 192.168.1.187:3306
  29. # 設置用戶的密碼(這個密碼爲MySQL中dev用戶經過Atlas加密程序加密後的密碼),多個能夠用逗號隔開
  30. pwds = dev:A2OS3vFVUmY=
  31. # 設置Atlas日誌信息,其中log-level有message、warning、critical、error、debug五個級別
  32. log-level = message
  33. # 日誌存放的路徑,日誌名爲$instance_name.log,好比$log-path/test.log
  34. log-path = /usr/local/mysql-proxy/log
  35. # 設置容許鏈接Atlas的客戶端ip,非必須,能夠是多個,能夠是精準ip也能夠是ip段,好比:
  36. #client-ips = 127.0.0.1, 192.168.1
  37. # 掛接lvs的物理網卡ip,如有lvs結構,且設置了client-ips,則必須設置此項,反之可不設置。
  38. #lvs-ips = 192.168.1.1 

配置好後,直接啓動就好:
  1. /usr/local/mysql-proxy/bin/mysql-proxyd test start
其中test爲配置文件中instance的值。
固然能夠檢查一下是否已經啓動成功:
  1. /usr/local/mysql-proxy/bin/mysql-proxyd test status
  2. MySQL-Proxy of test is running (5176)
  3. MySQL-Proxy of test is running (5177)


好比這樣就能夠鏈接到Atlas後臺界面:
  1. mysql -h192.168.1.187 -P2345 -uadmin -padmin

進去以後能夠查看當前配置的DBserver和狀態。
  1. mysql> SELECT * FROM backends;
  2. +-------------+--------------------+-------+------+
  3. | backend_ndx | address            | state | type |
  4. +-------------+--------------------+-------+------+
  5. | 1           | 192.168.1.185:3306 | up    | rw   |
  6. | 2           | 192.168.1.186:3306 | up    | ro   |
  7. +-------------+--------------------+-------+------+
  8. 2 rows in set (0.00 sec)

固然更多的選項能夠經過SELECT * FROM help;來獲取:
  1. <span "="">mysql> SELECT * FROM help;
  • <span "="">+----------------------------+---------------------------------------------------------+
  • <span "=""><span "="">| command <span "="">    <span "="">    <span "="">    <span "="">    <span "="">  <span "=""> | description<span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "=""> |<span "="">    
  • <span "="">+----------------------------+---------------------------------------------------------+
  • <span "=""><span "="">| SELECT * FROM help <span "="">    <span "="">   <span "=""> | shows this help<span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "=""> |
  • <span "=""><span "="">| SELECT * FROM backends <span "="">   <span "=""> | lists the backends and their state <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "=""> |
  • <span "=""><span "="">| SET OFFLINE $backend_id <span "="">  <span "=""> | offline backend server, $backend_id is backend_ndx's id |
  • <span "=""><span "="">| SET ONLINE $backend_id <span "="">   <span "=""> | online backend server, ... <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "=""> |
  • <span "=""><span "="">| ADD MASTER $backend <span "="">    <span "="">  <span "=""> | example: "add master 127.0.0.1:3306", ... <span "="">    <span "="">    <span "="">    <span "=""> <span "=""> |
  • <span "=""><span "="">| ADD SLAVE $backend <span "="">    <span "="">   <span "=""> | example: "add slave 127.0.0.1:3306", ... <span "="">    <span "="">    <span "="">    <span "="">  <span "=""> |
  • <span "=""><span "="">| REMOVE BACKEND $backend_id | example: "remove backend 1", ... <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">  <span "=""> |
  • <span "=""><span "="">| SELECT * FROM clients <span "="">    <span "=""> | lists the clients<span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">   <span "="">|
  • <span "=""><span "="">| ADD CLIENT $client <span "="">    <span "="">   <span "=""> | example: "add client 192.168.1.2", ... <span "="">    <span "="">    <span "="">    <span "="">    <span "=""> |
  • <span "=""><span "="">| REMOVE CLIENT $client <span "="">    <span "=""> | example: "remove client 192.168.1.2", ... <span "="">    <span "="">    <span "="">    <span "=""> <span "=""> |
  • <span "=""><span "="">| SELECT * FROM pwds <span "="">    <span "="">   <span "=""> | lists the pwds <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "=""> |
  • <span "=""><span "="">| ADD PWD $pwd <span "="">    <span "="">    <span "="">     <span "=""> | example: "add pwd user:raw_password", ... <span "="">    <span "="">    <span "="">    <span "=""> <span "=""> |
  • <span "=""><span "="">| ADD ENPWD $pwd <span "="">    <span "="">    <span "="">   <span "=""> | example: "add enpwd user:encrypted_password", ... <span "="">    <span "=""> <span "=""> |
  • <span "=""><span "="">| REMOVE PWD $pwd <span "="">    <span "="">    <span "="">  <span "=""> | example: "remove pwd user", ... <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">   <span "=""> |
  • <span "=""><span "="">| SAVE CONFIG <span "="">    <span "="">    <span "="">    <span "="">  <span "=""> | save the backends to config file <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">  <span "=""> |
  • <span "=""><span "="">| SELECT VERSION <span "="">    <span "="">    <span "="">   <span "=""> | display the version of Atlas<span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">   <span "=""> |
  • <span "="">+----------------------------+---------------------------------------------------------+

<span "="">php

 


其餘參數:<span "="">
mysql

  1. sql-log-slow = 10 # 相似於mysql的long_query_time,若是設置了該選項,則日誌只記錄超過該值的日誌記錄,若沒有添加這個參數選項,則表示所有記錄,單位爲ms 
  2. wait-timeout = 10 # Atlas會關閉超過該時間以後一直未活躍的鏈接,單位s
  3. tables = db_name.table_name.user_id.100 # 分表設置,其中格式爲:【庫名.表名.分表字段.子表數量】,若設置多項則用逗號分隔。注,子表必須已經存在,其中子表命名規則爲:【表名_數字】,範圍爲【0,子表數量-1】,即百表爲table_name_0 table_name_1 ... table_name_99。





<span "="">〇 測試:
<span "="">
爲了方便看到請求是否讀寫分離,能夠先在master & slave兩個實例上打開general_log,並放入表中:
git

  1. SET GLOBAL log_output='TABLE';
  2. SET GLOBAL general_log=on;


master上建立一張測試表:
github

  1. master> CREATE TABLE test.a(id int);
  2. Query OK, 0 rows affected (0.03 sec)


而後再到客戶端(192.168.1.192)嘗試對Atlas(192.168.1.187)發起增刪改查請求:

此處寫了一個php腳原本模擬請求:
sql

  1. <?php
  2. $con = mysql_connect("192.168.1.187","dev","dev");
  3. if (!$con){
  4.   die('connect error: ' . mysql_error());
  5.   }
  6. mysql_select_db("my_db", $con);
  7. mysql_query("INSERT INTO test.a SELECT 1;");
  8. mysql_query("UPDATE test.a SET id=222 WHERE id=1;");
  9. mysql_query("DELETE FROM test.a WHERE id=222;");
  10. mysql_query("INSERT INTO test.a SELECT 123456;");
  11. mysql_query("SELECT count(1) FROM test.a;");
  12. mysql_close($con);
  13. ?>


此處能夠經過 yum install -y php php-mysql 來安裝一下php相關依賴。

執行這個php腳本後,能夠分別檢查一下master(192.168.1.185)和從庫(192.168.1.186)的general log:
服務器

  1. master> SELECT user_host, argument
  2.     -> FROM mysql.general_log 
  3.     -> WHERE user_host='dev[dev] @ [192.168.1.187]' ;
  4. +-----------------------------+-------------------------------------+
  5. | user_host                   | argument                            |
  6. +-----------------------------+-------------------------------------+
  7. | dev[dev] @ [192.168.1.187]  | INSERT INTO test.a SELECT 1         |
  8. | dev[dev] @ [192.168.1.187]   | UPDATE test.a SET id=222 WHERE id=|
  9. | dev[dev] @ [192.168.1.187]  | DELETE FROM test.a WHERE id=222     |
  10. | dev[dev] @ [192.168.1.187]  | INSERT INTO test.a SELECT 123456    |
  11. +-----------------------------+-------------------------------------+
  12. 4 rows in set (0.00 sec)
  13. slave> SELECT user_host, argument
  14.    -> FROM mysql.general_log 
  15.    -> WHERE user_host='dev[dev] @ [192.168.1.187]' ;
  16. +-----------------------------+-----------------------------+
  17. | user_host                   | argument                    |
  18. +-----------------------------+-----------------------------+
  19. | dev[dev] @ [192.168.1.187 | SELECT count(1) FROM test.|
  20. +-----------------------------+-----------------------------+
  21. 1 rows in set (0.00 sec)


最後再檢查一下跑完這個php腳本後的test.a表的數據,是否和預期的一致:
架構

  1. slave> SELECT * FROM test.a;
  2. +--------+
  3. | id     |
  4. +--------+
  5. | 123456 |
  6. +--------+
  7. 1 row in set (0.00 sec)



固然,顯然是與預期一致。
顯然Atlas做爲proxy,已經將寫請求提交給master(192.168.1.185),將讀請求提交給slave(192.168.1.186)。
對於客戶端和開發人員,只須要獲取一個Atlas的服務器地址、端口、用戶名及密碼即可使用讀寫分離。

Atlas也能夠實現分表功能,此處可自行翻閱Atlas Home
測試

相關文章
相關標籤/搜索