Centos5.6下MySQL Proxy0.8.2的安装及测试html
参考:
http://www.hake.cc/a/shujuku/mysql/2012/0323/46760.html
Mysql-proxy就是一个中间层代理,简单的说,
mysql proxy就是一个链接池,负责将前台应用的链接请求转发给后台的数据库,而且经过使用lua脚本,能够实现复杂的链接控制和过滤,从而实现读写分离和负载均衡。对于应用来讲,mysql-proxy是彻底透明的,应用则只须要链接到mysql proxy的监听端口便可。固然,这样proxy机器可能成为单点失效,但彻底可使用多个proxy机器作为冗余,在应用服务器的链接池中配置到多个proxy的链接参数便可。Mysql proxy更强大的一项功能是实现“读写分离”,基本原理是让主数据库处理事务性查询,让从库处理select查询。数据库复制被用来把事务性查询致使的变动同步到集群中的从库。在生成mysql的M-S结构后,为了实现读写分离,须要使用mysql proxy。
Mysql proxy目前应用的生产环境
1. 现实中不少应用环境是这样:在程序开发初期没有规划好,程序读写数据都只提供一个
IP接口,后期因为压力顶不住,公司要求后来的系统架构师/DBA将公司的数据库架构更改,这样在程序上实现比较困难,因此加进此中间层来实现。
2. 建议你们仍是将其应用中小型网站,特别是读比较频繁的网站。若是是大型网站或门户网站的网站,建议读写分离仍是从开发层面实现。
3. 建议你们采用
mysql proxy0.8.0以上的版本,它修正了之前很多bug,并且稳定性也不错。
Mysql proxy 0.8.2的安装步骤以下:
Mysql proxy0.8.2安装以前有先决条件以下:
libevent 1.x 或更高
(libevent-2.0.13-stable.tar.gz)
glib2 2.6.0 或更高
(glib-2.22.5.tar.gz)
lua 5.1.x 或更高
(lua-5.1.4.tar.gz)
pkg-config
(
yum安装……)
libtool 1.5 或更高
(yum安装……)
服务器操做系统:
CentOS 6.2 x86_64
Mysql proxy环境设置说明:
Mysql proxy服务器:
192.168.2.6
Mysql master服务器:
192.168.2.5
Mysql slave服务器:
192.168.2.4
i. 为了加速安装进度,咱们能够先
yum安装必须的库,同时解决pkg-config、libtool和mysql开发库,因为mysql proxy实际并不须要在本机运行mysql实例,因此咱们这里用yum安装,命令以下:
#yum –y install gcc gcc-c++ autoconf mysqldevel libtool pkgconfig ncurses ncurses-devel
ii. 安装
libevet
#tar zxvf libevent-2.0.13-stable.tar.gz
#cd libevent-2.0.13-stable
#./configure
#make && make install
iii. 安装
glib
#tar zxvf glib-2.22.5.tar.gz
#cd glib-2.22.5
#./configure
#make && make install
iv. 安装
readline
#tar zxvf readline-6.1.tar.gz
#cd readline-6.1
#./configure
#make && make install
为了让动态连接库为系统所共享,咱们这里用
ldconfig
#ldconfig –v
用此选项,
ldconfig将显示正在扫描的目录及搜索到的动态连接库,还有它所建立的链接的名字
v. 安装
lua
#tar zxvf lua-5.1.4.tar.gz
#cd lua-5.1.4
64位系统,需在
CFLAGS里加上-fPIC,咱们用vim编辑下src/Makefile文件,修改代码以下:
CGLAGS= -O2 –Wall –Fpic $(MYCFLAGS)
#make linux && make install
vi. 配置
pkg-config环境变量,命令以下:
#cp etc/lua.pc /usr/local/lib/pkgconfig
#export PKG_CONFIG_PATH=$PKG_COFNIG_PATH:/usr/local/lib/pkgconfig
以上操做就完成了基本文件安装
mysql proxy0.8.2的安装
vii. #tar zxvf mysql-proxy-0.8.2.tar.gz
#cd mysql-proxy-0.8.2
#./configure –prefix=/usr/local/mysql-proxy
#make && make install
#cp lib/rw-splitting.lua /usr/local/lib
#cp lib/admin.lua /usr/local/lib
到这里
mysql-proxy已基本安装完成,接下来就是mysql proxy的配置和测试了
a. mysql proxy选项说明,你们能够用
mysql-proxy –help-all 查看它的帮助选项,命令以下:
#/usr/local/mysql-proxy/bin/mysql-proxy –help-all
代理功能选项:
-P, --proxy-address=<host:port>是
mysql-proxy服务器的监听端口,缺省是4040,建议改成3306,方便开发人员写代码。
-r, --proxy-read-only-backend-
addresses
=<host:port>只读
slave的地址和端口;
-b, --proxy-backend-
addresses
=<host:port>远程
master地址和端口;
-s, --proxy-lua-script=<file>指定一个
lua脚原本控制mysql proxy的运行和设置,这个脚本在每次新建链接和脚本发生修改的时候讲从新调用;
其余选项:
--defaults-file=<file>配置文件,能够把
mysql proxy的参数信息置入一个配置文件里,比较方便;
--daemon mysql proxy以守护进程方式运行;
--pid-file=<file>设置
mysql proxy的存储PID文件的路径;
--keepalive保持链接启动进程会有
2个,一号进程用来监视 二号进程,若是二号进程死掉重启proxy,这是新版本mysql proxy增长的keepalived功能,它修正了之前mysql proxy容易死掉的bug,建议开启。
Mysql proxy配置文件以下:
[root@CentOS bin]# cat /etc/mysql-proxy.cnf
[mysql-proxy]
admin-username=root
admin-password=123456
admin-lua-script=/usr/local/lib/admin.lua
proxy-read-only-backend-addresses=192.168.2.4
proxy-backend-addresses=192.168.2.5
proxy-lua-script=/usr/local/lib/rw-splitting.lua
log-file=/usr/local/mysql-proxy/mysql-proxy.log
log-level=debug
daemon=true
keepalive=true
b. 给相关服务器受权
在
master/slave上各创建一个用户,以后客户端发送的SQL都是经过mysql-proxy服务器来转发,因此要保证能够从mysql-proxy服务器登陆master和slave:
在
192.168.2.5和192.168.2.4上均执行此命令:
Mysql>grant all privileges on *.* to root@’192.168.2.6’ identified by ‘123456’;
Mysql>flush privileges;
添加完用户以后,开始启动
mysql-proxy,进行测试。
注:启动以前需将mysql-proxy.cnf配置文件的权限设为600(chomd 600 /etc/mysql-proxy.cnf),不然会报错提示。
#/usr/local/mysql-proxy/bin/mysql-proxy –P 192.168.2.6:4040 --default-file=/etc/mysql-proxy.cnf
此时能够查看进行,有两个
[root@CentOS bin]# ps ax | grep mysql-proxy
31168 ?
S 0:00 /usr/local/mysql-proxy/bin/mysql-proxy -P 192.168.2.6:4040 --defaults-file=/etc/mysql-proxy.cnf
31169 ?
S 0:17 /usr/local/mysql-proxy/bin/mysql-proxy -P 192.168.2.6:4040 --defaults-file=/etc/mysql-proxy.cnf
此时能够查看
mysql-proxy的日志文件:
2012-12-27 13:04:17: (message) Initiating shutdown, requested from signal handler
2012-12-27 13:04:18: (message) shutting down normally, exit code is: 0
2012-12-27 13:04:18: (debug) chassis-unix-daemon.c:167: 31169 returned: 31169
2012-12-27 13:04:18: (message) chassis-unix-daemon.c:176: [angel] PID=31169 exited normally with exit-code = 0 (it used 1 kBytes max)
2012-12-27 13:04:18: (message) Initiating shutdown, requested from mysql-proxy-cli.c:604
2012-12-27 13:04:18: (message) shutting down normally, exit code is: 0
2012-12-27 13:04:28: (message) chassis-unix-daemon.c:136: [angel] we try to keep PID=31409 alive
2012-12-27 13:04:28: (debug) chassis-unix-daemon.c:157: waiting for 31409
2012-12-27 13:04:28: (debug) chassis-unix-daemon.c:121: we are the child: 31409
2012-12-27 13:04:28: (message)
mysql-proxy 0.8.2 started
2012-12-27 13:04:28: (debug) max open file-descriptors = 1024
2012-12-27 13:04:28: (message)
proxy listening on port 192.168.2.6:4040
2012-12-27 13:04:28: (message)
added read/write backend: 192.168.2.5
2012-12-27 13:04:28: (message)
added read-only backend: 192.168.2.4
接下来即是测试
mysql proxy的读写功能了,为了快速看到效果,先在修改下rw-splitting.lua。
-- connection pool
if not proxy.global.config.rwsplit then
proxy.global.config.rwsplit = {
min_idle_connections = 1, //默认为
4
max_idle_connections = 2, //默认为
8
is_debug = true //默认为
false
}
end
修改完成后,重启
mysql-proxy。
测试读写分离效果
登陆主数据库服务器:
192.168.2.5,为了清晰的看到读写分离的效果,须要暂时关闭mysql主从复制的功能。在主mysql数据库中的test数据库常见表,并插入数据
Mysql>use test;
Database changed
Mysql>create table first_tb(id int(3),name char(10));
Query Ok,1 row affected(0.00 sec)
Mysql>insert into first_tb values (1,’myself’);
Query Ok, 1 row affected (0.00 sec)
mysql>select * from first_tb;
+------+-------+
| id
| name |
+------+-------+
|
1 | myself |
+------+-------+
1 row in set (0.00 sec)
在从
192.168.2.4mysql数据库中的test中建立表并插入数据
mysql>use test;
Database changed
mysql>create table first_tb(id int(3),name char(10));
Query Ok, 1 row affected (0.00 sec)
mysql>insert into first_tb values (2,'yours');
Query Ok, 1 row affected (0.00 sec)
mysql>select * from first_tb;
+------+-------+
| id
| name |
+------+-------+
|
2 | yours |
+------+-------+
1 row in set (0.00 sec)
此时在
mysql-proxy192.168.2.6服务器上登陆
#mysql –uroot –p123456 –h192.168.2.6 –P4040
mysql> select * from test.first_tb;
+------+--------+
| id
| name |
+------+--------+
|
1 | myself |
+------+--------+
4 rows in set (0.00 sec)
显示读取的数据为
192.168.2.5主数据库中的数据,再从新打开一个mysql-proxy终端一样select一下
#mysql –uroot –p123456 –h192.168.2.6 –P4040
mysql> select * from test.first_tb;
+------+--------+
| id
| name |
+------+--------+
|
2 | yours |
+------+--------+
4 rows in set (0.00 sec)
再打开终端请求过来,
select所有到192.168.2.4从库上去查询。此时在mysql-proxy上插入一条数据;
#mysql -uroot -ppassword -h192.168.2.6 -P4040 test
mysql> use test;
mysql>insert into first_tb values (110,'second');
而后分别去主从服务器上查看信息
mysql> select * from first_tb; (主
192.168.2.5)
+------+--------+
| id
| name |
+------+--------+
|
1 | myself |
| 110 | second |
+------+--------+
4 rows in set (0.00 sec)
mysql> select * from first_tb; (从
192.168.2.4)
+------+--------+
| id
| name |
+------+--------+
|
2 | yours |
+------+--------+
4 rows in set (0.00 sec)
可见写到主数据库(
192.168.2.5)中了,读写分离完成!
由此,咱们已经实现了
mysql读写分离,目前全部的写操做都所有在master主服务器上,用来避免数据的不一样步;
另外,全部的读操做都分摊给了
slave从服务器,分担数据库的压力;