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/
- Mysql 基于 Amoeba 的 读写分离
- mysql基于amoeba的读写分离
- mysql基于amoeba的读写分离
- 基于windows的mysql读写分离和amoeba配置
- 基于amoeba实现MySQL读写分离
- mysql amoeba读写分离
- MySQL Amoeba读写分离
- mysql读写分离 amoeba
- MySQL-amoeba-读写分离
- MySQL的读写分离之Amoeba
- 基于Amoeba的MySQL读取分离
- mysql主从配置以及基于amoeba实现读写分离
- MySQL之——基于Amoeba实现读写分离
- Amoeba+mysql实现读写分离
- Amoeba for mysql读写分离
- Amoeba for mysql读写分离
- mysql集群-amoeba读写分离
- mysql 主从amoeba读写分离
- Android View的小结
- 接口,抽象类
- liferay中配置Struts2
- #include<bits/stdc++.h>这个头文件的使用
- UITextField UITextView隐藏键盘的方法
- mysql基于amoeba的读写分离
- Java8 default methods 默认方法的概念与代码解析
- Struts2的Interceptor和Listener以及Plugin
- bjfu 上这道题我不知道是放在dp里还是放在dfs里。。。
- 推荐系统小结
- 【微信】微信获取TOKEN,以及储存TOKEN方法,Spring quartz让Token永不过期
- hdu 1599 find the mincost route
- HDU 4715 Difference Between Primes
- 详解MySQL中EXPLAIN解释命令