Cassandra架构与应用For Cassandra 0.7.0淘宝网文茂AgendaAgenda•基础知识•基础知识•数据模型•数据分布策略•存储机制•存储机制•数据读写删•最终一致性•Gossiper•Gossiper•面向未来NoSql背景NoSql背景随着互联网大规模的Web2.0应用的兴起,随着云计算需要的大规模分布式服务和分布式存储的发展传统的关系数据库面临着诸多全新分布式服务和分布式存储的发展,传统的关系数据库面临着诸多全新的挑战,特别是在那些超大规模和高并发的SNS类型的应用场景下,使用关系数据库来存储和查询用户动态数据已经显得力不从心,暴露很多难克的数库高并发读的需求海了很多难以克服的问题:(1)对数据库高并发读写的需求(2)对海量数据的高效率存储和访问的需求(3)对数据库的高可扩展性和高可用性的需求。在这样的背景下,NoSQL数据库就应运而生了。NOSQLNOSQLissimplyis simplyOlSQ!Not Only SQL!NOSQL特点NOSQL特点不要叫它们数据库•不要叫它们数据库•它们可以处理超大量的数据它们可以处理超大量的数据•它们运行在便宜的PC服务器集群上•它们打破了性能瓶颈•没有过多的操作没有过多的操作。•Bootstrap支持CAPCAPACID/BASEACID/BASEACIDBASE•ACID•原子性(Atomicity).事务中的所有操作要么全部成功•BASE•Basically Available(基本可用)•Softstate(柔性状态)事务中的所有操作,要么全部成功,要么全部不做.•一致性(Consistency)在事务开始与结束时,数据库处于一致状态Soft state(柔性状态)状态可以有一段时间不同步,异步•Eventually consistent(最终一致)最终数据是一致的就可以了,而不是致状态.•隔离性(Isolation). 事务如同只有这一个操作在被数据库所执行一样最终数据是致的就可以了,而不是时时一致库所执行样.•持久性(Durability).在事务结束时,此操作将不可逆转.(也就是只要事务提交,系统将保转(也就是只要事务提交,系统将保证数据不会丢失,即使出现系统Crash,译者补充).最终一致性最终致性•场景介绍•(1)存储系统(1)存储系统存储系统可以理解为一个黑盒子,它为我们提供了可用性和持久性的保证。•(2)Process A ProcessA、Process B 、ProcessC是3个相互独立节点,都可对存储系统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是什么?Casandra是什么?是个高靠的大规模分布式存•Cassandra是一个高可靠的大规模分布式存储系统。•2007由facebook开发已经在生产环境中使用比如ilidh–已经在生产环境中使用,比如emailindexsearch•2009年成为Apache的孵化项目Cassandra有什么特点?Cassandra有什么特点?•列表数据结构在混合模式可以将超级列添加到5维的分布式KVl存储系统在混合模式可以将超级列添加到5维的分布式Key‐Value存储系统。•模式灵活使用Cassandra,你不必提前解决记录中的字段。你可以在系统运行时随意的添加或移除字段意的添加或移除字段。•真正的可扩展性Cassandra是纯粹意义上的水平扩展。为给集群添加更多容量,可以增加动态添加节点即可。你不必重启任何进程,改变应用查询,或手动迁移任何数据。•多数据中心识别你可以调整你的节点布局来避免某一个数据中心起火,一个备用的数据中心将至少有每条记录的完全复制。•范围查询如果你不喜欢全部的键值查询,则可以设置键的范围来查询。•分布式写操作有可以在任何地方任何时间集中读或写任何数据并且不会有任何单点有可以在任何地方任何时间集中读或写任何数据。并且不会有任何单点失败。AgendaAgenda•基础知识•基础知识•数据模型•数据分布策略•存储机制•存储机制•数据读写删•最终一致性•Gossiper•Gossiper•面向未来数据模型数据模型•Column•SuperColumnSuperColumn•ColumnFamily•Keyspaces•RowRowColumnColumnColumn namevaluetimestampUser_id182848051270073054 ColumnFamily{Columns}Column Family{Columns}ColumnFamily keyColumns18284805namevaluetimestampuser_id182848051270073054 nickhz07991270073054 pwdtaobao12341270073054 18284806namevaluetimestampuser_id182848061270084021 nick刘刘商家测试11270084021 pwdtaobao12341270084021 SuperColumnSuper ColumnSuperColumn pkeyColumnsWork_addressnamevaluetimestampProvince浙江1270073054 city杭州1270073054 street华星路99号创业大厦1270073054street华星路99号创业大厦1270073054 Home_addressnamevaluetimestampProvince广东1270084021 广东city深圳1270084021 street梅林路梅林四村1270084021 ColumnFamily{SuperColumns}y{p}ColumnFamily KeySuperColumnswenmaokeyColumnsWork_addressname value timestamp Province浙江1270073054 杭city杭州1270073054 street华星路99号创业大厦1270073054 Home_addressname value timestamp Province广东1270084021 city深圳1270084021 street梅林路梅林四村1270084021 datongWork_addressname value timestamp Province浙江1270073054 city杭州1270073054 street华星路99号创业大厦1270073054 Home_addressname value timestamp Province广东1270084021 city深圳1270084021 street梅林路梅林四村1270084021 KeyspacesKeyspaces个是哈希第维是•一个Keyspace是Cassandra哈希第一维,是ColumnFamilies容器。•一般来说,我们的一个程序应用只会有一个Keyspace相当于关系数据库的一个数据个Keyspace,相当于关系数据库的一个数据库.RowRow以为表个对应的数据以•Row以key为表示,一个key对应的数据可以分布在多个column family中,通常我们都只y会存放在一个column family中。数据定位数据定位第层索引所用的为•第一层索引所用的key 为(row‐key, cf‐name),即用一个row‐key 和column‐family‐name 可yy以定位一个column family。column family 是column的集合。column 的集合。•第二层索引所用的key 为column‐name,即通过个可以在个通过一个column‐name 可以在一个column family 中定位一个column。AgendaAgenda基础知识•基础知识•数据模型•数据分布策略•存储机制•存储机制•数据读写删•最终一致性•GossiperGossiper•面向未来数据分布策略数据分布策略Ditibtdhhtbl•Distributed hash table•Partitioner类型RandomPartitionerRandomPartitionerOrderPreservingPartitionerByteOrderedPartitioneryCollatingOrderPreservingPartitioner•副本策略LocalStrategyRackUnawareStrategyRkASttRackAwareStrategyDatacenterShardStategyDistributedhashtableDistributed hash tablePartitioner类型Partitioner类型•RandomPartitioner随机分区是一种hash分区策略,使用的Token随机分区是种分区策略,使用的是大整数型(BigInteger),范围为0~2^127,因此极端情况下,一个采用随机分区策略的此极端情况下,个采用随机分区策略的Cassandra集群的节点可以达到2^127+1个节点。为什么是2^127?•为什么是2^127?Cassandra采用了MD5作为hash函数,其结果是128位的整数值(其中一位是符号位,Token取绝对值为结果)。)Partitioner类型Partitioner类型•RandomPartitioner4个节点,随机分配的Token分布情况采用随机分区策略的集群无法支持针对的•采用随机分区策略的集群无法支持针对Key的范围查询。•假如集群有N个节点,每个节点的hash空间采取平均分布的话,那么第i个节点的Token可以设置为:i* ( 2 ^ 127 / N )Partitioner类型Partitioner类型•OrderPreservingPartitioner如果要支持针对Key的范围查询,那么可以如果要支持针对Key的范围查询,那么可以选择这种有序分区策略。该策略采用的是字符串类型的Token字符串类型的Token。如果没有指定InitialToken,则系统会使用一个长度为16的随机字符串作为Token,字符串包含大小写字符和数字。串包含大小写字符和数字。Partitioner类型Partitioner类型8989f3KoRVD8989yf3rwBsoeLFEM9K0p78I77Nba6gv5zaE10Fj9NDba6gv5zaE10Fj9NDdOesQASXoGwygtelcViC2OxAndA9oMTVb36f65zWaeeIbgA37lRpHvIW48tuPXdJ1ALaIi651cvO7GKqC689MuiFyBVmOeUYMea0SbI9O9mOHs3RMea0SbI9O9mOHs3RPartitioner类型Partitioner类型•ByteOrderedPartitioner•和OrderPreservingPartitioner一样是有序分和Orde