链式存储系统原理

• NoSQL运动与Cassandra系统
NoSQL的技术特征:三个否定
否定关系模型
否定ACID事务(亚洲工业发展理事会)
否定SQL语言(现在某种程度上又回归SQL)
大数据促进了NoSQL的迅速繁荣,出现了大量的、技术多样的NoSQL系统,主要可以分为三类:文档系统,键值系统和图系统。 以键值存储的代表,Cassandra系统为例。
Cassandra技术来源
Cassandra系统核心技术主要来源于两个方面, 一是Google的Bigtable,就是我们常说的大表, 另一个是Amazon的DynamoDB,主要是借鉴他的P2P架构。
Cassandra特点与定位
Cassandra的技术来源决定了的它所拥有的技术特点,即,无单点故障、高可用性和可配置的一致性。他适合的应用场景包括时间序列数据、物联网数据、社交媒体数据等等。
• 数据模型、接口和语言
Cassandra 的逻辑数据模型:
键空间 - Keyspace,最上层的命名空间,通常是一个应用程序一个Keyspace;
Keyspace 是列族(column family)的容器;一个keyspace 具有特定的配置(数据分区策略, 副本数目等);一个应用程序,一般有一个keyspace 和多个列族;
列族 - ColumnFamily,与table对应, 不同点在于:Column Family是稀疏的表;
一个 Column Family 由很多行组成;
行 - Row,每一行由一个key唯一标识,由columns 组成;
一行由很多列组成;
列 - Column,存储的基本单元。
列是一个三元组 : (name(用于查询), value(没有辅助索引的情况下无法按列查询), timestamp(long类型,可用来解决版本冲突))
核心概念之间的包含关系:
Cassandra接口-基于Thrift的API
读操作
get:单行键单列查询
get_slice:单行键多列查询
multiget_slice:多行键多列查询
get_count:获取列数量
get_range_slice:多行键列范围查询
get_indexed_slices:基于二级索引的多列查询
写操作
inset:单行单列写入
batch_mutate:多行多列写入
remove:单行单列删除
truncate:删除整个列族(打标记)
其他
login,describe_*,add/drop column family/keyspace
登陆,读取表结构,添加删除CF/KS
Cassandra查询语言 – Not only SQL
Cassandra 0.8版 引入CQL, 类似SQL以替代传统的RPC接口
CQL的理由
Thrift 接口(低层接口: get, get_slice, mutate...;直接暴露了内部存储结构,不利于系统升级)
CQL2(在0.8版本(CQL)引入, 在1.0版本更新(CQL2);语法和SQL类似, 比 Thrift 接口更可扩展;几乎是1对1的映射到 Thrift 接口, 所以不支持SQL中面向行的部分内容,也不支持复合类型)
CQL3示例
DESCRIBE keyspaces;——>查看键空间
CREATE KEYSPACE IF NOT EXISTS myCas WITH REPLICATION = {'class':'SimpleStrategy','replication_factor':1};——>创建键空间,使用键空间
USE testsp;——>使用键空间
DESCRIBE keyspace testsp;——>创建列族
CREATE ColumnFamily users1 (id int,user_name varchar, PRIMARY KEY (id) );——>插入数据
INSERT INTO users1 (id,user_name) VALUES (1, 'abc');——>更新数据
UPDATE users1 SET user_name = '2014' WHERE id = 1;——>删除数据
DELETE FROM users1 WHERE id = 1;——>查询数据
• 系统架构和Gossip协议
Cassandra去中心化的架构-P2P
P2P分布式架构:所有节点在结构上是 对等关系;任意节点 宕机,可能对整个机群的吞吐量造成潜在影响;但不会造成灾难性的服务中断。
扩展能力强:集群扩展时,绝大多数步骤都是自动完成的;得益于P2P架构,集群的扩展相比主从结构更为简便。
不同节点间如何相互感知(Hadoop是主从架构系统,所有节点定期与主节点通信,管理容易)
流言协议( Gossip协议—>疫情算法(Epoidemic Algorithms):借鉴Amazon的键值系统Dynamo的体系架构,利用Gossip协议来发现集群中其他节点的位置(如路由表、Hash环上的位置)、状态(如版本、负载、死活)等信息。
通过Gossip组建集群(指定部分种子节点,某些节点要预知多个种子节点;各节点与种子节点通信,形成集群;多次通信,集群中的节点互相都知道,组建集群完成。)
Gossip交换信息的三种模式:推(Push)、拽(Pull)、推+拽(Push-pull)
• 一致性哈希和数据分区
在Cassandra节点间相互连通之后,如何将大规模的数据集合进行切分并存放到到各个节点上呢?
Cassandra采用一种性哈希方法对数据集进行切分。其基本思想是用同样的哈希函数来计算 数据对象和节点的哈希值,用节点的哈希值作为数据集的切分点。
在一致性哈希方法中,节点不再是影响数据对象哈希值的参数,而是作为哈希函数的输入。
一致性哈希方法的优点主要有两条:
1、在确定了Hash函数和节点区间表以后,客户端就可以知道一个数据项存放在哪一个物理节点上。因此 不需要全局的元数据服务器
2、当节点数量改变时, 不需要将所有数据对象在新的集群进行重新分配。具体来讲,如果删除一个节点,邻近的机器会接管删除节点的数据,如果新增一个节点,邻近的机器会分摊一部分数据给新节点。
• 数据副本及其一致性
数据副本是大数据存储系统普遍采用的提高系统读性能,并保证系统可靠性的重要手段。
副本、全副本、副本因子N
Cassandra副本策略:
简单策略:复制数据副本到协调者节点的 N-1个后继节点上。
机架感知策略:在不同的机架中选择存放副本的机器。
数据中心感知策略:类似机架感知策略, 只是本策略是在数据中心层面做出选择。
副本的优点:可用性、并行化、减少数据传输。
副本的缺点:增加了更新成本,增加了并发控制的复杂度(并发可能会导致数据不一致)。
数据分区与数据迁移(需要同时更新数据本身与副本节点,考虑节点离开与新节点加入)。
保证数据的一致性:法团协议 Quorum)
–NR (读成功数)+ NW(写成功数) > N(副本数)
–NW > N/2
• 节点本地数据存取
data:存储真正的数据文件,既后面的SStable文件,可以指定多个目录。
commitlog:存储未写入SSTable中的数据(在每次写入之前先放入日志文件)。
cache:存储系统中的缓存数据(在服务重启的时候从这个目录中加载缓存数据)。
Memtable中的数据是排序的,Cassandra定期将Memtable刷到硬盘的Sstable当中;
SStable中的数据一经写入,不再修改;
SStable被生成后,Memtable即被销毁,相关CommitLog清空。
Cassandra系统中某一个节点的是如何完成本地数据存取的
Cassandra系统采用了P2P架构,节点完全对等,没有主节点。
客户端访问可以和集群中的任一节点相连,这个连接点叫协调者,其他节点叫非协调者。
协调者结点会根据一致性级别,把访问请求发送给相应数据节点。
最终执行用户请求的节点,可称之为本地节点。
Cassandra数据写入
1、写入memtable
2、写入CommitLog
首先从memtable获取数据,如果存在即返回;
否则,从行缓存中获取数据,如果存在即返回;
再则,检查布隆过滤器判断哪些sstable中存在数据,如果不存在即返回;
检索key缓存来快速在Sstable中定位
从sstable中获取数据
数据写入到行缓存中
列检索特别快!行切片检索比较快!
没有任何读操作,速度很快,阻塞来自于CPU而非I/O!
具体写入示意图如下:

猜你喜欢

转载自blog.csdn.net/cristina__jing/article/details/78745443