zoukankan      html  css  js  c++  java
  • 基于amoeba实现mysql数据库的读写分离/负载均衡

    一、Amoeba的简述:[来自百度百科]

         Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy。它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行。基于此可以实现负载均衡、读写分离、高可用性等需求。与MySQL官方的MySQL Proxy相比,作者强调的是amoeba配置的方便(基于XML的配置文件,用SQLJEP语法书写规则,比基于lua脚本的MySQL Proxy简单)。
         Amoeba相当于一个SQL请求的路由器,目的是为负载均衡、读写分离、高可用性提供机制,而不是完全实现它们。用户需要结合使用MySQL的 Replication等机制来实现副本同步等功能。amoeba对底层数据库连接管理和路由实现也采用了可插拨的机制,第三方可以开发更高级的策略类来替代作者的实现。这个程序总体上比较符合KISS原则的思想。目前 Amoeba 已在很多 企业的生产线上面使用。
    二、Amoeba解决的问题及目前存在的劣势:
    1.主要解决的问题:
      (1). 数据切分后复杂数据源整合
      (2). 提供数据切分规则并降低数据切分规则给数据库带来的影响
      (3). 降低数据库与客户端连接
      (4). 读写分离路由
    2.劣势:
      (1).目前还不支持事务
      (2).暂时不支持存储过程(近期会支持)
      (3).不适合从amoeba导数据的场景或者对大数据量查询的query并不合适(比如一次请求返回10w以上甚至更多数据的场合)
      (4).暂时不支持分库分表,amoeba目前只做到分数据库实例,每个被切分的节点需要保持库表结构一致
    三、基于 Amoeba 实现mysql数据库读写分离的配置
    1.测试环境,amoeba的要求,软件提供,简要原理图:
      (1).测试环境:
           红帽6.3系统
           amoeba服务器地址:192.168.1.104
           mysql数据库:192.168.1.102:3306(master -- rw)/192.168.1.100:3306(slave -- r)
           注:为了方便测试读写分离,我这里是不配置主从。
      (2).amoeba的要求:
           Amoeba 是基于 java 开发,所以如果要运行 Amoeba,必须先安装 jdk 以便可以运行
      (3).软件下载:[大家可以到http://www.oschina.net/p/amoeba (开源中国)下载]
          当前测试环境使用的amoeba软件下载地址:http://www.kuaipan.cn/file/id_119710994921422890.htm
          amoeba参考手册:http://docs.hexnova.com/amoeba/
          amoeba项目代码:http://sourceforge.net/projects/amoeba/files/
      (4).简要原理图:
    spacer.gif222358593.jpg
    2.我们这里将amoeba相关软件放在/tmp目录下,这里我们先配置JDK
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    # 解压JDK软件到/usr/local目录下
    [root@centos tmp]# tar -xf jdk-7u15-linux-x64.tar.gz  -C /usr/local/
    # 进入相应目录,并建立java目录
    [root@centos tmp]# cd /usr/local/
    [root@centos local]# mkdir java
    # 将解压出来的内容移到java目录
    [root@centos local]# mv jdk1.7.0_15/*  java
    # 设置java环境变量
    [root@centos local]# echo 'export JAVA_HOME=/usr/local/java' >> ~/.bashrc
    [root@centos local]# . ~/.bashrc
    # 测试jdk是否正确安装
    [root@centos local]#  java -version
    # *******************************
    # 以下这个方法设置JDK[在下面设置amoeba时,会覆盖,所以这里的配置文件,以最下面amoeba的配置为准]
    [root@centos java]# echo $JAVA_HOME
    [root@centos java]# vim /etc/profile
    # 在末尾添加
    export JAVA_HOME=/usr/locla/java
    export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
    [root@centos java]# source /etc/profile
    # *******************************
    3.配置amoeba中的dbServer.xml(后端mysql 服务器连接配置)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    [root@centos java]# cd /tmp/
    # 建立相应amoeba目录
    [root@centos tmp]# mkdir /usr/local/amoeba
    # 将压缩包解压到指定目录
    [root@centos tmp]# tar -xf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba
    [root@centos tmp]# cd /usr/local/amoeba/
    [root@centos amoeba]# cd conf/
    # 准备修改配置文件
    #/*  以下部分为注解
    #/*  Amoeba总共有7个配置文件,分别如下:
    #/*  Amoeba主配置文件($AMOEBA_HOME/conf/amoeba.xml),用来配置Amoeba服务的基本参数,如Amoeba主机地址、端口、认证方式、用于连接的用户名、密码、线程数、超时时间、其他配置文件的位置等。
    #/*  数据库服务器配置文件($AMOEBA_HOME/conf/dbServers.xml),用来存储和配置Amoeba所代理的数据库服务器的信息,如:主机IP、端口、用户名、密码等。
    #/*  切分规则配置文件($AMOEBA_HOME/conf/rule.xml),用来配置切分规则。
    #/*  数据库函数配置文件($AMOEBA_HOME/conf/functionMap.xml),用来配置数据库函数的处理方法,Amoeba将使用该配置文件中的方法解析数据库函数。
    #/*  切分规则函数配置文件($AMOEBA_HOME/conf/ruleFunctionMap.xml),用来配置切分规则中使用的用户自定义函数的处理方法。
    #/*  访问规则配置文件($AMOEBA_HOME/conf/access_list.conf),用来授权或禁止某些服务器IP访问Amoeba。
    #/*  日志规格配置文件($AMOEBA_HOME/conf/log4j.xml),用来配置Amoeba输出日志的级别和方式。
    # 配置后端mysql 服务器连接[dbServer.xml]
    [root@centos conf]# vim dbServers.xml
    .........................(省略)
            <dbServer name="abstractServer" 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>
    # 设置 mysql 数据库的端口
                            <!-- mysql port -->
                            <property name="port">3306</property>
    # 设置缺省的数据库,当连接amoeba时,操作表必须显式的指定数据库名,即采用dbname.tablename的方式,
    # 不支持 use dbname指定缺省库,因为操作会调度到各个后端dbserver
                            <!-- mysql schema -->
                            <property name="schema">kongzhong</property>
     # 设置amoeba连接后端数据库服务器的账号和密码,需在后端数据库器上创建该用户,并授权amoeba连接
                            <!-- mysql user -->
                            <property name="user">kongzhong123</property>
                            <!--  mysql password -->
                            <property name="password">kongzhong123</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="testOnReturn">true</property>
                            <property name="testWhileIdle">true</property>
                    </poolConfig>
            </dbServer>
     # 设置一个后端的dbServer,名为master ,这个可以随便取,但是为了明确其含义,最好给予特殊含义的单词,这里是主DB SERVER
            <dbServer name="master"  parent="abstractServer">
                    <factoryConfig>
     # 设置这台DB server 的ip地址
                            <!-- mysql ip -->
                            <property name="ipAddress">192.168.1.102</property>
                    </factoryConfig>
            </dbServer>
    # 再设置一台后端mysql数据库,这里叫slave,名字需要唯一[这里可以创建N个后端数据库,只要复制下面<dbServer>...</dbServer>]
            <dbServer name="slave"  parent="abstractServer">
                    <factoryConfig>
    # 设置这台DB server 的ip地址
                            <!-- mysql ip -->
                            <property name="ipAddress">192.168.1.100</property>
                    </factoryConfig>
            </dbServer>
    # 指定一个虚拟的dbServer,将上面定义的dbserver加入这个虚拟的dbserver,相当于组成一个组[这里我们将读的数据库组成一个组]
    # 这里 需要将 name="mul..." 改成自己想要取的名字,这个名字也需要有含义,后面会用到
            <dbServer name="ReadPool" virtual="true">
                    <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
                            <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
    # 选择调度算法 1 是轮询 2 是权重 3 是HA 这里选择1 轮询
                            <property name="loadbalance">1</property>
                            <!-- Separated by commas,such as: server1,server2,server1 -->
    # 负载均衡,slave1,slave2当成2个服务器进行调度,这模拟量加权的调度算法。
    # 注意这里使用的dbserver必须是已经定义了的,可以写多个,如slave1,slave2
                            <property name="poolNames">slave</property>
                    </poolConfig>
            </dbServer>
    </amoeba:dbServers>
    4. 配置 Amoeba 监听端口[amoeba.xml]
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    [root@centos conf]# vim amoeba.xml
    .........................(省略)
            <proxy>
                    <!-- service class must implements com.meidusa.amoeba.service.Service -->
                    <service name="Amoeba for Mysql" class="com.meidusa.amoeba.net.ServerableConnectionManager">
                            <!-- port -->
     # 设置amoeba监听的端口(这里如果默认,后面测试需要指定端口,就是这里的端口)
                            <property name="port">3306</property>
                            <!-- bind ipAddress -->
                            <!--
     # 设置监听的接口,如果不设置,则监听所有的IP[选择默认]
                            <property name="ipAddress">127.0.0.1</property>
                             -->
    .........................(省略)
                            <property name="authenticator">
                                    <bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">
    # 提供客户端连接amoeba时需要使用这里设定的账号 (这里的账号密码和amoeba连接后端数据库服务器的密码无关)
                                            <property name="user">kongzhong</property>
    # 提供客户端连接amoeba时需要使用这里设定的密码
                                            <property name="password">kongzhong</property>
                                            <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>
    .........................(省略)
            <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">master</property>
                    <!--                 -->
    # 把默认注释掉的读写分离选项,把注释去掉并readpool修改成ReadPool(这个名字,我们前面在dbServer.xml里设置一个读数据库组,这里是作为只读池)
                    <property name="writePool">master</property>
                    <property name="readPool">ReadPool</property>
                    <property name="needParse">true</property>
            </queryRouter>
    5. 配置amoeba及JAVA的环境变量
    1
    2
    3
    4
    5
    [root@centos conf]# vim /etc/profile
    JAVA_HOME=/usr/locla/java
    AMOEBA_HOME=/usr/local/amoeba
    export PATH=$PATH:$AMOEBA_HOME/bin:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
    [root@centos conf]# source /etc/profile
    6.启动amoeba测试
    1
    2
    3
    4
    5
    6
    # 如果确认能够正常启动,就加>>/dev/null 否则还是看一下提示信息
    [root@centos conf]# amoeba start & >>/dev/null
    # 检测启动情况
    [root@centos conf]# netstat -tulnp |grep java
    # 停止amoeba测试指令是否可用
    [root@centos conf]# amoeba stop
    7.在两台数据库做刚才设置中的相应操作
    (1).在主DB server上操作
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 建立配置文件指定的数据库
    mysql> create database kongzhong;
    mysql> use kongzhong
    # 创建用于测试的表
    mysql> create table t1(name varchar(10));
    # 插入测试数据
    mysql> insert into t1 values('102');
    # 授予amoeba用户连接数据库的权限
    mysql> grant all privileges on kongzhong.* to 'kongzhong123'@'192.168.1.104' identified by 'kongzhong123';
    mysql> flush privileges;
    (2).在从DB server上操作
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 建立配置文件指定的数据库
    mysql> create database kongzhong;
    mysql> use kongzhong
    # 创建用于测试的表
    mysql> create table t1(name varchar(10));
    # 插入测试数据
    mysql> insert into t1 values('100');
    # 授予amoeba用户连接数据库的权限
    mysql> grant all privileges on kongzhong.* to 'kongzhong123'@'192.168.1.104' identified by 'kongzhong123';
    mysql> flush privileges;
    8.在任何一台机器上登陆测试,这里的ip地址指向amoeba所在服务器的ip地址
    1
    2
    3
    4
    # 登陆相应数据库,查询当前所在数据库(相应大家都应该懂的,就不详细演示了)
    [root@client102 ~]# mysql -ukongzhong -p -h192.168.1.104
    [root@client100 ~]# mysql -ukongzhong -p -h192.168.1.104
    [root@client104 ~]# mysql -ukongzhong -p -h192.168.1.104
     
    9.遇到的问题
    (1).报错1:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    The stack size specified is too small, Specify at least 160k
    Error: Could not create the Java Virtual Machine.
    Error: A fatal exception has occurred. Program will exit.
    解决方法:
    [root@centos bin]# cd /usr/local/amoeba/
    # 修改配置文件
    [root@centos amoeba]# vim bin/amoeba
    将下面这行
    DEFAULT_OPTS="-server -Xms1024m -Xmx1024m -Xss128k"
    修改为:
    DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss256k"
    (2).报错2:
    1
    2
    3
    4
    Error: JAVA_HOME environment variable is not set.
    解决方法:
    [root@centos local]# echo 'export JAVA_HOME=/usr/local/java' >> ~/.bashrc
    [root@centos local]# . ~/.bashrc
    10.需要注意的问题,思路延伸
    (1).取消日志生成,不然磁盘容易爆满
    1
    2
    3
    4
    5
    [root@centos conf]# vim log4j.xml [此文件在amoeba目录下的conf目录下]
    修改log4j.xml 取消日志文件生成(太大了,磁盘很容易满)
    <param name="file" value="${amoeba.home}/logs/project.log"/>
    改成
    <param name="file" value="<![CDATA[${amoeba.home}/logs/project.log>/dev/null]]>"/>
    (2).性能优化
    1
    2
    3
    4
    [root@centos amoeba]# vim bin/amoeba
    DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss128k"
    改成
    DEFAULT_OPTS="-server -Xms512m -Xmx512m -Xmn100m -Xss1204k"
  • 相关阅读:
    梳理一下自己的技术关注面[转]
    在SharePoint 2010系统中安装RBS FILESTREAM Provider
    53套SharePoint 2010站点模版在线演示及下载
    sharepoint form认证下的当前在线用户统计和当日浏览量的统计
    MOSS部署常用的stsadm命令行
    asp.net实现伪静态的几种常用的方法
    新闻滚动效果JQuery实现
    百度编辑器Ueditor的使用
    新闻滚动JS
    SQL分页笔记
  • 原文地址:https://www.cnblogs.com/fx2008/p/4092884.html
Copyright © 2011-2022 走看看