820 likes | 1.22k Views
Cassandra 架构与应用. For Cassandra 0.7.0 淘宝网 文茂. Agenda. 基础知识 数据模型 数据分布策略 存储机制 数据读写删 最终一致性 Gossiper 面向未来. NoSql 背景.
E N D
Cassandra架构与应用 For Cassandra 0.7.0 淘宝网 文茂
Agenda • 基础知识 • 数据模型 • 数据分布策略 • 存储机制 • 数据读写删 • 最终一致性 • Gossiper • 面向未来
NoSql背景 随着互联网大规模的Web2.0应用的兴起,随着云计算需要的大规模分布式服务和分布式存储的发展,传统的关系数据库面临着诸多全新的挑战,特别是在那些超大规模和高并发的SNS类型的应用场景下,使用关系数据库来存储和查询用户动态数据已经显得力不从心,暴露了很多难以克服的问题,例如需要很高的实时插入性能;需要海量的数据存储能力同时还需要非常快的查询检索速度;需要将数据存储无缝扩展到整个群集环境下,并且能够在线扩展等等。在这样的背景下,NoSQL数据库就应运而生了。
NOSQL is simply Not Only SQL!
NOSQL特点 • 不要叫它们数据库 • 它们可以处理超大量的数据 • 它们运行在便宜的PC服务器集群上 • 它们击碎了性能瓶颈 • Bootstrap支持
ACID/BASE • ACID • 原子性(Atomicity). 事务中的所有操作,要么全部成功,要么全部不做. • 一致性(Consistency) 在事务开始与结束时,数据库处于一致状态. • 隔离性(Isolation). 事务如同只有这一个操作在被数据库所执行一样. • 持久性(Durability). 在事务结束时,此操作将不可逆转.(也就是只要事务提交,系统将保证数据不会丢失,即使出现系统Crash,译者补充). • BASE • Basically Available(基本可用) • Soft state(柔性状态) 状态可以有一段时间不同步,异步 • Eventually consistent(最终一致) 最终数据是一致的就可以了,而不是时时一致
最终一致性 • 场景介绍 • (1)存储系统 存储系统可以理解为一个黑盒子,它为我们提供了可用性和持久性的保证。 • (2)Process A ProcessA主要实现从存储系统write和read操作 • (3)Process B 和ProcessC ProcessB和C是独立于A,并且B和C也相互独立的,它们同时也实现对存储系统的write和read操作。 • 强一致性 强一致性(即时一致性) 假如A先写入了一个值到存储系统,存储系统保证后续A,B,C的读取操作都将返回最新值 • 弱一致性 假如A先写入了一个值到存储系统,存储系统不能保证后续A,B,C的读取操作能读取到最新值。此种情况下有一个“不一致性窗口”的概念,它特指从A写入值,到后续操作A,B,C读取到最新值这一段时间。 • 最终一致性 最终一致性是弱一致性的一种特例。假如A首先write了一个值到存储系统,存储系统保证如果在A,B,C后续读取之前没有其它写操作更新同样的值的话,最终所有的读取操作都会读取到最A写入的最新值。此种情况下,如果没有失败发生的话,“不一致性窗口”的大小依赖于以下的几个因素:交互延迟,系统的负载,以及复制技术中replica的个数(这个可以理解为master/salve模式中,salve的个数)。
Casandra是什么? • Cassandra是一个高可靠的大规模分布式存储系统。高度可伸缩的、一致的、分布式的结构化key-value存储方案。 • 2007由facebook开发 • 已经在生产环境中使用,比如emailindexsearch • 2009年成为Apache的孵化项目
Cassandra有什么特点? • 列表数据结构 在混合模式可以将超级列添加到5维的分布式Key-Value存储系统。 • 模式灵活 使用Cassandra,你不必提前解决记录中的字段。你可以在系统运行时随意的添加或移除字段。 • 真正的可扩展性 Cassandra是纯粹意义上的水平扩展。为给集群添加更多容量,可以增加动态添加节点即可。你不必重启任何进程,改变应用查询,或手动迁移任何数据。 • 多数据中心识别 你可以调整你的节点布局来避免某一个数据中心起火,一个备用的数据中心将至少有每条记录的完全复制。 • 范围查询 如果你不喜欢全部的键值查询,则可以设置键的范围来查询。 • 分布式写操作 有可以在任何地方任何时间集中读或写任何数据。并且不会有任何单点失败。
Agenda • 基础知识 • 数据模型 • 数据分布策略 • 存储机制 • 数据读写删 • 最终一致性 • Gossiper • 面向未来
数据模型 • Column • SuperColumn • ColumnFamily • Keyspaces • Row
Keyspaces • 一个Keyspace是Cassandra哈希第一维,是ColumnFamilies容器。 • 一般来说,我们的一个程序应用只会有一个Keyspace,相当于关系数据库的一个数据库.
Row • Row以key为表示,一个key对应的数据可以分布在多个column family中,通常我们都只会存放在一个column family中。
数据定位 • 第一层索引所用的 key 为 (row-key, cf-name), 即用一个 row-key 和 column-family-name 可以定位一个 column family。column family 是 column 的集合。 • 第二层索引所用的 key 为 column-name, 即通过一个 column-name 可以在一个 column family 中定位一个 column。
Agenda • 基础知识 • 数据模型 • 数据分布策略 • 存储机制 • 数据读写删 • 最终一致性 • Gossiper • 面向未来
数据分布策略 • Distributed hash table • Partitioner类型 RandomPartitioner OrderPreservingPartitioner ByteOrderedPartitioner CollatingOrderPreservingPartitioner • 副本策略 LocalStrategy RackUnawareStrategy RackAwareStrategy DatacenterShardStategy
Partitioner类型 • RandomPartitioner 随机分区是一种hash分区策略,使用的Token是大整数型(BigInteger),范围为0~2^127,因此极端情况下,一个采用随机分区策略的Cassandra集群的节点可以达到2^127+1个节点。 • 为什么是2^127? Cassandra采用了MD5作为hash函数,其结果是128位的整数值(其中一位是符号位,Token取绝对值为结果)。
Partitioner类型 • RandomPartitioner 4个节点,随机分配的Token分布情况 • 采用随机分区策略的集群无法支持针对Key的范围查询。 • 假如集群有N个节点,每个节点的hash空间采取平均分布的话,那么第i个节点的Token可以设置为:i * ( 2 ^ 127 / N )
Partitioner类型 • OrderPreservingPartitioner 如果要支持针对Key的范围查询,那么可以选择这种有序分区策略。该策略采用的是字符串类型的Token。 如果没有指定InitialToken,则系统会使用一个长度为16的随机字符串作为Token,字符串包含大小写字符和数字。
Partitioner类型 • ByteOrderedPartitioner • 和OrderPreservingPartitioner一样是有序分区策略。只是排序的方式不一样,采用的是字节型Token。
Partitioner类型 • CollatingOrderPreservingPartitioner 和OrderPreservingPartitioner一样是有序分区策略。只是排序的方式不一样,采用的是字节型Token。支持设置不同语言环境的排序方式,代码中默认是en_US。 将制定的Token信息按照不同语言环境来编组转化为字节数组。 其它与ByteOrderedPartitioner完全一致。
副本策略 • LocalStrategy:只在本地节点中保持一个副本。 • RackUnawareStrategy:不考虑机柜因素,将Token按照从小到大的顺序,从第一个Token位置处依次取N个节点作为副本。 • RackAwareStrategy:考虑机柜因素,在primaryToken之外,先找一个处于不同数据中心的点,然后在不同机柜找。
副本策略 • LocalStrategy:只在本地节点中保持一个副本。 • RackUnawareStrategy:不考虑机柜因素,将Token按照从小到大的顺序,从第一个Token位置处依次取N个节点作为副本。 • RackAwareStrategy:考虑机柜因素,在primaryToken之外,先找一个处于不同数据中心的点,然后在不同机柜找。
副本策略 • LocalStrategy:只在本地节点中保持一个副本。 • RackUnawareStrategy:不考虑机柜因素,将Token按照从小到大的顺序,从第一个Token位置处依次取N个节点作为副本。 • RackAwareStrategy:考虑机柜因素,在primaryToken之外,先找一个处于不同数据中心的点,然后在不同机柜找。
副本策略 • DatacenterShardStategy:这需要复制策略属性文件,在该文件中定义在每个数据中心的副本数量。在各数据中心副本数量的总和应等于Keyspace的副本数量。 • 举例来说,如果Keyspace的副本总数是6,数据中心副本因子可能是3、2和1 ,3个副本、2个副本、1个副本分别在不同数据中心 - 共计6。
副本策略 • Cassandra-rack.properties # Cassandra Node IP=Data Center:Rack 192.168.1.200=DC1:RAC1 192.168.2.300=DC2:RAC2 10.0.0.10=DC1:RAC1 10.0.0.11=DC1:RAC1 10.0.0.12=DC1:RAC2 10.20.114.10=DC2:RAC1 10.20.114.11=DC2:RAC1 10.21.119.13=DC3:RAC1 10.21.119.10=DC3:RAC1 10.0.0.13=DC1:RAC2 10.21.119.14=DC3:RAC2 10.20.114.15=DC2:RAC2 # default for unknown nodes default=DC1:r1
Agenda • 基础知识 • 数据模型 • 数据分布策略 • 存储机制 • 数据读写删 • 最终一致性 • Gossiper • 面向未来
存储机制 • Storage Model • Memtable • SSTable • Commitlog • Compaction
Memtable/SSTable • 数据先写入内存中的Memtable,写入关键路径上不需要持有任何锁,Memtable达到条件后刷新到磁盘,保存为SSTable,SSTable不可修改 • Memtable刷新到磁盘的三个条件
Memtable/SSTable • 同一个CF的多个SSTable可以合并(Compaction)以优化读操作 • 通过布隆过滤算法(Bloom Filter)减少对不可能包含查询key的SSTable的读取。 • 将随机写转变为顺序写,提升系统写性能。
Memtable/SSTable • SSTable包含对应的三种文件 • Datafile 按照Key排序顺序保存的数据文件 文件名称格式如下:ColumnFamilyName-序号-Data.db • Indexfile 保存每个Key在Datafile中的位置偏移 文件名称格式如下: ColumnFamilyName-序号-Filter.db • Filterfile 保存BloomFilter的Key查找树 文件名称格式如下: ColumnFamilyName-序号-index.db
Commitlog • Commitlog是server级别的,不是Column Family级别的,每一个节点上的Commitlog都是统一管理。 • 每个Commitlog文件的大小是固定的,称之为一个CommitlogSegment,目前版本(0.7.0)中,这个大小是128MB,硬编码在代码中。 • 当一个Commitlog文件写满以后,会新建一个的文件。 • SSTable持久后不可变更,故Commitlog只用于Memtable的恢复,相当于Oracle的Instance Recovery。Cassandra不需要做Media Recover • 当节点异常重启后,将根据SSTable和Commitlog进行实例恢复,在内存中重新恢复出宕机前的Memtable。 • 当一个Commitlog文件对应的所有CF的Memtable都刷新到磁盘后,该Commitlog就不再需要,系统会自动清除。
Commitlog • 每个Commitlog文件(CommitlogSegment)都有一个CommitlogHeader,紧随其后则是序列化之后的变更的RowMutation对象。 • Key是在Memtable中存在更新的CF_ID • Value保存的是Column Family在上一次Flush时日志的偏移位置,恢复时则可以从这个位置读取Commitlog记录。
Commitlog • Commitlog刷新有两种机制: • Batch:当CommitlogSegment刷新到磁盘后,插入Memtable操作才可继续。并且需要等待CommitLogSyncBatchWindowInMS毫秒(默认值1,建议0.1~10)内的其他写操作一起批量刷日志到磁盘。可以类比为Oracle的batch/wait模式。 • Periodic :每隔CommitLogSyncPeriodInMS毫秒(默认值10000)性刷新CommitlogSegment,不阻塞数据写操作,可以类比为Oracle的batch/nowait模式。
Compaction • 一个CF可能有很多SSTable,系统会将多个SSTable合并排序后保存为一个新的SSTable,称之为Compaction。 • 一次compaction最多请求合并32个SSTable,最少4个。超过32个则按时间排序分批进行(这两个阈值可以设置)。 • 如果空间不足,则尝试去掉最大的SSTable再合并,如果连合并两个最小的SSTable的空间都不足,则告警。 • Major Comaction:合并CF的所有SSTable为一个新的SSTable,同时执行垃圾数据(已标记删除的数据tombstone)清理。 • Minor Compaction:只合并大小差不多的SSTable,超过4个需要合并的SSTable就会自动触发。 • 可通过nodetool compact命令手动触发。 • 数据目录最好保持50%以上的可用空间。
Compaction • Compaction将旧的SSTable的记录按序写入到新的名字包含tmp的SSTable,完成后重命名去掉tmp,切换到新文件后,再将原SSTable删除。 • 可以通过设置Compaction的minthreshold(默认4)和maxthreshold(默认32)来改变触发一次Comaction合并的最少SSTable数和最多SSTable数。 • 如果设置minthreshold=0或者maxthreshold=0,则会禁止系统自动执行Minor Compaction。建议在业务高峰期禁止Compaction,定期到业务低峰期通过nodetool compact手工执行Major Compaction。 • 以上两个参数可以通过nodetool设置: Nodetoolsetcompactionthreshold[minthreshold] ([maxthreshold])
Agenda • 基础知识 • 数据模型 • 数据分布策略 • 存储机制 • 数据读写删 • 最终一致性 • Gossiper • 面向未来
数据读写删 • Quorum NRW • Read • Write • ConsistencyLevel • Delete
Quorum NRW N: 复制的节点数量 R: 成功读操作的最小节点数 W: 成功写操作的最小节点数