windows上mysql 阿米巴 amoeba 安装使用

使用amoeba来实现mysql主从、读写分离。负载均衡。

我的另外一篇文章说明了怎么mysql主从配置。

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

下载地址:https://sourceforge.net/projects/amoeba/files/

原理图:


1.下载安装包:

我使用的是这个版本。

2.解压之后:

3.安装好java,然后配置好java环境,环境里面必须要配置JAVA_HOME,不然amoeba不能安装。

4.配置amoeba:

地址:http://docs.hexnova.com/amoeba/single-dbserver.html#id2748292

下面是原文。如果对里面的东西不懂可以搜索。或者私聊我。有空帮你解答。

校验amoeba的运行状态

根据上一章文档,相信你应该已经配置完成了Amoeba的环境。执行以下命令:

$ $AMOEBA_HOME/bin/amoeba
amoeba start|stop
请按任意键继续. . .

当出现如上提示,表示Amoeba可以正常启动。

验证数据库是否可以正常连接

要通过Amoeba来连接数据库首先数据库需要正常对外提供服务,根据不同的数据库类型按以下方式进行验证。

MySQL的情形下
$ mysql -uroot -ppassword -h127.0.0.1 -P33061
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 125
Server version: 5.5.9 MySQL Community Server (GPL)

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

1

这里只是一个命令的例子,其中-u选项后是MySQL用户名、-p选项后是MySQL密码、-h选项后是MySQL所在主机地址以及-P选项后是MySQL服务的端口号。

通过以上命令你可以验证MySQL的正常对外服务。

Caution

需要注意的是,以上命令需要在Amoeba所在的机器执行。因为iptables等配置很容易使得Amoeba无法访问MySQL。

MongoDB的情形下
$ mongo 127.0.0.1:270171
MongoDB shell version: 1.6.2
connecting to: 127.0.0.1:27017/test
> 

通过以上命令你可以验证MongoDB的正常对外服务。

1

这里只是一个mongodb登录命令的示例,其中的主机地址以及端口号需根据你的实际情况。

Caution

需要注意的是,以上命令需要在Amoeba所在的机器执行。因为iptables等配置很容易使得Amoeba无法访问mongoDB。

配置Amoeba

在这一节主要包含对Amoeba进行最基本的配置使得你可以通过Amoeba对一台数据库进行操作,当然借由这个机会本节也将对Amoeba的配置文件梗概性地介绍。

Amoeba基础配置介绍

Amoeba有哪些主要的配置文件?

  • 想象Amoeba作为数据库代理层,它一定会和很多数据库保持通信,因此它必须知道由它代理的数据库如何连接,比如最基础的:主机IP、端口、Amoeba使用的用户名和密码等等。这些信息存储在$AMOEBA_HOME/conf/dbServers.xml中。

  • Amoeba为了完成数据切分提供了完善的切分规则配置,为了了解如何分片数据、如何将数据库返回的数据整合,它必须知道切分规则。与切分规则相关的信息存储在$AMOEBA_HOME/conf/rule.xml中。

  • 当我们书写SQL来操作数据库的时候,常常会用到很多不同的数据库函数,比如:UNIX_TIMESTAMP()、SYSDATE()等等。这些函数如何被Amoeba解析呢?$AMOEBA_HOME/conf/functionMap.xml描述了函数名和函数处理的关系。

  • 对$AMOEBA_HOME/conf/rule.xml进行配置时,会用到一些我们自己定义的函数,比如我们需要对用户ID求HASH值来切分数据,这些函数在$AMOEBA_HOME/conf/ruleFunctionMap.xml中定义。

  • Amoeba可以制定一些可访问以及拒绝访问的主机IP地址,这部分配置在$AMOEBA_HOME/conf/access_list.conf中

  • Amoeba允许用户配置输出日志级别以及方式,配置方法使用log4j的文件格式,文件是$AMOEBA_HOME/conf/log4j.xml。

配置一个DB节点

以下是配置一个DB节点,使用Amoeba做操作转发的步骤:

  1. 首先,在$AMOEBA_HOME/conf/dbServers.xml中配置一台数据库,如下:

    Example 3.1. 简单的DB节点配置

    <?xml version="1.0" encoding="gbk"?>
    
    <!DOCTYPE amoeba:dbServers SYSTEM "dbserver.dtd">
    <amoeba:dbServers xmlns:amoeba="http://amoeba.meidusa.com/">
    
      <!-- 
       Each dbServer needs to be configured into a Pool,
       If you need to configure multiple dbServer with load balancing that can be simplified by the following configuration:
        add attribute with name virtual = "true" in dbServer, but the configuration does not allow the element with name factoryConfig
        such as 'multiPool' dbServer   
      -->
      
     <dbServer name="abstractServer" abstractive="true">1
      <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
       <property name="manager">${defaultManager}</property>2
       <property name="sendBufferSize">64</property>
       <property name="receiveBufferSize">128</property>
        
       <!-- mysql port -->
       <property name="port">3306</property>3
       
       <!-- mysql schema -->
       <property name="schema">test</property>4
       
       <!-- mysql user -->
       <property name="user">root</property>5
       
       <!--  mysql password -->
       <property name="password">password</property>6
    
      </factoryConfig>
    
      <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">7
       <property name="maxActive">500</property>
       <property name="maxIdle">500</property>
       <property name="minIdle">10</property>
       <property name="minEvictableIdleTimeMillis">600000</property>
       <property name="timeBetweenEvictionRunsMillis">600000</property>
       <property name="testOnBorrow">true</property>
       <property name="testWhileIdle">true</property>
      </poolConfig> 
     </dbServer>
    
     <dbServer name="server1"  parent="abstractServer">8
      <factoryConfig>
       <!-- mysql ip -->
       <property name="ipAddress">127.0.0.1</property>9
      </factoryConfig>
     </dbServer>
     
     <dbServer name="multiPool" virtual="true">10
      <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">server1</property>
      </poolConfig>
     </dbServer>
      
    </amoeba:dbServers>


    以下对这个简单的配置文件进行一些分析:

    1

    这份dbServers配置文件中,我们定义了三个dbServer元素,这是第一个dbServer元素的定义。这个名为abstractServer的dbServer,其abstractive属性为true,这意味着这是一个抽象的dbServer定义,可以由其他dbServer定义拓展。

    3 4 5 6

    在第一个dbServer元素分别定义MySQL的端口号、数据库名、用户名以及密码。

    2

    manager定义了该dbServer选择的连接管理器(ConnectionManager),这里引用了amoeba.xml的配置,稍后介绍。

    7

    dbServer下有poolConfig的元素,这个元素的属性主要配置了与数据库的连接池,与此相关的具体配置会在后面的章节中详细介绍。

    8

    命名为server1的dbServer元素,正如你设想的那样,这个server1是abstractServer的拓展,parent属性配置了拓展的抽象dbServer,它拓展了abstractServer的ipAddress属性来指名数据库的IP地址,而在端口、用户名密码、连接池配置等属性沿用了abstractServer的配置。

    9

    server1拓展了abstractServer的ipAddress属性。

    10

    这一段其实并不需要配置,并不会影响到基本使用。以下大致介绍下此配置的含义:multiPool是一个虚拟的数据库节点,可以将这个节点配置成好几台数据库组成的数据库池。比如上面这个配置中仅配置了一台server1,负载均衡策略为ROUNDROBIN(轮询)。与虚拟数据库节点相关的详细教程会在后面的章节中介绍。

    由此,你大概可以理解定义abstractServer的原因:当我们有一个数据库集群需要管理,这个数据库集群中节点的大部分信息可能是相同的,比如:端口号、用户名、密码等等。因此通过归纳这些共性定义出的abstractServer极大地简化了dbServers配置文件:

    Example 3.2. 一个利用定义抽象节点配置集群的例子

    <?xml version="1.0" encoding="gbk"?>
    
    <!DOCTYPE amoeba:dbServers SYSTEM "dbserver.dtd">
    <amoeba:dbServers xmlns:amoeba="http://amoeba.meidusa.com/">
    
     <dbServer name="abstractServerForBilling" abstractive="true">
      <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
       <property name="manager">${defaultManager}</property>
       <property name="sendBufferSize">64</property>
       <property name="receiveBufferSize">128</property>
       <property name="port">3306</property>
       <property name="schema">test</property>
       <property name="user">root</property>
       <property name="password">password</property>
      </factoryConfig>
    
      <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
       <property name="maxActive">500</property>
       <property name="maxIdle">500</property>
       <property name="minIdle">10</property>
       <property name="minEvictableIdleTimeMillis">600000</property>
       <property name="timeBetweenEvictionRunsMillis">600000</property>
       <property name="testOnBorrow">true</property>
       <property name="testWhileIdle">true</property>
      </poolConfig> 
     </dbServer>
    
     <dbServer name="billing1"  parent="abstractServer">
      <factoryConfig>
       <!-- mysql ip -->
       <property name="ipAddress">192.168.0.1</property>
      </factoryConfig>
     </dbServer>
    
     <dbServer name="billing2"  parent="abstractServer">
      <factoryConfig>
       <!-- mysql ip -->
       <property name="ipAddress">192.168.0.2</property>
      </factoryConfig>
     </dbServer>
    ......  
    </amoeba:dbServers>


  2. 再配置完dbServer.xml后,继续配置amoeba.xml文件:

    Example 3.3. 一个基本的amoeba.xml例子

    <?xml version="1.0" encoding="gbk"?>
    
    <!DOCTYPE amoeba:configuration SYSTEM "amoeba.dtd">
    <amoeba:configuration xmlns:amoeba="http://amoeba.meidusa.com/">
    
     <proxy>
     
      <!-- server class must implements com.meidusa.amoeba.service.Service -->
      <service name="Amoeba for Mysql" class="com.meidusa.amoeba.net.ServerableConnectionManager">1
       <!-- port -->
       <property name="port">8066</property>2
       
       <!-- bind ipAddress -->
       <!-- 
       <property name="ipAddress">127.0.0.1</property>3
        -->
       
       <property name="manager">${clientConnectioneManager}</property>4
       
       <property name="connectionFactory">5
        <bean class="com.meidusa.amoeba.mysql.net.MysqlClientConnectionFactory">
         <property name="sendBufferSize">128</property>
         <property name="receiveBufferSize">64</property>
        </bean>
       </property>
       
       <property name="authenticator">6
        <bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">
         
         <property name="user">root</property>7
         
         <property name="password">password</property>8
         
         <property name="filter">
          <bean class="com.meidusa.amoeba.server.IPAccessController">
           <property name="ipFile">${amoeba.home}/conf/access_list.conf</property>
          </bean>
         </property>
        </bean>
       </property>
       
      </service>
      
      <!-- server class must implements com.meidusa.amoeba.service.Service -->
      <service name="Amoeba Monitor Server" class="com.meidusa.amoeba.monitor.MonitorServer">
       <!-- port -->
       <!--  default value: random number
       <property name="port">9066</property>
       -->
       <!-- bind ipAddress -->
       <property name="ipAddress">127.0.0.1</property>
       <property name="daemon">true</property>
       <property name="manager">${clientConnectioneManager}</property>
       <property name="connectionFactory">
        <bean class="com.meidusa.amoeba.monitor.net.MonitorClientConnectionFactory"></bean>
       </property>
       
      </service>
      
      <runtime class="com.meidusa.amoeba.mysql.context.MysqlRuntimeContext">9
       <!-- proxy server net IO Read thread size -->
       <property name="readThreadPoolSize">20</property>
       
       <!-- proxy server client process thread size -->
       <property name="clientSideThreadPoolSize">30</property>
       
       <!-- mysql server data packet process thread size -->
       <property name="serverSideThreadPoolSize">30</property>
       
       <!-- per connection cache prepared statement size  -->
       <property name="statementCacheSize">500</property>
       
       <!-- query timeout( default: 60 second , TimeUnit:second) -->
       <property name="queryTimeout">60</property>
      </runtime>
      
     </proxy>
     
     <!-- 
      Each ConnectionManager will start as thread
      manager responsible for the Connection IO read , Death Detection
     -->
     <connectionManagerList>10
      <connectionManager name="clientConnectioneManager" class="com.meidusa.amoeba.net.MultiConnectionManagerWrapper">
       <property name="subManagerClassName">com.meidusa.amoeba.net.ConnectionManager</property>
       <!-- 
         default value is avaliable Processors 
       <property name="processors">5</property>
        -->
      </connectionManager>
      <connectionManager name="defaultManager" class="com.meidusa.amoeba.net.MultiConnectionManagerWrapper">
       <property name="subManagerClassName">com.meidusa.amoeba.net.AuthingableConnectionManager</property>
       
       <!-- 
         default value is avaliable Processors 
       <property name="processors">5</property>
        -->
      </connectionManager>
     </connectionManagerList>
     
      <!-- default using file loader -->11
     <dbServerLoader class="com.meidusa.amoeba.context.DBServerConfigFileLoader">
      <property name="configFile">${amoeba.home}/conf/dbServers.xml</property>
     </dbServerLoader>
     
     <queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
      <property name="ruleLoader">
       <bean class="com.meidusa.amoeba.route.TableRuleFileLoader">
        <property name="ruleFile">${amoeba.home}/conf/rule.xml</property>
        <property name="functionFile">${amoeba.home}/conf/ruleFunctionMap.xml</property>
       </bean>
      </property>
      <property name="sqlFunctionFile">${amoeba.home}/conf/functionMap.xml</property>
      <property name="LRUMapSize">1500</property>
      <property name="defaultPool">server1</property>
      
      <!--
      <property name="writePool">server1</property>
      <property name="readPool">server1</property>
      -->
      <property name="needParse">true</property>
     </queryRouter>
    </amoeba:configuration>


    1 5

    Service节点定义了需要启动的服务,在本配置中其class属性为“com.meidusa.amoeba.net.ServerableConnectionManager”,这意味着这是一个Proxy Service(就目前而言)。在这个元素下的connectionFactory元素中定义其class属性为“com.meidusa.amoeba.mysql.net.MysqlClientConnectionFactory”,这意味着这是一个MySQL Proxy Service。相应的也会有MongoDB Proxy Service以及Aladdin Proxy Service。

    2 3

    这里定义了之前我们所定义的MySQL Proxy Service的服务端口和主机地址。

    Caution

    通常Proxy Service服务的主机地址并不需要定义,如果Amoeba所在的服务器在多个网络环境内你可以定义该机器的其中一个IP来指定Amoeba所服务的网络环境。如果设置为127.0.0.1将导致其他机器无法访问Amoeba的服务。

    6 8 7

    这里配置了MySQL Proxy Service的认证器,user和passwd属性分别定义Amoeba对外服务的用户名和密码。你的程序或者数据库客户端需要使用该用户名和密码来通过Amoeba连接之前定义的dbServer。

    9

    runtime元素定义了一些Proxy相关的运行期配置,如客户端及数据库服务器端的线程数以及SQL超时时间设定等等。

    10

    connectionManagerList定义了一系列连接管理器,这些连接管理器可以在其他地方被引用,比如clientConnectioneManager在amoeba.xml中被引用作为MySQL Proxy Service的客户端连接管理器;defaultManager在dbServers.xml中被引用作为dbServer的数据库服务器端连接管理器。连接管理器主要配置了用于网络处理的CPU核数,默认其processor属性为Amoeba所在主机的CPU核数。

    11

    最后一部分dbServerLoader定义了dbServers.xml的位置。queryRouter定义了规则配置及函数配置等相关文件的位置。

运行及验证

至此你应该已经可以通过Amoeba来连接MySQL数据库了,可以按照以下步骤尝试使用:

$ mysql -uroot -ppassword -h127.0.0.1 -P3306
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 125
Server version: 5.5.9 MySQL Community Server (GPL)

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create table `test`.`staff`( 1
    ->    `ID` int NOT NULL AUTO_INCREMENT, 
    ->    `NAME` varchar(10), 
    ->    PRIMARY KEY (`ID`)
    -> );
Query OK, 0 rows affected (0.00 sec)
mysql> use test
Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| staff          |
+----------------+
1 row in set (0.00 sec)

1

通过这个命令在test数据库中创建了STAFF表,这里连接的是真实的MySQL数据库。

接下来启动Amoeba:

$ amoeba start
log4j:WARN log4j config load completed from file:C:\amoeba-mysql-binary-2.0.1-BETA\bin\..\conf\log4j.xml
log4j:WARN ip access config load completed from file:C:\amoeba-mysql-binary-2.0.1-BETA\bin\../conf/access_list.conf
2011-03-04 10:17:36,942 INFO  net.ServerableConnectionManager - Amoeba for Mysql listening on 0.0.0.0/0.0.0.0:8066.
2011-03-04 10:17:36,958 INFO  net.ServerableConnectionManager - Amoeba Monitor Server listening on /127.0.0.1:55916.

启动Amoeba后这次通过mysql客户端来连接Amoeba,注意端口从真实的MySQL端口3306改为Amoeba端口8066:

$ mysql -uroot -ppassword -h127.0.0.1 -P8066
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 27778511
Server version: 5.1.45-mysql-amoeba-proxy-2.0.1-BETA MySQL Community Server (GPL)1

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use test;
Database changed
mysql> INSERT INTO test.staff (ID, NAME)2
    -> VALUES (12345, 'Daisy Li.');
Query OK, 1 row affected (0.03 sec)

mysql> SELECT * FROM test.staff LIMIT 0, 50;3
+-------+-----------+
| ID    | NAME      |
+-------+-----------+
| 12345 | Daisy Li. |
+-------+-----------+
1 row in set (0.00 sec)

mysql> 

1

通过Server version可以得知连接的是Amoeba实例而不是MySQL实例。

2

通过Amoeba执行插入操作。

3

查询,验证之前的插入操作正确。

以上是通过Amoeba对一个数据库实例进行操作的整个过程。可以由此得知:Amoeba是一款优秀且透明的数据库中间层,如果你不习惯用命令行的方式操作数据库,你甚至可以尝试一些GUI数据库管理工具,经过使用大多数GUI工具兼容Amoeba。



5.使用cd进入amoeba的bin目录:

6.安装

输入 amoeba start   如果没有安装就会安装,然后开启。

我的是已经安装好了,显示:

如果有报错,就找报错的提示,进行配置文件的修改,90%都是自己配置文件出错。

成功之后可以使用amoeba提供的地址,账户,密码,让客户端连接amoeba,由amoeba来管理数据库的连接。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值