五一假期,有个博友给我发邮件,说我的这篇blog:http://bobwu.blog.51cto.com/2918362/537077 只能通过程序员在程序中实现读写分离,咨询能否实现程序员无察觉的读写分析,呵呵,我明白意思。回答是肯定的,可以实现,这里面就用到了Mysql-proxy的功能。我在测试环境下搭建了一下,把过程写出来,大家看看,依旧不提供截图,仅提供命令行,方便大家粘贴复制:

 

Mysql-proxy安装配置:

mysql-proxy.需要按下列顺序安装其所依赖的包:

()安装LUA

#tar zxvf lua-5.1.tar.gz

#cd lua-5.1

vi修改Makefile,使"INSTALL_TOP=/usr/local/lua",这样做的目的是为了是lua的所有文件都安装在目录/usr/local/lua/

#make posix

#make install

 

 libevent

#tar zxvf libevent-1.1a.tar.gz

#cd libevent-1.1a

#./configure --prefix=/usr/local/libevent

#make

#make install

 

check

#tar zxvf check-0.8.4.tar.gz

#cd check-0.8.4

#./configure

#make

#make install

 

置安装mysql-proxy所需的环境变量.把下面的内容追加到/etc/profile

export LUA_CFLAGS="-I/usr/local/lua/include" LUA_LIBS="-L/usr/local/lua/lib -llua -ldl" LDFLAGS="-L/usr/local/libevent/lib -lm"

export CPPFLAGS="-I/usr/local/libevent/include"

export CFLAGS="-I/usr/local/libevent/include"

然后执行 source /etc/profile (安装完mysql-proxy不再需要这些变量,可以删除之)

 

mysql(只安装mysql客户端即可)

#tar zxvf  mysql-5.0.45.tar.gz

#cd mysql-5.0.45

#./configure --prefix=/usr/local/mysql  --without-server

#make

#make install

 

mysql-proxy

#tar zxvf mysql-proxy-0.5.0.tar.gz

#cd mysql-proxy-0.5.0

#./configure --prefix=/usr/local/mysql-proxy  --with-mysql=/usr/local/mysql  --with-lua

#make

#make install

 

补充:主要的命令行选项

--help-all显示所有的帮助选项

--admin-address=host:port 管理主机及端口,默认是4041

--proxy-address=host:port 代理服务器的监听地址及端口,默认4040

--proxy-read-only-address=host:port 只读连接时,代理服务器的监听地址及端口。默认4042

--proxy-backend-addresses=host:port连接真实服务器的地址及监听端口,默认是3306,这是mysql代理最重要的选项,多个主机之间用空格隔开。使用rr算法。

--proxy-lua-script=file 指定lua脚本的名称

 

置使用方法

2mysql服务器的情形,本方案情景

mysql-proxy \

     --proxy-backend-addresses=mysql_ip1:3306 \

     --proxy-backend-addresses=mysql_ip2:3306

3个服务器的情形:一个主服务器,负责写入;2个从服务器,负责查询,依次类推。

mysql-proxy --proxy-backend-addresses=<master_ip> :3306\

         --proxy-read-only-address=<slave_ip1>:3306 \

         --proxy-read-only-address=<slave_ip2>:3306

 

mysql-proxy

编写脚本/usr/local/bin/mysql-proxy.sh其内容如下:

#/bin/bash

LUA_PATH="/usr/local/mysql-proxy/share/mysql-proxy/?.lua" mysql-proxy --proxy-read-only-backend-addresses=<salve_IP>:3306 --proxy-
backend-addresses=<master_IP>:3306 --proxy-lua-script=/usr/local/mysql-proxy/share/mysql-proxy/rw-splitting.lua >> /var/log/mysql-proxy.log &

chmod 755 /usr/local/bin/mysql-proxy.sh; 

执行命令/usr/local/bin/mysql-proxy.sh启动服务

 

能测试

1、主从复制测试:在主数据库服务器上创建库和表,然后再插入记录,再登陆到从服务器,看是否也建立相一致的库和表以及记录。

mysql> create database hichina_db;

Query OK, 1 row affected (0.01 sec)

 在主数据库服务器创建库hichina_db

 

mysql> create table hichinaren_tb(id int(3),name char(10));

Query OK, 0 rows affected (0.00 sec)

 在主数据库服务器创建表hichinaren_db

 

mysql> insert into first_tb values (001,'bob');

Query OK, 1 row affected (0.00 sec)

在主数据服务器的表hichinaren_db中插入记录

现在转到从数据库服务器,看是否同步了上面主数据库的数据

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| hichina_db           |

| mysql              |

| test               |

+--------------------+

4 rows in set (0.01 sec)

数据库自动生成了

 

mysql> use hichina_db;
Database changed

mysql> show tables;
+--------------------+
| Tables_in_first_db |
+--------------------+
| hichinaren_tb           | 
+--------------------+
1 row in set (0.00 sec)

表也自动生成了

 

mysql> select * from hichinaren_tb;
+------+--------+
| id   | name   |
+------+--------+
|    1 | bob    | 
+------+--------+
1 row in set (0.00 sec)

记录存在。

2、读写分离:用mysql客户端程序如mysql登陆到mysql代理,然后执行读写操作,以测试读写分离的正确性。