1 / 82

Cassandra 架构与应用

Cassandra 架构与应用. For Cassandra 0.7.0 淘宝网 文茂. Agenda. 基础知识 数据模型 数据分布策略 存储机制 数据读写删 最终一致性 Gossiper 面向未来. NoSql 背景.

malana
Download Presentation

Cassandra 架构与应用

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Cassandra架构与应用 For Cassandra 0.7.0 淘宝网 文茂

  2. Agenda • 基础知识 • 数据模型 • 数据分布策略 • 存储机制 • 数据读写删 • 最终一致性 • Gossiper • 面向未来

  3. NoSql背景 随着互联网大规模的Web2.0应用的兴起,随着云计算需要的大规模分布式服务和分布式存储的发展,传统的关系数据库面临着诸多全新的挑战,特别是在那些超大规模和高并发的SNS类型的应用场景下,使用关系数据库来存储和查询用户动态数据已经显得力不从心,暴露了很多难以克服的问题,例如需要很高的实时插入性能;需要海量的数据存储能力同时还需要非常快的查询检索速度;需要将数据存储无缝扩展到整个群集环境下,并且能够在线扩展等等。在这样的背景下,NoSQL数据库就应运而生了。

  4. NOSQL is simply Not Only SQL!

  5. NOSQL特点 • 不要叫它们数据库 • 它们可以处理超大量的数据 • 它们运行在便宜的PC服务器集群上 • 它们击碎了性能瓶颈 • Bootstrap支持

  6. CAP

  7. ACID/BASE • ACID • 原子性(Atomicity). 事务中的所有操作,要么全部成功,要么全部不做. • 一致性(Consistency) 在事务开始与结束时,数据库处于一致状态. • 隔离性(Isolation). 事务如同只有这一个操作在被数据库所执行一样. • 持久性(Durability). 在事务结束时,此操作将不可逆转.(也就是只要事务提交,系统将保证数据不会丢失,即使出现系统Crash,译者补充). • BASE • Basically Available(基本可用) • Soft state(柔性状态) 状态可以有一段时间不同步,异步 • Eventually consistent(最终一致) 最终数据是一致的就可以了,而不是时时一致

  8. 最终一致性 • 场景介绍 • (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的个数)。

  9. Casandra是什么? • Cassandra是一个高可靠的大规模分布式存储系统。高度可伸缩的、一致的、分布式的结构化key-value存储方案。 • 2007由facebook开发 • 已经在生产环境中使用,比如emailindexsearch • 2009年成为Apache的孵化项目

  10. Cassandra有什么特点? • 列表数据结构 在混合模式可以将超级列添加到5维的分布式Key-Value存储系统。 • 模式灵活 使用Cassandra,你不必提前解决记录中的字段。你可以在系统运行时随意的添加或移除字段。 • 真正的可扩展性 Cassandra是纯粹意义上的水平扩展。为给集群添加更多容量,可以增加动态添加节点即可。你不必重启任何进程,改变应用查询,或手动迁移任何数据。 • 多数据中心识别 你可以调整你的节点布局来避免某一个数据中心起火,一个备用的数据中心将至少有每条记录的完全复制。    • 范围查询 如果你不喜欢全部的键值查询,则可以设置键的范围来查询。 • 分布式写操作 有可以在任何地方任何时间集中读或写任何数据。并且不会有任何单点失败。

  11. Agenda • 基础知识 • 数据模型 • 数据分布策略 • 存储机制 • 数据读写删 • 最终一致性 • Gossiper • 面向未来

  12. 数据模型 • Column • SuperColumn • ColumnFamily • Keyspaces • Row

  13. Column

  14. Column Family{Columns}

  15. Super Column

  16. ColumnFamily {SuperColumns}

  17. Keyspaces • 一个Keyspace是Cassandra哈希第一维,是ColumnFamilies容器。 • 一般来说,我们的一个程序应用只会有一个Keyspace,相当于关系数据库的一个数据库.

  18. Row • Row以key为表示,一个key对应的数据可以分布在多个column family中,通常我们都只会存放在一个column family中。

  19. 数据定位 • 第一层索引所用的 key 为 (row-key, cf-name), 即用一个 row-key 和 column-family-name 可以定位一个 column family。column family 是 column 的集合。 • 第二层索引所用的 key 为 column-name, 即通过一个 column-name 可以在一个 column family 中定位一个 column。

  20. Agenda • 基础知识 • 数据模型 • 数据分布策略 • 存储机制 • 数据读写删 • 最终一致性 • Gossiper • 面向未来

  21. 数据分布策略 • Distributed hash table • Partitioner类型 RandomPartitioner OrderPreservingPartitioner ByteOrderedPartitioner CollatingOrderPreservingPartitioner • 副本策略 LocalStrategy RackUnawareStrategy RackAwareStrategy DatacenterShardStategy

  22. Distributed hash table

  23. Partitioner类型 • RandomPartitioner 随机分区是一种hash分区策略,使用的Token是大整数型(BigInteger),范围为0~2^127,因此极端情况下,一个采用随机分区策略的Cassandra集群的节点可以达到2^127+1个节点。 • 为什么是2^127? Cassandra采用了MD5作为hash函数,其结果是128位的整数值(其中一位是符号位,Token取绝对值为结果)。

  24. Partitioner类型 • RandomPartitioner 4个节点,随机分配的Token分布情况 • 采用随机分区策略的集群无法支持针对Key的范围查询。 • 假如集群有N个节点,每个节点的hash空间采取平均分布的话,那么第i个节点的Token可以设置为:i * ( 2 ^ 127 / N )

  25. Partitioner类型 • OrderPreservingPartitioner 如果要支持针对Key的范围查询,那么可以选择这种有序分区策略。该策略采用的是字符串类型的Token。 如果没有指定InitialToken,则系统会使用一个长度为16的随机字符串作为Token,字符串包含大小写字符和数字。

  26. Partitioner类型

  27. Partitioner类型 • ByteOrderedPartitioner • 和OrderPreservingPartitioner一样是有序分区策略。只是排序的方式不一样,采用的是字节型Token。

  28. Partitioner类型

  29. Partitioner类型 • CollatingOrderPreservingPartitioner 和OrderPreservingPartitioner一样是有序分区策略。只是排序的方式不一样,采用的是字节型Token。支持设置不同语言环境的排序方式,代码中默认是en_US。 将制定的Token信息按照不同语言环境来编组转化为字节数组。 其它与ByteOrderedPartitioner完全一致。

  30. 副本策略 • LocalStrategy:只在本地节点中保持一个副本。 • RackUnawareStrategy:不考虑机柜因素,将Token按照从小到大的顺序,从第一个Token位置处依次取N个节点作为副本。 • RackAwareStrategy:考虑机柜因素,在primaryToken之外,先找一个处于不同数据中心的点,然后在不同机柜找。

  31. 副本策略 • LocalStrategy:只在本地节点中保持一个副本。 • RackUnawareStrategy:不考虑机柜因素,将Token按照从小到大的顺序,从第一个Token位置处依次取N个节点作为副本。 • RackAwareStrategy:考虑机柜因素,在primaryToken之外,先找一个处于不同数据中心的点,然后在不同机柜找。

  32. 副本策略 • LocalStrategy:只在本地节点中保持一个副本。 • RackUnawareStrategy:不考虑机柜因素,将Token按照从小到大的顺序,从第一个Token位置处依次取N个节点作为副本。 • RackAwareStrategy:考虑机柜因素,在primaryToken之外,先找一个处于不同数据中心的点,然后在不同机柜找。

  33. 副本策略 • DatacenterShardStategy:这需要复制策略属性文件,在该文件中定义在每个数据中心的副本数量。在各数据中心副本数量的总和应等于Keyspace的副本数量。 • 举例来说,如果Keyspace的副本总数是6,数据中心副本因子可能是3、2和1 ,3个副本、2个副本、1个副本分别在不同数据中心 - 共计6。

  34. 副本策略 • 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

  35. Agenda • 基础知识 • 数据模型 • 数据分布策略 • 存储机制 • 数据读写删 • 最终一致性 • Gossiper • 面向未来

  36. 存储机制 • Storage Model • Memtable • SSTable • Commitlog • Compaction

  37. Storage Model

  38. Memtable/SSTable • 数据先写入内存中的Memtable,写入关键路径上不需要持有任何锁,Memtable达到条件后刷新到磁盘,保存为SSTable,SSTable不可修改 • Memtable刷新到磁盘的三个条件

  39. Memtable/SSTable • 同一个CF的多个SSTable可以合并(Compaction)以优化读操作 • 通过布隆过滤算法(Bloom Filter)减少对不可能包含查询key的SSTable的读取。 • 将随机写转变为顺序写,提升系统写性能。

  40. Memtable/SSTable • SSTable包含对应的三种文件 • Datafile 按照Key排序顺序保存的数据文件 文件名称格式如下:ColumnFamilyName-序号-Data.db • Indexfile 保存每个Key在Datafile中的位置偏移 文件名称格式如下: ColumnFamilyName-序号-Filter.db • Filterfile 保存BloomFilter的Key查找树 文件名称格式如下: ColumnFamilyName-序号-index.db

  41. 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就不再需要,系统会自动清除。

  42. Commitlog • 每个Commitlog文件(CommitlogSegment)都有一个CommitlogHeader,紧随其后则是序列化之后的变更的RowMutation对象。 • Key是在Memtable中存在更新的CF_ID • Value保存的是Column Family在上一次Flush时日志的偏移位置,恢复时则可以从这个位置读取Commitlog记录。

  43. Commitlog • Commitlog刷新有两种机制: • Batch:当CommitlogSegment刷新到磁盘后,插入Memtable操作才可继续。并且需要等待CommitLogSyncBatchWindowInMS毫秒(默认值1,建议0.1~10)内的其他写操作一起批量刷日志到磁盘。可以类比为Oracle的batch/wait模式。 • Periodic :每隔CommitLogSyncPeriodInMS毫秒(默认值10000)性刷新CommitlogSegment,不阻塞数据写操作,可以类比为Oracle的batch/nowait模式。

  44. Compaction

  45. 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%以上的可用空间。

  46. 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])

  47. Agenda • 基础知识 • 数据模型 • 数据分布策略 • 存储机制 • 数据读写删 • 最终一致性 • Gossiper • 面向未来

  48. 数据读写删 • Quorum NRW • Read • Write • ConsistencyLevel • Delete

  49. Quorum NRW N: 复制的节点数量 R: 成功读操作的最小节点数 W: 成功写操作的最小节点数

  50. Read

More Related