NoSQL实践指南
进度
P230,快速看本书可以从P276开始
笔记
使用NoSQL的动机:可伸缩性,成本开销,灵活性,可用性。
例子:购物车,用户自己看,别人不会看, kv类型。
2PC:降低可用性提高一致性。
CAP:P分区指的是网络分区。
ACID:C 数据库事务不会使得数据库陷入数据完整性收到破环。
BASE:basically available:出了故障,其余部分可用, s:soft state 数据最终会被新值所覆写 eventually consistent:副本数据暂时不一致
软状态:不刷新就会过期的数据。
最终一致性:因果,读自己写,会话,单调读(读读),单调写(写写)
键值数据库最简单。查询受限。只能根据K查询。
文档数据库的文档,指的是以字符串或字符串二进制存储的数据结构。JSON或者XML。半结构化的实体。可以根据属性查询文档。
列族数据库:每一行有不同的列。关系数据库每一行列相同。
用户,订单,支付 在关系型是三张表,但是列组里面一张表。
KV
数组->关联数组->缓存->内存键值数据库->磁盘键值数据库
主从,有写入压力,无主,无写入压力
关键词:键值,命名空间,分区,分区键,schemaless,集群,无主(ring),
内存型 kv :redis,磁盘型 kv:leveldb
Redis:主从 Riak:无主
如果发现总是在设计较大的数值结构,可能需要文档数据库。
OracleNoSQL支持表格结构。支持高级搜索功能:Riak
KV模拟表格,关系型数据库。
document
文档是键值对的集合。
文档和kv比,优势在于相关属性可以放在同一个对象内。
相似的文档叫集合。文档-行,集合-表
文档支持CRUD操作。
水平分区就是分片技术。
html是文档。和文档数据库很类似。
kv不需要关系反范式化,文档则需要。
数据范式化意味着:关联/join。少冗余。
KV不需要query processor,而文档需要。需要处理AND,OR等操作。
关系型:订单和顾客信息分开放,这样删除完用户订单后,顾客信息不会丢失。文档型:总是关联数据放在一起。
一对一关系:一个文档实现 一对多关系:嵌套文档实现 多对多关系:两个集合来实现 层级关系:指向父节点或子节点,列出所有上级节点。
Column
宽列数据库,
行由列族组成。
值由行标识符,列名,时间戳来索引。
row key vs primary key
列族是map of map
当数据库不一致时候,会产生信息熵。 反熵算法修复副本不一致:检测副本之间是否有数据差异的一套流程,交换很少数据,发现副本不一致。发送hash码:如merkle树过去检测。
hash tree快速判断数据集是否一致。
提示移交,不用担心暂时写不进去,节点恢复后会移交数据。写入请求先保存。
cassandra的primary key就是row key=Partition key column+Clustering columns.
写入较多适合列祖数据库。
术语:keyspace,row key,column,column family
列由列明,时间戳,列值组成。
列族常用技术:集群,分区,提交日志,bloom过滤器,一致性级别。
LSM tree较多。
分配给布隆过滤器内存越大,越不容易出错。1%假阳性,10个二进制位表示每个元素,在多5个二进制位,错误率降低到0.1%。
列族设计是用户驱动的。需要先回答问题,才能开始设计。设计从查询入手。
列族数据库是稀疏,多维的map,列可以动态添加,数据行的列不同。(user_by_product,product_by_user)
适合存放:稀疏多维数据集,大量数据(HBase,Bigtable.Cassandra),且大数据有关。
选型
类别 | 考虑 |
---|---|
Relation | 关系型数据 case:交易,数仓 |
KV | 频繁读取,少量写入 缓存关系型数据 web程序容易变化属性,购物车 配置信息,用户数据信息 领域数据模型较为简单 case:购物车,缓存 |
Document | 读写较大 属性多变数据,灵活的数据 JSON结构的程序 大结构反范式化数据 查询模式较多 case:cms系统 |
Column Family | 总是可写 多数据中心 副本暂时不一致 字段经常变化 数据量很大,大数据级别,TB级别 case:大量设备分析日志,分析客户特征,提供个性化内容 |
Graph | 社交网络 推荐产品服务 case:计算机网络,社交网站 |
参考
Paper
Key-Value stores: a practical overview
Towards Robust Distributed Systems