数据库读写分离的原理
A. 什么是数据库的读写分离
amoeba 跟 mysql proxy在读写分离的使用上面的区别。
在mysql proxy 上面如果想要读写分离并且 读集群、写集群 机器比较多情况下,用mysql proxy 需要相当大的工作量,目前mysql proxy没有现成的 lua脚本。mysql proxy根本没有配置文件,lua脚本就是它的全部,当然lua是相当方便的。那么同样这种东西需要编写大量的脚本才能完成一个复杂的配置。amoeba目标是走产品化这条路。只需要进行相关的配置就可以满足需求。一、Master/Slave 结构读写分离:
Master: server1 (可读写)
slaves:server2、server3、server4(3个平等的数据库。只读/负载均衡)
amoeba提供读写分离pool相关配置。并且提供负载均衡配置。
可配置server2、server3、server4形成一个虚拟的 virtualSlave,该配置提供负载均衡、failOver、故障恢复功能Xml代码
<dbServer name="virtualSlave" virtual="true">
<poolConfig>
<className>com.meisa.amoeba.server.MultipleServerPool</className>
<!-- 负载均衡参数 1=ROUNDROBIN , 2=WEIGHTBASED -->
<property name="loadbalance">1</property>
<!-- 参与该pool负载均衡的poolName列表以逗号分割 -->
<property name="poolNames">server2,server3,server4</property>
</poolConfig>
</dbServer>
如果不启用数据切分,那么只需要配置QueryRouter属性
wirtePool=server1
readPool=virtualSlave
<queryRouter>
<className>com.meisa.amoeba.mysql.parser.MysqlQueryRouter</className>
<property name="LRUMapSize">1500</property>
<property name="defaultPool">server1</property>
<property name="writePool">server1</property>
<property name="readPool">virtualSlave</property>
<property name="needParse">true</property>
B. 为什么数据库读写分离可以提高性能
首先声明一点,读写分离只有在读多写少的场景下才能提高性能。
一方面读写分离都是1写+N读的实现,因此READ操作可以分散到多台服务器上,性能自然提高。
另一方面,在一个数据库实例下,同表数据经常会遇到锁等待,WRITE时所有的READ操作被阻塞,将读写分离,可以很大程度上减轻这种情况。
C. mysql 如何实现读写分离,用mysql-proxy 或者直接用php连接两个数据库
Mysql主从配置,实现读写分离
原理:主服务器(Master)负责网站NonQuery操作,从服务器负责Query操作,用户可以根据网站功能模特性块固定访问Slave服务器,或者自己写个池或队列,自由为请求分配从服务器连接。主从服务器利用MySQL的二进制日志文件,实现数据同步。二进制日志由主服务器产生,从服务器响应获取同步数据库。
具体实现:
1、在主从服务器上都装上MySQL数据库,windows系统鄙人安装的是mysql_5.5.25.msi版本,Ubuntu安装的是mysql-5.6.22-linux-glibc2.5-i686.tar
windows安装mysql就不谈了,一般地球人都应该会。鄙人稍微说一下Ubuntu的MySQL安装,我建议不要在线下载安装,还是离线安装的好。大家可以参考 http://www.linuxidc.com/Linux/2013-01/78716.htm 这位不知道大哥还是姐妹,写的挺好按照这个就能装上。在安装的时候可能会出现几种现象,大家可以参考解决一下:
(1)如果您不是使用root用户登录,建议 su - root 切换到Root用户安装,那就不用老是 sudo 了。
(2)存放解压的mysql 文件夹,文件夹名字最好改成mysql
(3)在./support-files/mysql.server start 启动MySQL的时候,可能会出现一个警告,中文意思是启动服务运行读文件时,忽略了my.cnf文件,那是因为my.cnf的文件权限有问题,mysql会认为该文件有危险不会执行。但是mysql还会启动成功,但如果下面配置从服务器参数修改my.cnf文件的时候,你会发现文件改过了,但是重启服务时,修改过后的配置没有执行,而且您 list一下mysql的文件夹下会发现很多.my.cnf.swp等中间文件。这都是因为MySQL启动时没有读取my.cnf的原因。这时只要将my.cnf的文件权限改成my_new.cnf的权限一样就Ok,命令:chmod 644 my.cnf就Ok
(4)Ubuntu中修改文档内容没有Vim,最好把Vim 装上,apt-get install vim,不然估计会抓狂。
这时候我相信MySQL应该安装上去了。
2、配置Master主服务器
(1)在Master MySQL上创建一个用户‘repl’,并允许其他Slave服务器可以通过远程访问Master,通过该用户读取二进制日志,实现数据同步。
D. 数据库为什么要读写分离
数据库不一定要读写分离,如果程序使用数据库较多时,而更新少,查询多的情况下会考虑使用,利用数据库 主从同步 。可以减少数据库压力,提高性能。当然,数据库也有其它优化方案。memcache 或是 表折分,或是搜索引擎。都是解决方法。
E. 怎么实现读写分离
为了确保数据库产品的稳定性,很多数据库拥有双机热备功能。也就是,第一台数据库服务器,是对外提供增删改业务的生产服务器;第二台数据库服务器,主要进行读的操作。·
读写分离(Read/Write Splitting)。
1.原理:让主数据库(master)处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库(slave)处理SELECT查询操作。
2.诞生原因:
2.1 为了确保数据库产品的稳定性,很多数据库拥有双机热备功能。也就是,第一台数据库服务器,是对外提供增删改查业务的生产服务器;第二台数据库服务器,仅仅接收来自第一台服务器的备份数据(注意,不同数据库产品,第一台数据库服务器,向第二台数据库服务器发送备份数据的方式不同)。当第一台数据库崩溃后,第二台数据库服务器,可以立即上线来代替第一台数据库服务器,并且,在第一台数据库服务器崩溃后,宝贵的数据,依然会存在于第二台数据库服务器里(根据目前业界的备份数据发送方式来看,当第一台数据库崩溃后,第一台数据库里的仍然会有少量的新数据,没能来得及被发送到第二台数据库服务器,所以,这部分数据就丢失了)。
2.2 一般来说,为了配置方便,以及稳定性,这两台数据库服务器,都用的是相同的配置(思考一下,如果两台服务器的配置不同,会导致什么结果)。
2.3 从上文的描述中,大家能看到,在实际运行中,第一台数据库服务器的压力,远远大于第二台数据库服务器。因此,很多人希望合理利用第二台数据库服务器的空闲资源。那么,第二台数据库服务器能做些什么事情呢?
2.4 从数据库的基本业务来看,数据库的操作无非就是增删改查这4个操作。但对于“增删改”这三个操作,如果是双机热备的环境中做,一台机器做了这三个操作的某一个之后,需要立即将这个操作,同步到另一台服务器上。单向的同步,不复杂。但如果两台机器都需要向对方进行同步,那逻辑就非常复杂,而且还会大大降低性能。(从保证ACID特性的角度,思考一下为什么双向同步会非常复杂且低性能?而单向同步却不会?)出于这个原因,第二台备用的服务器,就只做了查询操作。进一步,为了降低第一台服务器的压力,干脆就把查询操作全部丢给第二台数据库服务器去做,第一台数据库服务器就只做增删改了。
2.4 到这一步,就实现了所谓的读写分离。这样做,缺点也非常明显了。本来第二台数据库服务器,是用来做热备的,它就应该在一个压力非常小的环境下,保证运行的稳定性。而读写分离,却增加了它的压力,也就增加了不稳定性。因此,读写分离,实质上是一个在资金比较缺乏,但又需要保证数据安全的需求下,在双机热备方案上,做出的一种折中的扩展方案。
简单实现
通过RAID技术,RAID是英文Rendant Array of Independent Disks的缩写,翻译成中文意思是“独立磁盘冗余阵列”,有时也简称磁盘阵列(Disk Array)。
简单的说,RAID是一种把多块独立的硬盘(物理硬盘)按不同的方式组合起来形成一个硬盘组(逻辑硬盘),从而提供比单个硬盘更高的存储性能和提供数据备份技术。
F. 为什么数据库读写分离能提高数据库的性能
读写分离主要目的是提高系统吞吐量。某些网站同一时间有大量的读操作和较少的写操作。同时,读操作对数据的实时性要求并没有那么高。在此前提下,可以这么设计解决方案。
所以你问题里“数据仍然需要同步”这个理解是不对的。事实上,正是由于允许用户读到几秒钟甚至几分钟前的数据,才可以使用读写分离的。
所以这种方案其实就是以数据的时效性,换取了读操作的吞吐率。
G. 为什么数据库读写分离可以提高性能
之所以说读写分离能够提高性能,是因为读写分离采用这样的机制:
假设我们现在有数据库服务器1,对外提供一切操作,还有数据库服务器2,仅仅保存数据库服务器1的数据备份,定时同步,以便服务器1意外崩溃后能够尽量的弥补损失。
但是服务器2原本能够提供增删改查服务,这样以来服务器2的资源就产生了极大的浪费,因此我们希望服务器2也做一些事情,而不是仅仅作为一个备份。
显然增删改都是不能够交给服务器2去完成的,因为如果这样做就失去了服务器1的意义,所以服务器2仅仅提供查询操作,增删改都留给服务器1去完成,这就是所谓的读写分离。
读写分离机制使得两个服务器分担原本属于一个服务器的压力,因此性能有所提高,同时有数据备份的存在,其稳定性高于单服务器。
H. mysql读写分离原理是什么
利用mysql proxy来实现的。
MySQL Proxy最强大的一项功能是实现“读写分离(Read/Write Splitting)”。基本的原理是让主数据库处理事务性查询,而从数据库处理SELECT查询。数据库复制被用来把事务性查询导致的变更同步到集群中的从数据库。当然,主服务器也可以提供查询服务。使用读写分离最大的作用无非是环境服务器压力。
I. 什么叫读写分离读是RAID几写又是RAID几
读写分离(Read/Write Splitting)”,基本的原理是让主数据库处理事务性查询,而从数据库处理SELECT查询。数据库复制被用来把事务性查询导致的变更同
步到集群中的从数据库。
对于大访问量的网站,一般会采用读写分离,比如ebay的读写比率是260:1,也就是大型的电子商务网站的。
网上看到说采用读写分离有如下工具:
1,oracle的logical standby
2, Quest公司的SharePlex
3, DSG公司的RealSync
如果你是网吧类应用:强烈建议你不要用无盘!!!!
必须有一名专业人员维护!三天两头的小问题 软件游戏更新要你的命!
无盘服务器的读写分离,很早就被提出来了。几乎所有的商业无盘系统都会将读写分离作为提高无盘运行速度的有效途径。可即使做了读写分离,系统性能也并
没有得到显着的提升。为什么?因为他们分离错了!该分离的没有分离,而不该分离的却又分离了!
现在市面上的无盘读写分离,都是将系统分区同游戏分区分开二个磁盘。殊不知,系统分区的磁盘读写负荷不知要大过游戏分区多少倍!为什么这么说呢
?程序员都知道,程序一运行就会将自身完全载入内存了。虽然现在的游戏几乎没有不超过G大小的,但是,游戏主程序加上其需要调用的DLL文件,可能加起来
也就才几十M而已,甚至更少!(大家可以运行一个大型游戏来看看它的内存使用量)。那另外那些几乎超过游戏总大小百分之九十九的东西是什么呢?不用说
大家都知道,是游戏必不可少的资源文件,比如:地图、图像、声音等等。而游戏一般进去都会有等待载入的画面,这里等待载入的东西,就是那些资源文件。
而这些资源文件载入后放在哪里了?即使你系统有NG的内存容量,也不要指望游戏会将它放全部放在内存里。(不信你现在又可以看看游戏所占用内存使用量)
。那是放哪里了?那么多宠大的游戏资源文件是放在哪里了?去问个游戏程序员吧(问我也行啊,俺也是。。)。他会告诉你,放在页面文件里了!!! 千
万不要以为,游戏是边运行边从硬盘读取文件的,游戏为了加快运行速度,都是将需要运行的文件预先加载入内存或是虚拟内存中的!而更多的是加载到虚拟内
存即页面文件中,即使是几G的内存,也是摆设。
感觉到恐怖吧!你以为你的系统分区磁盘几乎没做什么事,其实它是最累的!游戏的读取只需要进行一次,就是说载入一次,但是载入以后的东西是放在页
面文件中的,游戏对页面文件的读取是非常频繁的!可现在的无盘全弄反了,将系统分区磁盘弄成个普通IDE,将游戏分区弄成阵列。好武器没有用到该用的地
方。
玩游戏会卡?几乎每一种技术的无盘系统,玩游戏都会觉得有卡的时候。看看你客户机的页面文件大小吧,最小都有二三百M吧,几十台机每台都来个几百M
的读写量,呵呵,你想想,你那个又要做系统又要放页面文件而且“待遇又不好”的磁盘,它磁头会忙成什么样子!
我已经分析的很清楚了,该分离的应该是页面文件!而游戏可以分,也可以不分。对于本身带有缓冲功能的无盘系统,大型游戏应该都放在无盘服务器上。
而不常用的硬盘游戏,网络游戏就可以放在网络的其它机上面。(共享或是虚拟磁盘方式)。
打开多个IE卡,最小化IE卡,启动QQ卡,退出游戏还是卡。这些都是对页面文件大量读写的时候。将页面文件分离出来吧!专门弄个硬盘提供页面文件的读
写。这样,系统更稳定、游戏更流畅!
怎么解决这个恼人的页面文件?暂时的方法,你可以升级您的系统分区的磁盘硬件,会有点改善,但解决不了根本。因为页面文件是同系统分区放在一个磁
盘里面的,而用户与操作系统的交互是非常频繁的,就是说,依现在的磁盘读写速度,又要满足页面文件的读写,又要不影响用户同系统的交互,是做不到的。
另外一个解决方法,就是使用SetPageFile.exe软件。
RAID是英文Rendant Array of Independent Disks的缩写,翻译成中文意思是“独立磁盘冗余阵列”,有时也简称磁盘阵列(Disk Array)。
简单的说,RAID是一种把多块独立的硬盘(物理硬盘)按不同的方式组合起来形成一个硬盘组(逻辑硬盘),从而提供比单个硬盘更高的存储性能和提供数
据备份技术。组成磁盘阵列的不同方式成为RAID级别(RAID Levels)。数据备份的功能是在用户数据一旦发生损坏后,利用备份信息可以使损坏数据得以恢复
,从而保障了用户数据的安全性。在用户看起来,组成的磁盘组就像是一个硬盘,用户可以对它进行分区,格式化等等。总之,对磁盘阵列的操作与单个硬盘一
模一样。不同的是,磁盘阵列的存储速度要比单个硬盘高很多,而且可以提供自动数据备份。
RAID技术的两大特点:一是速度、二是安全,由于这两项优点,RAID技术早期被应用于高级服务器中的SCSI接口的硬盘系统中,随着近年计算机技术的发展
,PC机的CPU的速度已进入GHz 时代。IDE接口的硬盘也不甘落后,相继推出了ATA66和ATA100硬盘。这就使得RAID技术被应用于中低档甚至个人PC机上成为
可能。RAID通常是由在硬盘阵列塔中的RAID控制器或电脑中的RAID卡来实现的。
RAID技术经过不断的发展,现在已拥有了从 RAID 0 到 6 七种基本的RAID 级别。另外,还有一些基本RAID级别的组合形式,如RAID 10(RAID 0与RAID 1
的组合),RAID 50(RAID 0与RAID 5的组合)等。不同RAID 级别代表着不同的存储性能、数据安全性和存储成本。但我们最为常用的是下面的几种RAID形式。
(1) RAID 0
RAID 0又称为Stripe(条带化)或Striping,它代表了所有RAID级别中最高的存储性能。RAID 0提高存储性能的原理是把连续的数据分散到多个磁盘上存取
,这样,系统有数据请求就可以被多个磁盘并行的执行,每个磁盘执行属于它自己的那部分数据请求。这种数据上的并行操作可以充分利用总线的带宽,显着提
高磁盘整体存取性能。
例如系统向三个磁盘组成的逻辑硬盘(RADI 0 磁盘组)发出的I/O数据请求被转化为3项操作,其中的每一项操作都对应于一块物理硬盘。我们可以清楚的看
到通过建立RAID 0,原先顺序的数据请求被分散到所有的三块硬盘中同时执行。从理论上讲,三块硬盘的并行操作使同一时间内磁盘读写速度提升了3倍。 但由
于总线带宽等多种因素的影响,实际的提升速率肯定会低于理论值,但是,大量数据并行传输与串行传输比较,提速效果显着显然毋庸置疑。
RAID 0的缺点是不提供数据冗余,因此一旦用户数据损坏,损坏的数据将无法得到恢复。
RAID 0具有的特点,使其特别适用于对性能要求较高,而对数据安全不太在乎的领域,如图形工作站等。对于个人用户,RAID 0也是提高硬盘存储性能的绝
佳选择。
(2) RAID 1
RAID 1又称为Mirror或Mirroring(镜像),它的宗旨是最大限度的保证用户数据的可用性和可修复性。 RAID 1的操作方式是把用户写入硬盘的数据百分之
百地自动复制到另外一个硬盘上。
当读取数据时,系统先从RAID 0的源盘读取数据,如果读取数据成功,则系统不去管备份盘上的数据;如果读取源盘数据失败,则系统自动转而读取备份
盘上的数据,不会造成用户工作任务的中断。当然,我们应当及时地更换损坏的硬盘并利用备份数据重新建立Mirror,避免备份盘在发生损坏时,造成不可挽回
的数据损失。
由于对存储的数据进行百分之百的备份,在所有RAID级别中,RAID 1提供最高的数据安全保障。同样,由于数据的百分之百备份,备份数据占了总存储空间
的一半,因而Mirror(镜像)的磁盘空间利用率低,存储成本高。
Mirror虽不能提高存储性能,但由于其具有的高数据安全性,使其尤其适用于存放重要数据,如服务器和数据库存储等领域.
( 3) RAID 0+1
正如其名字一样RAID 0+1是RAID 0和RAID 1的组合形式,也称为RAID 10。
以四个磁盘组成的RAID 0+1为例,其数据存储方式:RAID 0+1是存储性能和数据安全兼顾的方案。它在提供与RAID 1一样的数据安全保障的同时,也提供
了与RAID 0近似的存储性能。
由于RAID 0+1也通过数据的100%备份功能提供数据安全保障,因此RAID 0+1的磁盘空间利用率与RAID 1相同,存储成本高。
RAID 0+1的特点使其特别适用于既有大量数据需要存取,同时又对数据安全性要求严格的领域,如银行、金融、商业超市、仓储库房、各种档案管理等。
(4) RAID 3
RAID 3是把数据分成多个“块”,按照一定的容错算法,存放在N+1个硬盘上,实际数据占用的有效空间为N个硬盘的空间总和,而第N+1个硬盘上存储的数
据是校验容错信息,当这N+1个硬盘中的其中一个硬盘出现故障时,从其它N个硬盘中的数据也可以恢复原始数据,这样,仅使用这N个硬盘也可以带伤继续工作
(如采集和回放素材),当更换一个新硬盘后,系统可以重新恢复完整的校验容错信息。由于在一个硬盘阵列中,多于一个硬盘同时出现故障率的几率很小,所
以一般情况下,使用RAID3,安全性是可以得到保障的。与RAID0相比,RAID3在读写速度方面相对较慢。使用的容错算法和分块大小决定RAID使用的应用场合,
在通常情况下,RAID3比较适合大文件类型且安全性要求较高的应用,如视频编辑、硬盘播出机、大型数据库等.
(5) RAID 5
RAID 5 是一种存储性能、数据安全和存储成本兼顾的存储解决方案。 以四个硬盘组成的RAID 5为例,其数据存储方式:,P0为D0,D1和D2的奇偶校验信
息,其它以此类推。由图中可以看出,RAID 5不对存储的数据进行备份,而是把数据和相对应的奇偶校验信息存储到组成RAID5的各个磁盘上,并且奇偶校验信
息和相对应的数据分别存储于不同的磁盘上。当RAID5的一个磁盘数据发生损坏后,利用剩下的数据和相应的奇偶校验信息去恢复被损坏的数据。
RAID 5可以理解为是RAID 0和RAID 1的折衷方案。RAID 5可以为系统提供数据安全保障,但保障程度要比Mirror低而磁盘空间利用率要比Mirror高。RAID
5具有和RAID 0相近似的数据读取速度,只是多了一个奇偶校验信息,写入数据的速度比对单个磁盘进行写入操作稍慢。同时由于多个数据对应一个奇偶校验信
息,RAID 5的磁盘空间利用率要比RAID 1高,存储成本相对较低。
RAID级别的选择有三个主要因素:可用性(数据冗余)、性能和成本。如果不要求可用性,选择RAID0以获得最佳性能。如果可用性和性能是重要的而成
本不是一个主要因素,则根据硬盘数量选择RAID 1。如果可用性、成本和性能都同样重要,则根据一般的数据传输和硬盘的数量选择RAID3、RAID5。