码迷,mamicode.com
首页 > 数据库 > 详细

Amoeba+Mysql 实现读写分离

时间:2016-09-02 08:51:27      阅读:464      评论:0      收藏:0      [点我收藏+]

标签:

About Amoeba
Amoeba可译为阿米巴、变型虫
Amoeba是一个开源项目,致力于Mysq的分布式数据库前端代理层
Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy。它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行。
Amoeba相当于一个SQL请求的路由器,目的是为负载均衡、读写分离、高可用性提供机制,而不是完全实现它们。用户需要结合使用MySQL的Replication等机制来实现副本同步等功能
通过Amoeba可以实现数据源的高可用、负载均衡、数据切片等功能
与MySQL官方的MySQL Proxy相比,amoeba配置更方便(基于XML的配置文件,用SQLJEP语法书写规则,比基于lua脚本的MySQL Proxy简单)
Amoeba对底层数据库连接管理和路由实现也采用了可插拨的机制,第三方可以开发更高级的策略类来替代作者的实现,这个程序总体上比较符合KISS原则的思想。

Amoeba主要的解决的问题有:
• 降低 数据切分带来的复杂多数据库结构
• 提供切分规则并降低 数据切分规则 给应用带来的影响
• 降低db 与客户端的连接数
• 读写分离

 

实验架构图

       技术分享

实验环境

主机名 操作系统版本 Mysql版本 主机IP 其他版本说明
lyj1(Master) Red Hat release 6.5 Mysql5.6.31 10.0.100.201  
lyj2(Slave) Red Hat release 6.5 Mysql5.6.31 10.0.100.202  
lyj3(Amoeda) Red Hat release 6.5 Mysql5.6.31 10.0.100.204 jdk-8u101-linux-i586.tar.gz、amoeba-mysql-1.3.1-BETA.zip

 

安装jdk(Amoeba是基于JavaSE1.5开发的因此需要Java环境)

//要看清系统的位数下载对应版本
# getconf LONG_BIT
32
//下载地址http://www.oracle.com/technetwork/java/javase/downloads/index.html
# tar xvf jdk-8u101-linux-i586.tar.gz
# cp jdk1.8.0_101/  /Amoeba -r
# vim /etc/profile
  export JAVA_HOME=/Amoeba/jdk1.8.0_101
  export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH
  export PATH=$JAVA_HOME/bin:$PATH
# source /etc/profile
# java -version
  java version "1.8.0_101"
  Java(TM) SE Runtime Environment (build 1.8.0_101-b13)
  Java HotSpot(TM) Client VM (build 25.101-b13, mixed mode)

 

安装Amoeba

//Amoeba安装非常简单,解压即可使用
# mkdir /usr/local/amoede
# unzip amoeba-mysql-1.3.1-BETA.zip -d /usr/local/amoeba/
# chmod -R +x /usr/local/amoeba/bin/

 

Amoeba的配置

1. 为Amoeba访问集群中所有Mysql数据库节点新建用户与授权

//注意每个Mysql服务器都要设置有 
-> grant all privileges on *.* to ‘amoeba‘@‘%‘ identified by ‘amoeba123‘;
-> flush privileges;

2. Amoeba For MySQL 的使用非常简单,所有的配置文件都是标准的XML 文件,总共有四个配置文件。分别为:

  • amoeba.xml:主配置文件,配置所有数据源以及Amoeba 自身的参数设置(实现主从的话配置这个文件就可以了)
  • rule.xml:配置所有Query 路由规则的信息
  • functionMap.xml:配置用于解析Query 中的函数所对应的Java 实现类
  • rullFunctionMap.xml:配置路由规则中需要使用到的特定函数的实现类

3. 书写Amoeba.xml配置文件

技术分享
<?xml version="1.0" encoding="gbk"?>

<!DOCTYPE amoeba:configuration SYSTEM "amoeba.dtd">
<amoeba:configuration xmlns:amoeba="http://amoeba.meidusa.com/">

    <server>
        <!-- proxy server绑定的端口 -->
        <property name="port">9006</property>
        
        <!-- proxy server绑定的IP -->
        
        <property name="ipAddress">10.0.100.204</property>
         
        <!-- 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>
        
        <!-- socket Send and receive BufferSize(unit:K)  -->
        <property name="netBufferSize">128</property>
        
        <!-- Enable/disable TCP_NODELAY (disable/enable Nagle‘s algorithm). -->
        <property name="tcpNoDelay">true</property>
        
        <!-- 对外验证的用户名 -->
        <property name="user">root</property>
        
        <!-- 对外验证的密码 -->
        
        <property name="password">123456</property>
        
        
        <!-- query timeout( default: 60 second , TimeUnit:second) -->
        <property name="queryTimeout">60</property>
    </server>
    
    <!-- 
        每个ConnectionManager都将作为一个线程启动。
        manager负责Connection IO读写/死亡检测
    -->
    <connectionManagerList>
        <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>
    
    <dbServerList>
        <!-- 
            一台mysqlServer 需要配置一个pool,
            如果多台 平等的mysql需要进行loadBalance, 
            平台已经提供一个具有负载均衡能力的objectPool:com.meidusa.amoeba.mysql.server.MultipleServerPool
            简单的配置是属性加上 virtual="true",该Pool 不允许配置factoryConfig
            或者自己写一个ObjectPool。
        -->
        <dbServer name="server1">
            
            <!-- PoolableObjectFactory实现类 -->
            <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
                <property name="manager">defaultManager</property>
                
                <!-- 真实mysql数据库端口 -->
                <property name="port">3306</property>
                
                <!-- 真实mysql数据库IP -->
                <property name="ipAddress">10.0.100.201</property>
                <property name="schema">test</property>
                
                <!-- 用于登陆mysql的用户名 -->
                <property name="user">amoeba</property>
                
                <!-- 用于登陆mysql的密码 -->
                <property name="password">amoeba123</property>
                
                
            </factoryConfig>
            
            <!-- ObjectPool实现类 -->
            <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
                <property name="maxActive">200</property>
                <property name="maxIdle">200</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="server2">
            
            <!-- PoolableObjectFactory实现类 -->
            <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
                <property name="manager">defaultManager</property>
                
                <!-- 真实mysql数据库端口 -->
                <property name="port">3306</property>
                
                <!-- 真实mysql数据库IP -->
                <property name="ipAddress">10.0.100.202</property>
                <property name="schema">test</property>
                
                <!-- 用于登陆mysql的用户名 -->
                <property name="user">amoeba</property>
                
                <!-- 用于登陆mysql的密码 -->
                <property name="password">amoeba123</property>
                
                
            </factoryConfig>
            
            <!-- ObjectPool实现类 -->
            <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
                <property name="maxActive">200</property>
                <property name="maxIdle">200</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="master" virtual="true">
            <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
                <!-- 负载均衡参数 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
                <property name="loadbalance">1</property>
                
                <!-- 参与该pool负载均衡的poolName列表以逗号分割 -->
                <property name="poolNames">server1</property>
            </poolConfig>
        </dbServer>
        
        <dbServer name="slave" virtual="true">
            <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
                <!-- 负载均衡参数 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
                <property name="loadbalance">1</property>
                
                <!-- 参与该pool负载均衡的poolName列表以逗号分割 -->
                <property name="poolNames">server1,server2</property>
            </poolConfig>
        </dbServer>        
        
    </dbServerList>
    
    <queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
        <property name="ruleConfig">${amoeba.home}/conf/rule.xml</property>
        <property name="functionConfig">${amoeba.home}/conf/functionMap.xml</property>
        <property name="ruleFunctionConfig">${amoeba.home}/conf/ruleFunctionMap.xml</property>
        <property name="LRUMapSize">1500</property>
        
        <property name="defaultPool">master</property>
        <property name="writePool">master</property>
        <property name="readPool">slave</property>
        
        <property name="needParse">true</property>
    </queryRouter>
</amoeba:configuration>
amoeba.xml参考配置文件

4. 启动Amoeba与常见报错说明

# cd /usr/local/amoeba/bin/
# nohup bash -x amoeba &
# cat nohup.out
   2016-08-18 22:37:27,675 INFO  net.ServerableConnectionManager - Server listening on /10.0.100.204:9006.   ->出现这条说明成功
# netstat -tulnp|grep java
tcp 0 0 ::ffff:10.0.100.204:9006 :::* LISTEN 10664/java ->关闭Amoeba就是kill这个进程即可

常见报错1:
The stack size specified is too small, Specify at least 228k
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
解决1:
# vim /usr/local/amoeba/bin/amoeba
#DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss128k"  注释掉这行
DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss256k"   增加并修改这行

常见错误2:
org.xml.sax.SAXParseException; lineNumber: 406;columnNumber: 6; 注释中不允许出现字符串 "--"
解决2:
要注意注释两边注释两边要有空格才行
<!--  实体类路径和名   -->

此外的报错应该思考:
先尝试着用amoeba是不是可以登录Mysql、权限设置是否正确等
配置文件中要注意细节不要出错

 

Amoeba+Mysql 实现读写分离

标签:

原文地址:http://www.cnblogs.com/snsdzjlz320/p/5786022.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!