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 for mysql 使用日志

   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 for mysql 使用日志

      由于是简单使用,所以这里就只是配置了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

amoeba for mysql 使用日志,布布扣,bubuko.com

amoeba for mysql 使用日志

上一篇:数据库WMI 0x80041010 如何解决?


下一篇:ORA-20079: full resync from primary database is not done