dengdaiyemanren / java

java课程学习blog以及代码
3 stars 0 forks source link

性能设计之数据库扩展 #48

Open dengdaiyemanren opened 6 years ago

dengdaiyemanren commented 6 years ago

读写分离 CQRS

CQRS全称Command an Query Responsibility Segregation ,也就是命令与查询职责分离。 其原理是,用户对于一个应用的操作可以分成两种,一种是Command 也就是我们的写操作(增,删,改),另一种是Query操作(查),也就是读操作。Query操作基本上是在做数据整合显现,而Command操作这边会有更重的业务逻辑。分离这两种操作可以在语义上做好区分。

dengdaiyemanren commented 6 years ago

分库分表 Sharding

一般来说,影响数据库最大的性能问题有两个,一个是对数据库的操作,一个是数据库中数据的大小。 对于前者,我们需要业务上优化。一方面,简化业务,不要在数据库上做太多的关联查询,而对于一些更为复杂的用于做报表或者搜索的数据库操作,应该把其移到更合适的地方。比如,用ElasticSearch来做查询,用Hadoop或者别的数据分析软件来做报表分析。 对于或者,分库分表是必要的手段。

关于分库策略。 我们把数据库按某种规则分成了三个库。比如,或者按地理位置,或者按日期,或者按某个范围分,或者按一种hash散列算法。总之,我们把数据分到了三个库中。

关于数据库访问层。 需要引入一个叫做“数据访问层”的中间件。解析SQL语句的能力,并且根据解析的SQL路由。 比如要做一个分页功能,需要读一组顺序的数据,或者需要做MAX/MIN/COUNT 这样的操作。需要到三个库中分别求值,然后在数据访问层这里合计处理返回。如果遇到跨库事物,你需要走XA这样两阶段提交操作,这样会把数据库性能降到最低。 一般的分片策略如下:

dengdaiyemanren commented 6 years ago

数据库扩展的设计重点

这里只是业务层上谈一下数据扩展的两种方法,数据库引擎的水平扩展,可以参考《分布式数据调度的相关论文》中的AWS Aurora 和Google Spanner 的那些方法。

一个服务一个库,AWS的玩法。 先做服务化拆分,再做分片。 有两种分片模式,一种是水平分片,一种是垂直分片。水平分片就是我们之前说的那种分片。而垂直分片 是把一张表的一些字段放到一张表中,另一些字段放到另一张表中。垂直分片主要是把一些经常修改的数据和不经常修改的数据给分离开来,这样修改某个字段的数据时,不会导致其他字段的数据被锁而影响性能。比如电商的商品描述信息和库存价格信息分离。 水平分片需要注意的点。

dengdaiyemanren commented 6 years ago

我们的系统设计

CQRS

VO的实体类型不一样,EntityVO和QueryVO 操作方法不一样,queryByVc, loadUsageByVc

数据库访问层

聚合路由功能:DDS层功能模块

服务化

某一领域的服务对应自己的库,逻辑上分离。

水平分库

按照BE,租户水平分库,逻辑上分离,物理上通过同步保持数据一致。 分库携带字段为BE,要求每张分库表都需要携带这个字段,否则会导致SQL下沉不了。 额外的查询需要申明为非分库查询,效率变低。

另一种水平分库的方法

背景:一个BE下数据量还是很大,一个客户挂靠大量设备。