mysql基于amoeba的读写分离

来源:互联网 发布:php字符串截取中文 编辑:程序博客网 时间:2024/04/29 07:28

    前文中有讲到有关mysql的主从配置,如果单单就主从配置而言,仅能实现数据的及时备份与恢复,对于那些更新不频繁,不需要时时备份数据的用户来说意义不大,而且仅为了备份而再架设一台数据库服务器有些浪费,因为使用免费的云备份完全可以胜任,当然架设主从数据库的意义当然不仅仅在于数据的备份与恢复,更大的意义在于实现mysql的读写分离,当然除了主从数据库是必备的之外,我们还需要借助一些工具,其中amoeba就是其中的佼佼者,配置简单,使用方便,下面我们就来看看如何借助amoeba来实现mysql的读写分离吧。

    测试环境:

    amoeba服务器 :物理机 内网ip:192.168.1.103   amoeba版本3.0.5-RC   未安装mysql   java环境1.7.0_60    操作系统xp 

    master服务器    :虚拟机 桥接物理机 内网ip:192.168.1.116  mysql版本5. 5.32   操作系统xp  

    slave服务器       :虚拟机 桥接物理机 内网ip:192.168.1.110   mysql版本5.5.39   操作系统centos6.5 

    主从配置这里不再复述,有需要的朋友可以参考小编的“mysql主从配置浅析”,下面的操作均建立在主从配置好的基础上。

    一、下载并安装amoeba

    我们可以在SourceForge (全球最大开源软件开发平台和仓库)中搜索amoeba,里面几乎囊括了所有版本的amoeba,而我们需要的是amoeba for mysql,选择最近最新的版本进行下载,如果实在找不到可以点击下面的参考资料“amoeba下载地址”进行下载。windows下的amoeba无需安装,只需要安装运行amoeba的java环境即可。


    二、增加权限

  grant all on test.* to 'amoeba'@'192.168.1.103' identified by '123456'
    master和slave服务器中都需要为amoeba服务器添加一个用户,用于操作master和slave上的数据库,master和slave服务器上添加的用户和密码相同。

    三、配置amoeba

    我们在解压缩的amoeba文件夹中找到conf文件夹,其中我们需要配置的仅有dbServers.xml和amoeba.xml。

    dbServers.xml

    首先我们来看下name为abstractServer的dbServer标签,其中abstractive属性为true,意味着这是一个抽象的dbServer定义,可以由其他dbServer定义拓展,类似于抽象类,可以由其他类继承和扩展。其中需要我们手动修改的是端口(port),数据库(schema),用户名(user),密码(password),那么这里应该如何填写呢?小编第一次使用的时候也非常迷糊,其实我们应该填写的就是在master和slave上我们为amoeba服务器创建的用于连接master和slave数据库的用户,因此这里应该填写port——3306(默认端口无修改),schema——test(test数据库),user——amoeba(用户名),password——123456(密码)。

    

    而abstractServer下方的dbServer就是我们实际中需要使用的,关于dbServer,可以根据自己的情况书写,有几个需要配置的数据库,就填写几个,其中name可以自定义,最好书写有含义的名称,parent就填写abstractServer,因为我们要继承abstractServer,这样我们就可以在abstractServer的基础上进行扩展(继承了port,schema,user和password等属性),只需要添加独有的属性即可,例如添加属于自己独有的ip。这里说下关于步骤二中的添加用户问题,你可以在master和slave中为amoeba添加不同的用户名和密码,但是需要在独立的dbServer中再进行特别的配置,为了方便起见,所以为amoeba设置相同的用户名和密码。下方我们可以看到有被<!-- -->注释的地方,当主从数据库超过两个的时候,这个地方就有用了,举例来说,一主两从,主为master,从一为slave1,从二为slave2。除了各自的dbServer之外,我们还可以新建一个dbServer作为数据库池,用于整合那些功能相同的数据库,例如slave1和slave2都是从数据库,负责读取操作,我们就可以把它们集中在一起方便调用。其中属性为loadbalance代表负载均衡,默认值是1,代表轮询算法。关于负载均衡小编知之甚少,无法做过多解释,暂且就按照默认值来吧。poolNames属性就是让我们放置那些具有共同功能的dbServer,例如slave1,,slave2,其中不同的dbServer以英文逗号隔开。

    

    amoeba.xml

    配置完成dbSevers.xml之后,我们来配置amoeba.xml,首先我们来配置service标签,需要配置的地方有三点,port,user和password。其中port默认是8066,可以自行更改,但是不要跟现有端口起冲突,如非必要不建议更改。user和password则可以自定义,无需跟master和slave创建的用户一致。这里的端口,用户名和密码其实就是为了虚拟出一个mysql链接做准备的(非真实,amoeba服务器可以不安装真实的mysql数据库),具体应用可参考下面的测试。

    特别说明:在service标签中有一个被注释的ipAddress属性,该属性用于绑定可以链接amoeba虚拟出来的mysql的具体ip,如果不绑定,则amoeba服务器所在的网络环境(在同一个局域网下,非同一个局域网下未测试)的其他服务器,可以通过amoeba的内网ip进行链接,如果绑定了127.0.0.1,那么只有amoeba服务器可以链接虚拟出来的mysql,这点需要注意。

    

    端口,用户名和密码配置完之后,我们来配置queryRouter标签,该标签可以实现真正意义上的读写分离,以上配置均为该标签做准备。其中我们需要手动修改的地方有三处,分别是defaultPool,writePool和readPool。defaultPool配置了默认的数据库节点,一些除了SELECT\UPDATE\INSERT\DELETE的语句都会在defaultPool执行,一般设置为主库。writePool顾名思义就是数据库写库,insert,update和delete操作都将会在此库中执行,一般设置为主库。readPool就是写库,如果是单主单从,则readPool就写从库在dbServers.xml中设置的名称,例如设置为slave,如果是一主多从,则readPool设置为从数据库池,例如上述例子中的multiPool,就是从数据库池,包含了slave1和salve2两个从数据库,这样就完成了读写分离(主从)和负载均衡(从一和从二)。至此,amoeba的配置工作已完成。

    

    四、测试读写分离

    amoeba是否真的能够实现读写分离呢?我们来测试一下,首先自然是打开amoeba,启动文件在amoeba文件夹下的bin中,找到launcher.bat,双击打开(如果使用的版本比较低的话,没有该文件,相应的启动文件名称应该为amoeba),出现如下界面证明启动成功。


    在操作数据库之前,我们还需要做一件事情,就是打开master和slave上的查询日志,默认情况下该日志是关闭的,因为该日志会记录下用户的所有操作,在实际运行中会产生大量的信息,造成不必要的I/O开销,但是对于我们验证读写分离却是有很大的帮助,因此在测试读写分离的时候可以打开查询日志。打开方法很简单,找到mysql的配置文件my.cnf或者my.ini,书写log="日志文件目录和名称",在定义的文件目录下则可以找到该文件,如果没有设置文件目录,默认在mysql文件夹的data文件夹下,设置完成后别忘了重启mysql。

    开启查询日志后,我们可以书写链接mysql的程序了,以php链接mysql为例。

<?phpmysql_connect('127.0.0.1:8066','myuser','mypass');mysql_select_db('test');mysql_query("set names 'utf8'");$createtable = "create table `amoeba`(           `id` int(10) not null,               `name` varchar(50) not null       )engine=myisam default character set utf8";mysql_query($createtable);mysql_query("insert into `amoeba`(`id`,`name`) values(1,'1')");mysql_query("select `id`,`name` from `amoeba`");

其中链接mysql的host,user,password都是在amoeba.xml中定义的,不要随意更改,否则会链接失败,选择的数据库则是dbServers.xml中定义的schema属性值,该数据库必须是在master和slave中真实存在的,否则基于该库的所有操作都会失败。我们为该库创建一个数据表amoeba,并为这个表插入一条数据,然后查询该表数据。此时我们进行了三个操作,一个是create操作,一个是insert操作,一个是select操作,根据amoeba中关于应用池的定义,那么create和insert操作应该在master数据库中,select操作应该在slave中,到底是否真的如此呢?我们可以查看刚才开启的查询日志中的记录,果然在master主库中只记录了create和insert操作,并没有记录select操作,那么slave从库中是否只记录了select操作呢,打开一看,居然有create和insert操作,难道没有生效?其实不然,slave之所以有create和insert操作,是因为主从配置关系,它同步了主库的create和insert操作,怎么证明呢?其实很简单,我们在mysql命令行下输入stop slave,暂停从库,然后再次插入一条数据,现在主库的数据是不是比从库中多了一条呢,此时的从库的查询日志中是否已经没有新插入的insert的记录了呢。

    总结:以上仅说到了用amoeba实现mysql读写分离的最小配置,amoeba还能实现数据的水平切分、垂直切分,关于amoeba更进一步的应用这里就不在详述,如果有兴趣的朋友可以参考amoeba官方文档(参考资料2)。

    注意事项:

    1.amoeba使用java开发,因此使用之前需要安装java环境,请使用java SE 1.5以上的版本,关于如何安装java环境不是本文重点,这里不再复述。

    2.linux默认开启的有防火墙,此时我们在其他服务器上链接此服务器的mysql的时候会无法链接,我们可以使用service iptables stop命令来关闭防火墙,切记使用root权限来关闭防火墙,如果使用普通用户权限该命令无反应。

    3.以上测试均建立在单一数据库的基础上,如果需要进行多数据库的读写分离,则相应的权限和配置信息都需要调整。

    4.amoeba服务器无需安装真实mysql数据库,它可以虚拟出一个mysql实例,但是程序操作的数据库必须在master和slave中真实存在。

    参考资料

    1.amoeba下载地址:http://sourceforge.net/projects/amoeba/files/Amoeba%20for%20mysql/

    2.amoeba使用指南:http://docs.hexnova.com/amoeba/

0 0
原创粉丝点击