数据库(七),读写分离到CQRS

读写分离

当一个公司业务不断扩展,用户量大量增加,原来使用的数据库很可能就撑不住了。那么可以

  • Scale-in,扩充硬件的性能,但是很可能用户量继续增长,增加的性能很快就吃光了。
  • 读写分离:数据库撑不住了,无非就是读写量过大,特别是有一些复杂的查询比如最近24小时最热门的产品等。需要很复杂的SQL语句,运行起来当然是慢。

但是为了读写分离,需要把数据库拆分为master库和Slave库,

市面上主要的关系数据库都支持数据复制功能,所以可以把一个数据库拆分为Master和Slave两种角色,写操作在主上,由Master服务器向其他Slave服务器进行同步。

读操作以及数据分析等离线操作都在Slave服务器上进行。

我们知道互联网的很多应用都是读的,这样有多个Slave可以负载分担一下,又可以保证数据的可用性和正确性。

但是相应的原有的应用代码也需要修改,必须改为写数据用master库,读数据的时候使用slave库,就相当于重写了。

复杂查询

但是就算重写了代码,发现性能还是无法得到明显的提升,原因仍然是使用了太多复杂的查询,比如说有很多表在联接,在数据库(四),数据库组成部分里面我们都说过,联接非常消耗性能。

那么我们可不可以单独用一张表来存放过去24小时的热门产品啊,这样只需要使用简单的SQL就能搞定。

也就是说,一套单一的数据库表对报表、搜索、事务等不同的行为是不适当的。

现在的表是为了新增、修改数据而设计的,对复杂查询不适合。

但是我们还需要考虑这个查询库如何更新的问题,还就是可能不是实时更新,我们能否忍受这种延迟的问题。

CQRS

能否忍受延迟的问题需要从业务上来看,比如过去24小时热门的极品,一点点过时的信息没有太大的影响,只要求最终一致即可。

我们可以使用CQRS(Command Query Responsibility Segregation),也就是增删改的命令与查询责任分离

在CQRS中,强调的是读(Query)写(Command)分离,因为用户读到的数据通常是过时的,那么为什么还需要从数据库读一遍呢,可以直接建立一个读数据源。可以是Cache,可以是XML、JSON等。

那之前提到的怎么更新的问题怎么解决?可以使用Event,也就是事件,比如某个产品卖出去了,可以发布一个事件,修改原有的Read Model。

这样就通过事件机制把同步变成了异步。

最后,这种方法最好只在复杂查询中用,原来的简单查询依然在关系型数据库里面取。为什么呢?因为引入一种新的技术需要付出代价,比如同步变异步了,还需要事件机制,我们不能只看到新技术的优点,而看不到缺点了。

主要参考

从读写分离到CQRS,张大胖是如何解决性能问题的?

原文地址:https://www.cnblogs.com/dy2903/p/8449334.html

时间: 2024-07-31 13:38:39

数据库(七),读写分离到CQRS的相关文章

数据库表读写分离,分区

数据库分区分表以及读写分离 谈谈怎么实现Oracle数据库分区表 Oracle数据库分区是作为Oracle数据库性能优化的一种重要的手段和方法,做手头的项目以前,只聆听过分区的大名,感觉特神秘,看见某某高手在讨论会上夸夸其谈时,真是骂自己学艺不精,最近作GPS方面的项目,处理的数据量达到了几十GB,为了满足系统的实时性要求,必须提高数据的查询效率,这样就必须通过分区,以解燃眉之急! 先说说分区的好处吧! 1) 增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用: 2) 维护方便:如

基于 EntityFramework 的数据库主从读写分离服务插件

基于 EntityFramework 的数据库主从读写分离服务插件 1.       版本信息和源码 1.1 版本信息 v1.0 beta(2015-04-02),基于 EF 6.1 开发,支持 EF 6.1 之后的所有 EF6 版本. 1.2 开放源码地址 https://github.com/cjw0511/NDF.Infrastructure 关于该 EF 数据库主从读写分离服务核心源码位于文件夹: src\ NDF.Data.EntityFramework\MasterSlaves 文件

为什么数据库要读写分离

1.什么情况下数据库需要读写分离? 数据库读写比例失衡. 2.为什么读写分离能提高系统性能? 在高并发情况下,由于并发读写会使用锁机制,本来应该是并行的操作,被变为了串行的操作.如果只有读操作,在绝大多数情况下不会被锁机制所干扰,是并行的操作,所以读写分离可以在某些场景中提高系统的效率.

利用oneproxy部署mysql数据库的读写分离

实验系统:CentOS 6.6_x86_64 实验前提:防火墙和selinux都关闭 实验说明:本实验共有4台主机,IP分配如拓扑 实验软件:mariadb-10.0.20 oneproxy-rhel5-linux64-v5.6-ga 下载地址:http://pan.baidu.com/s/1jGpL2o2 实验拓扑: 注意:本实验是之前mysql-proxy实验的拓展,因此大部分环境及设定是相同的,其中一.二步这里不再重复,具体请参考:利用mysql-proxy进行mysql数据库的读写分离

sql server 本地复制订阅 实现数据库服务器 读写分离(转载)

转载地址:http://www.cnblogs.com/echosong/p/3603270.html 再前段echosong 写了一遍关于mysql 数据同步实现业务读写分离的文章,今天咱们来看下SQL Server的复制订阅实现数据的读写分离 比起mysql的复制,SQL server 复制相对强大 一. 名词解释 1.复制的 机构组成(类比报纸流通): 1).发布服务器(报社出版) 生产维护数据源,审阅所有出版数据的更改 发送给 分发服务器(邮局) 2).分发服务器 (邮局) 分发服务器包

基于 EntityFramework 的数据库主从读写分离架构 - 目录

基于 EntityFramework 的数据库主从读写分离架构 回到目录,完整代码请查看(https://github.com/cjw0511/NDF.Infrastructure)中的目录: src\ NDF.Data.EntityFramework\MasterSlaves 基于 EntityFramework 的数据库主从读写分离架构 - 需求/功能概述 基于 EntityFramework 的数据库主从读写分离架构(1)- 原理概述和基本功能实现 基于 EntityFramework 的

MySQL数据库之读写分离

一.概述: MySQL数据库主从结构配置以后,正常情况下数据库的所有读写操作全部都在主数据库上面,从数据库仅仅作为数据备份使用,显然无法有效的使用服务器资源,那么实现读写分离的需求就不可避免. 二.拓扑图说明: 如上图所示,本文要实现的是读MySQL数据库的写入操作(增删改)等在Master服务器(192.168.4.10)上面实现,而对MySQL数据库的读取操作(查询)等在Slave服务器(192.168.4.20)上面完成. 如果在程序员编程时创建两个数据库连接Connection,在程序中

sql server 本地复制订阅 实现数据库服务器 读写分离

原文:sql server 本地复制订阅 实现数据库服务器 读写分离 再前段echosong 写了一遍关于mysql 数据同步实现业务读写分离的文章,今天咱们来看下SQL Server的复制订阅实现数据的读写分离 比起mysql的复制,SQL server 复制相对强大 一. 名词解释 1.复制的 机构组成(类比报纸流通): 1).发布服务器(报社出版) 生产维护数据源,审阅所有出版数据的更改 发送给 分发服务器(邮局) 2).分发服务器 (邮局) 分发服务器包括分发数据库,并且存储元数据.历史

Mycat - 实现数据库的读写分离与高可用【转】

文章地址:https://www.cnblogs.com/youzhibing/p/9553766.html 前言 开心一刻 上语文课,不小心睡着了,坐在边上的同桌突然叫醒了我,并小声说道:“读课文第三段”.我立马起身大声读了起来.正在黑板写字的老师吓了一跳,老师郁闷的看着我,问道:“同学有什么问题吗?”,我貌似知道了什么,蛋定的说了一句:“这段写的真好!我给大伙念念!”,老师还较真了:“你说说看,好在哪里?”,顿时我就无语了,脸黑着望向了同桌了,心想着:“这是个畜生啊!” 路漫漫其修远兮,吾将