溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Atlas+mysql主主集群實現(xiàn)讀寫分離

發(fā)布時間:2020-06-07 16:04:01 來源:網(wǎng)絡(luò) 閱讀:6916 作者:gnixgnix 欄目:MySQL數(shù)據(jù)庫

前言

    目前線上系統(tǒng)數(shù)據(jù)庫采用的是主主架構(gòu)。其中一臺主僅在故障時切換使用,(僅單臺服務(wù)器對外提供服務(wù),當一臺出現(xiàn)問題,切換至另一臺),該結(jié)構(gòu)很難支撐較大并發(fā),另外雙主中的另外一臺機在非故障時沒得到有效利用。 結(jié)合以上情況,擬采用數(shù)據(jù)庫中間件提供讀寫分離功能(一主讀寫,一主讀)。既可以提高讀并發(fā)能力,又可以充分利用數(shù)據(jù)庫服務(wù)器,后期可繼續(xù)增加主主集群的從服務(wù)器擴充讀并發(fā)性能。如下為具體架構(gòu)圖:

Atlas+mysql主主集群實現(xiàn)讀寫分離

Atlas官方鏈接: https://github.com/Qihoo360/Atlas/blob/master/README_ZH.md

Atlas下載鏈接: https://github.com/Qihoo360/Atlas/releases

Atlas (普通) : Atlas-2.2.1.el6.x86_64.rpm

Atlas (分表) : Atlas-sharding_1.0.1-el6.x86_64.rpm


Ip及軟件信息

IP

系統(tǒng)

軟件版本

安裝路徑

備注

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主主集群架設(shè)

基本原理:

    對于一個mysql服務(wù)器, 一般有兩個線程來負責復制和被復制。當開啟復制之后。

1. Slave 上面的IO 線程連接上Master,并請求從指定日志文件的指定位置(或者從最開始的日志)之后的日志內(nèi)容;

2. Master 接收到來自Slave 的IO 線程的請求后,通過負責復制的IO 線程根據(jù)請求信息讀取指定日志指定位置之后的日志信息,返回給Slave 端的IO 線程。返回信息中除了日志所包含的信息之外,還包括本次返回的信息在Master 端的Binary Log文件的名稱以及在Binary Log 中的位置;

3. Slave 的IO 線程接收到信息后,將接收到的日志內(nèi)容依次寫入到Slave 端的Relay Log 文件(mysql-relay-bin.xxxxxx)的最末端,并將讀取到的Master 端的binlog的文件名和位置記錄到master-info 文件中,以便在下一次讀取的時候能夠清楚的高速Master“我需要從某個bin-log 的哪個位置開始往后的日志內(nèi)容,請發(fā)給我”。

4. Slave 的SQL 線程檢測到Relay Log 中新增加了內(nèi)容后,會馬上解析該Log 文件中的內(nèi)容成為在Master 端真實執(zhí)行時候的那些可執(zhí)行的Query 語句,并在自身執(zhí)行這些Query。這樣,實際上就是在Master 端和Slave 端執(zhí)行了同樣的Query,所以兩端的數(shù)據(jù)是完全一樣的。

 如圖:

Atlas+mysql主主集群實現(xiàn)讀寫分離

主主設(shè)置,既兩臺服務(wù)器互為主從的配置。

略(網(wǎng)上很多相關(guān)配置)

 

 ATLAS數(shù)據(jù)庫中間件安裝

下載并安裝ATLAS數(shù)據(jù)庫中間件

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目錄下放的都是可執(zhí)行文件

2.“encrypt”是用來生成MySQL密碼加密的,在配置的時候會用到

3.“mysql-proxy”是MySQL自己的讀寫分離代理

4.“mysql-proxyd”是360弄出來的,后面有個“d”,服務(wù)的啟動、重啟、停止。都是用他來執(zhí)行的

 

編輯配置文件

cd /usr/local/mysql-proxy/conf/
vim test.cnf
[mysql-proxy]
 
#帶#號的為非必需的配置項目
 
#管理接口的用戶名
admin-username = user
 
#管理接口的密碼
admin-password = pwd
 
#Atlas后端連接的MySQL主庫的IP和端口,可設(shè)置多項,用逗號分隔。注意設(shè)置為主庫僅支持寫功能。若要讀寫要同時將該庫在從庫中進行設(shè)置。支持讀功能。
proxy-backend-addresses = 192.168.9.175:3306
 
#Atlas后端連接的MySQL從庫的IP和端口,@后面的數(shù)字代表權(quán)重,用來作負載均衡,若省略則默認為1,可設(shè)置多項,用逗號分隔 。這里將主庫的數(shù)據(jù)庫再次配置到這里用以支持讀。達到讀負載均衡的目的。
proxy-read-only-backend-addresses = 192.168.9.176:3306@1,192.168.9.175:3306@1
 
#用戶名與其對應(yīng)的加密過的MySQL密碼,密碼使用PREFIX/bin目錄下的加密程序encrypt加密,下行的user1和user2為示例,將其替換為你的MySQL的用戶名和加密密碼!
pwds = root:/iZxz+0GRoA=
 
#設(shè)置Atlas的運行方式,設(shè)為true時為守護進程方式,設(shè)為false時為前臺方式,一般開發(fā)調(diào)試時設(shè)為false,線上運行時設(shè)為true,true后面不能有空格。
daemon = true
 
#設(shè)置Atlas的運行方式,設(shè)為true時Atlas會啟動兩個進程,一個為monitor,一個為worker,monitor在worker意外退出后會自動將其重啟,設(shè)為false時只有worker,沒有monitor,一般開發(fā)調(diào)試時設(shè)為false,線上運行時設(shè)為true,true后面不能有空格。
keepalive = true
 
#工作線程數(shù),對Atlas的性能有很大影響,可根據(jù)情況適當設(shè)置
event-threads = 8
 
#日志級別,分為message、warning、critical、error、debug五個級別
log-level = message
 
#日志存放的路徑
log-path = /usr/local/mysql-proxy/log
 
#SQL日志的開關(guān),可設(shè)置為OFF、ON、REALTIME,OFF代表不記錄SQL日志,ON代表記錄SQL日志,REALTIME代表記錄SQL日志且實時寫入磁盤,默認為OFF
#sql-log = OFF
 
#慢日志輸出設(shè)置。當設(shè)置了該參數(shù)時,則日志只輸出執(zhí)行時間超過sql-log-slow(單位:ms)的日志記錄。不設(shè)置該參數(shù)則輸出全部日志。
#sql-log-slow = 10
 
#實例名稱,用于同一臺機器上多個Atlas實例間的區(qū)分
#instance = test
 
#Atlas監(jiān)聽的工作接口IP和端口
proxy-address = 0.0.0.0:1234
 
#Atlas監(jiān)聽的管理接口IP和端口
admin-address = 0.0.0.0:2345
 
#分表設(shè)置,此例中person為庫名,mt為表名,id為分表字段,3為子表數(shù)量,可設(shè)置多項,以逗號分隔,若不分表則不需要設(shè)置該項
#tables = person.mt.id.3
 
#默認字符集,設(shè)置該項后客戶端不再需要執(zhí)行SET NAMES語句
#charset = utf8
 
#允許連接Atlas的客戶端的IP,可以是精確IP,也可以是IP段,以逗號分隔,若不設(shè)置該項則允許所有IP連接,否則只允許列表中的IP連接
#client-ips = 127.0.0.1, 192.168.1
 
#Atlas前面掛接的LVS的物理網(wǎng)卡的IP(注意不是虛IP),若有LVS且設(shè)置了client-ips則此項必須設(shè)置,否則可以不設(shè)置
#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

賦予啟動腳本權(quán)限并添加開機啟動

chmod –R 755 /etc/init.d/atlas
chkconfig atlas on                               
 
啟動atlas
service atlas start

端口介紹

默認會開啟兩個端口1234和2345端口。(以上端口可以在配置文件中修改)

Atlas監(jiān)聽的工作接口IP和端口

proxy-address = 0.0.0.0:1234

 

Atlas監(jiān)聽的管理接口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客戶端進行連接配置

Atlas+mysql主主集群實現(xiàn)讀寫分離

讀負載均衡驗證(經(jīng)驗證會交替采用后端兩臺數(shù)據(jù)庫服務(wù)器響應(yīng)請求)

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驅(qū)動jar包,配置很簡單,東西很好很強大很好用。

Jmeter下載地址:http://jmeter.apache.org/download_jmeter.cgi

MySQL的JDBC  :http://dev.mysql.com/downloads/connector/j/

下載下來后,分別都解壓開來,打開Jmeter ( 在bin路面下的jmeter.bat ) ,在測試計劃中,導入JDBC的jar包。具體步驟略



向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI