Amoeba for MySQL的读写分离配置

作者:鱼在天上游  发布日期:2014-05-20 08:36:19

一、Amoeba概述

1、amoeba简介

Amoeba是一个类似MySQL Proxy的分布式数据库中间代理层软件,是由陈思儒开发的一个开源的java项目。其主要功能包括读写分离,垂直分库,水平分库等,经过测试,发现其功能和稳定性都非常的不错,如果需要构架分布式数据库环境,采用Amoeba是一个不错的方案。目前Amoeba一共包括For aladdin,For MySQL和For Oracle三个版本,本文主要关注For MySQL版本的一个读写分离实现。

Amoeba处于在应用和数据库之间,扮演一个中介的角色,将应用传递过来的SQL语句经过分析后,将写的语句交给Master库执行,将读的语句路由到Slave库执行(当然也可以到Master读,这个完全看配置)。Amoeba实现了简单的负载均衡(采用轮询算法)和Failover。如果配置了多个读的库,则任何一个读的库出现宕机,不会导致整个系统故障,Amoeba能自动将读请求路由到其他可用的库上,当然,写还是单点的依赖于Master数据库的,这个需要通过数据库的切换,或者水平分割等技术来提升Master库的可用性。

 

2、amoeba与mysql-proxy的区别

在MySQL proxy 6.0版本上面如果想要读写分离并且读集群、写集群机器比较多情况下,用mysql proxy 需要相当大的工作量,目前mysql proxy没有现成的 lua脚本。mysql proxy根本没有配置文件, lua脚本就是它的全部,当然lua是相当方便的。那么同样这种东西需要编写大量的脚本才能完成一 个复杂的配置。而Amoeba只需要进行相关的配置就可以满足需求。

wKiom1N56-_ThsOOAACHTdXnoRY687.jpg

 

二、实验环境

服务器角色 IP地址 安装软件 功用 操作系统
主服务器 172.16.8.1 mysql 可读写 centos6.5
从服务器 172.16.8.2 mysql 只可读,与主服务器做读的负载均衡 centos6.5
读写分离服务器 172.16.8.3 amoeba 实现读写分离,将写操作发往主服务器,将读操作进行负载均衡! centos6.5

 

三、amoeba的详细配置

1、主从服务器的配置

在主服务器上安装mysql

#yum-yinstallmysqlmysql-server

 

修改配置文件:

#vim/etc/my.cnf
//添加如下:
server-id=1

 

  • 启动mysql,并 创建授权账户

    #servicemysqldstart
    #mysql
    mysql>grantreplicationslave,replicationclienton*.*to"gulong"@'172.16.8.2'identifiedby'123';
    mysql>flushprivileges;

     

    从服务器上的也安装mysql

    #yum-yinstallmysqlmysql-server

     

    • 修改配置文件:

      #vim/etc/my.cnf
      //添加如下:
      server-id=2
      relay_log=relay_bin

       

      • 启动mysql,连接主服务器

        #servicemysqldstart
        #mysql
        mysql>changemastertomaster_host='172.16.8.1',master_user='gulong',master_password='123'

         

        • 查看主从状态:

          mysql>startslave;
          mysql>showslavestatus\G;

          wKioL1N5_0-ikOXMAAL4ujA0L78776.jpg

          到此,主从服务器配置好了!

           

          2、amoeba的配置

          首先下载jdk与amoeba安装包:

          jdk

          amoeba

           

          • 安装jdk:

            #chmod+xjdk-6u31-linux-x64-rpm.bin
            #./jdk-6u31-linux-x64-rpm.bin
            #vim/etc/profile.d/java.sh
            //添加如下内容:
            exportJAVA_HOME=/usr/java/latest
            exportPATH=$JAVA_HOME/bin:$PATH
            #./etc/profile.d/java.sh

             

            查看java状态:

            wKiom1N6AjOTCK1CAACLxY7v5ic182.jpg

             

            安装amoeba:

            #mkdir/usr/local/amoeba
            #tarxfamoeba-mysql-binary-2.2.0.tar.gz-C/usr/local/amoeba/
            #cd/usr/local/amoeba/

            Amoeba for MySQL的使用是很简单的,主要是通过xml文件来实现的。1. 配置文件介绍:(1.) dbServers.xml 想象Amoeba作为数据库代理层,它一定会和很多数据库保持通信,因此它必须知道由它代理的数据库如何连接,比如最基础的:主机IP、端口、Amoeba使用的用户名和密码等等。这些信息存储在$AMOEBA_HOME/conf/dbServers.xml中。

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

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

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

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

            (6.) log4j.xml Amoeba允许用户配置输出日志级别以及方式,配置方法使用log4j的文件格式,文件是$AMOEBA_HOME/conf/log4j.xml。其中,我们主要用到dbServer.xml 和 amoeba.xml 。

             

            • 修改ameoba.xml配置文件

              [root@node1~]#cd/usr/local/amoeba/conf/
              [root@node1conf]#vimamoeba.xml

              wKiom1N6BGSheZzKAAOu5Zluq3k515.jpg

              wKioL1N6CE6wO8zYAASyhlALdtg922.jpg

               

              • 修改dbServers.xml 配置文件

                [root@node1conf]#vimdbServers.xml
                //修改如下:
                <?xmlversion="1.0"encoding="gbk"?>
                
                <!DOCTYPEamoeba:dbServersSYSTEM"dbserver.dtd">
                <amoeba:dbServersxmlns:amoeba="http://amoeba.meidusa.com/">
                
                <!--
                EachdbServerneedstobeconfiguredintoaPool,
                IfyouneedtoconfiguremultipledbServerwithloadbalancingthatcanbesimplifiedbythefollowingconfiguration:
                addattributewithnamevirtual="true"indbServer,buttheconfigurationdoesnotallowtheelementwithnamefactoryConfig
                suchas'multiPool'dbServer
                -->
                
                <dbServername="abstractServer"abstractive="true">
                <factoryConfigclass="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
                <propertyname="manager">${defaultManager}</property>
                <propertyname="sendBufferSize">64</property>
                <propertyname="receiveBufferSize">128</property>
                
                <!--mysqlport-->
                <propertyname="port">3306</property>
                
                <!--mysqlschema-->
                <propertyname="schema">test</property>
                
                <!--mysqluser-->
                //设置连接后端数据库的账户密码,需要在主mysql上授权
                <propertyname="user">root</property>
                <propertyname="password">admin</property>
                <!--mysqlpassword
                <propertyname="password">password</property>
                -->
                </factoryConfig>
                
                <poolConfigclass="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
                <propertyname="maxActive">500</property>
                <propertyname="maxIdle">500</property>
                <propertyname="minIdle">10</property>
                <propertyname="minEvictableIdleTimeMillis">600000</property>
                <propertyname="timeBetweenEvictionRunsMillis">600000</property>
                <propertyname="testOnBorrow">true</property>
                <propertyname="testOnReturn">true</property>
                <propertyname="testWhileIdle">true</property>
                </poolConfig>
                </dbServer>
                
                //将172.16.8.1添加为master主服务器
                <dbServername="master"parent="abstractServer">
                <factoryConfig>
                <!--mysqlip-->
                <propertyname="ipAddress">172.16.8.1</property>
                </factoryConfig>
                </dbServer>
                
                //172.16.8.2添加为从的slave服务器
                <dbServername="slave"parent="abstractServer">
                <factoryConfig>
                <!--mysqlip-->
                <propertyname="ipAddress">172.16.8.2</property>
                </factoryConfig>
                </dbServer>
                
                //将master与slave添加为一个mysql集群,命名为readservers,采用轮询的负载均衡机制
                <dbServername="readservers"virtual="true">
                <poolConfigclass="com.meidusa.amoeba.server.MultipleServerPool">
                <!--Loadbalancingstrategy:1=ROUNDROBIN,2=WEIGHTBASED,3=HA-->
                <propertyname="loadbalance">1</property>
                //1代表轮询
                <!--Separatedbycommas,suchas:server1,server2,server1-->
                <propertyname="poolNames">master,slave</property>
                </poolConfig>
                </dbServer>
                
                </amoeba:dbServers>

                 

                • 在主mysql服务器上授权远程连接账户:

                  mysql>grantallon*.*to"root"@'172.16.%.%'identifiedby'admin';
                  mysql>flushprivileges;

                   

                   

                  • 启动amoeba,并测试:

                    [root@node1bin]#cd/usr/local/amoeba/
                    [root@node1bin]#./amoebastart
                    [root@node1~]#mysql-uroot-pmypass-h172.16.8.3

                    wKiom1N6C1SS6caAAAF2uxH1thY499.jpgwKioL1N6C2-RYrSWAAIHTG648mw897.jpg

                     

                    3、测试:

                    连接amoeba

                    创建数据库,

                    MySQL[mysql]>createdatabasewb;//创建数据库
                    MySQL[mysql]>selectuser,passwordfrommysql.user;//查询数据库
                    MySQL[mysql]>showdatabases;

                    可以通过使用tcpdump在master、slave服务器上抓包,创建一个数据库,并多使用几次查询语句,验证写操作是否被调度至master(172.16.8.1),而读操作会以轮叫的方式调度至master和slave,可以分摊mysql的读请求!

                    [root@localhost~]#tcpdump-ieth0-nn-XXipdsthost172.16.8.1andtcpdstport3306
                    [root@localhost~]#tcpdump-ieth0-nn-XXipdsthost172.16.8.2andtcpdstport3306

                    wKiom1N6ELahVl17AAXEoqXrFJg612.jpgwKioL1N6EL7Rw8MbAAeuR2GzYXs528.jpg

                     

                    至此,基于amoeba的读写分离已经介绍完毕,不足之处,请多加指点!

    Tag标签: MySQL  
    • 专题推荐

    About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
    本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规