atlas+mysql主主集羣實現讀寫分離mysql
前言:linux
目前線上系統數據庫採用的是主主架構。其中一臺主僅在故障時切換使用,(僅單臺服務器對外提供服務,當一臺出現問題,切換至另外一臺)。該結構很難支撐較大併發。另外雙主中的另一臺機在非故障時沒獲得有效利用。 結合以上狀況,擬採用數據庫中間件提供讀寫分離功能(一主讀寫,一主讀)。既能夠提升讀併發能力。又能夠充分利用數據庫服務器。後期可繼續增長主主集羣的從服務器擴充讀併發性能。以下爲具體架構圖:git
Atlas官方連接: https://github.com/Qihoo360/Atlas/blob/master/README_ZH.mdgithub
Atlas下載連接: https://github.com/Qihoo360/Atlas/releasessql
Atlas (普通) : Atlas-2.2.1.el6.x86_64.rpm數據庫
Atlas (分表) : Atlas-sharding_1.0.1-el6.x86_64.rpmapache
IP及軟件信息:vim
IP後端 |
系統安全 |
軟件版本 |
安裝路徑 |
備註 |
192.168.9.150 |
CentOS release 6.8 (Final) |
Atlas-2.2.1.el6.x86_64.rpm |
/usr/local/mysql-proxy |
Atlas普通版 |
192.168.9.175 |
CentOS release 6.8 (Final) |
mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz |
/usr/local/mysql |
主主集羣 |
192.168.9.176 |
CentOS release 6.8 (Final) |
mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz |
/usr/local/mysql |
主主集羣 |
MYSQL主主集羣架設:
基本原理:
對於一個mysql服務器, 通常有兩個線程來負責複製和被複制。當開啓複製以後。
1. Slave 上面的IO 線程鏈接上Master,並請求從指定日誌文件的指定位置(或者從最開始的日誌)以後的日誌內容;
如圖:
主主設置,既兩臺服務器互爲主從的配置。
略(網上不少相關配置)
ATLAS數據庫中間件安裝:
下載並安裝ATLAS數據庫中間件
cd /usr/local/src 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
安裝好了,它會默認在」/usr/local/mysql-proxy」下給你生成4個文件夾,以及須要配置的文件,以下:
[root@localhost mysql-proxy]# ls
bin conf lib log
1.bin目錄下放的都是可執行文件
2.「encrypt」是用來生成MySQL密碼加密的,在配置的時候會用到
3.「mysql-proxy」是MySQL本身的讀寫分離代理
4.「mysql-proxyd」是360弄出來的,後面有個「d」,服務的啓動、重啓、中止。都是用他來執行的
編輯配置文件
cd /usr/local/mysql-proxy/conf/ vim test.cnf [mysql-proxy] #帶#號的爲非必需的配置項目 #管理接口的用戶名 admin-username = user #管理接口的密碼 admin-password = pwd #Atlas後端鏈接的MySQL主庫的IP和端口,可設置多項,用逗號分隔。注意設置爲主庫僅支持寫功能。若要讀寫要同時將該庫在從庫中進行設置。支持讀功能。 proxy-backend-addresses = 192.168.9.175:3306 #Atlas後端鏈接的MySQL從庫的IP和端口,@後面的數字表明權重,用來做負載均衡,若省略則默認爲1,可設置多項,用逗號分隔 。這裏將主庫的數據庫再次配置到這裏用以支持讀。達到讀負載均衡的目的。 proxy-read-only-backend-addresses = 192.168.9.176:3306@1,192.168.9.175:3306@1 #用戶名與其對應的加密過的MySQL密碼,密碼使用PREFIX/bin目錄下的加密程序encrypt加密,下行的user1和user2爲示例,將其替換爲你的MySQL的用戶名和加密密碼! pwds = root:/iZxz+0GRoA= #設置Atlas的運行方式,設爲true時爲守護進程方式,設爲false時爲前臺方式,通常開發調試時設爲false,線上運行時設爲true,true後面不能有空格。 daemon = true #設置Atlas的運行方式,設爲true時Atlas會啓動兩個進程,一個爲monitor,一個爲worker,monitor在worker意外退出後會自動將其重啓,設爲false時只有worker,沒有monitor,通常開發調試時設爲false,線上運行時設爲true,true後面不能有空格。 keepalive = true #工做線程數,對Atlas的性能有很大影響,可根據狀況適當設置 event-threads = 8 #日誌級別,分爲message、warning、critical、error、debug五個級別 log-level = message #日誌存放的路徑 log-path = /usr/local/mysql-proxy/log #SQL日誌的開關,可設置爲OFF、ON、REALTIME,OFF表明不記錄SQL日誌,ON表明記錄SQL日誌,REALTIME表明記錄SQL日誌且實時寫入磁盤,默認爲OFF #sql-log = OFF #慢日誌輸出設置。當設置了該參數時,則日誌只輸出執行時間超過sql-log-slow(單位:ms)的日誌記錄。不設置該參數則輸出所有日誌。 #sql-log-slow = 10 #實例名稱,用於同一臺機器上多個Atlas實例間的區分 #instance = test #Atlas監聽的工做接口IP和端口 proxy-address = 0.0.0.0:1234 #Atlas監聽的管理接口IP和端口 admin-address = 0.0.0.0:2345 #分表設置,此例中person爲庫名,mt爲表名,id爲分表字段,3爲子表數量,可設置多項,以逗號分隔,若不分表則不須要設置該項 #tables = person.mt.id.3 #默認字符集,設置該項後客戶端再也不須要執行SET NAMES語句 #charset = utf8 #容許鏈接Atlas的客戶端的IP,能夠是精確IP,也能夠是IP段,以逗號分隔,若不設置該項則容許全部IP鏈接,不然只容許列表中的IP鏈接 #client-ips = 127.0.0.1, 192.168.1 #Atlas前面掛接的LVS的物理網卡的IP(注意不是虛IP),如有LVS且設置了client-ips則此項必須設置,不然能夠不設置 #lvs-ips = 192.168.1.1
編輯添加啓動腳本
vim /etc/init.d/atlas #!/bin/sh # #atlas: Atlas Daemon # # chkconfig: - 90 25 # description: Atlas Daemon # # Source function library. start() { echo -n $"Starting atlas: " /usr/local/mysql-proxy/bin/mysql-proxyd test start echo } stop() { echo -n $"Shutting down atlas: " /usr/local/mysql-proxy/bin/mysql-proxyd test stop echo } ATLAS="/usr/local/mysql-proxy/bin/mysql-proxyd" [ -f $ATLAS ] || exit 1 # See how we were called. case "$1" in start) start ;; stop) stop ;; restart) stop sleep 3 start ;; *) echo $"Usage: $0 {start|stop|restart}" exit 1 esac exit 0
賦予啓動腳本權限並添加開機啓動
Chmod –R 755 /etc/init.d/atlas chkconfig atlas on
啓動atlas
service atlas start
端口介紹
默認會開啓兩個端口1234和2345端口。(以上端口能夠在配置文件中修改)
Atlas監聽的工做接口IP和端口 proxy-address = 0.0.0.0:1234 Atlas監聽的管理接口IP和端口 admin-address = 0.0.0.0:2345
訪問管理後臺並查看管理命令(注意用戶名密碼爲缺省的,爲了安全最好修改掉):
mysql -uuser -ppwd -P2345 -h 127.0.0.1 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 | +----------------------------+---------------------------------------------------------+ 16 rows in set (0.00 sec)
訪問工做端口
可以使用NAVICAT客戶端進行鏈接配置
讀負載均衡驗證:(經驗證會交替採用後端兩臺數據庫服務器響應請求)
select @@hostname; mysql> select @@hostname; +------------+ | @@hostname | +------------+ | db1 | +------------+ 1 row in set mysql> select @@hostname; +------------+ | @@hostname | +------------+ | db2 | +------------+ 1 row in set
讀寫分離驗證
mysql> begin;select @@hostname;commit; Query OK, 0 rows affected +------------+ | @@hostname | +------------+ | db1 | +------------+ 1 row in set Query OK, 0 rows affected mysql> begin;select @@hostname;commit; Query OK, 0 rows affected +------------+ | @@hostname | +------------+ | db1 | +------------+ 1 row in set Query OK, 0 rows affected
壓力測試:
讀寫分離壓力測試須要使用到Jmeter了,它是Java寫第一套開源的壓力測試工具,由於這個比較方便。他有專門測試MySQL的模塊,須要使用MySQL的JDBC驅動jar包,配置很簡單,東西很好很強大很好用。
Jmeter下載地址:http://jmeter.apache.org/download_jmeter.cgi
MySQL的JDBC :http://dev.mysql.com/downloads/connector/j/
下載下來後,分別都解壓開來,打開Jmeter ( 在bin路面下的jmeter.bat ) ,在測試計劃中,導入JDBC的jar包。具體步驟略