amoeba for mysql 使用日志
一、在使用一个工具之前还是要先了解一下这个东西的一些细节,也就是说连这个东西是什么都不清楚就盲目去用了,那是不严谨的,起码都不知道这东西是否合适用在后面的生产环境,不合适再牛的技术就就是个屁!
Amoeba(变形虫)项目,该开源框架于2008年 开始发布一款 Amoeba for Mysql软件。这个软件致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的 时候充当SQL路由功能,专注于分布式数据库代理层(Database Proxy)开发。座落与 Client、DB Server(s)之间,对客户端透明。具有负载均衡、高可用性、SQL 过滤、读写分离、可路由相关的到目标数据库、可并发请求多台数据库合并结果。 通过Amoeba你能够完成多数据源的高可用、负载均衡、数据切片的功能,目前Amoeba已在很多 企业的生产线上面使用。这段是来自官网的,官网的东西一般是最正确的,这里附上官网地址:http://docs.hexnova.com/amoeba/
Amoeba for MySQL致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当query 路由功能,专注 分布式数据库 proxy 开发。座落与Client、DB Server(s)之间。对客户端透明。具有负载均衡、高可用性、Query过滤、读写分离、可路由相关的query到目标数据库、可并发请求多台数据库合并结果。 在Amoeba上面你能够完成多数据源的高可用、负载均衡、数据切片的功能。目前在很多企业的生产线上面使用。
Amoeba不能做什么:
1.暂时不支持事务 #貌似说后面会支持,但是不知道什么时候,现在官网也有一段时间没更新了
2.暂时不知道支持存储过程
3.不适合从amoeba导数据的场景或者对大数据量查询的query并不合适(比如一次请求返回10W以上甚至更多数据的场合)
4.暂时不支持分库表,amoeba目前只做到分数据库实例,每个被切分的节点需要保持库表结构一致 #例如必须insert into test(id,name)values (1,samfeng),有些自增的id习惯可以不写,但是这里必须写!
二、 部署amoeba
1.由于amoeba是运行在java环境中的,说白就是java开发的,前提你的服务器上面要有jdk,官网说要用jdk1.5的,我这里下载了jdk1.7,并且配好了环境变量。
2.下载amoeba,我下载的是zip包
#unzip amoeba.zip
#mv amoeba /usr/local/amoeba
3.配置好mysql主从,这个在上一遍博文已经做好了
master:192.168.1.60
slave: 192.168.1.54
4.配置amoeba,配置文件到amoeba目录下面的conf文件里面
由于是简单使用,所以这里就只是配置了amoeba.xml跟dbServer.xml,其实还有很多其他配置文件可以使用,如access_list.conf可以控制访问,rule.xml增强了切分的细粒度等等。
#vi dbServer.xml
....................
<dbServer name="abstractServer" abstractive="true"> #默认定义了一个统一的连接模板
<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
<property name="connectionManager">${defaultManager}</property>
<property name="sendBufferSize">64</property>
<property name="receiveBufferSize">128</property>
<!-- mysql port -->
<property name="port">3306</property>
<!-- mysql schema -->
<property name="schema">hves</property> #要进行事务使用的数据库
<!-- mysql user -->
<property name="user">proxy1</property> #数据库库用户名
<property name="password">123456</property> #密码
</factoryConfig>
.........................
<dbServer name="master" parent="abstractServer">#新增master数据库
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.1.60</property>#master ip地址
</factoryConfig>
</dbServer>
<dbServer name="slave" parent="abstractServer">#新增slave数据库
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.1.54</property>#slave ip 地址
</factoryConfig>
</dbServer>
<dbServer name="server1" virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->#有三个选择轮询、权重、高可用 <property name="loadbalance">1</property>#我想是有多台master的时候才有意义
<!-- Separated by commas,such as: server1,server2,server1 -->
<property name="poolNames">master</property>#我想是有多台master的时候才有意义
</poolConfig>
</dbServer>
<dbServer name="server2" virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
<property name="loadbalance">1</property>
<!-- Separated by commas,such as: server1,server2,server1 -->
<property name="poolNames">slave</property>
</poolConfig>
</dbServer>
#vi amoeba.xml
...................
<proxy>
<!-- service class must implements com.meidusa.amoeba.service.Service -->
<service name="Amoeba for Mysql" class="com.meidusa.amoeba.mysql.server.MySQLService">
<!-- port -->
<property name="port">8066</property>
<!-- bind ipAddress -->
<!--
<property name="ipAddress">127.0.0.1</property>#要屏蔽,开启了别的机器会访问不了,或者写自己的ip地址 -->
<property name="connectionFactory">
<bean class="com.meidusa.amoeba.mysql.net.MysqlClientConnectionFactory">
<property name="sendBufferSize">128</property>
<property name="receiveBufferSize">64</property>
</bean>
</property>
<property name="authenticateProvider">
<bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">
<property name="user">proxy1</property>
<property name="password">123456</property>
<property name="filter">
..........................
<queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
<property name="ruleLoader">
<bean class="com.meidusa.amoeba.route.TableRuleFileLoader">
<property name="ruleFile">/usr/local/amoeba/conf/rule.xml</property>
<property name="functionFile">/usr/local/amoeba/conf/ruleFunctionMap.xml</property>
</bean>
</property>
<property name="sqlFunctionFile">/usr/local/amoeba/conf/functionMap.xml</property>
<property name="LRUMapSize">1500</property>
<property name="defaultPool">server1</property>#这必须要存在,如果去掉了就报错
<property name="writePool">master</property>#读写分离
<property name="readPool">slave</property>#读写分离
<property name="needParse">true</property>
</queryRouter>
#cd ../bin
#nohup ./launcher &
这样就可以了
然后测试一下读写分离是否可以了?
60mysql>use hves;
60mysql>select * from tests;
+----+------------+
| id | name |
+----+------------+
| 1 | fengyunsen |
| 2 | samfeng |
| 3 | ssss |
| 4 | kkkk |
+----+------------+
54mysql>use hves;
54mysql>select * from tests;
+----+---------+
| id | name |
+----+---------+
| 2 | samfeng |
| 3 | ssss |
| 4 | kkkk |
+----+---------+
#mysql -u proxy1 -p -h127.0.0.1 -P8066 ----登陆到amoeba
mysql>use hves;
mysql>select * from tests;
+----+---------+
| id | name |
+----+---------+
| 2 | samfeng |
| 3 | ssss |
| 4 | kkkk |
+----+---------+
读到了54上面去了,这就证明读写分离起作用了。
其实amoeba还有很多切分方式的,如:水平切分,垂直切分等等,可以到官网看一下更加详细的介绍。
本文出自 “fengyunsen” 博客,请务必保留此出处http://samfeng.blog.51cto.com/52272/1384477
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。