〇 Atlas架構介紹
<span "="">Atlas是Qihoo360開發的一箇中間件,位於Client和MySQL Server中間層,能夠做爲讀寫分離,分庫分表中間件。
<span "="">對於MySQL Server而言,Atlas像是個Client,而對於Client而言,Atlas則是一個DB server。
![](http://static.javashuo.com/static/loading.gif)
〇 實驗結構
<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 "="">
(主從創建步驟略)
主/從上創建具備增刪改查帳號:
<span "="">Atlas是Qihoo360開發的一箇中間件,位於Client和MySQL Server中間層,能夠做爲讀寫分離,分庫分表中間件。
<span "="">對於MySQL Server而言,Atlas像是個Client,而對於Client而言,Atlas則是一個DB server。
![](http://static.javashuo.com/static/loading.gif)
〇 實驗結構
<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 "="">
(主從創建步驟略)
主/從上創建具備增刪改查帳號:
- <span "="">GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'dev'@'192.168.1.187' IDENTIFIED BY 'dev';
- <span "="">FLUSH PRIVILEGES;
從庫上能夠設置:
- SET GLOBAL read_only=1;
〇 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:
- 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
經過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配置文件內容能夠參考這個:
- [mysql-proxy]
- # 基礎設置
- # 以守護進程方式啓動
- daemon = true
- # 設置atlas的運行方式,若爲true,則表示多一個monitor,該進程會在woker進程掛掉後將其重啓。若爲false,則只有一個工做進程woker。
- keepalive = true
- # atlas實例名,便於區分一臺機子上的不一樣atlas
- instance = test
- # 工做線程數,atlas開發人員推薦將其設置爲CPU個數的2~4倍。
- event-threads = 8
- # SQL日誌的開關,共有三個可選項:OFF、ON、REALTIME,分別爲:不記錄sql日誌、記錄sql日誌,並等待緩衝區填滿後,纔會落地到磁盤、記錄sql日誌並實時寫入磁盤。
- sql-log = OFF
- # 等同於客戶端鏈接到mysql-server後輸入SET names utf8;
- charset = utf8
- # 若是這樣配置,能夠經過mysql -h127.0.0.1 -P2345 -uadmin -padmin能夠鏈接到Atlas管理界面
- admin-username = admin
- admin-password = admin
- # 該參數設置Atlas後臺管理地址和端口
- admin-address = 192.168.1.187:2345
- # 設置主庫和從庫的地址,其中主庫爲寫庫,從庫爲只讀庫
- # 主庫地址
- proxy-backend-addresses = 192.168.1.185:3306
- # 設置讀庫地址和端口
- proxy-read-only-backend-addresses = 192.168.1.186:3306
- # 若配置爲主庫也分擔讀請求,而且設置權重爲 (主:從)=(1:3),則能夠寫做
- #proxy-read-only-backend-addresses = 192.168.1.185:3306@1, 192.168.1.186:3306@3
- # 設置Atlas工做監聽的地址和端口,應用程序將鏈接到這個地址,既然客戶端把Atlas當作一個mysql-server,故此處直接寫成3306端口
- proxy-address = 192.168.1.187:3306
- # 設置用戶的密碼(這個密碼爲MySQL中dev用戶經過Atlas加密程序加密後的密碼),多個能夠用逗號隔開
- pwds = dev:A2OS3vFVUmY=
- # 設置Atlas日誌信息,其中log-level有message、warning、critical、error、debug五個級別
- log-level = message
- # 日誌存放的路徑,日誌名爲$instance_name.log,好比$log-path/test.log
- log-path = /usr/local/mysql-proxy/log
- # 設置容許鏈接Atlas的客戶端ip,非必須,能夠是多個,能夠是精準ip也能夠是ip段,好比:
- #client-ips = 127.0.0.1, 192.168.1
- # 掛接lvs的物理網卡ip,如有lvs結構,且設置了client-ips,則必須設置此項,反之可不設置。
- #lvs-ips = 192.168.1.1
配置好後,直接啓動就好:
- /usr/local/mysql-proxy/bin/mysql-proxyd test start
固然能夠檢查一下是否已經啓動成功:
- /usr/local/mysql-proxy/bin/mysql-proxyd test status
- MySQL-Proxy of test is running (5176)
- MySQL-Proxy of test is running (5177)
好比這樣就能夠鏈接到Atlas後臺界面:
- mysql -h192.168.1.187 -P2345 -uadmin -padmin
進去以後能夠查看當前配置的DBserver和狀態。
- mysql> SELECT * FROM backends;
- +-------------+--------------------+-------+------+
- | backend_ndx | address | state | type |
- +-------------+--------------------+-------+------+
- | 1 | 192.168.1.185:3306 | up | rw |
- | 2 | 192.168.1.186:3306 | up | ro |
- +-------------+--------------------+-------+------+
- 2 rows in set (0.00 sec)
固然更多的選項能夠經過SELECT * FROM help;來獲取:
- <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
- sql-log-slow = 10 # 相似於mysql的long_query_time,若是設置了該選項,則日誌只記錄超過該值的日誌記錄,若沒有添加這個參數選項,則表示所有記錄,單位爲ms
- wait-timeout = 10 # Atlas會關閉超過該時間以後一直未活躍的鏈接,單位s
- 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
- SET GLOBAL log_output='TABLE';
- SET GLOBAL general_log=on;
master上建立一張測試表:
github
- master> CREATE TABLE test.a(id int);
- Query OK, 0 rows affected (0.03 sec)
而後再到客戶端(192.168.1.192)嘗試對Atlas(192.168.1.187)發起增刪改查請求:
此處寫了一個php腳原本模擬請求:
sql
- <?php
- $con = mysql_connect("192.168.1.187","dev","dev");
- if (!$con){
- die('connect error: ' . mysql_error());
- }
- mysql_select_db("my_db", $con);
- mysql_query("INSERT INTO test.a SELECT 1;");
- mysql_query("UPDATE test.a SET id=222 WHERE id=1;");
- mysql_query("DELETE FROM test.a WHERE id=222;");
- mysql_query("INSERT INTO test.a SELECT 123456;");
- mysql_query("SELECT count(1) FROM test.a;");
- mysql_close($con);
- ?>
此處能夠經過 yum install -y php php-mysql 來安裝一下php相關依賴。
執行這個php腳本後,能夠分別檢查一下master(192.168.1.185)和從庫(192.168.1.186)的general log:
服務器
- master> SELECT user_host, argument
- -> FROM mysql.general_log
- -> WHERE user_host='dev[dev] @ [192.168.1.187]' ;
- +-----------------------------+-------------------------------------+
- | user_host | argument |
- +-----------------------------+-------------------------------------+
- | dev[dev] @ [192.168.1.187] | INSERT INTO test.a SELECT 1 |
- | dev[dev] @ [192.168.1.187] | UPDATE test.a SET id=222 WHERE id=1 |
- | dev[dev] @ [192.168.1.187] | DELETE FROM test.a WHERE id=222 |
- | dev[dev] @ [192.168.1.187] | INSERT INTO test.a SELECT 123456 |
- +-----------------------------+-------------------------------------+
- 4 rows in set (0.00 sec)
- slave> SELECT user_host, argument
- -> FROM mysql.general_log
- -> WHERE user_host='dev[dev] @ [192.168.1.187]' ;
- +-----------------------------+-----------------------------+
- | user_host | argument |
- +-----------------------------+-----------------------------+
- | dev[dev] @ [192.168.1.187] | SELECT count(1) FROM test.a |
- +-----------------------------+-----------------------------+
- 1 rows in set (0.00 sec)
最後再檢查一下跑完這個php腳本後的test.a表的數據,是否和預期的一致:
架構
- slave> SELECT * FROM test.a;
- +--------+
- | id |
- +--------+
- | 123456 |
- +--------+
- 1 row in set (0.00 sec)
固然,顯然是與預期一致。
顯然Atlas做爲proxy,已經將寫請求提交給master(192.168.1.185),將讀請求提交給slave(192.168.1.186)。
對於客戶端和開發人員,只須要獲取一個Atlas的服務器地址、端口、用戶名及密碼即可使用讀寫分離。
Atlas也能夠實現分表功能,此處可自行翻閱Atlas Home測試