MySQL 中介軟體Atlas 實現讀寫分離
〇 Atlas架構介紹
Atlas是Qihoo360開發的一箇中介軟體,位於Client和MySQL Server中間層,可以作為讀寫分離,分庫分表中介軟體。
對於MySQL Server而言,Atlas像是個Client,而對於Client而言,Atlas則是一個DB server。
〇 實驗結構
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
〇 MySQL部分:
(主從建立步驟略)
主/從上建立具有增刪改查賬號:
從庫上可以設定:
如果該從庫永遠不用做master,可以寫到配置檔案中。
〇 Atlas部分:
Atlas開發者給出部分建議:
1、Atlas只能執行在64bit的發行版本上
2、若曾經安裝過,在新安裝時會報錯:如“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,再執行新的安裝。
3、建議使用MySQL 5.6,此外,不宜小於MySQL 5.1
在proxy機上安裝Atlas:
透過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配置檔案內容可以參考這個:
配置好後,直接啟動就好:
其中test為配置檔案中instance的值。
當然可以檢查一下是否已經啟動成功:
比如這樣就可以連線到Atlas後臺介面:
進去之後可以檢視當前配置的DBserver和狀態。
當然更多的選項可以透過SELECT * FROM help;來獲取:
其他引數:
〇 測試:
為了方便看到請求是否讀寫分離,可以先在master & slave兩個例項上開啟general_log,並放入表中:
master上建立一張測試表:
然後再到客戶端(192.168.1.192)嘗試對Atlas(192.168.1.187)發起增刪改查請求:
此處寫了一個php指令碼來模擬請求:
此處可以透過 yum install -y php php-mysql 來安裝一下php相關依賴。
執行這個php指令碼後,可以分別檢查一下master(192.168.1.185)和從庫(192.168.1.186)的general log:
最後再檢查一下跑完這個php指令碼後的test.a表的資料,是否和預期的一致:
當然,顯然是與預期一致。
顯然Atlas作為proxy,已經將寫請求提交給master(192.168.1.185),將讀請求提交給slave(192.168.1.186)。
對於客戶端和開發人員,只需要獲取一個Atlas的伺服器地址、埠、使用者名稱及密碼便可使用讀寫分離。
Atlas也可以實現分表功能,此處可自行翻閱Atlas Home。
〇 參考文件:
作者微信公眾號(持續更新)
Atlas是Qihoo360開發的一箇中介軟體,位於Client和MySQL Server中間層,可以作為讀寫分離,分庫分表中介軟體。
對於MySQL Server而言,Atlas像是個Client,而對於Client而言,Atlas則是一個DB server。
〇 實驗結構
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
〇 MySQL部分:
(主從建立步驟略)
主/從上建立具有增刪改查賬號:
- GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'dev'@'192.168.1.187' IDENTIFIED BY 'dev';
- FLUSH PRIVILEGES;
從庫上可以設定:
- SET GLOBAL read_only=1;
〇 Atlas部分:
Atlas開發者給出部分建議:
1、Atlas只能執行在64bit的發行版本上
2、若曾經安裝過,在新安裝時會報錯:如“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,再執行新的安裝。
3、建議使用MySQL 5.6,此外,不宜小於MySQL 5.1
在proxy機上安裝Atlas:
- wget
- 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;來獲取:
- mysql> SELECT * FROM help;
- +----------------------------+---------------------------------------------------------+
- | command | description |
- +----------------------------+---------------------------------------------------------+
- | SELECT * FROM help | shows this help |
- | SELECT * FROM backends | lists the backends and their state |
- | SET OFFLINE $backend_id | offline backend server, $backend_id is backend_ndx's id |
- | SET ONLINE $backend_id | online backend server, ... |
- | ADD MASTER $backend | example: "add master 127.0.0.1:3306", ... |
- | ADD SLAVE $backend | example: "add slave 127.0.0.1:3306", ... |
- | REMOVE BACKEND $backend_id | example: "remove backend 1", ... |
- | SELECT * FROM clients | lists the clients |
- | ADD CLIENT $client | example: "add client 192.168.1.2", ... |
- | REMOVE CLIENT $client | example: "remove client 192.168.1.2", ... |
- | SELECT * FROM pwds | lists the pwds |
- | ADD PWD $pwd | example: "add pwd user:raw_password", ... |
- | ADD ENPWD $pwd | example: "add enpwd user:encrypted_password", ... |
- | REMOVE PWD $pwd | example: "remove pwd user", ... |
- | SAVE CONFIG | save the backends to config file |
- | SELECT VERSION | display the version of Atlas |
- +----------------------------+---------------------------------------------------------+
其他引數:
-
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。
〇 測試:
為了方便看到請求是否讀寫分離,可以先在master & slave兩個例項上開啟general_log,並放入表中:
-
SET GLOBAL log_output='TABLE';
- SET GLOBAL general_log=on;
master上建立一張測試表:
-
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指令碼來模擬請求:
-
<?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。
〇 參考文件:
作者微信公眾號(持續更新)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29773961/viewspace-2123060/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Mycat中介軟體實現Mysql主從讀寫分離MySql
- docker+atlas+mysql實現讀寫分離DockerMySql
- MySQL cetus 中介軟體 讀寫分離MySql
- MysqL讀寫分離的實現-Mysql proxy中介軟體的使用MySql
- MySQL讀寫分離AtlasMySql
- MySQL + Atlas --- 部署讀寫分離MySql
- Mycat中介軟體實現Percona Cluster讀寫分離
- MYSQL 主從 + ATLAS 讀寫分離 搭建MySql
- Mysql之讀寫分離架構-AtlasMySql架構
- Mysql 高可用(MHA)-讀寫分離(Atlas)MySql
- MySQL中介軟體之ProxySQL(3):初試讀寫分離MySql
- 使用proxysql 1.4.14中介軟體實現mysql 5.7.26主從的讀寫分離MySql
- 採用Atlas+Keepalived實現MySQL讀寫分離、讀負載均衡MySql負載
- 資料庫中介軟體sharding-jdbc實現讀寫分離資料庫JDBC
- ProxySQL實現MySQL讀寫分離MySql
- Amoeba 實現 MySQL 讀寫分離MySql
- Amoeba+Mysql 實現讀寫分離MySql
- mysql-proxy實現讀寫分離MySql
- 資料庫中介軟體 Sharding-JDBC 原始碼分析 —— JDBC實現與讀寫分離資料庫JDBC原始碼
- 搭建MySQL主從實現Django讀寫分離MySqlDjango
- ProxySQL實現Mysql讀寫分離 - 部署手冊MySql
- Amoeba實現讀寫分離
- 使用淘寶中介軟體cobar實現mysql分庫分表MySql
- 高可用Mysql架構_Mysql主從複製、Mysql雙主熱備、Mysql雙主雙從、Mysql讀寫分離(Mycat中介軟體)、Mysql分庫分表架構(Mycat中介軟體)的演變MySql架構
- Mycat實現mysql的負載均衡讀寫分離MySql負載
- Spring配置RoutingDataSource實現mysql讀寫分離SpringMySql
- mysql proxy 安裝及配置實現讀寫分離MySql
- Kubernetes 中實現 MySQL 的讀寫分離MySql
- MySQL Proxy 實現 MySQL 讀寫分離提高併發負載MySql負載
- MySQL怎麼實現主從同步和Django實現MySQL讀寫分離MySql主從同步Django
- CQRS如何實現讀寫分離
- mysql讀寫分離的最佳實踐MySql
- MySQL Amoeba讀寫分離MySql
- Amoeba for mysql讀寫分離MySql
- 博學谷 - mysql資料庫效能優化筆記05 - 讀寫分離中介軟體MaxScaleMySql資料庫優化筆記
- mycat結合MySQL的雙主實現讀寫分離MySql
- 【Mysql】mysql-proxy讀寫分離MySql
- MyCat 讀寫分離 資料庫分庫分表 中介軟體 安裝部署,及簡單使用資料庫