一.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的連接參數即可。
其實現如圖所示:
二.基本環境介紹,
主數據庫服務器:172.16.31.20,MariaDB已經安裝
從數據庫服務器:172.16.31.21,MariaDB已經安裝
主從複製架構配置完畢,實現了主從複製;詳細配置參考博客:
http://sohudrgon.blog.51cto.com/3088108/1608207
Mysql-proxy讀寫分離服務器節點:172.16.31.22,未配置;
規劃架構如圖:
三.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實現數據庫讀寫分類的實驗就實現了。