第六讲NoSQL
NoSQL的技术特征:三个否定
1998年的NoSQL项目仅仅否定SQL语言,2009年的NoSQL运动发
展为三个否定,核心是否定关系模型
否定关系模型
否定ACID事务
否定SQL语言(在某种程度上又回归SQL)
NoSQL的繁荣与分类
1. Document(文档): Clusterpoint, Apache CouchDB, Couchbase, MarkLogic, MongoDB
2. Key-value(键值):Dynamo, Cassandra, FoundationDB, MemcacheDB, Redis, Riak, Aerospike
3. Graph(图): Allegro, Neo4J, InfiniteGraph, OrientDB, Virtuoso, Stardog
Cassandra特点与定位
• 无单点故障
• 高可用性
• 可配置的一致性
• 适合事件追踪与分析
– 时间序列数据
– 传感器设备数据
– 社交媒体分析
– 风险分析
– 故障预测
Cassandra 的逻辑数据模型
1. 键空间 - Keyspace– 最上层的命名空间
– 通常是一个应用程序一个Keyspace
– ~= database
2. 列族 - ColumnFamily
– 与table对应
– 不同点在于,Column Family是稀疏的表
3. 行 - Row
每一行由一个key唯一标识由columns 组成
4. 列 - Column
存储的基本单元
列-Column
• 是一个三元组 : (name, value, timestamp)
• name
– byte[]
– 用于查询
• value
– byte[]
– 无法按列值查询(在没有辅助索引的情况下)
• timestamp
– Long 类型 (记录时间戳)
– 可用来解决版本冲突
键空间-Keyspace
• Keyspace 是列族(column family)的容器
• 一个keyspace 具有如下特定的配置
– 数据分区策略, 副本数目等
• 一个应用程序,一般有一个keyspace 和多个列族
CQL的理由
• Thrift 接口
– 低层接口: get, get_slice, mutate...
– 直接暴露了内部存储结构(不利于系统升级)
• CQL2
– 在0.8版本(CQL)引入, 在1.0版本更新(CQL2),
– 语法和SQL类似, 比Thrift 接口更可扩展
– 几乎是1对1的映射到Thrift 接口, 所以不支持SQL中面向行的部分内容,也不支持复合类型
Cassandra去中心化的架构-P2P
• P2P分布式架构
– 所有节点在结构上是对等关系
– 任一节点宕机,可能对整个机群的吞吐性能造成潜在的影响,
– 但不会造成灾难性的服务中断
• 扩展能力强
– 集群扩展时,绝大多数步骤都是自动完成的
– 得益于P2P的架构,集群的扩展相比主从结构更为简便
流言协议(Gossip 协议)
• Cassandra借鉴了Amazon的键值系统Dynamo的体系架构
• 节点利用Gossip 协议来发现集群中其他节点的位置(如路由表、Hash环上的位置)、状态(如版本、负载、死活)等信息
Gossip 协议的原理
• 流言协议也被称为”Epidemic Algorithms”(疫情算法),因为它的工作机制也像瘟疫传播
• 一个节点一旦获取了另一个节点的信息,它就会把该信息传给集群中的其它节点
• 最后,集群中所有节点都拥有这个节点的信息
Gossip交换信息的三种模式
1. 推模式(Push)
2. 拽模式(Pull)
3. 推+拽(Push-pull )
一致性哈希
• 基本思想
– 用同样的哈希函数来计算数据对象和机器节点的哈希值
– 哈希对象不只是数据,还有机器节点
• 机器节点不再是影响数据对象哈希值的参数,而是作为哈希函数的输入
副本
• 当数据被重复存储在两个以上节点时,我们称数据是副本存储的
• 全副本,指数据对象存储在所有节点上
– 全冗余数据库,在每个节点上都存储一个完整的数据库
• 我们把数据重复存储的次数,称为副本因子 N
– 每个数据项被复制到N个节点上
Cassandra的副本策略
• 简单策略
– 复制数据副本到协调者节点的N-1个后继节点上
• 机架感知策略
– 在不同的机架中选择存放副本的机器
• 数据中心感知策略
– 类似机架感知策略, 只是本策略是在数据中心层面做出选择
副本的优点
• 可用性
– 包含r的某些数据节点失效,不会导致数据r完全不可用
• 并行化
– 对于r的数据查询,可以通过多台含有r副本的节点并行获得
• 减少数据传输
– 数据项r被多个节点所拥有,可以在这些节点上本地获取数据r
副本的缺点
• 增加了更新的成本
– r的所有副本都需要被更新
• 增加了并发控制的复杂度
– 并发的更新不同的副本,可能会产生不一致的数据
– 除非实现特殊的并发控制策略
基于法团(Quorum)的协议
• 三个参数对读取和写入操作一致性非常重要
– N 对数据或数据片读写的副本数目
– NR 读操作中需要读取的节点个数
– NW 写操作中需要阻塞等待的节点个数
• 对于严格的一致性, 必须遵守下面的规则
– NR + NW > N
– NW > N/2
Cassandra存储结构
• Cassandra使用LSM-Tree结构存储数据
– L- commitLog:写操作的日志
– S - Sstable:数据持久化文件
– M - Memtable:内存中的数据表
• Memtable中的数据是排序的
• SStable中的数据一经写入,不再修改
• SStable被生成后,Memtable即被销毁,相关CommitLog清空