Mysql-Proxy实现mysql读写分离、负载均衡(转)
在mysql中实现读写分离、负载均衡,⽤Mysql-Proxy是很容易的事,不过⼤型处理对于性能⽅⾯还有待提⾼,主要配置步骤如下:
1.1. mysql-proxy安装
MySQL Proxy就是这么⼀个中间层代理,简单的说,MySQL Proxy就是⼀个连接池,负责将前台应⽤的连接请求转发给后台的数据库,并且通过使⽤lua脚本,可以实现复杂的连接控制和过滤,从⽽实现读写分离和负载平衡。对于应⽤来说,MySQL Proxy是完全透明的,应⽤则只需要连接到MySQL Proxy的监听端⼝即可。当然,这样proxy机器可能成为单点失效,但完全可以使⽤多个proxy机器做为冗余,在应⽤服务器的连接池配置中配置到多个proxy的连接参数即可。建议proxy别跟mysql数据库安装在⼀台服务器中。在安装mysql-proxy之前需要确定已经按照以下包:pkg-config(系统⾃带,不需安装) ,libevent,glib,LUA,在CentOS5.2系统已经包含,查看是否已经安装改包,⽤命令rpm –q libevent 、rpm –q glib和rpm –q –lua,如果版本过低或者未安装,需要重新安装。
⼀、mysql-proxy安装
1、 libevent安装
centos下⾃带的libevent版本超⽼,这个没有别的办法,只能⾃⼰重新编译,版本需要在1.4.0以上,越⾼越好,重新安装命令
Ø wget /~provos/libevent-1.4. 远程下载包
Ø tar zvfx libevent-1.4.
Ø cd libevent-1.4.9-stable
Ø ./configure
Ø make
Ø make install
2、glib安装
centos⾃带的glib版本也⽐较⽼,mysqlproxy 0.7.0以上需要glib2 2.16.0以上才能编译成功,因此也需要重新编译glib,重新安装命令:
Ø wget /pub/gnome/sources/glib/2.18/glib-2.18.
Ø tar zvfx glib-2.18.
Ø cd glib-2.18.4
Ø ./configure
Ø make
Ø make install
3、LUA安装
Centos系统未⾃带该包,需下载安装,安装命令如下
Ø wget /ftp/lua-5.1.
Ø tar zvfx lua-5.1.
Ø cd lua-5.1.4
在安装Lua之前,如果操作系统为64位,需要修改lua相关⽂件代码为:
vi src/Makefile进⼊改⽂件到CFLAGS,在其最后⾯添加上-fPIC,如果不添加则要在64位机上编译出现了“relocations”错误。
修改了改⽂件后,现在执⾏编译按照操作
Ø make linux
Ø make install
Ø cp etc/lua.pc /usr/local/lib/pkgconfig/
重要:让pkg-config到⾃⼰编译的库在哪⾥,执⾏以下指令
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
LUA安装完毕。
4、mysql-proxy源码安装
Ø wget launchpad/mysql-proxy/0.8/0.8.0/+download/mysql-proxy-0.8.
Ø
Ø tar zxvf mysql-proxy-0.8.
Ø cd mysql-proxy-0.8.0
Ø ./configure
Ø make
Ø make install
编译完成可执⾏命令mysql-proxy –V 查看安装信息
说明Mysql-proxy已经安装成功了。接下来对其进⾏配置
⼆、mysql-proxy配置
1、mysql-proxy配置需要配置脚本,脚本可以直接从⽹站上下载,执⾏命令
Ø wget -c lecode/files/mysql-proxy
Ø cp mysql-proxy /etc/init.d/mysql-proxy 把下载到的复制到 /etc/init.d/下
此脚本为mysql-proxy的启动、停⽌、重启和相关运⾏的读写分离、负载均衡提供了⽀持。
对脚本进⾏格式转换,否则在运⾏操作时会提⽰错误,转换命令:
Ø dos2unxi /etc/init.d/mysql-proxy
Ø vi /etc/init.d/mysql-proxy
Ø :set ff=unix 修改成Unix模式
保存退出
再执⾏命令:
Ø # chmod 755 /etc/init.d/mysql-proxy 修改该⽂件权限
Ø # chkconfig mysql-proxy on
2、添加读写分离、负载均衡配置⽂件
此⽂件主要配置读写分离、负载均衡的服务器配置⽂件,路径为:etc/sysconfig/添加mysql-proxy⽂件,此⽂件名需要和 /etc/init.d/mysql-proxy中⽂件⾥的代码指定的⽂件名⼀
致。这⾥都为mysql-proxy。
创建mysql-proxy⽂件,执⾏命令:
Ø vi /etc/sysconfig/mysql-proxy 创建⽂件
添加内容:
# options to mysql-proxy
# do not remove --daemon
PROXY_OPTIONS="—admin-address=:4040 --proxy-backend-addresses=192.168.1.60:3306 --proxy-read-only-backend-addresses=192.168.1.61:3306 --proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua --keepalive 红⾊为读写分离配置,只⽤于读
脚本解释说明
--daemon 采⽤daemon⽅式启动
--admin-address=:4040 指定mysqlproxy的管理端⼝,在这⾥,表⽰本机的4401端⼝;
--proxy-address=:3307 指定mysqlproxy的监听端⼝,也可以⽤ 127.0.0.1:3307 表⽰;
--proxy-backend-addresses=192.168.1.60:3306 指定mysql主机的端⼝,可读写;
--proxy-read-only-backend-addresses=192.168.1.61:3306 指定只读的mysql主机端⼝,多个指定
--proxy-read-only-backend-addresses=192.168.1.61:3306 指定另⼀个只读的mysql主机端⼝;
--proxy-lua-script=/usr/local/share/mysql-proxy/rw-splitting.lua指定lua脚本,在这⾥,使⽤的是rw-splitting脚本,⽤于读写分离
此脚本也可以直接在⽹上下载:
在linux下执⾏命令:
wget
把下载的包复制到路径/usr/local/share/mysql-proxy/下
修改读写分离脚本 rw-splitting.lua
修改默认连接,进⾏快速测试,不修改的话达到连接数为4时才启动读写分离
#vi /opt/mysql-proxy/scripts/rw-splitting.lua
-- connection pool
min_idle_connections = 1, //默认为4
max_idle_connections = 1, //默认为8
三、启动mysql-proxy
进⼊之前在路径/etc/init.d/中建⽴的mysql-proxy⽂件,执⾏命令:
Ø mysql-proxy start|stop 则mysql-proxy服务启动成功|停⽌
2.2测试
⼀、负载均衡测试:
测试服务器:192.168.1.60(mysql-proxy安装在此服务器);192.168.1.61,
分表在上述服务器创建数据库testproxy,⽤于数据读取。
在60数据库中添加数据 name:slave,id:1
61数据库中添加数据 name:master,id:1
打开两个连接窗⼝
在192.168.1.61中输⼊命令
# mysql -u user -h 192.168.1.60 -p -P 4010
主要是连接在192.168.1.60中的mysql-proxy,其中4040为mysql-proxy管理端⼝,在配置⽂件中设置。
在mysql中执⾏查询语句:
默认请求的是当前数据库的连接,接下来停⽌当前服务器(192.168.1.61)中的mysql服务
命令:service mysqld stop;
停⽌服务后,再⼀次连接
# mysql -u user -h 192.168.1.60 -p -P 4010
在mysql执⾏查询语句,输出的结果则为:
此查询是⾃动切换到192.168.1.60中的数据中
现在mysql-proxy服务连接的是192.168.0.60数据库,如果现在把该mysql服务停⽌,启动1.61的mysql服务,再在192.168.1.61客户端执⾏
# mysql -u user -h 192.168.1.60 -p -P 4010
查询出的结果⼜会是192.168.1.61 数据库的数据,如图:
提⽰上⾯错误信息,说明正在试图连接其他服务器。
说明:负载均衡中的连接没有主从之分,在多个服务器同时启动的时候,先启动的服务器,就被标识为主,如果主挂掉,连接的其他服务器会被标识成主。
在做读写分离测试时:
主要是针对程序测试,需要在对两个数据库同时作添加查询的操作,那样,添加会⾃动切换到主库,读取数据会切换到从库。
我们已经实现了MySQL读写分离,⽬前所有的写操作都全部在Master主服务器上,⽤来避免数据的不同步;在程序⾥做测试时,连接的服务器地址为:192.168.1.60 port=4040( 连接数据库fig连接字符串)
这⾥必须跟上端⼝号,指定连接是mysql-proxy代理服务器,在代码中写⼊插⼊、查询语句,进⾏测试,会发现读写操作不同的数据库。
另外,所有的读操作都分摊给了其它各个Slave从服务器上,⽤来分担数据库压⼒。
总结:在上述环境中,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 配置⽂件:
1 [mysqld]
2datadir=/var/lib/mysql
3socket=/var/lib/mysql/mysql.sock
4user=mysql
5 #server-id= 2
6 log-bin= mysql-bin
7 #master-host= 192.168.1.60
8 #master-user= user
9 #master-password= 123456
10 #master-port= 3306
11 #Disabling symbolic-links is recommended to prevent assorted security risks
12symbolic-links=0
13log-slow-queries = var/lib/mysql/slow-query.log
14back_log=1000
15key_buffer_size = 300M
16max_allowed_packet = 4M
17thread_stack = 256K
18tmp_table_size = 200M
19sort_buffer_size = 32M
20read_buffer_size = 4M
21read_rnd_buffer_size = 16M
22join_buffer_size = 8M
23myisam_sort_buffer_size = 64M
24table_cache= 1024
25 thread_cache_size= 120
26query_cache_size = 64M
27tmp_table_size = 256M
28max_connections = 1024
下载mysql服务端命令29thread_cache_size = 80
30max_connect_errors = 10000000
31wait_timeout=30// sleep连接休眠时间超过10秒则终⽌连接
32thread_concurrency= 8
33innodb_flush_log_at_trx_commit = 1
34innodb_log_buffer_size = 2M
35innodb_thread_concurrency=8
36record_buffer = 16M
37interactive_timeout = 30
38skip_name_resolve // 建议打开
39binlog_format=mixed // 建议开启以免在事务操作时⽇志出错
40 # Toenable the InnoDB Plugin, uncomment the 2 next lines
41#ignore-builtin-innodb
42#plugin-load=innodb=ha_innodb_plugin.so
43
44 # Toenable InnoDB-related INFORMATION_SCHEMA tables
45 # Jointhe following options to above directive
46 ;innodb_trx=ha_innodb_plugin.so
47 ;innodb_locks=ha_innodb_plugin.so
48 ;innodb_cmp=ha_innodb_plugin.so
49 ;innodb_cmp_reset=ha_innodb_plugin.so
50 ;innodb_cmpmem=ha_innodb_plugin.so
51 ;innodb_cmpmem_reset=ha_innodb_plugin.so
52
53[mysqld_safe]
54log-error=/var/log/mysqld.log
55pid-file=/var/run/mysqld/mysqld.pid
56
57
58 [mysql]
59default-character-set=gb2312
常⽤myf配置⽂件
Mysql慢⽇志查询
分析sql查询语句,可以打开mysql中的log_slow_queries 参数
打开⽅式是在myf中添加log-slow-queries= var/lib/mysql/slow-query.log
配合参数long_query_time =10(单位为秒) 只的是超过10s的查询会记录该⽇志
Mysql在多并发出现⼤量“unauthenticated :2501 None Connect Reading from net”
信息时,需要在myf配置⽂件中添加skip-name-resolve 参数,
它将禁⽌ MySql Server 对外部连接进⾏ DNS 解析,使⽤这⼀选项可以消除 MySql 进⾏ DNS 解析的时间。
但需要注意,如果开启该选项,则所有远程主机连接授权都要使⽤IP地址⽅式,否则MySQL将⽆法正常处理连接请求,即不能使⽤Localhost主机名的⽅式访问
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论