1. 程式人生 > >Mysql讀寫分離--mysql-proxy

Mysql讀寫分離--mysql-proxy

mysql 讀寫分離

技術分享圖片


準備前提:


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