Cassandra运维之道
- 4. Gossip 去中心化,一致性hash, P2P协议 Gossip协议通过endPointStateMap的摘要digest 同步节点状态信息数据。一个节点自身的状态只能由自己修改,其他节点的状态只能通过同步更新。 Map中每一个EndpointStat包括: HeartbeatStat:Generation(节点重启后递增)/Version Number ApplicationStat:应用状态(每个对象标识一种状态)/Version Number
- 5. Gossip endPointStateMap EndPointState10.0.0.1 HeartBeatState: generation 1259909635, version 325 ApplicationState "load-information": 5.2, generation 1259909635, version 45 ApplicationState"bootstrapping": bxLpassF3XD8Kyks, generation 1259909635, version 56 EndPointState10.0.0.2 HeartBeatState: generation 1259911052, version 61 ApplicationState"load-information": 2.7, generation 1259911052, version 2 ApplicationState"bootstrapping": AujDMftpyUvebtnn, generation 1259911052, version 31 Gossip Digest for endpoint 10.0.0.2: 10.0.0.2:1259911052:61 (IP:Generation:Max Version) 一般情况下HeartbeatState中的Version都会是endpointstat中最大Max Version ,但这不是一个“死规定”。
- 8. Memtable/SSTable 出自Google Bigtable设计的存储模型 数据先写入内存中的Memtable 写入关键路径上不需要持有任何锁 Memtable达到条件(大小,key的数量,时间间隔等)后刷新到磁盘,保存为SSTable SSTable不可修改 同一个CF的多个SSTable可以合并(Compaction)以优化读操作 通过布隆过滤算法(Bloom Filter)减少对不可能包含查询key的SSTable的读取。 将随机写转变为顺序写,提升系统写性能。
- 15. Hinted Handoff Key A按照规则首要写入节点为N1,复制到N2 假如N1宕机,如果写入N2能满足ConsistencyLevel要求,则Key A对应的RowMutation将封装一个带hint信息的头部(包含了目标为N1的信息),然后随机写入一个节点N3,此副本不可读。同时正常复制一份数据到N2,此副本可以提供读。如果写N2不满足写一致性要求,则写会失败。 N1恢复后,原本应该写入N1的带hint头的信息将重新写回N1。 HintedHandoff是实现最终一致性的一个优化措施,可以减少最终一致的时间窗口。
- 17. Read Repair 读取Key A的数据时,系统会读取Key A的所有数据副本,如果发现有不一致,则进行一致性修复。 如果读一致性要求为ONE,会立即返回离客户端最近的一份数据副本。然后会在后台执行Read Repair。这意味着第一次读取到的数据可能不是最新的数据。 如果读一致性要求为QUORUM,则会在读取超过半数的一致性的副本后返回一份副本给客户端,剩余节点的一致性检查和修复则在后台执行。 如果读一致性要求高(ALL),则只有Read Repair完成后才能返回一致性的一份数据副本给客户端。 该机制有利于减少最终一致的时间窗口。
- 20. 数据复制 DatacenterShardStategy 如果replication factor为N,则(N-1)%2的副本复制到不同数据中心。所有副本在两个数据中心均衡分布 RackAwareStrategy 一个副本复制到不同数据中心,其他副本复制到同数据中心的不同机架。异地机房只保有一个副本,主要用于容灾 RackUnAwareStrategy 不考虑复制节点的物理位置,一般是hash环右边的N-1个节点
- 21. 接口 两种编程接口 Thrift 2007年由Facebook开源给Apache,目前发展缓慢。需要生成不同语言的接口代码 Avro Hadoop的一个子项,Cassandra正在往这个接口进行迁移。这是一个动态序列化库,无须生成静态接口代码 类似接口的还有Google的Protocol Buffer
- 22. 参数配置 主要配置文件storage-conf.xml ClusterName:集群名,所有节点统一 AutoBootstrap:作为新节点加入集群时,设置true开始初始化 HintedHandoffEnabled:启用Hinted Handoff特性 Keyspaces: 数据模型相关keyspace和column family设置 ReplicaPlacementStrategy: 数据副本复制策略(基于数据中心分布/机架分布) ReplicationFactor: 数据副本复制份数,一般建议设置为3份 EndPointSnitch: 集群节点对应物理机器分布策略,据此路由不同的数据副本。 Partitioner: 数据分布策略。随机分布 or 有序分布 InitialToken: 初始化Token,具体key的第一份副本分布到哪个节点
- 23. 参数配置 主要配置文件storage-conf.xml CommitLogDirectory: Commitlog文件存放路径 DataFileDirectory : 数据文件存放路径,可以指定多个路径 Seeds:种子节点列表,当初始化完成后可以设置为种子节点,新节点加入集群时,需要从种子节点获取需要的信息。 RpcTimeoutInMillis: 等待远程节点返回消息的超时设置 CommitLogRotationThresholdInMB: commitlog文件大小,超过则进行切换 ListenAddress/ StoragePort: 集群内部通讯监听IP和端口 ThriftAddress/ ThriftPort: Thrift监听IP和端口,用于响应客户端请求 DiskAccessMode: 磁盘访问模式。64位系统建议设置为mmap,或者auto(64位时等效于mmap) RowWarningThresholdInMB: 对超长的压缩行进行告警。如果压缩行不能完全放入内存中,Cassandra会崩溃,所以需要根据内存设置告警阀值。
- 24. 参数配置 主要配置文件conf/storage-conf.xml SlicedBufferSizeInKB:读取连续列的缓存大小 FlushDataBufferSizeInMB: 刷新Memtable到磁盘数据文件的缓存大小 FlushIndexBufferSizeInMB: 刷新Memtable到磁盘索引文件的缓存大小 ColumnIndexSizeInKB: 当一行长度超过该值时,添加一个列偏移索引 MemtableThroughputInMB: Memtable大小 MemtableFlushAfterMinutes: N分钟后强制刷新Memtable到磁盘 ConcurrentReads: 并发读请求,建议设置为CPU核数的两倍 ConcurrentWrites: Cassandra写性能更好,因此并发写请求可以设置更高,例如CPU核数的8倍 CommitLogSync: Commitlog刷新到磁盘的方式,batch or periodic GCGraceSeconds: 清理带有删除标记的垃圾数据的间隔时间。如果节点宕机时间超过这个间隔,则节点会永久失效,只能重新进行初始化后才能加入到集群。默认为10天。
- 26. 参数配置 jvm配置bin/ cassandra.in.sh 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"
- 35. 监控 Cassandra web console http://github.com/suguru/cassandra-webconsole/downloads
- 36. 参考 http://wiki.apache.org/cassandra http://io.typepad.com/glossary.html http://spyced.blogspot.com/ http://perspectives.mvdirona.com/2009/02/07/FacebookCassandraArchitectureAndDesign.aspx http://nosql.mypopescu.com/tagged/cassandra http://www.cs.cornell.edu/home/rvr/papers/flowgossip.pdf http://www.ruohai.org/?p=13 http://www.ningoo.net/html/2010/cassandra_token.html http://www.dbthink.com/?tag=cassandra http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html http://cassandra.apache.org/ *部分链接需要翻墙访问