NoSQL架构模式与MySQL对比

LSM树介绍

LSM树的合并过程

LSM 树(Log-Structured Merge Tree)牺牲了一定的读性能来换取写入数据的高性能,Hbase、Cassandra、LevelDB 都是用这种算法作为存储的引擎.

当从 LSM 树里面读数据时,我们首先从 MemTable 中查找数据,如果数据没有找到,再从 SSTable 中查找数据.因为存储的数据都是有序的,所以查找的效率是很高的,只是因为数据被拆分成多个 SSTable,所以读取的效率会低于 B+ 树索引.

NoSQL一般的架构模式

架构图

WAL

Write Ahead Log 的方式将数据先写在磁盘上,防止系统故障MemTable出现问题导致数据丢失.

MemTable

MemTable是在内存结构中的,在 MemTable 中数据是按照写入的 Key 来排序的.
写入时一个是顺序写日志另一个是写入MemTable,所以相较于MySQL的非顺序数据和索引磁盘写入性能会很高.

SSTable (Sorted Strings Table)

MemTable 写入到磁盘生成SSTable.
如果要删除指定的key,那么被删除的key的标记也会flush到SSTable当中.
注意这个文件是有序的.该文件生成后是不许更改的.

Compactor

当不断生成新的SSTable时,同一个key可能会存在不同的SSTable中,那么不是最后出现的SSTable当中的这些数据就应该被清除.

Merge 这些SSTable,更新index就是Compactor的工作.

Index

当查询的key不在MemTable当中,就可以根据Index查询到SSTable对应的数据即可.

布隆过滤器

布隆过滤器是我们的老朋友了,经常出没于一些非关系型数据库或者大数据中经常见到.

主要作用,加速查询,快速过滤不存在的key.

实际使用优点

1.更新采用的是乐观锁的模式,按照版本号进行并发控制,减少锁的冲突,死锁检测等.更新文档的同时更新索引,将索引指向新写如的文件.
2.顺序和内存写入,写入性能高效,这就是NoSQL在大数据写入下的性能高于MySQL等关系型数据库的关键.
3.可采用WAL机制保证了数据的可靠性
4.分布式特性,可按照写入的Key进行Hash然后将数据写入对应的文件,对同一个key只用查询同一个文件即可.分布式特性,也是NoSQL快速发展的重要特性.

拓展

为什么NoSQL是LSM树,而不采用B+树呢?

B+树极大的提高了读性能,但是有这么几点也是B+树的弊端.B+树的特点是不够灵活,不像LMS树可以进行数据合并.尤其是对于乱序的写,节点存在分裂,这会导致严重的性能问题.
分布式不仅要考虑读性能更要考虑写性能,尤其是在数据量比较大的情况下.而且用缓存提高读性能要比缓存提高写性能要容易.

还有一个情况也需要考虑就是,写放大的问题,比如10M的数据写入MySQL可能需要100M,NoSQL需要50M.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9LgXtnRD-1603354164922)(evernotecid://8BF4008B-52C0-484E-A4B5-8EBD45F20215/appyinxiangcom/13973009/ENResource/p2002)]

主从适用于分布式吗?

主从架构主要适用于分布式读场景,面对分布式写的场景却比较难以招架. 在写场景比较多的情况下,除非分库我们可以减少写的流量.而分库带来的额外开发成本是比较大的. NoSQL一般采用的是集群的模式可以保证数据的分部,而且每台机器上有每个数据分片的副本来保证读性能.可以参照ElasticSearch,Redis的集群机制. 集群机制在多机房数据同步问题上会有巨大作用.