关于mysql读写分离的一些测试
转载自 运维者
MySQL-Proxy是处在你的MySQL数据库客户和服务端之间的程序,它还支持嵌入性脚本语言Lua。这个代理可以用来分析、监控和变换(transform)通信数据,它支持非常广泛的使用场景:
- 负载平衡和故障转移处理
- 查询分析和日志
- SQL宏(SQL macros)
- 查询重写(query rewriting)
- 执行shell命令
MySQL Proxy更强大的一项功能是实现“读写分离(Read/Write Splitting)”。基本的原理是让主数据库处理事务性查询,而从数据库处理SELECT查询。数据库复制被用来把事务性查询导致的变更同步到集群中的从数据库。
这些均来自互联网,已经熟的不能再熟了,也不是我要介绍的,下面开始我们的实战
环境:
就目前的环境来看我们已经搞会了master slave 以及 cluster等配置,也知道了变形虫(amoeba),它也一款代理软件,也支持读写分离,但是amoeba不支持事务,这点很蛋疼!所以我们这块,要继续研究一下mysql-proxy,因为它支持事务。
client—>proxy(读写分离)—–>cluster,是我们需要的环境了,为什么要这样,你懂的,percona cluster,所有的DB都支持读写,但是,如果写锁,那是非常郁闷的事!你能保证程序员不会给你来点刺激的事吗?所以我们要将读写进行分离,之前有用haproxy进行分离,但是存在一个问题,就是程序员写代码时,会不会严格的将两个端口或者两个IP写在代码里!一个人还好讲,一个团队,你能保证不会出问题,而且在国内的程序员的思维里,存在这种逻辑的估计很少,唉,运维就是这么苦B的职业,什么都要搞!下面我们测试测试,看看是不是能解决我们面临的问题!
一、安装mysql-proxy:
# yum list mysql-proxy
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirror.esocc.com
* epel: ftp.jaist.ac.jp
* extras: mirror.esocc.com
* updates: centos.ustc.edu.cn
Available Packages
mysql-proxy.i686 0.8.2-1.el6 epel
mysql-proxy.x86_64 0.8.2-1.el6 epel
# yum install mysql-proxy
下面省略所有 ..........
多省事,不要老想着源码有多好管理,yum源就是方便!
二、配置启动需要的配置文件(vi /etc/sysconfig/mysql-proxy):
# Options for mysql-proxy
ADMIN_USER="admin"
ADMIN_PASSWORD=""
ADMIN_LUA_SCRIPT="/usr/lib64/mysql-proxy/lua/admin.lua"
PROXY_USER="mysql-proxy"
PROXY_OPTIONS="--daemon --log-level=info --log-use-syslog"
原内容是这样的,我将其改为:
# Options for mysql-proxy
ADMIN_USER="admin"
ADMIN_PASSWORD=""
ADMIN_LUA_SCRIPT="/usr/lib64/mysql-proxy/lua/admin.lua"
PROXY_USER="mysql-proxy"
PROXY_OPTIONS="--defaults-file=/etc/mysql-proxy.cnf"
mysql-proxy.cnf内容如下:
[mysql-proxy]
daemon = true
user = mysql-proxy
proxy-skip-profiling = true
keepalive = true
;max-open-files = 2048
event-threads = 50
pid-file = /var/run/mysql-proxy.pid
log-file = /var/log/mysql-proxy.log
log-level = debug
admin-address=:4401
admin-username=admin
admin-password=passw0rd
admin-lua-script=/usr/lib64/mysql-proxy/lua/admin.lua
proxy-address = 0.0.0.0:3307
proxy-backend-addresses = 192.168.1.64:3306
proxy-read-only-backend-addresses=192.168.1.66:3306, 192.168.1.244:3306
proxy-lua-script=/usr/lib64/mysql-proxy/lua/proxy/balance.lua
这里要多插两句,backend-addresses = 192.168.1.64:3306(读写) proxy-read-only-backend-address后面的DB主机只能是两台,超过两台就会有问题!如果说你有多个read-only-backend大可以分成两行写!
修改启动文件(vi /etc/init.d/mysql-proxy):
- daemon $prog $PROXY_OPTIONS --pid-file=$PROXY_PID --user=$PROXY_USER --admin-username="$ADMIN_USER" --admin-lua-script="$ADMIN_LUA_SCRIPT" --admin-password="$ADMIN_PASSWORD"
+ daemon $prog $PROXY_OPTIONS --pid-file=$PROXY_PID
三、启动:
# /etc/init.d/mysql-proxy start
Starting mysql-proxy: [ OK ]
# tail -f /var/log/mysql-proxy.log
-06-20 23:08:17: (message) mysql-proxy 0.8.2 started
-06-20 23:08:17: (debug) max open file-descriptors = 1024
-06-20 23:08:17: (message) proxy listening on port 0.0.0.0:3307
-06-20 23:08:17: (message) added read/write backend: 192.168.1.64:3306
-06-20 23:08:17: (message) added read-only backend: 192.168.1.66:3306
-06-20 23:08:17: (message) added read-only backend: 192.168.1.244:3306
-06-20 23:08:17: (debug) now running as user: mysql (498/498)
-06-20 23:08:17: (message) chassis-event-thread.c:375: starting 49 threads
# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0