1.理解读写分离的原理

随着一个网站的业务不断扩展,数据不断增加,数据库的压力也会越来越大,对数据库或者SQL的基本优化可能达不到最终的效果,我们可以采用读写分离的策略来改变现状。读写分离现在被大量应用于很多大型网站,这个技术也不足为奇了。ebay就做得非常好。ebay用的是Oracle,听说是用Quest Share Plex 来实现主从复制数据。

读写分离简单的说是把对数据库读和写的操作分开对应不同的数据库服务器,这样能有效地减轻数据库压力,也能减轻io压力。主数据库提供写操作,从数据库提供读操作,其实在很多系统中,主要是读的操作。当主数据库进行写操作时,数据要同步到从的数据库,这样才能有效保证数据库完整性。Quest SharePlex就是比较牛的同步数据工具,听说比oracle本身的流复制还好,MySQL也有自己的同步数据技术。mysql只要是通过二进制日志来复制数据。通过日志在从数据库重复主数据库的操作达到复制数据目的。这个复制比较好的就是通过异步方法,把数据同步到从数据库。

主数据库同步到从数据库后,从数据库一般由多台数据库组成这样才能达到减轻压力的目的。读的操作怎么样分配到从数据库上?应该根据服务器的压力把读的操作分配到服务器,而不是简单的随机分配。mysql提供了MySQL-Proxy实现读写分离操作。不过MySQL-Proxy好像很久不更新了。oracle可以通过F5有效分配读从数据库的压力。

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文件中的切片规则实现。原理如图:

Mysql数据库读写分离Amoeba的更多相关文章

  1. MySQL数据库读写分离、读负载均衡方案选择

    MySQL数据库读写分离.读负载均衡方案选择 一.MySQL Cluster外键所关联的记录在别的分片节点中性能很差对需要进行分片的表需要修改引擎Innodb为NDB因此MySQL Cluster不适 ...

  2. 170301、使用Spring AOP实现MySQL数据库读写分离案例分析

    使用Spring AOP实现MySQL数据库读写分离案例分析 原创 2016-12-29 徐刘根 Java后端技术 一.前言 分布式环境下数据库的读写分离策略是解决数据库读写性能瓶颈的一个关键解决方案 ...

  3. 161220、使用Spring AOP实现MySQL数据库读写分离案例分析

    一.前言 分布式环境下数据库的读写分离策略是解决数据库读写性能瓶颈的一个关键解决方案,更是最大限度了提高了应用中读取 (Read)数据的速度和并发量. 在进行数据库读写分离的时候,我们首先要进行数据库 ...

  4. 使用Spring AOP实现MySQL数据库读写分离案例分析

    一.前言 分布式环境下数据库的读写分离策略是解决数据库读写性能瓶颈的一个关键解决方案,更是最大限度了提高了应用中读取 (Read)数据的速度和并发量. 在进行数据库读写分离的时候,我们首先要进行数据库 ...

  5. Linux安装Mycat1.6.7.4并实现Mysql数据库读写分离简单配置

    1. Mycat简介 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务.ACID.可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群 一 ...

  6. 数据库读写分离Amoeba

    1.理解读写分离的原理 Amoeba(变形虫)项目,该开源框架于2008发布一款Amoeba for mysql软件,该软件致力于mysql的分布式数据库前端代理层,主要的作用是应用服务访问mysql ...

  7. Mysql数据库读写分离配置

    环境模拟 实现读写分离 减轻数据库的负荷 主服务器  master   10.0.0.12 从服务器 slave    10.0.0.66 配置主服务器: 在10.0.0.12服务器操作   创建数据 ...

  8. 利用mycat实现mysql数据库读写分离

    1.这里是在mysql主从复制实现的基础上,利用mycat做读写分离,架构图如下: 2.Demo 2.1 在mysql master上创建数据库创建db1 2.2 在数据库db1创建表student ...

  9. (转)Mysql数据库读写分离配置

    环境模拟 实现读写分离 减轻数据库的负荷 主服务器 master 10.0.0.12从服务器 slave 10.0.0.66 ------------------------------------- ...

随机推荐

  1. handlebars使用总结

    对自己使用handlebars做一个小总结,以后忘记了,好有地方看一下,不会用的小伙伴也可以借鉴一下,写的不好. 使用 Handlebars的安装是比较简单和方便的;handlebars是一个纯JS库 ...

  2. img图片标签alt和title属性的区别

    alt 用于图片没显示图片显示区域显示说明文字title 表示鼠标图片停留显示悬浮框其显示文字

  3. [PHP] PHP1 与 CGI

    早期,一个web程序通过cgi方式提供数据处理,编写cgi程序可以用不同的语言. 这个过程是,我们生成一个服务端可执行程序,处理 web server 传过来的请求,(设置header头)然后返回数据 ...

  4. 1023: [SHOI2008]cactus仙人掌图(DP+单调队列优化)

    这道题吗= =首先解决了我多年以来对仙人掌图的疑问,原来这种高大上的东西原来是这个啊= = 然后,看到这种题,首先必须的就是缩点= = 缩点完之后呢,变成在树上找最长路了= =直接树形dp了 那么那些 ...

  5. php与微信基础的学习

    我们要搞的是用php来与微信进行信息交互,现在是一个学习过程...结合慕课网渔夫老师的讲解. 微信公众号的申请具体可百度,太简单不予说明,微信本身功能也挺多,也有相关第三方平台,然而我们学习编程--具 ...

  6. collectionView布局

    关于 collectionView的layout布局方法: 设置cell的间距,行间距,组与组之间的间距,都是在layout里面来设置. 包括,滚动方向. -(void)prepareLayout [ ...

  7. HTML文档及标签介绍

    HTML标签 HTML 标记标签通常被称为 HTML 标签 (HTML tag). HTML标签是由尖括号包含的关键词,比如<html> HTML标签通常是成对出现的,比如<body ...

  8. AlloyTouch之无限循环select插件

    写在前面 当滚动的内容很多,比如闹钟里设置秒,一共有60项.让使用者从59ms滚回01ms是一件很痛苦的事情,所以: 在列表项太多的情况下,我们希望能够有个无限循环的滚动.00ms和01ms是无缝链接 ...

  9. iOS 推送全解析,你不可不知的所有 Tips!

    本文旨在对 iOS 推送进行一个完整的剖析,如果你之前对推送一无所知,那么在你认真地阅读了全文后必将变成一个推送老手,你将会对其中的各种细节和原理有充分的理解.以下是 pikacode 使用 iOS ...

  10. php 实现购物车功能,以大苹果购物网为例,上图上代码。。。。

    首先是几个简单的登录页面 <body> <form action="chuli.php" method="post"> <div ...