Mysql讀寫分離--mysql-proxy
準備前提:
1、MySQL的安裝與配置 --省略
版本:Server version: 5.6.35
1.1 系統版本:
[root@centos7-67 package]# lsb_release -a
LSB Version: :core-4.1-amd64:core-4.1-noarch
Distributor ID: CentOS
Description: CentOS Linux release 7.2.1511 (Core)
Release: 7.2.1511
Codename: Core
2、場景描述
數據庫Master主服務器:192.168.1.83
數據庫Slave從服務器:192.168.1.66
MySQL-Proxy調度服務器:192.168.1.67
以下操作,均是在192.168.1.67即MySQL-Proxy調度服務器 上進行的。
配置主從復制,並在192.168.1.66上開啟 start slave;
MySQL-Proxy上安裝所需軟件包
yum install -y gcc* gcc-c++* autoconf* automake* zlib* libxml* ncurses-devel* libmcrypt* libtool* flex* pkgconfig* libevent* glib* readline-devel*
3、編譯安裝lua
MySQL-Proxy的讀寫分離主要是通過rw-splitting.lua腳本實現的,因此需要安裝lua
下載:
從http://www.lua.org/download.html下載源碼包
wget http://www.lua.org/ftp/lua-5.3.4.tar.gz
3.1 tar xf lua-5.3.4.tar.gz
3.2 cd lua-5.3.4
3.3 vi src/Makefile
CFLAGS= -O2 -Wall -fPIC -Wextra -DLUA_COMPAT_5_2 $(SYSCFLAGS) $(MYCFLAGS)
3.4 make linux
3.5 make install
下載:
https://downloads.mysql.com/archives/get/file/mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz
4、tar xf mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz
5、mv mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit /usr/local/mysql-proxy
6、cd /usr/local/mysql-proxy
7、mkdir lua #創建腳本存放目錄
mkdir logs #創建日誌目錄
8、cp share/doc/mysql-proxy/rw-splitting.lua ./lua #復制讀寫分離配置文件
9、cp share/doc/mysql-proxy/admin-sql.lua ./lua #復制管理腳本
10、vi /etc/init.d/mysql-proxy #創建mysql-proxy服務管理腳本
[root@centos7-67 ~]# cat /etc/init.d/mysql-proxy
#!/bin/sh
# mysql-proxy This script starts and stops the mysql-proxy daemon
#
# chkconfig: - 78 30
# processname: mysql-proxy
# description: mysql-proxy is a proxy daemon to mysql
# Source function library.
. /etc/rc.d/init.d/functions
#PROXY_PATH=/usr/local/bin
PROXY_PATH=/usr/local/mysql-proxy/bin
prog="mysql-proxy"
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
#[ ${NETWORKING} == "no" ] && exit 0
# Set default mysql-proxy configuration.
PROXY_OPTIONS="--log-level=info \
--log-file=/var/log/mysql-proxy.log \
--plugins=proxy -b 192.168.1.83:3306 -r 192.168.1.66:3306 \
--proxy-lua-script=/usr/local/mysql-proxy/lua/rw-splitting.lua \
--plugins=admin --admin-username=admin \
--admin-password=admin \
--admin-lua-script=/usr/local/mysql-proxy/lib/mysql-proxy/lua/admin.lua"
PROXY_PID=/usr/local/mysql-proxy/mysql-proxy.pid
# Source mysql-proxy configuration.
if [ -f /etc/sysconfig/mysql-proxy ]; then
. /etc/sysconfig/mysql-proxy
fi
PATH=$PATH:/usr/bin:/usr/local/bin:$PROXY_PATH
# By default it's all good
RETVAL=0
# See how we were called.
case "$1" in
start)
# Start daemon.
echo -n $"Starting $prog: "
$NICELEVEL $PROXY_PATH/mysql-proxy $PROXY_OPTIONS --daemon --pid-file=$PROXY_PID --user=mysql
RETVAL=$?
echo
if [ $RETVAL = 0 ]; then
touch /var/lock/subsys/mysql-proxy
fi
;;
stop)
# Stop daemons.
echo -n $"Stopping $prog: "
killproc $prog
RETVAL=$?
echo
if [ $RETVAL = 0 ]; then
rm -f /var/lock/subsys/mysql-proxy
rm -f $PROXY_PID
fi
;;
restart)
$0 stop
sleep 3
$0 start
;;
condrestart)
[ -e /var/lock/subsys/mysql-proxy ] && $0 restart
;;
status)
status mysql-proxy
RETVAL=$?
;;
*)
echo "Usage: $0 {start|stop|restart|status|condrestart}"
RETVAL=1
;;
esac
exit $RETVAL
11、腳本更改說明:
PROXY_PATH=/usr/local/mysql-proxy/bin//定義mysql-proxy服務二進制文件路徑
--proxy-read-only-backend-addresses=192.168.1.66:3306 //定義從服務器可讀
--proxy-backend-addresses=192.168.1.83:3306 //定義主服務器可寫 --proxy-lua-script=/usr/local/mysql-proxy/lua/rw-splitting.lua"//定義lua讀寫分離腳本路徑
PROXY_PID=/usr/local/mysql-proxy/mysql-proxy.pid//定義mysql-proxy PID文件路徑
--daemon //定義以守護進程模式啟動
--keepalive //使進程在異常關閉後能夠自動恢復
--pid-file=$PROXY_PID //定義mysql-proxy PID文件路徑
--user=mysql //以mysql用戶身份啟動服務
--log-level=warning //定義log日誌級別,由高到低分別有(error|warning|info|message|debug)
--log-file=/usr/local/mysql-proxy/logs/mysql-proxy.log //定義log日誌文件路徑
12、chmod 755 /etc/init.d/mysql-proxy
13、vi /usr/local/mysql-proxy/lua/rw-splitting.lua //修改讀寫分離腳本//修改默認連接,進行快速測試,不修改的話要達到連接數為4時才啟用讀寫分離
-- connection pool
if not proxy.global.config.rwsplit then
proxy.global.config.rwsplit = {
min_idle_connections = 1,//默認為4
max_idle_connections = 1,//默認為8
is_debug = false
}
end
14、啟動mysql-proxy
/etc/init.d/mysql-proxy start
15、啟動成功:
[root@centos7-67 ~]# netstat -nutlp| grep mysql
tcp 0 0 0.0.0.0:4040 0.0.0.0:* LISTEN 18520/mysql-proxy
tcp 0 0 0.0.0.0:4041 0.0.0.0:* LISTEN 18520/mysql-proxy
16、測試讀寫分離效果
創建用於讀寫分離的數據庫連接用戶
登陸主數據庫服務器192.168.1.83,通過命令行登錄管理MySQL服務器
mysql> GRANT ALL ON *.* TO 'proxy1'@'192.168.1.67' IDENTIFIED BY 'password';
由於我們配置了主從復制功能,因此從數據庫服務器172.16.1.66上已經同步此操作。
為了清晰的看到讀寫分離的效果,需要暫時關閉MySQL主從復制功能;線上是需要主從同步的,這裏只是做實驗測試,需要關閉
登錄從數據庫服務器192.168.1.66
關閉Slave同步進程
mysql> stop slave;
連接到mysql-proxy
[root@centos7-67 ~]# mysql -uproxy1 -p'password' -P4040 -h192.168.1.67
插入2條數據
mysql> insert into t1 values (120,'third');
Query OK, 1 row affected (0.02 sec)
mysql> insert into t1 values (121,'for');
Query OK, 1 row affected (0.01 sec)
驗證:
mysql-proxy:
mysql> select * from t1; //沒有看到數據
master:
mysql> select * from t1; //可以看到數據
slave:
mysql> select * from t1; //沒有看到數據
連接管理端口:
[root@centos7-67 ~]# mysql -uadmin -padmin -h192.168.1.67 -P4041
mysql> SELECT * FROM backends;
+-------------+-------------------+-------+------+------+-------------------+
| backend_ndx | address | state | type | uuid | connected_clients |
+-------------+-------------------+-------+------+------+-------------------+
| 1 | 192.168.1.83:3306 | up | rw | NULL | 0 |
| 2 | 192.168.1.66:3306 | up | ro | NULL | 0 |
+-------------+-------------------+-------+------+------+-------------------+
2 rows in set (0.00 sec)
up:表示讀寫分離生效;unKnown:還沒生效
結論:當在mysql-proxy插入數據時,寫入到了master上,查詢數據是從slave上查看,所以查詢不到數據。當在slave上插入數據,在mysql-proxy上可以看到,說明讀是從slave上,寫是在master上。
Mysql讀寫分離--mysql-proxy