36 个回答
分别回答下,题主的三个问题:
1. 目前,服务器的磁盘和内存,cpu都相对较好,一台数据库服务器可以存储好几亿条的数据,在一个什么样的情况下,应该考虑分布式数据库的,百亿?千亿?
考虑用分布式数据库,肯定是容量或者性能方面,现有的单机数据库满足不了业务的需求。当然,遇到了容量或者性能的问题,也不一定要用分布式数据库,可以通过scale-up的方式,即升级数据库服务器的CPU、内存、磁盘,将SATA/SAS盘换SSD盘等方式解决。不过相对scale-up来说, 分布式数据库这种scale-out的方式,扩展性会更强一些,一般来说也更具性价比。
普通的X86服务器,一台数据库服务器存好几亿条数据,问题不大,但前提是需要分库或分表,单表几亿条数据,普通服务器基本支撑不了的,毕竟数据量一大,表对应的B树层次就高,写入时B树节点的分裂和调整,开销也大。同时,上亿规模下,单台数据库服务器的恐怕不能支持密集的读请求,性能可能会有问题。
2. “如果单机数据库,直接通过分布式数据库来访问,分布式数据库是否能够提高数据库的效率呢?”
题主这里所说的分布式数据库, 应该是指数据库中间件这样的软件吧。目前比较流行的一种做法,是DBA利用开源中间件,结合自己项目的mysql或pg数据库,来搭建出一套分布式数据库的解决方案。主要的方法有两种:
一种是水平拆分。当数据量大到单机数据库已存储不下时, 可以对数据进行拆分,化整为零,将数据均匀分布到多个数据库节点中。由于对数据进行了拆分,每个数据库节点上的数据量小了,自然读写性能就提高了。
另一种是读写分离。这种方法,主要用在数据量并不大,单机数据库能够hold得住,但读请求很高的情况下。此时,可以配置多个只读数据库节点,来分担主节点的读请求。通过数据复制机制,在主节点和只读节点之间进行数据的实时同步,保证主从节点的数据一致性。
两种方法很好地解决了数据库的容量和性能问题。当然,使用了中间件,相当于在sql的执行路径上,多了一个处理环节,因此单条sql的延时,相对于直连数据库节点,在非满负载的情况下,肯定是要高的。但在实际的业务访问中,sql的性能瓶颈,一般都出在数据库节点上,中间件只是做单纯的sql解析和路由,性能开销不会很大。因此,通过增加数据库节点,提升sql处理的短板,是能够提高系统效率的。
3.“数据库分库后,一些复杂的sql场景,会比较难处理,而且分库之后,sql除了查询分库的数据外,还要进行数据合并操作,那是否是说不分库,比分库更好一些呢?”
基于中间件来进行分库, 确实对 SQL 有阉割的情况,并不是所有sql都能够支持。主要原因是数据被拆分了。而数据一旦被拆分到多个节点,则:
1.复杂的join查询
2. 同时更新多个数据库节点的sql语句
这两类SQL的支持难度,就比较高。这也是目前市面上所有中间件都无法满足的两点。复杂的join查询之所以难以支持,是因为要跨节点join;同时更新多个节点的sql难以支持,是因为很难解决多个节点的并发一致性问题。但是除了这两点之外,其他的sql类型,一款中间件是能够努力做到的。