高并发系统学习 Day14 Nosql

67 阅读3分钟
对于存储服务来说,我们一般会从两个方面对它做改造:
    1. 提升它的读写性能,尤其是读性能,因为我们面对的多是一些读多写少的产品。
    比方说,你离不开的微信朋友圈、微博和淘宝,都是查询 QPS 远远大于写入 QPS。
    2. 增强它在存储上的扩展能力,从而应对大数据量的存储需求。
在 NoSQL 数据库刚刚被应用时,它被认为是可以替代关系型数据库的银弹,也许因为以下几个方面的原因:
弥补了传统数据库在性能方面的不足;数据库变更方便,不需要更改原先的数据结构;适合互联网项目常见的
大数据量的场景;

使用 NoSQL 提升写入性能:
很多 NoSQL 数据库都在使用的基于 LSM 树的存储引擎.
LSM 树(Log-Structured Merge Tree)牺牲了一定的读性能来换取写入数据的高性能,
Hbase、Cassandra、LevelDB 都是用这种算法作为存储的引擎。     
它的思想很简单,数据首先会写入到一个叫做 MemTable 的内存结构中,在 MemTable 中数据是按照写入的     Key 来排序的。为了防止 MemTable 里面的数据因为机器掉电或者重启而丢失,一般会通过写 Write Ahead     Log 的方式将数据备份在磁盘上。MemTable 在累积到一定规模时,它会被刷新生成一个新的文件,我们把这个     文件叫做 SSTable(Sorted String Table)。当 SSTable 达到一定数量时,我们会将这些 SSTable 合     并,减少文件的数量,因为 SSTable 都是有序的,所以合并的速度也很快。

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

提升扩展性.
MongoDB 就有三个扩展性方面的特性:
1)Replica,也叫做副本集,你可以理解为主从分离,也就是通过将数据拷贝成多份来保证当主挂掉后数据不会丢失。同时呢,Replica 还可以分担读请求。Replica 中有主节点来承担写请求,并且把数据变动记录到 oplog 里(类似于 binlog);从节点接收到 oplog 后就会修改自身的数据以保持和主节点的一致。一旦主节点挂掉,MongoDB 会从从节点中选取一个节点成为主节点,可以继续提供写数据服务。
2) Shard,也叫做分片,你可以理解为分库分表,即将数据按照某种规则拆分成多份,存储在不同的机器上。MongoDB 的 Sharding 特性一般需要三个角色来支持,一个是 Shard Server,它是实际存储数据的节点,是一个独立的 Mongod 进程;二是 Config Server,也是一组 Mongod 进程,主要存储一些元信息,比如说哪些分片存储了哪些数据等;最后是 Route Server,它不实际存储数据,仅仅作为路由使用,它从 Config Server 中获取元信息后,将请求路由到正确的 Shard Server 中。
3)负载均衡,就是当 MongoDB 发现 Shard 之间数据分布不均匀,会启动 Balancer 进程对数据做重新的分配,最终让不同 Shard Server 的数据可以尽量的均衡。当我们的 Shard Server 存储空间不足需要扩容时,数据会自动被移动到新的 Shard Server 上,减少了数据迁移和验证的成本。

此文章为5月Day14学习笔记,内容来源于极客时间《高并发系统设计 40 问》