MariaDB數據庫讀寫分離實現(一):mysql-proxy的使用

一.mysql-proxy簡介


MySQL-Proxy是處在你的MySQL數據庫客戶和服務端之間的程序,它還支持嵌入性腳本語言Lua。這個代理可以用來分析、監控和變換(transform)通信數據,它支持非常廣泛的使用場景:

    負載平衡和故障轉移處理

    查詢分析和日誌

    SQL宏(SQL macros)

    查詢重寫(query rewriting)

    執行shell命令

MySQL-Proxy更強大的一項功能是實現“讀寫分離(Read/Write Splitting)”。基本的原理是讓主數據庫處理事務性查詢,而從數據庫處理SELECT查詢。數據庫複製被用來把事務性查詢導致的變更同步到集羣中的從數據庫。


簡單的說,MySQL Proxy就是一個連接池,負責將前臺應用的連接請求轉發給後臺的數據庫,並且通過使用lua腳本,可以實現複雜的連接控制和過濾,從而實現讀寫分離和負載平衡。對於應用來說,MySQL Proxy是完全透明的,應用則只需要連接到MySQL Proxy的監聽端口即可。當然,這樣proxy機器可能成爲單點失效,但完全可以使用多個proxy機器做爲冗餘,在應用服務器的連接池配置中配置到多個proxy的連接參數即可。


其實現如圖所示:

wKiom1TEhEvDLvYFAADHbPVGkAc896.jpg




二.基本環境介紹,

主數據庫服務器:172.16.31.20,MariaDB已經安裝

從數據庫服務器:172.16.31.21,MariaDB已經安裝

主從複製架構配置完畢,實現了主從複製;詳細配置參考博客:

http://sohudrgon.blog.51cto.com/3088108/1608207

Mysql-proxy讀寫分離服務器節點:172.16.31.22,未配置;


規劃架構如圖:

wKioL1TEiNTzWjtyAAHVpLa7Us8443.jpg


三.mysql-proxy讀寫分離實現;

1.安裝mysql-proxy軟件

如果你有epel源,epel源收錄了mysql-proxy的軟件包,我們可以使用yum安裝mysql-proxy,省去了編譯安裝的麻煩;但是EPEL源將讀寫分離的LUN腳本給去掉了,我們還需要從源碼包中就讀寫分離腳本複製出來;

我這裏提供mysql-proxy的下載,還提供一個讀寫分離的lun腳本文件:

http://down.51cto.com/data/1978347


下面就開始進行mysql-proxy的安裝

查看yum源中的mysql-proxy包:

[root@node5 ~]# yum list all mysql-proxy
Loaded plugins: fastestmirror, refresh-packagekit, security
base                                                     | 3.2 kB     00:00     
base/primary_db                                          | 3.3 MB     00:00     
epel                                                     | 3.0 kB     00:00     
epel/primary_db                                          | 7.2 MB     00:00     
extra                                                    | 2.9 kB     00:00     
extra/primary_db                                         | 1.1 MB     00:00     
Available Packages
mysql-proxy.i686                         0.8.5-1.el6                        epel
mysql-proxy.x86_64                       0.8.5-1.el6                        epel


安裝mysql-proxy包:

[root@node5 ~]# yum install -y mysql-proxy


我們查看epel源的mysql-proxy包提供的lun腳本:

[root@node5 ~]# ls /usr/share/doc/mysql-proxy-0.8.5/examples/
tutorial-basic.lua      tutorial-prep-stmts.lua  tutorial-states.lua
tutorial-constants.lua  tutorial-query-time.lua  tutorial-tokenize.lua
tutorial-inject.lua     tutorial-resultset.lua   tutorial-union.lua
tutorial-keepalive.lua  tutorial-rewrite.lua     tutorial-warnings.lua
tutorial-monitor.lua    tutorial-routing.lua
tutorial-packets.lua    tutorial-scramble.lua

可以發現沒有rw-splitting.lua 這個讀寫分離腳本,我們去下載一個同版本的源碼包,將其中的讀寫分離腳本拷貝到指定目錄:

[root@node5 ~]# tar xf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz 
[root@node5 ~]# ls mysql-proxy-0.8.5-linux-el6-x86-64bit/share/doc/mysql-proxy/
active-queries.lua       ro-balance.lua           tutorial-resultset.lua
active-transactions.lua  ro-pooling.lua           tutorial-rewrite.lua
admin-sql.lua            rw-splitting.lua         tutorial-routing.lua
analyze-query.lua        tutorial-basic.lua       tutorial-scramble.lua
auditing.lua             tutorial-constants.lua   tutorial-states.lua
commit-obfuscator.lua    tutorial-inject.lua      tutorial-tokenize.lua
commit-obfuscator.msc    tutorial-keepalive.lua   tutorial-union.lua
COPYING                  tutorial-monitor.lua     tutorial-warnings.lua
histogram.lua            tutorial-packets.lua     xtab.lua
load-multi.lua           tutorial-prep-stmts.lua
README                   tutorial-query-time.lua
[root@node5 ~]# ls /usr/lib64/mysql-proxy/lua/proxy/
auto-config.lua  balance.lua  commands.lua  parser.lua  test.lua  tokenizer.lua
[root@node5 ~]# cp mysql-proxy-0.8.5-linux-el6-x86-64bit/share/doc/mysql-proxy/rw-splitting.lua /usr/lib64/mysql-proxy/lua/
[root@node5 ~]# ls /usr/lib64/mysql-proxy/lua/
admin.lua   glib2.so  lpeg.so   posix.so  rw-splitting.lua
chassis.so  lfs.so    mysql.so  proxy


2.配置mysql-proxy讀寫分離

[root@node5 ~]# vim /etc/mysql-proxy.cnf 
[mysql-proxy]
daemon = true
pid-file = /var/run/mysql-proxy.pid
log-file = /var/log/mysql-proxy.log
log-level = debug
max-open-files = 1024
plugins = admin,proxy
user = mysql-proxy
#
#代理配置
#Proxy Configuration
#代理的地址和端口
proxy-address = 0.0.0.0:3306
#後端的讀寫mysql節點服務器
proxy-backend-addresses = 172.16.31.20:3306
#後端的只讀mysql服務器節點;
proxy-read-only-backend-addresses = 172.16.31.21:3306
#實現讀寫分離的lun腳本配置文件;
proxy-lua-script = /usr/lib64/mysql-proxy/lua/rw-splitting.lua
#proxy-skip-profiling = true
#
#管理配置
# Admin Configuration
#admin-address = 0.0.0.0:4041
admin-lua-script = /usr/lib64/mysql-proxy/lua/admin.lua
admin-username = admin
admin-password = admin



3.配置完成啓動mysql-proxy服務器:

[root@node5 ~]# service mysql-proxy start
Starting mysql-proxy:                                      [  OK  ]

查看監聽端口:

[root@node5 ~]# ss -tunl |grep tcp
tcp    LISTEN     0      128                   :::22                   :::*     
tcp    LISTEN     0      128                    *:22                    *:*     
tcp    LISTEN     0      128            127.0.0.1:631                   *:*     
tcp    LISTEN     0      128                  ::1:631                  :::*     
tcp    LISTEN     0      100                  ::1:25                   :::*     
tcp    LISTEN     0      100            127.0.0.1:25                    *:*     
tcp    LISTEN     0      128            127.0.0.1:6010                  *:*     
tcp    LISTEN     0      128                  ::1:6010                 :::*     
tcp    LISTEN     0      128                    *:54181                 *:*     
tcp    LISTEN     0      128                    *:4041                  *:*     
tcp    LISTEN     0      128                    *:3306                  *:*     
tcp    LISTEN     0      128                   :::111                  :::*     
tcp    LISTEN     0      128                    *:111                   *:*     
tcp    LISTEN     0      128                   :::49776                :::*


3306代理端口和管理端口4041都是啓動的;



5.主從服務器節點需要授權一個遠程連接允許mysql-proxy服務器訪問後端的主從服務器節點:

在master節點node3上授權即可:

MariaDB [hellodb]> grant all on *.* to 'root'@'172.16.%.%' identified by 'oracle';
Query OK, 0 rows affected (0.00 sec)
MariaDB [hellodb]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

我們在node5節點通過這個節點的代理訪問數據庫:

[root@node5 ~]# mysql -uroot -h172.16.31.22 -poracle -e 'show databases';
+--------------------+
| Database           |
+--------------------+
| binlog             |
| hellodb            |
| information_schema |
| mysql              |
| performance_schema |
| relaylog           |
| test               |
+--------------------+


可以發現數據庫是後端節點的數據庫;



6.讀寫分離測試:

讀寫分離測試我們先查看一下管理端口:

[root@node5 ~]# mysql -uadmin -padmin -P4041 -h172.16.31.22  
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.0.99-agent-admin
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
#可以發現主節點172.16.31.20是讀寫數據庫服務器節點,狀態是up,正常;
#而172.16.31.21是隻讀數據庫服務器節點,但是狀態未知,我們需要去讀取一些後端只讀服務器的數據;
mysql> select * from backends;
+-------------+-------------------+---------+------+------+-------------------+
| backend_ndx | address           | state   | type | uuid | connected_clients |
+-------------+-------------------+---------+------+------+-------------------+
|           1 | 172.16.31.20:3306 | up      | rw   | NULL |                 0 |
|           2 | 172.16.31.21:3306 | unknown | ro   | NULL |                 0 |
+-------------+-------------------+---------+------+------+-------------------+
2 rows in set (0.00 sec)

我們退出管理端口去執行一些select語句:

[root@node5 ~]# mysql -uroot -h172.16.31.22 -poracle -e 'select * from hellodb.teachers'; 
+-----+---------------+-----+--------+
| TID | Name          | Age | Gender |
+-----+---------------+-----+--------+
|   1 | Song Jiang    |  45 | M      |
|   2 | Zhang Sanfeng |  94 | M      |
|   3 | Miejue Shitai |  77 | F      |
|   4 | Lin Chaoying  |  93 | F      |
+-----+---------------+-----+--------+

多執行一些select語句,不同的最好;

執行完成後去查看管理端口狀態:

[root@node5 ~]# mysql -uadmin -padmin -P 4041 -h172.16.31.22                    
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.0.99-agent-admin
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> select * from backends;
+-------------+-------------------+-------+------+------+-------------------+
| backend_ndx | address           | state | type | uuid | connected_clients |
+-------------+-------------------+-------+------+------+-------------------+
|           1 | 172.16.31.20:3306 | up    | rw   | NULL |                 0 |
|           2 | 172.16.31.21:3306 | up    | ro   | NULL |                 0 |
+-------------+-------------------+-------+------+------+-------------------+
2 rows in set (0.00 sec)

全部up了,狀態正常;



至此,基於mysql-proxy實現數據庫讀寫分類的實驗就實現了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章