数据库读写分离Amoeba
1.理解读写分离的原理
Amoeba(变形虫)项目,该开源框架于2008发布一款Amoeba for mysql软件,该软件致力于mysql的分布式数据库前端代理层,主要的作用是应用服务访问mysql服务器时充当SQL路由功能,并具有负载均衡、高可用性、SQL过滤、读写分离、可路由相关SQL的到目标数据库、可并发请求多台数据库全并结果的作用。通过Amoeba能够完成多数据源的高可用、负载均衡、数据切片的功能,目前Amoeba已在很多企业的生产线上面使用;其版本可在官网进行下载。其工作原理图如下:

2.掌握读写分离配置过程
配置好主从复制
安装java环境,此处安装是jdk-6u14-linux-x64.bin,因为amoeba推荐使用 jdk1.5或 1.6版本,高版本不建议使用
chmod +x /usr/local/jdk-6u14-linux-x64.bin
/usr/local/jdk-6u14-linux-x64.bin #根据提示按回车建完成即可
mv /usr/local/jdk1.6.0_14 /usr/local/jdk1.6
vi /etc/profile #编辑/etc/profile文件来修改系统环境变量
export JAVA_HOME=/usr/local/jdk1.6
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin:$PATH:$HOME/bin
export AMOEBA_HOME=/usr/local/amoeba/
export PATH=$PATH:$AMOEBA_HOME/bin
source /etc/profile #使环境变量立即生效
java -version

如上图java环境已配置成
3.安装并配置amoeba软件
mkdir /usr/local/amoeba
tar zxf /root/amoeba-mysql-binary-2.1.0-RC5.tar.gz –C /usr/local/amoeba
chmod –R 755 /usr/local/amoeba/
/usr/local/amoeba/bin/amoeba
4.配置amoeba读写分离
所有的mysql数据库都要开放给amoeba访问,在主和从数据库上执行以下命令,ip地址应该为amoeba的ip地址,如:
grant all on *.* to test@’106.120.190.%’ identified by ‘123.com’;
vim /usr/local/amoeba/conf/amoeba.xml
……
<!-- Amoeba 账号,密码 -->
<property name="user">amoeba</property> //30行
<property name="password">123456</property>
……
<!-- 默认数据库,主数据库 -->
<property name="defaultPool">master</property> //115行
<!-- 写数据库 -->
<property name="writePool">master</property>
<!-- 读数据库,dbServer.xml 中配置的 虚拟数据库,数据库池 -->
<property name="readPool">slaves</property>
<property name="needParse">true</property>
……
vim /usr/local/amoeba/conf/dbServers.xml
……
<!-- mysql port -->
<property name="port">3306</property>
<!-- mysql schema -->
<property name="schema">test</property>
<!-- mysql user -->
<property name="user">test</property>
<!-- mysql password -->
<property name="password">123.com</property>
……
<!-- Master ,Slave1, Slave2 的独立部分,也就只有 IP 了 -->
<dbServer name="master" parent="abstractServer"> //45行
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">106.120.190.233</property> //Master的IP
</factoryConfig>
</dbServer>
<dbServer name="slave1" parent="abstractServer"> <factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">106.120.190.236</property> //Slave1的IP
</factoryConfig> //如果有多台slave,则可再配置
</dbServer>
<dbServer name="slave2" parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">106.120.190.228</property> //Slave2的IP
</factoryConfig>
</dbServer>
<!-- 数据库池,虚拟服务器,实现读取的负载均衡 -->
<dbServer name="slaves" 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">slave1</property> //单台slave的配置格式,多台的配置格式为:<property name="poolNames">slave1,slave2</property>
</poolConfig>
</dbServer>
启动amoeba软件
/usr/local/amoeba/bin/amoeba
5.测试ameoba
测试的时候和我们平时使用一样,amoeba-mysql对我们应用透明,就是个mysql的代理
在客户端安装mysql客户端,登录mysql使用如下命令(用户名密码和上面配置要一致)
mysql –u amoeba –p123456 –h amoeba的ip –P 8066
登录上去后,为了测试读和写必须,先把mysql的主从复制停掉,才能更清楚地看出读写的服务器是哪台,在从执行用stop slave;登录到amoeba上,然后执行写和读操作,查看写的是哪台服务器,读的是哪台服务器,实验结果显示:写只在主上进行,读在从上进行,但是可通过配置使得主从都可读,比率是1:1
测试步骤:
1.在客户机上安装mysql
yum –y install mysql
mysql –uroot –p123456 –h amoeba的ip地址 –P 8806
2.在master上建一个测试用库,如db_test,并建测试用表,如wg2:
mysql>create database db_test;
mysql>create table a_test(id int(10),addr varchar(20));
3.在从服务器上:
mysql>stop slave;
4.然后在主服务器上:
mysql>use db_test;
mysql>insert into a_test values(‘1’,’master’);
5.在从服务器上:
mysql> use db_test;
mysql>insert into a_test values(‘2’,‘slave’);
6.在客户端上查询数据:
mysql>select * from db_test.a_test;
7.在客户端上:
insert into db_test.a_test values(‘1’,’mrite’);
在主从上分别查询看结果:
select * from db_test.a_test;
6.了解使用amoeba进行数据切分
根据数据的特点,将不同特性的数据纪录存放到不同的数据库服务器中就是数据切分,可以设置规则匹配数据特性以实现数据切分,其实,数据切分就是根据设置规则将数据分别存放到不同的数据库,以减轻数据库服务器的压力和减小单个数据库的大小,可通过设置amoeba的rule.xml文件中的切片规则实现。原理如图:

数据库读写分离Amoeba的更多相关文章
- Mysql数据库读写分离Amoeba
1.理解读写分离的原理 随着一个网站的业务不断扩展,数据不断增加,数据库的压力也会越来越大,对数据库或者SQL的基本优化可能达不到最终的效果,我们可以采用读写分离的策略来改变现状.读写分离现在被大量应 ...
- MySQL+Amoeba实现数据库读写分离
参考:https://www.cnblogs.com/liuyisai/p/6009379.html 一,Amoeba是什么 Amoeba(变形虫)项目,专注 分布式数据库 proxy 开发.座落与C ...
- 在应用层通过spring特性解决数据库读写分离
如何配置mysql数据库的主从? 单机配置mysql主从:http://my.oschina.net/god/blog/496 常见的解决数据库读写分离有两种方案 1.应用层 http://neore ...
- Mysql 实现数据库读写分离
Amoeba+Mysql实现数据库读写分离 一.Amoeba 是什么 Amoeba(变形虫)项目,专注 分布式数据库 proxy 开发.座落与Client.DB Server(s)之间.对客户端透明. ...
- Spring aop应用之实现数据库读写分离
Spring加Mybatis实现MySQL数据库主从读写分离 ,实现的原理是配置了多套数据源,相应的sqlsessionfactory,transactionmanager和事务代理各配置了一套,如果 ...
- CYQ.Data V5 数据库读写分离功能介绍
前言 好多年没写关于此框架的新功能的介绍了,这些年一直在默默地更新,从Nuget上的记录就可以看出来: 这几天在看Java的一些东西,除了觉的Java和.NET的相似度实在太高之外,就是Java太原始 ...
- ThinkPHP v3.2.3 数据库读写分离,开启事务时报错:There is no active transaction
如题:ThinkPHP v3.2.3 数据库读写分离,开启事务时报错: ERR: There is no active transaction 刚开始以为是数据表引擎不对造成的,因为 有几张表的引擎是 ...
- EF架构~通过EF6的DbCommand拦截器来实现数据库读写分离~终结~配置的优化和事务里读写的统一
回到目录 本讲是通过DbCommand拦截器来实现读写分离的最后一讲,对之前几篇文章做了一个优化,无论是程序可读性还是实用性上都有一个提升,在配置信息这块,去除了字符串方式的拼接,取而代之的是sect ...
- 161220、使用Spring AOP实现MySQL数据库读写分离案例分析
一.前言 分布式环境下数据库的读写分离策略是解决数据库读写性能瓶颈的一个关键解决方案,更是最大限度了提高了应用中读取 (Read)数据的速度和并发量. 在进行数据库读写分离的时候,我们首先要进行数据库 ...
随机推荐
- imageX批量安裝windows7
以一臺電腦爲sample,安裝完成windows os及其全部update,安裝全部常用軟件,打印機驅動,網絡磁碟機等. 關閉安全控制"UAC"和"維護解決方案" ...
- 有限状态机(Finite-state machine)
var menu = { // 当前状态 currentState: 'hide', // 绑定事件 initialize: function() { var self = this; self.on ...
- 全面解析Bootstrap图片轮播效果
http://www.jb51.net/article/75806.htm 一 . 结构分析 一个轮播图片主要包括三个部分: ☑ 轮播的图片 ☑ 轮播图片的计数器 ☑ 轮播图片的控制器 第一步:设计轮 ...
- C#的显式接口和隐式接口(转载)
接口的实现分为:隐式实现和显式实现.如果类或者结构要实现的是单个接口,可以使用隐式实现,如果类或者结构继承了多个接口那么接口中相同名称成员就要显式实现.显示实现是通过使用接口的完全限定名来实现接口成员 ...
- Delphi TRect函数例子
{ 在网上看到个这个例子感觉还不错,将它移到自己的博客里没事的时候看看: TRect 作用:保存一个矩形的左上角和右下角的坐标值: 声明: type TRect = ...
- AnsiIO
1.文件数据内容,元数据内容 i节点ls -l err.txt-rw-rw-r-- 1 csgec csgec 50 Jun 23 11:19 err.txt-:普通文件(文件类型)rw-:属主用户拥 ...
- AngularJS中$http服务的简单用法
我们可以使用内置的$http服务直接同外部进行通信.$http服务只是简单的封装了浏览器原生的XMLHttpRequest对象. 1.链式调用 $http服务是只能接受一个参数的函数,这个参数是一个对 ...
- 界面编程与视图(View)组件
一.视图组件与容器组件 Android应用的绝大部分UI组件都放在android.widget包及其子包.android.view包及其子包中,Android应用的所有UI组件都继承了View类. V ...
- Spring JdbcTemplate用法整理
Spring JdbcTemplate用法整理: xml: <?xml version="1.0" encoding="UTF-8"?> <b ...
- 让EFCore更疯狂些的扩展类库(一):通过json文件配置sql语句
前言 EF通过linq和各种扩展方法,再加上实体模型,编写数据库的访问代码确实是优美.舒服,但是生成的sql不尽如意.性能低下,尤其是复杂些的逻辑关系,最终大家还是会回归自然,选择能够友好执行sql语 ...