Your SlideShare is downloading. ×
0
运维之道version 0.1淘宝 江枫http://www.NinGoo.nethttp://twitter.com/NinGoo<br />
Agenda<br />基本概念<br />体系架构<br />参数配置<br />备份恢复<br />限制<br />监控<br />参考<br />
基本概念<br />Gossip<br />Memtable/SSTable<br />Compaction<br />Commitlog<br />Consistency level<br />Hinted Handoff<br />Anti...
Gossip<br />去中心化,一致性hash, P2P协议<br />Gossip协议通过endPointStateMap的摘要digest<br />同步节点状态信息数据。一个节点自身的状态只能由自己修改,其他节点的状态只能通过同步更新。...
Gossip<br />endPointStateMap<br />EndPointState10.0.0.1 <br />HeartBeatState: generation 1259909635, version 325 Applicati...
Gossip<br />
Gossip<br />每秒运行一次(Gossiper.java的start方法),按照以下规则向其他节点发送同步消息:<br />随机取一个当前活着的节点,并向它发送同步请求(doGossipToLiveMember)<br />向随机一台不...
Memtable/SSTable<br />出自Google Bigtable设计的存储模型<br />数据先写入内存中的Memtable<br />写入关键路径上不需要持有任何锁<br />Memtable达到条件(大小,key的数量,时间间...
Memtable/SSTable<br />SSTable包含对应的三种文件<br />Datafile<br />按照Key排序顺序保存的数据文件<br />Indexfile<br />保存每个Key在Datafile中的位置偏移<br /...
Compaction<br />一个CF可能有很多SSTable,系统会将多个SSTable合并排序后保存为一个新的SSTable,称之为Compaction。<br />超过4个SSTable后可能触发Compaction。<br />Maj...
Commitlog<br />数据写入Memtable前需要由CommitLogExecutorService线程先写Commitlog<br />CommitlogHeader记录了CF的脏标志位和该CF的恢复起始偏移位置。<br />Com...
Commitlog<br />SSTable持久后不可变更,故Commitlog只用于Memtable的恢复,相当于Oracle的Instance Recovery。Cassandra不需要做Media Recover<br />当节点异常重启...
ConsistencyLevel<br />Write<br />
ConsistencyLevel<br />Read<br />
Hinted Handoff<br />Key A按照规则首要写入节点为N1,复制到N2<br />假如N1宕机,如果写入N2能满足ConsistencyLevel要求,则Key A对应的RowMutation将封装一个带hint信息的头部(包...
Anti Entropy<br />数据的最终一致性由AntiEntropy(逆熵)所生成的MerkleTrees对比来发现数据复制的不一致,通过org.apache.cassandra.streaming来进行完整的一致性修复。该动作可以由N...
Read Repair<br />读取Key A的数据时,系统会读取Key A的所有数据副本,如果发现有不一致,则进行一致性修复。<br />如果读一致性要求为ONE,会立即返回离客户端最近的一份数据副本。然后会在后台执行Read Repair...
体系架构<br />数据分布<br />数据复制<br />接口<br />
数据分布<br />RandomPartitioner<br />基于MD5的随机Hash分布。MD5的hash空间为2^127-1,每个节点的InitialToken可以按节点数量N进行平均分配,如第i个节点可以设置为i*(2^127-1)/...
数据复制<br />DatacenterShardStategy<br />如果replication factor为N,则(N-1)%2的副本复制到不同数据中心。所有副本在两个数据中心均衡分布<br />RackAwareStrategy<b...
接口<br />两种编程接口<br />Thrift<br />2007年由Facebook开源给Apache,目前发展缓慢。需要生成不同语言的接口代码<br />Avro<br />Hadoop的一个子项,Cassandra正在往这个接口进行...
参数配置<br />主要配置文件storage-conf.xml<br />ClusterName:集群名,所有节点统一<br />AutoBootstrap:作为新节点加入集群时,设置true开始初始化<br />HintedHandoffE...
参数配置<br />主要配置文件storage-conf.xml<br />CommitLogDirectory: Commitlog文件存放路径<br />DataFileDirectory : 数据文件存放路径,可以指定多个路径<br />...
参数配置<br />主要配置文件conf/storage-conf.xml<br />SlicedBufferSizeInKB:读取连续列的缓存大小<br />FlushDataBufferSizeInMB: 刷新Memtable到磁盘数据文件...
参数配置<br />日志配置文件conf/log4j.properties<br />log4j.appender.R.File=/var/log/cassandra/system.log 日志文件位置<br />log4j.appender....
参数配置<br />jvm配置bin/ cassandra.in.sh<br />JVM_OPTS=" <br />        -ea <br />        -Xms256M <br />        -Xmx1G <br />  ...
备份恢复<br />Snapshot<br />利用nodetool的snapshot命令可以生成SSTable的一个快照。<br />在生成snapshot前,先会执行一次Memtable切换,将最新的数据保存为SSTable。<br />复...
备份恢复<br />Export/Import<br />通过sstable2json可以将数据导出为json格式的文件,相当于逻辑备份。<br />通过json2sstable则可以将json格式的文件导入为SSTable。<br />
限制<br />Keyspace/CF无法动态增删,0.7以后的版本有计划支持动态增删。<br />由于Compaction时对整行数据反序列化,所以一行数据必须要能够全部存放进内存中。https://issues.apache.org/jir...
限制<br />Thrift不支持流(streaming),读写请求的数据都需要存放在内存中,因此大对象可能需要切分后存取。http://issues.apache.org/jira/browse/CASSANDRA-265<br />Thri...
监控<br />Nodetool<br />nodetool –h localhost –p 8080 tpstats<br />
监控<br />Nodetool<br />nodetool –h localhost –p 8080 cfstats<br />
监控<br />jconsole<br />jmx地址:service:jmx:rmi:///jndi/rmi://localhost:8080/jmxrmi<br />
监控<br />Nagios<br />http://www.mahalo.com/how-to-monitor-cassandra-with-nagios<br />
监控<br />Cassandra web console<br />http://github.com/suguru/cassandra-webconsole/downloads<br />
参考<br />http://wiki.apache.org/cassandra<br />http://io.typepad.com/glossary.html<br />http://spyced.blogspot.com/<br />ht...
Upcoming SlideShare
Loading in...5
×

Cassandra运维之道

7,563

Published on

Cassandra运维之道

2 Comments
23 Likes
Statistics
Notes
No Downloads
Views
Total Views
7,563
On Slideshare
0
From Embeds
0
Number of Embeds
7
Actions
Shares
0
Downloads
258
Comments
2
Likes
23
Embeds 0
No embeds

No notes for slide

Transcript of "Cassandra运维之道"

  1. 1. 运维之道version 0.1淘宝 江枫http://www.NinGoo.nethttp://twitter.com/NinGoo<br />
  2. 2. Agenda<br />基本概念<br />体系架构<br />参数配置<br />备份恢复<br />限制<br />监控<br />参考<br />
  3. 3. 基本概念<br />Gossip<br />Memtable/SSTable<br />Compaction<br />Commitlog<br />Consistency level<br />Hinted Handoff<br />Anti Entropy<br />Read Repair<br />
  4. 4. Gossip<br />去中心化,一致性hash, P2P协议<br />Gossip协议通过endPointStateMap的摘要digest<br />同步节点状态信息数据。一个节点自身的状态只能由自己修改,其他节点的状态只能通过同步更新。<br />Map中每一个EndpointStat包括:<br />HeartbeatStat:Generation(节点重启后递增)/Version Number<br />ApplicationStat:应用状态(每个对象标识一种状态)/Version Number<br />
  5. 5. Gossip<br />endPointStateMap<br />EndPointState10.0.0.1 <br />HeartBeatState: generation 1259909635, version 325 ApplicationState "load-information": 5.2, generation 1259909635, version 45 <br />ApplicationState"bootstrapping": bxLpassF3XD8Kyks, generation 1259909635, version 56 <br />EndPointState10.0.0.2 <br />HeartBeatState: generation 1259911052, version 61 <br />ApplicationState"load-information": 2.7, generation 1259911052, version 2 <br />ApplicationState"bootstrapping": AujDMftpyUvebtnn, generation 1259911052, version 31<br />Gossip Digest for endpoint 10.0.0.2:<br />10.0.0.2:1259911052:61 (IP:Generation:Max Version)<br />一般情况下HeartbeatState中的Version都会是endpointstat中最大Max Version ,但这不是一个“死规定”。<br />
  6. 6. Gossip<br />
  7. 7. Gossip<br />每秒运行一次(Gossiper.java的start方法),按照以下规则向其他节点发送同步消息:<br />随机取一个当前活着的节点,并向它发送同步请求(doGossipToLiveMember)<br />向随机一台不可达的机器发送同步请求(doGossipToUnreachableMember)<br />如果第一步中所选择的节点不是seed,或者当前活着的节点数少于seed数,则向随意一台seed发送同步请求,以避免出现信息孤岛(doGossipToSeed)<br />也就是说,一个节点发起一轮Gossip,最多请求三个节点。整个集群的信息达到同步的时间大概是log(N)。<br />
  8. 8. Memtable/SSTable<br />出自Google Bigtable设计的存储模型<br />数据先写入内存中的Memtable<br />写入关键路径上不需要持有任何锁<br />Memtable达到条件(大小,key的数量,时间间隔等)后刷新到磁盘,保存为SSTable<br />SSTable不可修改<br />同一个CF的多个SSTable可以合并(Compaction)以优化读操作<br />通过布隆过滤算法(Bloom Filter)减少对不可能包含查询key的SSTable的读取。<br />将随机写转变为顺序写,提升系统写性能。<br />
  9. 9. Memtable/SSTable<br />SSTable包含对应的三种文件<br />Datafile<br />按照Key排序顺序保存的数据文件<br />Indexfile<br />保存每个Key在Datafile中的位置偏移<br />Filterfile<br />保存BloomFilter的Key查找树<br />
  10. 10. Compaction<br />一个CF可能有很多SSTable,系统会将多个SSTable合并排序后保存为一个新的SSTable,称之为Compaction。<br />超过4个SSTable后可能触发Compaction。<br />Major Comaction:合并CF的所有SSTable为一个新的SSTable,同时执行垃圾数据(已标记删除的数据tombstone)清理。<br />Minor Compaction:只合并大小差不多的SSTable。<br />可通过nodetoolcompact命令手动触发。<br />
  11. 11. Commitlog<br />数据写入Memtable前需要由CommitLogExecutorService线程先写Commitlog<br />CommitlogHeader记录了CF的脏标志位和该CF的恢复起始偏移位置。<br />CommitlogSegment记录了变更的RowMutation信息。<br />Commitlog刷新有两种机制:<br />Batch:当CommitlogSegment刷新到磁盘后,插入Memtable操作才可继续。并且需要等待CommitLogSyncBatchWindowInMS毫秒内的其他写操作一起批量刷日志到磁盘。可以类比为Oracle的batch/wait模式。<br />Periodic :每隔CommitLogSyncPeriodInMS毫秒性刷新CommitlogSegment,不阻塞数据写操作,可以类比为Oracle的batch/nowait模式。<br />
  12. 12. Commitlog<br />SSTable持久后不可变更,故Commitlog只用于Memtable的恢复,相当于Oracle的Instance Recovery。Cassandra不需要做Media Recover<br />当节点异常重启后,将根据SSTable和Commitlog进行实例恢复,在内存中重新恢复出宕机前的Memtable。<br />当一个Commitlog文件对应的所有CF的Memtable都刷新到磁盘后,该Commitlog就不再需要,系统会自动清除。<br />
  13. 13. ConsistencyLevel<br />Write<br />
  14. 14. ConsistencyLevel<br />Read<br />
  15. 15. Hinted Handoff<br />Key A按照规则首要写入节点为N1,复制到N2<br />假如N1宕机,如果写入N2能满足ConsistencyLevel要求,则Key A对应的RowMutation将封装一个带hint信息的头部(包含了目标为N1的信息),然后随机写入一个节点N3,此副本不可读。同时正常复制一份数据到N2,此副本可以提供读。如果写N2不满足写一致性要求,则写会失败。<br />N1恢复后,原本应该写入N1的带hint头的信息将重新写回N1。<br />HintedHandoff是实现最终一致性的一个优化措施,可以减少最终一致的时间窗口。<br />
  16. 16. Anti Entropy<br />数据的最终一致性由AntiEntropy(逆熵)所生成的MerkleTrees对比来发现数据复制的不一致,通过org.apache.cassandra.streaming来进行完整的一致性修复。该动作可以由Nodetool触发,也可以由系统自动触发。<br />Merkle Tree是一种Hash Tree,叶子节点是Key的hash值,父节点是所有子节点值的hash值,通过判断父节点的异同可以知道所有子节点的异同。<br />通过判断root的异同可以快速判断所有叶子节点数据的异同。<br />
  17. 17. Read Repair<br />读取Key A的数据时,系统会读取Key A的所有数据副本,如果发现有不一致,则进行一致性修复。<br />如果读一致性要求为ONE,会立即返回离客户端最近的一份数据副本。然后会在后台执行Read Repair。这意味着第一次读取到的数据可能不是最新的数据。<br />如果读一致性要求为QUORUM,则会在读取超过半数的一致性的副本后返回一份副本给客户端,剩余节点的一致性检查和修复则在后台执行。<br />如果读一致性要求高(ALL),则只有Read Repair完成后才能返回一致性的一份数据副本给客户端。<br />该机制有利于减少最终一致的时间窗口。<br />
  18. 18. 体系架构<br />数据分布<br />数据复制<br />接口<br />
  19. 19. 数据分布<br />RandomPartitioner<br />基于MD5的随机Hash分布。MD5的hash空间为2^127-1,每个节点的InitialToken可以按节点数量N进行平均分配,如第i个节点可以设置为i*(2^127-1)/N<br />OrderPreservingPartitioner<br />基于Key值(UTF-8)的范围分布<br />CollatingOrderPreservingPartitioner<br />基于Key值(不同语言环境排序)的范围分布<br />
  20. 20. 数据复制<br />DatacenterShardStategy<br />如果replication factor为N,则(N-1)%2的副本复制到不同数据中心。所有副本在两个数据中心均衡分布<br />RackAwareStrategy<br />一个副本复制到不同数据中心,其他副本复制到同数据中心的不同机架。异地机房只保有一个副本,主要用于容灾<br />RackUnAwareStrategy<br />不考虑复制节点的物理位置,一般是hash环右边的N-1个节点<br />
  21. 21. 接口<br />两种编程接口<br />Thrift<br />2007年由Facebook开源给Apache,目前发展缓慢。需要生成不同语言的接口代码<br />Avro<br />Hadoop的一个子项,Cassandra正在往这个接口进行迁移。这是一个动态序列化库,无须生成静态接口代码<br />类似接口的还有Google的Protocol Buffer<br />
  22. 22. 参数配置<br />主要配置文件storage-conf.xml<br />ClusterName:集群名,所有节点统一<br />AutoBootstrap:作为新节点加入集群时,设置true开始初始化<br />HintedHandoffEnabled:启用Hinted Handoff特性<br />Keyspaces: 数据模型相关keyspace和column family设置<br />ReplicaPlacementStrategy: 数据副本复制策略(基于数据中心分布/机架分布)<br />ReplicationFactor: 数据副本复制份数,一般建议设置为3份<br />EndPointSnitch: 集群节点对应物理机器分布策略,据此路由不同的数据副本。<br />Partitioner: 数据分布策略。随机分布 or 有序分布<br />InitialToken: 初始化Token,具体key的第一份副本分布到哪个节点<br />
  23. 23. 参数配置<br />主要配置文件storage-conf.xml<br />CommitLogDirectory: Commitlog文件存放路径<br />DataFileDirectory : 数据文件存放路径,可以指定多个路径<br />Seeds:种子节点列表,当初始化完成后可以设置为种子节点,新节点加入集群时,需要从种子节点获取需要的信息。<br />RpcTimeoutInMillis: 等待远程节点返回消息的超时设置<br />CommitLogRotationThresholdInMB: commitlog文件大小,超过则进行切换<br />ListenAddress/ StoragePort: 集群内部通讯监听IP和端口<br />ThriftAddress/ ThriftPort: Thrift监听IP和端口,用于响应客户端请求<br />DiskAccessMode: 磁盘访问模式。64位系统建议设置为mmap,或者auto(64位时等效于mmap)<br />RowWarningThresholdInMB: 对超长的压缩行进行告警。如果压缩行不能完全放入内存中,Cassandra会崩溃,所以需要根据内存设置告警阀值。<br />
  24. 24. 参数配置<br />主要配置文件conf/storage-conf.xml<br />SlicedBufferSizeInKB:读取连续列的缓存大小<br />FlushDataBufferSizeInMB: 刷新Memtable到磁盘数据文件的缓存大小<br />FlushIndexBufferSizeInMB: 刷新Memtable到磁盘索引文件的缓存大小<br />ColumnIndexSizeInKB: 当一行长度超过该值时,添加一个列偏移索引<br />MemtableThroughputInMB: Memtable大小<br />MemtableFlushAfterMinutes: N分钟后强制刷新Memtable到磁盘<br />ConcurrentReads: 并发读请求,建议设置为CPU核数的两倍<br />ConcurrentWrites: Cassandra写性能更好,因此并发写请求可以设置更高,例如CPU核数的8倍<br />CommitLogSync: Commitlog刷新到磁盘的方式,batch or periodic<br />GCGraceSeconds: 清理带有删除标记的垃圾数据的间隔时间。如果节点宕机时间超过这个间隔,则节点会永久失效,只能重新进行初始化后才能加入到集群。默认为10天。<br />
  25. 25. 参数配置<br />日志配置文件conf/log4j.properties<br />log4j.appender.R.File=/var/log/cassandra/system.log 日志文件位置<br />log4j.appender.file.maxFileSize=20MB 日志文件大小<br />
  26. 26. 参数配置<br />jvm配置bin/ cassandra.in.sh<br />JVM_OPTS=" <br /> -ea <br /> -Xms256M <br /> -Xmx1G <br /> -XX:+UseParNewGC <br /> -XX:+UseConcMarkSweepGC <br /> -XX:+CMSParallelRemarkEnabled <br /> -XX:SurvivorRatio=8 <br /> -XX:MaxTenuringThreshold=1 <br /> -XX:+HeapDumpOnOutOfMemoryError <br /> -Dcom.sun.management.jmxremote.port=8080 <br /> -Dcom.sun.management.jmxremote.ssl=false <br /> -Dcom.sun.management.jmxremote.authenticate=false"<br />
  27. 27. 备份恢复<br />Snapshot<br />利用nodetool的snapshot命令可以生成SSTable的一个快照。<br />在生成snapshot前,先会执行一次Memtable切换,将最新的数据保存为SSTable。<br />复制snapshot即可对节点的数据进行物理备份。<br />Snapshot实际上是SSTable文件的一个Hard link。<br />
  28. 28. 备份恢复<br />Export/Import<br />通过sstable2json可以将数据导出为json格式的文件,相当于逻辑备份。<br />通过json2sstable则可以将json格式的文件导入为SSTable。<br />
  29. 29. 限制<br />Keyspace/CF无法动态增删,0.7以后的版本有计划支持动态增删。<br />由于Compaction时对整行数据反序列化,所以一行数据必须要能够全部存放进内存中。https://issues.apache.org/jira/browse/CASSANDRA-16<br />一行数据的长度不能超过2^31-1字节,因为行数据序列化时用一个整数表示其长度同时序列化到磁盘中。<br />Super columnfamilies中的sub column没有索引,因此在反序列化一个sub column时需要反序列化super column中的所有sub column。因此需要避免设计使用大量的sub column。https://issues.apache.org/jira/browse/CASSANDRA-598<br />
  30. 30. 限制<br />Thrift不支持流(streaming),读写请求的数据都需要存放在内存中,因此大对象可能需要切分后存取。http://issues.apache.org/jira/browse/CASSANDRA-265<br />Thrift端口收到非协议标准的随机数据可能导致Cassandra崩溃。因此对Thrift的探测如telnet等操作可能导致节点挂掉http://issues.apache.org/jira/browse/CASSANDRA-475<br />http://issues.apache.org/jira/browse/THRIFT-601<br />
  31. 31. 监控<br />Nodetool<br />nodetool –h localhost –p 8080 tpstats<br />
  32. 32. 监控<br />Nodetool<br />nodetool –h localhost –p 8080 cfstats<br />
  33. 33. 监控<br />jconsole<br />jmx地址:service:jmx:rmi:///jndi/rmi://localhost:8080/jmxrmi<br />
  34. 34. 监控<br />Nagios<br />http://www.mahalo.com/how-to-monitor-cassandra-with-nagios<br />
  35. 35. 监控<br />Cassandra web console<br />http://github.com/suguru/cassandra-webconsole/downloads<br />
  36. 36. 参考<br />http://wiki.apache.org/cassandra<br />http://io.typepad.com/glossary.html<br />http://spyced.blogspot.com/<br />http://perspectives.mvdirona.com/2009/02/07/FacebookCassandraArchitectureAndDesign.aspx<br />http://nosql.mypopescu.com/tagged/cassandra<br />http://www.cs.cornell.edu/home/rvr/papers/flowgossip.pdf<br />http://www.ruohai.org/?p=13<br />http://www.ningoo.net/html/2010/cassandra_token.html<br />http://www.dbthink.com/?tag=cassandra<br />http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html<br />http://cassandra.apache.org/<br />*部分链接需要翻墙访问<br />
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×