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