用 MySQL-Proxy 实现 MySQL 主从模式下的读写分离
准备所需的软件:
读写分离脚本是由 lua 语言编写的,需要安装 lua
http://www.lua.org/
下载适合的 MySQL-Proxy 版本
http://mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-Proxy/
安装依赖的库:
yum -y install readline-devel
Installing for dependencies: libtermcap-devel
安装 lua:
tar zxvf lua-5.1.3.tar.gz
cd lua-5.1.3
make linux
make install
安装 MySQL-Proxy:
tar zxvf mysql-proxy-0.6.1-linux-rhel4-x86-32bit.tar.gz
cd mysql-proxy-0.6.1-linux-rhel4-x86-32bit
mv sbin/mysql-proxy /usr/local/sbin/
mv share/mysql-proxy /usr/local/share/
strip /usr/local/sbin/mysql-proxy
创建一个启动脚本,方便管理:
vi /etc/init.d/mysql-proxy
export LUA_PATH=/usr/local/share/mysql-proxy/?.lua
case "$1" in
start)
/usr/local/sbin/mysql-proxy --daemon \
--proxy-address=:3306 \
--proxy-backend-addresses=192.168.0.9:3306 \
--proxy-read-only-backend-addresses=192.168.0.10:3307 \
--proxy-lua-script=/usr/local/share/mysql-proxy/rw-splitting.lua
;;
stop)
killall mysql-proxy
;;
*)
echo "Usage: mysql-proxy {start|stop}"
exit 1
esac
chmod +x /etc/init.d/mysql-proxy
参数解释:
--proxy-address=:3306 代理监听在本机所有 IP 的 3306 端口。
--proxy-backend-addresses=192.168.0.9:3306 写入操作连接 master - 192.168.0.9 的 3306 端口。
--proxy-read-only-backend-addresses=192.168.0.10:3307 读取操作连接 slave - 192.168.0.10 的 3307 端口。
--proxy-lua-script=/usr/local/share/mysql-proxy/rw-splitting.lua 使用的读写分离脚本。
因为 MySQL-Proxy 还是 Alpha 版的,实际使用中并不稳定,运行一段时间后 mysql-proxy 的进程就会死掉。
所以,用 daemontools 来管理 mysql-proxy 进程比较保险。
在 Redhat 9 和 CentOS 3.x 上用源码编译安装 daemontools 是可以的,但在 CentOS 4.x 上就不行了。
可以下载 RPM 包安装:
http://www.qmail.org/rpms/daemontools.html
http://untroubled.org/supervise-scripts/
wget http://www.qmail.org/rpms/RPMS/daemontools-0.76-112memphis.i386.rpm
wget http://untroubled.org/supervise-scripts/supervise-scripts-3.5-1.noarch.rpm
rpm -Uvh daemontools-0.76-112memphis.i386.rpm supervise-scripts-3.5-1.noarch.rpm
注意:
Daniel J. Bernstein 的软件包不是依照 FHS(Filesystem Hierarchy Standard) 标准创建的。
rpm -ql daemontools 可以看到那“怪异”的文件分布状况。
安装 supervise-scripts 包会在 /etc/inittab 的 si::sysinit:/etc/rc.d/rc.sysinit 行下添加如下两行:
SV:2345:respawn:/usr/bin/svscan-start /service
SX:S016:wait:/usr/bin/svscan-stopall /service
重新检查 /etc/inittab 文件:
telinit q
应该可以看到 svscan 进程了:
ps -ef | grep svscan
root 2269 1 0 21:25 ? 00:00:00 svscan /service
创建 mysql-proxy 运行脚本:
mkdir /service/mysql-proxy
vi /service/mysql-proxy/run
export LUA_PATH=/usr/local/share/mysql-proxy/?.lua
/usr/local/sbin/mysql-proxy \
--proxy-address=:3306 \
--proxy-backend-addresses=192.168.0.9:3306 \
--proxy-read-only-backend-addresses=192.168.0.10:3307 \
--proxy-lua-script=/usr/local/share/mysql-proxy/rw-splitting.lua
chmod 755 /service/mysql-proxy/run
马上就可以看到 mysql-proxy 进程被启动了,并且是由 supervise 管理的:
root 2309 2269 0 21:27 ? 00:00:00 supervise mysql-proxy
root 29442 29441 32 21:27 ? 00:00:00 /usr/local/sbin/mysql-proxy --proxy-address=:3306 --proxy-backend-addresses=192.168.0.9:3306 --proxy-read-only-backend-addresses=192.168.0.10:3307 --proxy-lua-script=/usr/local/share/mysql-proxy/rw-splitting.lua
杀死 mysql-proxy 进程再查看:
ps -ef | grep mysql-proxy
root 2309 2269 0 21:27 ? 00:00:00 supervise mysql-proxy
root 29640 29639 36 21:31 ? 00:00:01 /usr/local/sbin/mysql-proxy --proxy-address=:3306 --proxy-backend-addresses=192.168.0.9:3306 --proxy-read-only-backend-addresses=192.168.0.10:3307 --proxy-lua-script=/usr/local/share/mysql-proxy/rw-splitting.lua
可以看到,mysql-proxy 进程依然还在,不过 PID 已经变了。