《Mysql入门Ubuntu10下如何搭建MySQL Proxy读写分离探讨》要点:
本文介绍了Mysql入门Ubuntu10下如何搭建MySQL Proxy读写分离探讨,希望对您有用。如果有疑问,可以联系我们。
一、MySQL-Proxy基础MYSQL教程
MySQL Proxy是一个处于你的Client端和MySQL server端之间的简单程序,它可以监测、分析或改变它们的通信.它使用灵活,没有限制,常见的用途包括:负载平衡,故障、查询分析,查询过滤和修改等等.MYSQL教程
MYSQL教程
(Figure1:MySQL Proxy)MYSQL教程
MySQL-Proxy, announced in June, is a binary application that sits between your MySQL client and server, and supports the embedded scripting language Lua. The proxy can be used to analyze, monitor and transform communication, and supports a wide range of scenarios including:MYSQL教程
load balancing and fail over handling query analysis and logging SQL macros query rewriting executing shell commandsOne of the more powerful features of MySQL Proxy is the ability to do "Read/Write Splitting". The basic concept is to have a master database handle transactional queries while slaves handle SELECT queries. Replication is used to synchronize the changes due to transactional queries with the slaves in the cluster. MYSQL教程
MySQL-Proxy是处在你的MySQL数据库客户和服务端之间的程序,它还支持嵌入性脚本语言Lua.这个代理可以用来分析、监控和变换(transform)通信数据,它支持非常广泛的使用场景:MYSQL教程
负载平衡和故障转移处理 查询分析和日志 SQL宏(SQL macros) 查询重写(query rewriting) 执行shell命令MySQL Proxy更强大的一项功能是实现“读写分离(Read/Write Splitting)”.基本的原理是让主数据库处理事务性查询,而从数据库处理SELECT查询.数据库复制被用来把事务性查询导致的变更同步到集群中的从数据库.MYSQL教程
MYSQL教程
二、实战过程MYSQL教程
测试环境:Ubuntu 10.04.2 LTS + MySQL5.1.41-3ubuntu12.10-logMYSQL教程
192.168.1.147 proxy 代理 入口MYSQL教程
192.168.1.126 master 主机 只写MYSQL教程
192.168.1.145 slaver 从机 只读MYSQL教程
程序上只需要链接到192.168.1.147,而192.168.1.126和192.168.1.145对于程序来说是透明的,你完全不需要理会,也不需要知道192.168.1.126和192.168.1.145,你对数据库的所有操作都只对192.168.1.147进行操作.MYSQL教程
1.安装脚本luaMYSQL教程
#apt-get install lua5.1MYSQL教程
MySQL-Proxy的读写分离主要是通过rw-splitting.lua脚本实现的,因此需要安装lua.MYSQL教程
2.安装配置MySQL-ProxyMYSQL教程
#apt-get mysql-proxyMYSQL教程
当前获取到的版本是:mysql-proxy 0.8.0(查看版本命令:#mysql-proxy -V)MYSQL教程
3.修改rw-splitting.luaMYSQL教程
#vim /usr/share/mysql-proxy/rw-splitting.luaMYSQL教程
配置并使用rw-splitting.lua读写分离脚本,脚本目录是 /usr/share/mysql-proxy,修改读写分离脚本rw-splitting.lua,修改默认连接数,进行快速测试,如果不修改连接数的话要达到连接数为4时才会启用读写分离.MYSQL教程
-- connection poolMYSQL教程
if not proxy.global.config.rwsplit thenMYSQL教程
proxy.global.config.rwsplit = {MYSQL教程
min_idle_connections = 1, //默认为4MYSQL教程
max_idle_connections = 1, //默认为8MYSQL教程
is_debug = falseMYSQL教程
}MYSQL教程
endMYSQL教程
这是因为mysql-proxy会检测客户端连接,当连接没有超过min_idle_connections预设值时, 不会进行读写分离, 即查询操作会发生到Master上.MYSQL教程
4.新建文件夹/var/log/mysql-proxy/和文件mysql-proxy.logMYSQL教程
#mkdir /var/log/mysql-proxyMYSQL教程
#vi mysql-proxy.logMYSQL教程
5.执行读写分离MYSQL教程
#sudo mysql-proxy --proxy-read-only-backend-addresses=192.168.1.145:3306 --proxy-backend-addresses=192.168.1.126:3306 --proxy-lua-script=/usr/share/mysql-proxy/rw-splitting.lua >/var/log/mysql-proxy/mysql-proxy.log &MYSQL教程
参数说明:MYSQL教程
192.168.1.147 proxy 代理 入口MYSQL教程
192.168.1.126 master 主机 只写MYSQL教程
192.168.1.145 slaver 从机 只读MYSQL教程
当运行sudo mysql-proxy 上面语句后,查询进程没有4040的时候,需要重启mysql ( sudo /etc/init.d/mysql restart) 之后再输入proxy设置.MYSQL教程
6.查看进程端口MYSQL教程
#netstat -antMYSQL教程
#netstat CntlMYSQL教程
MYSQL教程
(Figure2:端口)MYSQL教程
tcp 0 0 0.0.0.0:4040 0.0.0.0:* LISTEN MYSQL教程
tcp 0 0 0.0.0.0:4041 0.0.0.0:* LISTEN MYSQL教程
7.查看数据库链接MYSQL教程
mysql> show processlist\G;MYSQL教程
MYSQL教程
(Figure3:进程)MYSQL教程
可以看到,产生了一个新连接.如果想杀掉某个链接,可以使用mysql>help kill查看kill的帮助信息,杀掉36进程的命令:mysql>kill 36;MYSQL教程
8.测试读写分离MYSQL教程
1)在mysql-proxy机子进入MySQLMYSQL教程
#mysql -u gaizai -p -P4040 -h 192.168.1.147MYSQL教程
必须指定-h参数,不然报下面错误:MYSQL教程
MYSQL教程
(Figure4:出错)MYSQL教程
2)显示数据库列表:MYSQL教程
mysql> show databases;MYSQL教程
如果你是搭建MySQL-Proxy成功的话,你上面查看到的数据库列表应该是192.168.1.145服务器上的数据库列表.(可以在145和126分别创建不同的数据库进行测试)MYSQL教程
3)进入测试数据库:MYSQL教程
mysql> use weibo;MYSQL教程
4)查询表记录:MYSQL教程
mysql>select * from blog;MYSQL教程
5)插入一条记录:MYSQL教程
mysql> INSERT INTO `blog` (`TaskID`, `Content`, `Quote`, `Author`, `Time`, `Url`, `ImageUrl`, `Transmits`, `Comments`, `Hash`, `AddOn`) VALUES('10','fefef','fefef','efef',NOW(),'http://www.cnblogs.com/zgx/archive/2011/09/13/2174823.html',NULL,'0','0','33333333',NOW());MYSQL教程
6)查询表记录:MYSQL教程
mysql>select * from blog;MYSQL教程
对比两次查询表的记录,看记录是否有变化,我们插入了数据(确认插入成功),但两次的数据是没有变化的,这就对了,这就是读写分离了(我们读的是145的数据库,插入的是126的数据库,而我们的145与126又没有设置Replication;如果之前设置了,请先停止后进行测试)MYSQL教程
注:有时候mysql_proxy(38)库里会显示出数据,重启系统系统,重新启动mysql后就没有此现象了.MYSQL教程
7)进入主写服务器(192.168.1.126) 查看数据MYSQL教程
#mysql -u gaizai -p -h 192.168.1.126MYSQL教程
mysql> use weibo;MYSQL教程
mysql>select * from blog;MYSQL教程
可以查看已经写入了一条记录.MYSQL教程
8)进入从读服务器(192.168.1.145)MYSQL教程
#mysql -u gaizai -p -h 192.168.1.145MYSQL教程
mysql> use weibo;MYSQL教程
mysql>select * from blog;MYSQL教程
因为没有数据显示,说明只能读,不能写.MYSQL教程
在使用工具SQLyog执行查询时,在Proxy服务器上会自动显示下面的信息:MYSQL教程
MYSQL教程
(Figure5:信息)MYSQL教程
9.MySQL-Proxy+ReplicationMYSQL教程
上面的测试只是测试了插入数据后,在没有进行Master与Slave的Replication设置的情况下,读取Master与Slave的数据是不同,如果想达到Figure1的效果,我们还需要设置Master与Slave之间的数据复制(Replication),详情请参考:Ubuntu10下MySQL搭建Master SlaveMYSQL教程
三、MySQL-Proxy命令MYSQL教程
帮助命令:$mysql-proxy --help-allMYSQL教程
查看下MySQL Proxy的版本:$ mysql-proxy -V MYSQL教程
编译启动脚本:$vi /etc/init.d/mysql-proxyMYSQL教程
启动命令:$ /etc/init.d/mysql-proxy startMYSQL教程
停止命令:$ /etc/init.d/mysql-proxy stopMYSQL教程
重启命令:$ /etc/init.d/mysql-proxy restartMYSQL教程
MYSQL教程
四、注意事项MYSQL教程
1.在启动mysql-proxy的时候,可以把启动命令保存为文件:MYSQL教程
建议使用配置文件的形式启动, 注意配置文件必须是660权限, 否则无法启动. 如果有多个Slave的话, proxy-read-only-backend-addresses参数可以配置多个以逗号分隔的IP:Port从库列表.MYSQL教程
杀掉mysql-proxy进程:# killall mysql-proxy MYSQL教程
新建一个文件:# vi /etc/mysql-proxy.cnfMYSQL教程
在文件中输入两个分隔符中间的内容:MYSQL教程
------------------------------------------------------MYSQL教程
[mysql-proxy]MYSQL教程
admin-username=viajarchenMYSQL教程
admin-password=123123MYSQL教程
admin-lua-script = /usr/share/mysql-proxy//admin-sql.lua MYSQL教程
proxy-backend-addresses=192.168.1.126:3306MYSQL教程
proxy-read-only-backend-addresses=192.168.1.145:3306MYSQL教程
proxy-lua-script=/usr/share/mysql-proxy/rw-splitting.luaMYSQL教程
log-file=/var/tmp/mysql-proxy.logMYSQL教程
log-level=debugMYSQL教程
daemon=trueMYSQL教程
keepalive=trueMYSQL教程
max-open-files=1024MYSQL教程
------------------------------------------------------MYSQL教程
设置权限:# chmod 660 /etc/mysql-proxy.cnfMYSQL教程
或者#chmod +x /etc/init.d/mysql-proxyMYSQL教程
设置启动文件:# mysql-proxy --defaults-file=/etc/mysql-proxy.cnfMYSQL教程
查看信息:# ps -ef | grep mysql-proxy | grep -v grepMYSQL教程
root 1869 1 0 18:16 ? 00:00:00 /usr/local/mysql-proxy/libexec/mysql-proxy --defaults-file=/etc/mysql-proxy.cnfMYSQL教程
root 1870 1869 0 18:16 ? 00:00:00 /usr/local/mysql-proxy/libexec/mysql-proxy --defaults-file=/etc/mysql-proxy.cnfMYSQL教程
查看日志:# tail -50f /var/tmp/mysql-proxy.logMYSQL教程
2.mysql-proxy参数MYSQL教程
--admin-address=host:port 指定一个mysqo-proxy的管理端口, 缺省是4041;MYSQL教程
-P, --proxy-address=<host:port> 是mysql-proxy 服务器端的监听端口, 缺省是4040;MYSQL教程
-r, --proxy-read-only-backend-addresses=<host:port> 只读Slave的地址和端口, 缺省为不设置;MYSQL教程
-b, --proxy-backend-addresses=<host:port> 远程Master地址和端口, 可设置多个做failover和load balance, 缺省是127.0.0.1:3306;MYSQL教程
--defaults-file=<file>配置文件, 可以把mysql-proxy的参数信息置入一个配置文件里;MYSQL教程
--daemon mysql-proxy以守护进程方式运行MYSQL教程
--keepalive try to restart the proxy if it crashed, 保持连接启动进程会有2个, 一号进程用来监视二号进程, 如果二号进程死掉自动重启proxy.MYSQL教程
Clog-level=debug定义log日志级别,由高到低分别有MYSQL教程
(error|warning|info|message|debug)MYSQL教程
--proxy-lua-script=file指定一个Lua脚本程序来控制mysql-proxy的运行和设置,这个脚本在每次新建连接和脚本发生修改的的时候将重新调用.MYSQL教程
--max-open-files:指定最大档案开启数为1024,否则会有【could not raise RLIMIT_NOFILE to 8192, Invalid argument (22). Current limit still 1024.】的log讯息出现.MYSQL教程
3.当MySQL主从复制在 show slave status\G 时出现Slave_IO_Running或Slave_SQL_Running 的值不为YES时,,需要首先通过 stop slave 来停止从服务器,然后再进行测试读写分离.MYSQL教程
4.MySQL-Proxy的rw-splitting.lua脚本在网上有很多版本,但是最准确无误的版本仍然是源码包中所附带的lib/rw-splitting.lua脚本,如果有lua脚本编程基础的话,可以在这个脚本的基础上再进行优化;MYSQL教程
5.MySQL-Proxy实际上非常不稳定,在高并发或有错误连接的情况下,进程很容易自动关闭,因此打开Ckeepalive参数让进程自动恢复是个比较好的办法,但还是不能从根本上解决问题,因此通常最稳妥的做法是在每个从服务器上安装一个MySQL-Proxy供自身使用,虽然比较低效但却能保证稳定性;MYSQL教程
6.一主多从的架构并不是最好的架构,通常比较优的做法是通过程序代码和中间件等方面,来规划,比如单双server-id号分开写入等方式来实现两个或多个主服务器;MYSQL教程
7.MySQL-Cluster 的稳定性也不是太好;MYSQL教程
8.Amoeba for MySQL 是一款优秀的中间件软件,同样可以实现读写分离,负载均衡等功能,并且稳定性要大大超过MySQL-Proxy,建议大家用来替代MySQL-Proxy,甚至MySQL-Cluster.MYSQL教程
9.mysql proxy不支持old_password.另外也可以通过查看密码长度的方式来判断:select length(password) from mysql.user如果长度为16位则是old_password无疑.MYSQL教程
10. 安装了mysql-proxy实现读写分离,有master x 1, slave x 2.为了测试failover,停掉了一个slave,然后mysql-proxy会一直报错,提示无法连接.这个情况比单点的mysql还糟糕,挂掉一个就全挂掉!mysql的工程师给提供了一段代码,替换掉:MYSQL教程
src/network-mysqld-proxy.c的NETWORK_MYSQLD_PLUGIN_PROTO函数可以解决这个问题.network-mysqld-proxy-function.c文件.MYSQL教程
(经过测试:我停止掉slave数据库,proxy的查询就会转移到master上,当把slave启动后,proxy依然在读master,当有新的链接进来的时候才会去读取slave的数据)MYSQL教程
11. 如果在mysql-proxy的机器上也安装了mysql的话,新手就会在这个时候混乱了,到底要如何进行测试和链接呢?比如使用命令:#mysql -u gaizai -p -P4040 -h 192.168.1.147是表示登陆本机的4040端口,使用gaizai帐号,这个帐号可以不是本地mysql的帐号,这样就比较容易区分了.MYSQL教程
12. 在上述环境中,mysql-proxy、mysql-master、mysql-slave三台服务器均存在单点故障.为了避免mysql-proxy单点隐患有两种方法:一种方法是mysql-proxy配合keepalived做双机,另一种方法是将mysql-proxy和应用服务安装到同一台服务器上;为了避免mysql-master单点故障可以使用DRBD+heartbear做双机;为了避免mysql-slave单点故障可以添加多台mysql-slave,mysql-proxy会自动屏蔽后端发生故障的mysql-slave.MYSQL教程
13. 用sysbench (或者super-smack)测试mysql性能:MYSQL教程
#sysbench --test=oltp --mysql-table-engine=innodb --oltp-table-size=1000 --mysql-socket=/tmp/mysql.sock --mysql-password=123456 --mysql-user=gaizai --mysql-host=192.168.1.126 --mysql-db=weibo --num-threads=15 prepareMYSQL教程
#sysbench --test=oltp --mysql-table-engine=innodb --oltp-table-size=1000 --mysql-socket=/tmp/mysql.sock --mysql-password=123456 --mysql-user=gaizai --mysql-host=192.168.1.126 --mysql-db=weibo --oltp-test-mode=complex runMYSQL教程
14. 关于mysql-proxy的启动和关闭的shell脚本的编写:MYSQL教程
15. 读写分离不能回避的问题之一就是延迟,可以考虑Google提供的SemiSyncReplicationDesign补丁.MYSQL教程
16. 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教程
17. 当使用bigint 时,mysql_insert_id()存在问题,详情见手册,不过对于大多数人而言,bigint基本不会遇到,所以你可以无视这个问题)注:对于这两个问题,官方BUG库里有人给出了相应的补丁.MYSQL教程
MYSQL教程
五、错误MYSQL教程
在执行命令的时候出现了下面的错误:MYSQL教程
MYSQL教程
(Figure6:错误信息)MYSQL教程
could not raise RLIMIT_NOFILE to 8192MYSQL教程
这个一个警告级别的错误,意思是MySQL Proxy在你的系统上不能把open files limit提升到8192,不过没关系的,MySQL Proxy依然好好的运行在你的电脑上.MYSQL教程
可以通过设置启动--max-open-files参数解决.MYSQL教程
MySQL Proxy安装和使用(一)MYSQL教程
mysql proxy master and slave testMYSQL教程
加入--max-open-files=8192后报下面的错误:MYSQL教程
MYSQL教程
(Figure7:错误信息)MYSQL教程
MYSQL教程
六、疑问与解答MYSQL教程
1.当slave宕机后,mysql-proxy是如何读取的?(经过测试:我停止掉slave数据库,proxy的查询就会转移到master上,当把slave启动后,proxy依然在读master,当有新的链接进来的时候才会重新去读取slave的数据.有时可能需要重启下mysql-proxy)MYSQL教程
2.如何知道mysql-proxy当前执行的select是在哪台机器上执行的?MYSQL教程
3.当slave宕机一段时间后,如果再次同步master的缺失的数据?MYSQL教程
4.当配置中设置了proxy-read-only-backend-addresses=192.168.1.145:3306MYSQL教程
,192.168.1.147:3306类似这样的两个slave,如果两个slave的数据不同步,那么是怎么读取数据的?# tail -50f /var/tmp/mysql-proxy.log测试MYSQL教程
5.生产环境中除了进行程序调试外,其它不要开启mysql查询日志,因为查询日志记录了客户端的所有语句,频繁的IO操作将会导致mysql整体性能下降.如何设置呢?MYSQL教程
6.mysql-proxy.cnf文件中的管理员帐号和密码有什么用?使用命令进入管理MYSQL教程
mysql -u viajarchen -p -P 4041 -h 192.168.1.147 密码是123123MYSQL教程
mysql> select * from proxy_connections;MYSQL教程
mysql> select * from proxy_config;MYSQL教程
MYSQL教程
(Figure8:信息)MYSQL教程
7.关于mysql-proxy的启动和关闭的shell脚本的编写?测试MYSQL教程
8.对于/usr/share/mysql-proxy/rw-splitting.lua脚本中的MYSQL教程
local min_idle_connections = 4 local max_idle_connections = 8应该如何理解?min的话就是要达到这个值的时候才会读写分离,那么max的是什么意思呢?最大能有8个链接?MYSQL教程
9.mysqld是什么意思?是mysql的守护进程!MYSQL教程
10.HAProxy和keepalived怎么一起搭建使用?能解决什么问题?MYSQL教程
转载请注明本页网址:
http://www.vephp.com/jiaocheng/3416.html