week12 学习总结
NoSQL 选型
1)Redis、LevelDB 这样的 KV 存储。这类存储相比于传统的数据库的优势是极高的读写性能,一般对性能有比较高的要求的场景会使用
2)Hbase、Cassandra 这样的列式存储数据库。这种数据库的特点是数据不像传统数据库以行为单位来存储,而是以列来存储,适用于一些离线数据统计的场景
3)像 MongoDB、CouchDB 这样的文档型数据库。这种数据库的特点是 Schema Free(模式自由),数据表中的字段可以任意扩展,比如说电商系统中的商品有非常多的字段,并且不同品类的商品的字段也都不尽相同,使用关系型数据库就需要不断增加字段支持,而用文档型数据库就简单很多了
使用 NoSQL 提升写入性能
很多 NoSQL 数据库都在使用的基于 LSM 树的存储引擎
LSM 树(Log-Structured Merge Tree)牺牲了一定的读性能来换取写入数据的高性能,Hbase、Cassandra、LevelDB 都是用这种算法作为存储的引擎。
1)数据首先会写入到一个叫做 MemTable 的内存结构中,在 MemTable 中数据是按照写入的 Key 来排序的。为了防止 MemTable 里面的数据因为机器掉电或者重启而丢失,一般会通过写 Write Ahead Log 的方式将数据备份在磁盘上。
2)MemTable 在累积到一定规模时,它会被刷新生成一个新的文件,我们把这个文件叫做 SSTable(Sorted String Table)。当 SSTable 达到一定数量时,我们会将这些 SSTable 合并,减少文件的数量,因为 SSTable 都是有序的,所以合并的速度也很快。
3)当从 LSM 树里面读数据时,首先从 MemTable 中查找数据,如果数据没有找到,再从 SSTable 中查找数据。因为存储的数据都是有序的,所以查找的效率是很高的,只是因为数据被拆分成多个 SSTable,所以读取的效率会低于 B+ 树索引
HBase 是一个分布式的、面向列的开源数据库。
1)面向实时读写、随机访问大规模数据集的场景,是一个高可靠性、高性能、高伸缩的分布式存储系统,在大数据相关领域应用广泛.
2)在Hbase中一个列族(Column Family)和一个列修饰符(Column Qualifier)组合起来才叫一个列(Column),使用冒号(:)分割,列族:列修饰符。
数据在进入Hbase时都会被打上一个时间戳,这个时间戳可以作为版本号来使用。
一个行键、列族、列修饰符、数据和时间戳组合起来叫做一个单元格(Cell)。
这里的行键、列族、列修饰符和时间戳其实可以看作是定位属性(类似坐标),最终确定了一个数据。
3)HBase 本身已经考虑了很多故障切换和恢复的方案:
Zookeeper 集群:自身设计保证了可用性;
Master: 通过多个 master 注册在 Zookeeper 集群上来进行主节点的 HA 和更新;
RegionServer: 本身就是无状态的,节点失效下线以后会把上面的 region 自动迁走,对服务可用性不会有太大影响;
Thriftserver: 通过用 Thrift 对 HBase 的进行,Thriftserver 本身是单点的,可以通过 HAProxy 来代理一组 Thriftserver 服务;
HDFS:由 Namenode 和 DataNode 节点组成,Namenode 开启 HA 功能, 保证了 HDFS 的集群可用性 ;
版权声明: 本文为 InfoQ 作者【burner】的原创文章。
原文链接:【http://xie.infoq.cn/article/bef4fd336d0a904d64832ae5d】。未经作者许可,禁止转载。
评论