我们通过路由选择来决定操作时访问那个数据库,而路由的选择方式不外乎以下几种:  

  1) SpringAOP方式:spring底层配置多个数据源,配置路由(面向切面编程)手工写很多代码(废除)

  2) MySql proxy编程lua(脚本语言)(几乎没人直接使用)

  3) Amoeba国人基于mysql proxy。不用编程,配置两个xml文件即可,对程序没有侵入性。

  4) MyCat阿里,基于mysqlProxy

  这里主要应用Amoeba。

  Amoeba读写分离,通过配置xml文件来声明有几个数据库服务器。通过配置来决定哪个机器用来写操作,哪几个的机器用来读操作。根据配置就把用户请求人工分开。让写的操作都写到master的服务器,slave的各个节点都自动同步msater上的数据。这样当海量用户过来,大量查询都转向slave节点服务器,从而减轻主上的访问压力。对主的操作就更加的快捷,没有查询的干扰。同时复制的速度很快。让系统性能飞速提升,大概30%。

  因为amoeba用户请求都要通过amoeba代理,这时对其访问压力非常大,给其充分资源,尽量单独找一台服务器安装amoeba。

优势:   

  Amoeba主要解决以下问题:

  a). 数据切分后复杂数据源整合

  b). 提供数据切分规则并降低数据切分规则给数据库带来的影响

  c). 降低数据库与客户端连接

  d). 读写分离路由

安装配置:

  1、Amoeba是java写的,所以要想运行amoeba必须先要安装jdk,配置好jdk的环境变量(详见随笔jdk的配置)

  2、安装Amoeba

  3、配置

    3.1 dbServers.xml

      修改mysql的端口  默认端口是3306

      修改mysql的用户名密码,要求所有节点的端口和用户名密码一致

      修改主从节点的名字和ip地址

      修改负载方式

详细配置如下:

  

<?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">
<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
<property name="manager">${defaultManager}</property>
<property name="sendBufferSize">64</property>
<property name="receiveBufferSize">128</property> <!-- mysql port -->
<property name="port">3306</property> <!-- mysql schema -->
<property name="schema">test</property> <!-- mysql user -->
<property name="user">root</property> <!-- mysql password -->
<property name="password">root</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 name="master" parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.170.43</property>
</factoryConfig>
</dbServer> <dbServer name="slave" parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.170.85</property>
</factoryConfig>
</dbServer> <dbServer name="multiPool" virtual="true">
<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">master,slave</property>
</poolConfig>
</dbServer> </amoeba:dbServers>

   3.2 Amoeba.xml

    配置文件如下

    

<?xml version="1.0" encoding="gbk"?>

<!DOCTYPE amoeba:configuration SYSTEM "amoeba.dtd">
<amoeba:configuration xmlns:amoeba="http://amoeba.meidusa.com/"> <proxy> <!-- service class must implements com.meidusa.amoeba.service.Service -->
<service name="Amoeba for Mysql" class="com.meidusa.amoeba.net.ServerableConnectionManager">
<!-- port -->
<property name="port">8066</property> <!-- bind ipAddress -->
<!--
<property name="ipAddress">127.0.0.1</property>
--> <property name="manager">${clientConnectioneManager}</property> <property name="connectionFactory">
<bean class="com.meidusa.amoeba.mysql.net.MysqlClientConnectionFactory">
<property name="sendBufferSize">128</property>
<property name="receiveBufferSize">64</property>
</bean>
</property> <property name="authenticator">
<bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator"> <property name="user">root</property> <property name="password">root</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> <!-- 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">
<!-- 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>
<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 -->
<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">master</property> <property name="writePool">master</property>
<property name="readPool">multiPool</property> <property name="needParse">true</property>
</queryRouter>
</amoeba:configuration>

 启动Amoeba

  ./bin/amoeba start 或 ./bin/amoeba start &

  ./bin/laucher start 或 ./bin/laucher start &

  如果有&则进行后台启动,没有&本窗口启动,且启动后占用本窗口不能再进行其他操作

停止Amoeba

  ./bin/amoeba stop

  ./bin/laucher stop

  

配置注意事项:

  1)amoeba要求所有的节点的端口和用户名密码一致

  2)验证数据库是否能正确的访问,链接test库

  3)amoeba支持负载均衡,默认:轮询,权重

  4)需要打开8806端口   

  /sbin/iptables -I INPUT -p tcp --dport 8066 -j ACCEPT

  /etc/rc.d/init.d/iptables save #修改生效

  /etc/init.d/iptables status #查看配置

  三种负载均衡算法:轮询,权重,HA高可用

    读写分离:写master,读slave01,slave02,master

    电商项目:读的操作占量非常大,所有写的服务器资源严重浪费,所有读时让写的服务器负责少量读取操作。

总结:

1) 安装amoeba,配置两个xml

2) dbServers.xml 配置哪个服务器负责写操作,哪些(多个)服务器负责写操作。

3) 业务如果写操作量也比较大,只写的操作配置master,如果读的操作非常多,master不能完全利用,资源有所闲置,这时也把它配置的读的负载均衡策略中

4) amoeba核心配置文件,8066端口,所有节点的用户名,密码一致,加载dbServers.xml,执行

Amoeba变形虫的更多相关文章

  1. MySQL+Amoeba实现数据库主从复制和读写分离

    MySQL读写分离是在主从复制的基础上进一步通过在master上执行写操作,在slave上执行读操作来实现的.通过主从复制,master上的数据改动能够同步到slave上,从而保持了数据的一致性.实现 ...

  2. Amoeba+Mysql实现数据库读写分离

    一.Amoeba 是什么 Amoeba(变形虫)项目,专注 分布式数据库 proxy 开发.座落与Client.DB Server(s)之间.对客户端透明.具有负载均衡.高可用性.sql过滤.读写分离 ...

  3. Amoeba for MySQL---分布式数据库Proxy解决方案

    Amoeba是什么? Amoeba(变形虫)项目,致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当SQL路由功能,专注于分布式数据库代理层(Database Proxy ...

  4. Amoeba:开源的分布式数据库Porxy解决方案

    http://www.biaodianfu.com/amoeba.html 什么是Amoeba? Amoeba(变形虫)项目,该开源框架于2008年 开始发布一款 Amoeba for Mysql软件 ...

  5. (转)使用Amoeba 实现MySQL DB 读写分离

    Amoeba(变形虫)项目是一个开源框架,于2008年开始发布一款 Amoeba for Mysql软件: 这个软件致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当SQ ...

  6. 使用Amoeba 实现MySQL DB 读写分离

    Amoeba(变形虫)项目是一个开源框架,于2008年开始发布一款 Amoeba for Mysql软件: 这个软件致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当SQ ...

  7. Amoeba搞定mysql主从读写分离

    前言:一直想找一个工具,能很好的实现mysql主从的读写分离架构,曾经试用过mysql-proxy发现lua用起来很不爽,尤其是不懂lua脚本,突然发现了Amoeba这个项目,试用了下,感觉还不错,写 ...

  8. Amoeba实现mysql主从读写分离

    Amoeba实现mysql主从读写分离 这段在网上看了下关于amoeba的文章,总体感觉好像要比mysql-proxy好的多,也参考了不少的资料,此文章可能与其他文章作者会有雷同的地方,请谅解,但是此 ...

  9. Amoeba是一个类似MySQL Proxy的分布式数据库中间代理层软件,是由陈思儒开发的一个开源的java项目

    http://www.cnblogs.com/xiaocen/p/3736095.html amoeba实现mysql读写分离 application  shang  2年前 (2013-03-28) ...

随机推荐

  1. UIDataPicker 时间选择器

    自用时间选择器 @interface ViewController () { UILabel *cityLabel; UIDatePicker *datePicker; } //@property(n ...

  2. Luogu 3424 [POI2005]SUM-Fibonacci Sums

    Solution 没有任何算法, 只要会$for$ 就能AC... 我们观察到, 如果有一个位置 的$F_i$ 的系数$b_i$ 为2, 那么只需要把 $b_{i-2}+1,b_{i+1}+1$即可. ...

  3. ui设计用什么软件

    Ui设计用什么软件?作为ui设计师,你必须要熟练的使用以下几款设计软件,不然可能也无法胜任ui设计师的职位. ui设计除了要学习一些基本的操作软件,如PS AI AE AXURE 以外呢,还要学习比如 ...

  4. Servlet会话管理二(Cookie)

    Cookie是在HTTP协议下,将服务器传递给浏览器的的少量信息保存到浏览器客户端的一种技术,通过这种技术,即使在浏览器被关闭或链接中断的情况下,用户仍可以维护Cookie中的数据. Cookie是经 ...

  5. JSR 规范目录

    JSR 规范目录 一.Servlet 规范 1.1 Servlet 2.x 规范 1.2 Servlet 3.x 规范 - 注解和异步请求规范 每天用心记录一点点.内容也许不重要,但习惯很重要!

  6. 【算法】Escape

    The students of the HEU are maneuvering for their military training. The red army and the blue army ...

  7. 62.Xcode 添加代码块

    1. Xcode创建一个新项目,打开一个.h或者.m文件 2.我举例以设置属性为例 #import <UIKit/UIKit.h> @interface ViewController : ...

  8. 在python中while

    一.While循环 1.while循环格式 while 条件 : while循环体 当条件为Ture时,执行循环体,直到条件是假,停止循环. count = 1 # count 计数 一般用于计数 w ...

  9. centos 7 安装svn客户端

    rpm -qa subversion yum remove -y subversion yum install -y subversion svnserve --version svn checkou ...

  10. spring boot 实现mybatis拦截器

    spring boot 实现mybatis拦截器 项目是个报表系统,服务端是简单的Java web架构,直接在请求参数里面加了个query id参数,就是mybatis mapper的query id ...