Mysql讀寫分離--mysql-proxy
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上。\
https://blog.51cto.com/jacksoner/2084099