Amoeba实现Mysql主从复制读写分离

本文介绍AmoebaforMySQL的安装与配置方法,并详细解释如何利用Amoeba实现MySQL的读写分离,提高数据库访问效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.简介
    Amoeba for MySQL致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当query 路由功能,专注 分布式数据库 proxy 开发。位于与Client、DB Server(s)之间。对客户端透明。具有负载均衡、高可用性、Query过滤、读写分离、可路由相关的query到目标数据库、可并发请求多台数据库合并结果。 在Amoeba上面你能够完成多数据源的高可用、负载均衡、数据切片的功能。目前在很多企业的生产线上面使用。
主要解决:
    *降低数据切片带来的复杂多数据库结构
    *提供切分规则并降低数据切分规则给应用带来的影响
    *降低db与客户端的连接数
    *读写分离,负载均衡

二.amoeba读写分离原理图

三.安装amoeba
先决条件:
   1.Java SE 1.5或以上
   2.支持mysql4.1以后的版本
   3.网络环境至少运行了一个mysql4.1以上的服务

1.安装java运行环境
Amoeba框架是基于Java SE1.5开发的,因此需要安装jdk,可以到oracle官网访问下载http://www.oracle.com/technetwork/java/javase/downloads/index.html

2. rpm -ivh jdk-7u80-linux-x64.rpm
 ln -s /usr/java/jdk1.7.0_80/ /usr/java/jdk1.7 #为了方便,创建软连接

3.配置java环境变量
export JAVA_HOME=/usr/java/jdk1.7
PATH=$JAVA_HOME/jre/bin:$JAVA_HOME/bin:$PATH:/usr/local/httpd/bin

source /etc/profile

4.安装amoeba
到此地址下载合适版本:https://sourceforge.net/projects/amoeba/files/
tar zxf /root/amoeba-mysql-1.2.1-GA.tar.gz -C /usr/local/
chmod +x /usr/local/amoeba/bin/amoeba

5.在master,slave上创建用户并赋予相应的权限
Master:grant select,insert,update,delete on *.* to amoeba@'192.168.154.%' identified by 'gege123';
flush privileges;
Slave: grant select on *.* to amoeba@'192.168.154.%' identified by 'gege123';

四.配置MySQL+Amoeba实现读写分离
1.配置mysql主从复制
关于mysql主从复制实现内容,请参考一下网址,这里不做过多赘述
http://blog.csdn.net/qq_30256711/article/details/78796311

2.配置amoeba
vim /usr/local/amoeba/conf/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">3306</property> #此处为代理服务器对外访问的端口
  
  <!-- proxy server绑定的IP -->
 
  <property name="ipAddress">192.168.200.128</property> #此处为代理服务器对外访问的IP地址
  
  <!-- proxy server net IO Read thread size -->
  <property name="readThreadPoolSize">100</property> #此参数是读客户端,databaseserver段网络数据包的线程数
  
  <!-- proxy server client process thread size -->
  <property name="clientSideThreadPoolSize">80</property> #此参数是读操作客户端的线程数
  
  <!-- mysql server data packet process thread size -->
  <property name="serverSideThreadPoolSize">100</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">oldboy</property># 此处是验证客户端的密码
  
  
  <!-- query timeout( default: 60 second , TimeUnit:second) -->
  <property name="queryTimeout">30</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">3308</property>
    
    <!-- 真实mysql数据库IP -->
    <property name="ipAddress">192.168.200.131</property>
    <property name="schema">test1</property>
    
    <!-- 用于登陆mysql的用户名 -->
    <property name="user">amoeba</property>
    
    <!-- 用于登陆mysql的密码 -->
    
    
    <property name="password">gg123</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="multiPool" 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="server2">
   
   <!-- PoolableObjectFactory实现类 -->
   <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory"> #连接工厂实现类
    <property name="manager">defaultManager</property>
    
    <!-- 真实mysql数据库端口 -->
    <property name="port">3307</property>
    
    <!-- 真实mysql数据库IP -->
    <property name="ipAddress">192.168.200.131</property>
    <property name="schema">test1</property> #连接初始化的schema
    
    <!-- 用于登陆mysql的用户名 -->
    <property name="user">amoeba</property>
    
    <!-- 用于登陆mysql的密码 -->
    
    
    <property name="password">gg123</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">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>


3.配置玩amoeba.xml后就可以使用
chmod +x /usr/local/amoeba/bin/amoeba
/usr/local/amoeba/bin/amoeba 命令启动了


Amoeba:分布式数据库Proxy解决方案 随着传统的数据库技术日趋成熟、计算机网络技术的飞速发展和应用范围的扩充,数据库应用 已经普遍建立于计算机网络之上。这时集中式数据库系统表现出它的不足:集中式处理,势必造成性 能瓶颈;应用程序集中在一台计算机上运行,一旦该计算机发生故障,则整个系统受到影响,可靠性 不高;集中式处理引起系统的规模和配置都不够灵活,系统的可扩充性差。在这种形势下,集中式数 据库将向分布式数据库发展。 分布式数据库系统的优点: 1、降低费用。分布式数据库在地理上可以式分布的。其系统的结构符合这种分布的要求。允许用 户在自己的本地录用、查询、维护等操作,实行局部控制,降低通信代价,避免集中式需要更高要求 的硬件设备。而且分布式数据库在单台机器上面数据量较少,其响应速度明显提升。 2、提高系统整体可用性。避免了因为单台数据库的故障而造成全部瘫痪的后果。 3、易于扩展处理能力和系统规模。分布式数据库系统的结构可以很容易地扩展系统,在分布式数 据库中增加一个新的节点,不影响现有系统的正常运行。这种方式比扩大集中式系统要灵活经济。在 集中式系统中扩大系统和系统升级,由于有硬件不兼容和软件改变困难等缺点,升级的代价常常是昂 贵和不可行的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值