1. 介绍
这个信息时代,每天都有大量数据产生。这对我们的技术也提出了新的挑战。今天简单看了点东西做了点总结。
2. 发展史
单纯从时间线来看,数据存储经历了 RDBMS->NoSQL->NewSQL
下面我们就以这三个类别来讨论。
PS: 我将不支持ACID特性的的都归纳到NoSQL哦,比如说ES。
3. RDBMS
RDBMS已经存在几十年了,非常成熟稳定。所以无论选择啥存储方案,一般都仍然会使用RDBMS做主存储。而且绝大部分场景,可以通过以下方式来提升RDBMS的查询效率:
- 建索引:合理的建和使用索引,查询亿级别的数据,控制在1秒内不成问题
- 分库分表:可以用一些JDBC sharding来做分库分表
4. NoSQL
4.1 Redis
如果不介意Redis的缺点的话(换句话说就是符合其使用场景的话),使用Redis可以显著提高读取性能。其优点就是社区十分成熟了,坑相对较少。
Redis的问题主要是:
- 数据类型支持少
- 不支持条件查询和复杂查询SQL。查询发杂情况下CPU load会很高
3.占用内存
- 没索引
4.2 SSDB
性能上可以做到和redis差不多。相比redis有些其自身优点:
- 支持冷热数据
- 更加节约内存
不过成熟度比redis差不少。
4.3 elasticsearch
社区成熟度还可以。同样能够提供高效的查询。相比redis而言能提供各种复杂的查询。不过重要数据不建议存储。因为其在安全方面比较差。容错方面比mongoDB好些。比如1主多从,主片挂了从片会自动顶上。对读多写少的存储es是可以代替mongo的,特别是运行在SSD服务器上时。ES维护起来还算简单。性能上若于mongoDB。
这个ES我也没好好用过,主要来源于网上资料参考。看看别人的应用场景吧,或许有所收获:
例1:
例2(罗哲):
关于该问题,在知乎已经有讨论,感兴趣的可以自己去看一看:
4.4 mongoDB
什么时候用mongoDB? 给出一篇文章作为参考:什么场景应该用 MongoDB?
比较适合的场景可以参考下图:以下特性有2个YES,选择mongoDB不会后悔。
4.5 mongoDB vs elasticsearch vs redis
真正的坑,估计只有全部好好玩过的才清楚了。
不过这篇文章罗列的表格可以参考:System Properties Comparison Elasticsearch vs. MongoDB vs. Redis
5. NewSQL
国外的google,国内的阿里,都在往NewSQL上发力,准备弄符合ACID特性的分布式数据库。拥有NOSQL的分布式高性能、扩展能力还具备ACID特性。从这个初衷来看,是很好的。
说到NewSQL必然要说到Google的F1。参照F1的理念,国内的pingCAP做出了类似的开源产品TiDB
有人可能会说,不是有mycat这样的RDBMS分布式方案了嘛,为啥还需要什么分布式数据库?关于这个问题可以参考下文章:怎样打造一个分布式数据库。简单来说,主要原因是通常的sharding,并没有真的做到分布式。比如SQL执行计划仍然是单机的,也没法做跨节点的join。没有完全发挥分布式计算的真正优点。
这里就简单提下NewSQL。后面有机会好好聊聊F1的原理,还有TiDB的实现。