使用MySQL-Proxy读写分离时的注意事项(一)

2014-11-24 14:40:33 · 作者: · 浏览: 2

使用MySQL-Proxy读写分离时的注意事项
在动手操作前最好先安装好MySQL-Proxy,并配置好MySQL主从服务器。补充:新版MySQL已经内建支持
www.2cto.com
延迟问题
读写分离不能回避的问题之一就是延迟,可以考虑Google提供的SemiSyncReplicationDesign补丁。
端口问题
MySQL-Proxy缺省使用的是4040端口,如果你想透明的把3306端口的请求转发给4040的话,那么可以:
iptables -t nat -I PREROUTING -s ! 127.0.0.1 -p tcp --dport 3306 -j REDIRECT --to-ports 4040
如果想删除这条规则,可以把上面例子中的-I换成-D。
参考链接
密码加密方式
MySQL-Proxy不支持老的密码加密方式,所以如果你使用的是老版本的MySQL,或者启用了old_passwords选项的话,则可能会出现错误:
ERROR 2013: Lost connection to MySQL server
此时最好的修复方法就是使用新的密码加密方式,如果你的用户表是老式的,可能需要先运行MySQL源代码里scripts目录下的mysql_fix_privilege_tables脚本升级表结构。有时候客观情况可能不允许立刻进行升级操作,此时可以为MySQL-Proxy专门建立一个密码为空的用户(通过主机限制访问,或者起一个很复杂的用户名),因为不管是新的密码加密方式还是旧的密码加密方式,空密码都同样是一个空字符串,这样就规避了密码加密的问题。
www.2cto.com
查询乱码
连接上MySQL-Proxy后,执行查询时,随机出现乱码。出现此问题的原因是当我们使用MySQL-Proxy读写分离时,通常会有多个后端服务器,客户端发出查询请求时,一般会先发出一条类似"SET NAME gbk"的语句来声明客户端编码,然后再发出实际查询的SQL语句,但MySQL-Proxy可能会把这两条语句分发给不同的后端服务器,于是就出现了乱码。
解决方法是强行指定后端服务器的字符编码:
init-connect='SET NAME gbk'
default-character-set=gbk
skip-character-set-client-handshake
如果使用init-connect,则需要注意操作用户不能有SUPER权限,否则此选项无效。
即便做好了以上的设置后,还有可能会出现乱码,比如说数据库是gbk的,当我们用PHPMyAdmin连接MySQL-Proxy时,查询还是会出现乱码,不过这是正常的!因为PHPMyAdmin使用的是utf8编码,它发出的“SET NAMES utf8”语句被skip-character-set-client-handshake屏蔽了,所以出现乱码。
进程崩溃
www.2cto.com
MySQL-Proxy偶尔会出现进程崩溃的情况,具体原因不明。
新版的MySQL-Proxy为了应付这个问题加入了一个keepalive选项(try to restart the proxy if it crashed),当使用这个选项时,会先后启动两个mysql-proxy进程,先启动的mysql-proxy进程用来监控后启动的mysql-proxy进程,实际提供服务的是后启动的mysql-proxy进程,一旦后启动的mysql-proxy进程挂掉(你可以自己kill试试),先启动的mysql-proxy进程会重新启动一个mysql-proxy提供服务。
不过现在很多人用的还是旧版的MySQL-Proxy,此时可以利用init来实现类似keepalive的效果:
编写脚本/usr/local/sbin/mysql-proxy.sh,加入以下内容(具体写法视安装情况而定):
LUA_PATH="/usr/local/mysql-proxy/share/mysql-proxy/ .lua" \
/usr/local/mysql-proxy/sbin/mysql-proxy \
--proxy-backend-addresses=192.168.0.1:3306 \
--proxy-read-only-backend-addresses=192.168.0.2:3306 \
--proxy-lua-script=/usr/local/mysql-proxy/share/mysql-proxy/rw-splitting.lua
别忘了加上可执行属性:
chmod a+x /usr/local/sbin/mysql-proxy.sh
0.7.0版本有一个新的选项:--defaults-file,可以把相关信息都写到配置文件里:
# MySQL Proxy's configuration file (mysql-proxy.cnf)
[mysql-proxy]
daemon = true
keepalive = true
proxy-backend-addresses = 192.168.0.1:3306
proxy-read-only-backend-addresses = 192.168.0.2:3306
proxy-lua-script = /usr/local/mysql-proxy/share/mysql-proxy/rw-splitting.lua
启动时可以使用:mysql-proxy --defaults-file=mysql-proxy.cnf
修改inittab:
www.2cto.com
vi /etc/inittab
加入以下内容:
mp:12345:respawn:/usr/local/sbin/mysql-proxy.sh
然后让init重新读取inittab内容:
kill -HUP 1
系统会自动检测/usr/local/sbin/mysql-proxy.sh是否正在运行,如果没有就自动运行。
需要注意的是在编写mysql-proxy.sh脚本的时候,不要加入--daemon选项,否则/usr/local/sbin/mysql-proxy.sh一运行就结束了,系统会不停的尝试运行脚本,从而在/var/log/message里留下大量的错误信息(init: Id "mp" respawning too fast: disabled for 5 minutes)。
init的方法可能显得有点另类了,可以使用其他的工具,比如svscan。
有状态的查询
一些有状态的特殊的查询可能失效,比如说:
SELECT SQL_CALC_FO