{{ item.name }}
{{ item.name }}

{{ it.name }}

{{ it.text }}

{{ it.name }}

{{ innerIt.name }}

{{ innerIt.text }}

{{news.time}}
{{news.title}}
什么情况下,需要使用分布式数据库?
2020-11-17发布 2,741浏览

如果通过分布式数据库直接访问单机数据库,分布式数据库能否提高数据库的效率?数据库分区后,一些复杂的sql场景将更难处理。数据库分区后,sql不仅查询分区数据库中的数据,还进行数据合并操作。这是否意味着它比不分区数据库的数据库好?

1. 目前,服务器的磁盘和内存,cpu都相对较好,一台数据库服务器可以存储好几亿条的数据,在一个什么样的情况下,应该考虑分布式数据库的,百亿?千亿?

以分布式数据库为例,肯定是容量或性能方面的问题,现有的单机数据库无法满足业务需求。自然,如果遇到容量或性能问题,也不需要使用分布式数据库,可以通过scale-up方法来解决,例如,将数据库服务器的 CPU、内存、磁盘升级到 SATA/SAS盘,将 SSD盘换成 SATA/SAS盘。但是,相对于scale-up,分布式数据库采用的是scale-out方式,具有更强的扩展性,而且通常价格低廉。
 
一般X86服务器中,一个数据库服务器中有数亿个数据,问题不大,只要需要分库或分表,一个表中有数亿个数据,一般服务器基本上支持不了,毕竟数据量一大,表对应的 B树层次就很高,在写 B树时, B树节点的拆分和调整开销也很大。与此同时,在上亿规模的数据库中,单个数据库服务器恐怕无法支持密集读请求,性能也可能出现问题。
2. “如果单机数据库,直接通过分布式数据库来访问,分布式数据库是否能够提高数据库的效率呢?” 

这里说的分布式数据库应该是指数据库中间件等软件。目前比较流行的一种方式是DBA利用开源中间件,结合自己项目的mysql或pg数据库,构建分布式数据库解决方案。主要有两种方法一种是水平拆分。当数据量太大,无法存储在单个数据库中时,可以将数据拆分成多个部分,数据可以均匀分布在多个数据库节点中。由于数据被拆分,每个数据库节点上的数据量很小,提高了自然读写性能。另一种是读写分离。这种方法主要用于数据量不大,单机数据库可以容纳,但读取请求较高的情况。此时,可以配置多个只读数据库节点来共享主节点的读取请求。通过数据复制机制,在主节点和只读节点之间进行实时数据同步,保证主节点和从节点之间的数据一致性。
两种方法很好地解决了数据库的容量和性能问题。当然,使用了中间件,相当于在sql的执行路径上,多了一个处理环节,因此单条sql的延时,相对于直连数据库节点,在非满负载的情况下,肯定是要高的。但在实际的业务访问中,sql的性能瓶颈,一般都出在数据库节点上,中间件只是做单纯的sql解析和路由,性能开销不会很大。因此,通过增加数据库节点,提升sql处理的短板,是能够提高系统效率的。 
3.数据库分库后,复杂的sql场景难以处理,而且分库后,sql除了查询分库的数据外,还进行数据合并操作,不分库比分库好吗?
主要原因是数据被分割,一旦数据被分割成多个节点,很难更新多个数据库节点的sql语句。复杂的join查询之所以难以支持,是因为要跨节点join;同时更新多个节点的sql难以支持,是因为很难解决多个节点的并发一致性问题。但是除了这两点之外,其他的sql类型,一款中间件是能够努力做到的。 
从中间件实现的角度,我们来对sql做一个分析,以说明这一点。 
1. 按操作范围的维度,可以把所有的SQL,分为3类:
1.1 kv类的sql: 这种sql操作很简单,就是简单的set/put某个表的一条记录,大部分insert/delete/update语句,和指定primary key/key的select,都属于这种类型。     1.2 范围更新/查询:这种sql不局限于操作一条记录,但还是作用于一张表。比如update多行记录,或者select某个时间范围的记录等。
1.3 多表join查询:又包括两种:
1.3.1 分库分表键都是同一个的多表join:由于采用同一个划分键,因此join操作其实是发生在单节点 
1.3.2 分库分表键不是同一个的多表join: 此时涉及到跨节点的join,实现复杂 
2.按是否要在关系运算之后,还要对结果进行聚合,把select sql分为两类:     2.1 不需要进行结果聚合,即select sql中没有集函数、group by、order by、limit等需要在关系运算之后,再对结果进行处理和聚合;     2.2 包括上述结果聚合语法的select sql 
3.从是否对分布式事务有要求的角度,可以把SQL分为两类:
3.1 只读写一个节点的sql,无分布式事务要求
3.2 跨多个节点读写的sql,有分布式事务要求 
根据之前所述, 目前的业内的中间件,都不能支持1.3.2 和3.2(mycat对分布式事务的支持,只支持最终一致性,还是一个伪支持;阿里DRDS号称内测版本支持分布式事务,但一直未见公测),而除去这两点,对于类型(1.1, 1.2, 1.3.1) × (2.1,2.2)得到的6种sql类型,理论上讲,中间件都是可以做到支持的。 对于OLTP应用来讲,这6种类型能够覆盖绝大部分的业务场景,这也是中间件技术这几年这么流行的原因。遗憾的是,目前业内的各大中间件, 对这6种类型的sql,支持程度往往都有一定的折扣。比如对于这样一条操作单表的sql: 
select distinct id, avg(price) from t1 where id>=1 group by concat(id,name) order by avg(price) limit 10; 目前主流的几款中间件,似乎就不能支持。


上一篇
专业的MySQL DBA培训
400-820-6580 13916131869
marketing@actionsky.com
上海市闵行区万源路2138号泓茂中心2号楼
产品详情
关系型数据库
AI数据库
数据库智能管理平台
数据库生态产品
行业案例
金融行业
新零售行业
制造业
通信行业
更多
公司动态
最新新闻
国产化信息
技术分享
关于我们
公司简介
公司分布
国家专利
资质认证
扫码关注公众号
© Copyright 2017, All rights reserved by: 上海爱可生信息技术股份有限公司 沪ICP备12003970号-1 | 法律声明 | 网站地图
沪公网安备 31010402003331号