Chinaunix首页 | 论坛 | 博客
  • 博客访问: 108452
  • 博文数量: 39
  • 博客积分: 2032
  • 博客等级: 大尉
  • 技术积分: 330
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-09 10:21
文章分类
文章存档

2011年(2)

2010年(22)

2009年(15)

我的朋友

分类: Mysql/postgreSQL

2009-11-15 21:26:14

Amoeba是一个类似MySQL Proxy的分布式数据库中间代理层软件,是由陈思儒开发的一个开源的java项目。其主要功能包括读写分离,垂直分库,水平分库等。Amoeba For MySQL处于在应用和数据库之间,扮演一个中介的角色,它对客户端透明,能将应用传递过来的SQL语句经过分析后,根据配置文件路由到不同的数据库进行适当的处理。Amoeba实现了简单的负载均衡(采用轮询算法)和Failover。

本系统中该模块的体系结构如下图3.2.7所示:
图3.2.7 分布式数据库结构
下面介绍一下Amoeba for MySQL的配置:
(1)   Server配置:
配置统一的对外接口,即外界程序进行连接的虚拟的MySQL数据库。
图3.2.8  对外统一接口配置
(2)   配置4个dbServer
需要至少配置一个dbServer,每个dbServer将是物理数据库Server的映射。
图3.2.9  master1的配置
上述配置实际是告诉虚拟MySQL数据库,它背后真正要去访问的是端口为3306,用户为root的MySQL数据库。本系统中,需要配置4个MySQL数据库。
(3)   配置queryRouter
这里是读写分离的查询规则配置,如下图所示,读操作去连接slavePool,更新操作去连接masterPool。
图3.2.10  query Router的配置
(4)   主从结构的读写分离
MasterPool:Master1、Master2主要进行写数据。
SlavePool:Slave1、Slave2是两个平等的数据库,负责读数据和负载均衡。
Amoeba提供了读写分离和负载均衡的配置方案。配置Slave1和Slave2形成一个虚拟的SlavePool,该配置可以提供负载均衡。配置如下:
图3.2.11  slavePool配置
在queryrouter属性中配置 writePool=masterPool,readPool=slavePool。那么遇到update、insert、delete等写语句时将query发送到writePool,遇到select语句时将query发送到readPool中执行,且在执行select语句时,采用轮询算法,轮流从slave1和slave2中读数据,达到负载均衡的效果。
(5)   数据垂直切分
垂直切分数据是按照系统要求,将不同类型的数据存放在不同的数据库或者服务器。在Amoeba中,数据垂直切分的粒度是表,因此在本系统中,将表account、car_information、violation和location分别存放在两个数据库服务器上(Master1和Master2)。在Amoeba的安装目录下的config/amoeba.xml配置文件中,启用ruleConfig配置。rule.xml配置文件的部分内容如下(第5,17—19行):
图3.2.12  数据切分配置
接下来就可以看到垂直切分的效果,当把数据写入violation表时,Amoeba会到master1上执行,而当把数据写入location表时,将会到master2上执行。上面的配置皆可完成基于Amoeba的数据垂直切分。
(6)   数据水平切分
Amoeba提供了非常友好的数据切分规则表达式,同时Amoeba也允许开发人员增加新的规则函数,数据水平切分的粒度是行。在本系统中,我们根据account表中的AUTHORITY字段进行水平切分,我们将插入的数据分成两类,一类是AUTHORITY=1,另一类是AUTHORITY=0。具体的配置如图3.2.12第5—16行。

在配置文件中,parameters属性指的是sql表达式中的where条件中cloumn字段。例如:在rule1中,参数是AUTHORITY,表达式是AUTHORITY=1,相当于sql语句的select * from account where AUTHORITY=1。如果有多个属性,可采用逗号分隔。

根据上面的水平切分规则:当有数据要插入account表时,如果AUTHORITY=1那么将数据插入到master1,如果AUTHORITY=0,那么就把数据插入到master2中,当进行select查询时,则Amoeba将从master1和master2同时发起请求,并将结果合并后返回给客户端。
以上是对MySQL实施分布式的中间件Amoeba的配置介绍。除此之外,还需要对MySQL进行主从同步的配置,对此请参见相应版本的MySQL使用手册。
本系统是在一台机器上启动四个MySQL实例来模拟多台数据库服务器。因此,还需要做一些配置,详细过程如下(不同版本略有不同,此处以5.1.39为例):

在同一台电脑中安装多个mysql服务,不能通过安装多次双击mysql安装文件的方式实现。假设电脑中已经安装一个MySQL服务(作为主服务器master),安装目录为D:\MySQL Server 5.1。此时复制MySQL Server 5.1目录下的所有安装文件至一个新的目录,以E:\MySQL Server 5.1目录为例说明,把它作为从服务器slave。

首先修改从服务器的配置文件,即E:\MySQL Server 5.1目录下的my.ini文件。用记事本打开,修改[client]下的port=3307(区别主服务的端口,避免冲突),修改[mysqld]下的port=3307,basedir="E:/MySQL Server 5.1/",datadir="E:/Program Files/MySQL/MySQL Server 5.1/data/",innodb_data_home_dir="E:/MySQL Datafiles/",其中innodb_data_home_dir自行设置路径 ,datadir为数据的存储路径,根据自己的data文件夹位置自行设置,主服务器的data文件夹默认在C:\Documents and Settings\All Users\Application Data\MySQL\MySQL Server 5.1目录下。

然后在命令行窗口下进入以下目录E:\MySQL Server 5.1\bin后,执行以下命令mysqld install mysql_slave,其中mysql_slave为服务名。操作如图:

图3.2.13  安装MySQL服务

接着在注册表找到HKEY_LOCAL_MACHINE \SYSTEM\CurrentControlSet \Services\ MySQL_ SLAVE中找到ImagePath项,在该项中加入--defaults-file="E:\MySQL Server 5.1\my.ini"。

最后,再回到命令行窗口的E:\MySQL Server 5.1\bin,执行net start mysql 命令,即可启动新的mysql服务。
阅读(1908) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~