用 MySQL-Proxy 实现 MySQL 主从模式下的读写分离

2008-07-13 | 22:48分类:Linux, MySQL, Redhat/CentOS | 标签: | 343 Views

准备所需的软件:
读写分离脚本是由 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

#!/bin/sh
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

#!/bin/sh
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 管理的:

ps -ef | grep mysql-proxy
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 进程再查看:

killall 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 已经变了。

发表您的评论

您的名字: (*必填)
您的邮箱:(*不会被公布 ,必填)
您的网站: