Hycz's Blog

Life is a game. Why so serious?

2011/06/15-17 在Eclipse中配置Cassandra——配置文件介绍

接上回https://hycz.wordpress.com/2011/06/14/20110614-%E5%9C%A8eclipse%E4%B8%AD%E9%85%8D%E7%BD%AEcassandra2/

7.
今天要对Cassandra进行配置,这话有点拗口,简单来说,就是改一下conf文件夹里的配置文件,因为原来的是默认设置,而且是针对linux的文件系统的,这里要改成windows下的。首先是cassandra.yaml文件(这坑好大。。。慢慢填),主要翻译翻译注释。。。。

1、cluster_name:集群名,主要用来防止机器加入到其他的逻辑集群中
2、initial_token:cassandra中有个token环,每个节点都负责其中的一部分,这个参数就是用来设定这台机器负责哪部分的。如果空着不写,那么就自动取负载最重的节点所拥有的token范围的一半。如果取不到负载信息,那么就随机取一段。
3、auto_bootstrap:cassandra中的节点其实还是分了2种,一个是seed节点,一个是non-seed节点,一个节点要加入集群实际上还是要一个入口,这个入口就是种子节点,所以一次能够加入集群的节点数量是有限的,即种子节点的数量,如果需要加入集群的节点数量多于这个阀值,那么就需要分阶段进行加入操作。这个参数是用来设定一个非种子节点是否在启动时自动从已有节点中迁移数据进来。默认false
4、hinted_handoff_enable:这个参数涉及了cassandra的一个机制,当一个写操作所针对的副本节点down掉的时候,cassandra会在另一台活着的副本几点上写一个hint(提示?暗示?还不如说是个便签。。。),这个hint用来表明那台down掉的节点需要重新执行这个写操作。如果所有的副本节点都死了,而且一致性等级是ConsistencyLevel.ANY(五种?ZERO,ONE,QUORUM,ALL,ANY,这里ANY是说只要一个写操作在任何地方成功了,hint写也算。。。那就算成功。。),协调节点(coordinating node)会在本地写下这个hint。这个机制主要是用来减少暂时失效节点通过活着的节点重新恢复到一致状态 所需要的时间,并且在不需要一致性的情况下提供额外的可用性。
     max_hint_window_in_ms:节点死掉之后保留hint的最长时间,死太久了,超过这个时间那么之前写的hint就被丢弃。
     hinted_handoff_throttle_delay_in_ms:每发送一行或者行碎片时sleep这么长时间?这里不确定
6、authenticator:认证后端,实现接口IAuthenticator,用来识别用户
7、authority:授权后端,实现接口IAuthority,用来限制访问,提供通行权
8、partitioner:这里是Cassandra中很重要的一部分,设置了Cassandra中数据的数据分割方式,用通俗的话来说,就是数据是以怎样的规则分布在整个集群的许多节点中的,数据的分割是以row为单位的,row使用key来唯一辨别的,所以其实就是key的分布。设置的值是个类名,这个类需要实现IPartitioner接口。Cassandra提供了几种分布方式如下

org.apache.cassandra.dht.RandomPartitioner
org.apache.cassandra.dht.ByteOrderedPartitioner
org.apache.cassandra.dht.OrderPreservingPartitioner (deprecated)
org.apache.cassandra.dht.CollatingOrderPreservingPartitioner(deprecated)

第一个是随机分割,使用md5;第二个是根据key的每个byte的字母顺序进行排序,这种排序支持row级别的(其实就是key啊)范围查询,但是对于顺序插入的负载,这种分割会存在热点问题,但是没办法啊。。。不然怎么顺序查询。。。泪奔;第三个是第二个的废弃版本,格式比第二个低效,使用UTF-8编码的字符串当做key;第四个似乎是和第三个差不多的,不过用了另一种排序方式,反正都被废弃了,不管了。
9、data_file_directories:存data的目录
     commitlog_directory:存commitlog的目录
     saved_caches_directory:存cache的目录
     commitlog_rotation_threshold_in_mb:一个阀值,单位MB,当commitlog超过这个大小时,就产生一个新的段
10、commitlog_sync:这里设置commitlog的同步方式,应该就是从内存中同步到磁盘上做持久化,这里有2种设置,一个是batch,一个是periodic。在batch模式中,只有当commit log同步到了磁盘上之后才会执行写操作,在执行同步之前,将会等待CommitLogSyncBatchWindowInMS毫秒,等其他的写操作结束。在periodic模式中,写操作会被立即执行,无视commitlog有没有写到磁盘上,而commitlog则是每隔commitlog_sync_period_in_ms这么长时间才周期性的进行同步。
      commitlog_sync_period_in_ms:commitlog以periodic模式同步时的周期值,单位毫秒。
11、seed_provider:这个参数是seed节点的设置,首先是要设置seed_provider的子参数- class_name,这里需要制定一个类来提供seed功能,这个类需要实现SeedProvider接口,然后设置子参数- seeds,也就是seed节点的地址,多个地址间用逗号隔开
12、flush_largest_memtables_at:这是第一个紧急状况压力阀值,这里的值设置在0-1.0之间,这个值的意思是每当full garbage collection之后,如果堆的使用率高于这个阀值的话,那么就会把最大的memtable flush到磁盘上。设到1.0就是永远不执行,也最好不要低于CMSInitiatingOccupancyFraction。
13、reduce_cache_sizes_at:这是第二个紧急状况压力阀值,在full garbage collecion之后,如果首次出现堆使用率高于这个阀值,那么cassandra就会降低cache的最大容量,并且降低cache的当前大小。
reduce_cache_capacity_to:当上述情况发生时,cache的最大容量降低比例
14、concurrent_reads:并发读的数量,当负载高于内存中能满足的数据时,读会成为cassandra的瓶颈,建议设置成16*驱动器数量
      concurrent_writes:并发写的数量,一般对于写操作,IO不会成为瓶颈,计算机的处理器core数才是影响其性能的关键,所以可以设置成8*core数量
15、memtable_total_space_in_mb:memtable的最大值,省略的话自动设置成堆的三分之一大小
        memtable_flush_writers:memtable flush的进程数量,由于flush进程会被磁盘io所阻塞,而且当被阻塞时,每个进程都会持有一个memtable,所以当堆很大,而且有很多数据目录时再去提高这个值。省略的话默认设置为数据目录的数量
      memtable_flush_queue_size:当memtable满了的时候能够进入等待flush队列的数目,最小应该设置为一个Column Family中辅助索引的最大数目
16、sliced_buffer_size_in_kb:处理连续的column slice的buffer大小
17、storage_port:TCP的端口
18、listen_address:其他节点用来连接的地址,也就是本机的地址,空着的话会自动调用InetAddress.getLocalHost()来填这个空,一般是填本机的hostname,不能填0.0.0.0
19、rpc_address:Thrift RPC service所绑定的地址,客户端会连接这个地址,0.0.0.0意味着监听所有,空着同上。
      rpc_port:Thrift RPC service绑定的端口
      rpc_keepalive:是否保持rpc连接存活,也就是用不用长连接吧
20、rpc_min_threads:对于客户端RPC,Cassandra使用一个进程进行处理,这是很昂贵的消耗,所以更好的方法是使用连接池。不过这里还是提供了rpc数量设置,这个参数是最小进程数。注释掉就默认16
      rpc_max_threads:这个参数是最大进程数,注释掉默认无上限
21、rpc_send_buff_size_in_bytes:rpc连接的socket buffer大小,可以注释掉
      rpc_recv_buff_size_in_bytes:rpc连接的socket buffer大小,可以注释掉
22、thrift_framed_transport_size_in_mb:thrift的框架大小,设成0就不用TFramedTransport,而用TSocket,但是不推荐设成0
23、thrift_max_message_length_in_mb:thrift消息的最大长度,包括所有的字段(field)和thrift内部的开销
24、incremental_backups:如果设为true的话,Cassandra会建立到每个已在本地flush后或stream之后的sstable的硬链接,这些sstable在Keyspace数据的备份或者子目录中。移除这些链接将是操作者的职责。一般设成false?这个参数没看懂。。。
25、snapshot_before_compaction:是否在每次compaction之前做snapshot,注意,如果设为true的话,cassandra是不会去清理这些snapshot的,所以要手动清理,估计会很多,很麻烦。。。一般设成false吧
26、compaciton_thread_priority:设置compaciton进程的优先级,注释掉的话默认设为1,在java中1是最低。。。。
27、column_index_size_in_kb:当一个row的内容超过这里设置的大小时,会添加column索引,默认设成了64,如果column的值都很大,或者有很多column的话,可以相应设置更大的值。这带来了另一个很矛盾的问题,即使只是读一个单独的column,Cassandra也需要反序列化(deserialize)这部分索引数据,所以这些索引数据是越小越好,一个column的情况可能比较极端,但至少能在读一行的一部分时(这种情况比较多见)能小一些;但是每次存取时是都需要先访问索引数据的,所以我们也不能一味图小,而使得索引中无法包括足够有用的信息。说了这么多废话,意思就是这个值要根据应用好好斟酌,不能太大,不能太小。默认64KB
28、in_memory_compaction_limit_in_mb:在内存中进行compaction的row的最大大小,超过这个值的话,超过的部分会暂时放到磁盘上,那么这个compaction效率就不行了。一个消息会log下来,用来辨别这个row key
29、concurrent_compactors:compation进程的数量,注释掉默认设置为处理器的数量,建议是使用多个进程进行处理,这样可以在读写混合型负载中保持读性能,原因是这样避免了在长时间的compaciton中sstable的积聚。。。其实嘛,就是compaciton的快一些。。
30、compaction_throughput_mb_per_sec:设置了一个阀值限制compaction输出的速率,单位是MB/s,要知道,compaciton是一个很差火的操作,同时消耗CPU,MEMORY,IO资源,所以compaction的时机非常重要,否则会对整个系统产生重大影响。compaction的相关设置都值得好好研究,如果希望系统高效的话,这个值的设置还是要结合实际使用情况。插入数据的速度越快,那么compaction的速度也要越快,以控制sstable的数量。一般设置这个值为插入数据速率的16到32倍比较好。设为0的话就没有阀值。
31、compaction_preheat_key_cache:是否在compaction过程中跟踪已缓存的row key,并且重新缓存这些row key在compact之后的sstable中的新位置。如果有足够大的key缓存的话,可以设为false(为什么。。。。)
32、rpc_timeout_in_ms:等待其他节点回复的时间,超过这个时间则执行的命令失败
33、phi_convict_threshold:这里就是论文中提到的Failure Detection所用到的phi,这里有一个算法,算出一个节点的phi值,如果超过阀值,那么就判断这个节点已经down掉。一般用不到,注释掉
34、endpoint_snitch:这里的参数值是一个实现了IEndpointSnitch接口的类,用来让Cassandra知晓网络拓扑,以更高效的route(这里忍不住吐槽一下,翻译成路由真是不知所云,还不如直接翻译成寻路)请求。snitch也是一个不好理解的地方,原意为告密,实际是理解为告知别人自己的拓扑结构么?那这个参数叫端点告知?Cassandra提供了3个策略

org.apache.cassandra.locator.SimpleSnitch:
org.apache.cassandra.locator.RackInferringSnitch:
org.apache.cassandra.locator.PropertyFileSnitch:

第一个是是简单策略,就是一个简单的邻近策略,能够提高缓存的locality(本地性?或者说集中性?),但是不能进行读修复(读修复能够进一步提高吞吐?);第二个是机架策略,邻近性由机架和数据中心决定,这里假设邻近性由不同节点的ip(ipv4)的第三个和第二个8位数(A.B.C.D中的B和C。。。)来决定,也就是说ip相近,那就认为更邻近;第三个是用配置文件显性地写好了哪些节点邻近,配置文件是cassandra-topology.properties。
35、dynamic_snitch:是否使用dynamic_snitch。dynamic_snitch是包裹在endpoint_snitch外,用来监控读延迟,以避免从已经变慢的主机上进行读取。
      dynamic_snitch_update_interval_in_ms:多久进行一次分数计算(代价昂贵?)
      dynamic_snitch_reset_interval_in_ms:多久充值所有机器的分数,通过这样的操作很可能可以让坏掉的节点恢复
      dynamic_snitch_badness_threshold:这里又提到了另一个机制,副本的pin(钉住?不知怎么翻译),意思就是反复从一个副本上读数据,这样cache的能力会得到提高。当这个参数的值(0.0到1.0闭区间)设置为大于0的时候,这个机制就会启动。但是基于dynamic snitch机制,副本是有分数的,dynamic snitch是用来监控读延迟,并且给主机打分,以评出优劣,然后选择更优的副本提供读,当一个已经pinned的副本变坏时,就需要换一个性能更优的副本pin住提供读。那么如何判断一个副本已经很坏了,需要换一个副本提供读呢?这里就用到了这个阀值,举个例子,当这个值为0.2时,当已经被pin的副本的分数比最快的副本的分数低20%时,cassandra就会选择另一个副本。

36、request_scheduler:这个参数是一个实现了RequestScheduler的类,用来基于特定的策略来调度传入的客户端请求,当一个Cassandra集群上有多租户时,这个调度会很有用。这个调度只是针对客户端请求,并不会影响内部节点通信。下面是提供的几个类

org.apache.cassandra.scheduler.NoScheduler
org.apache.cassandra.scheduler.RoundRobinScheduler

第一个是不使用任何调度;第二个是使用round robin调度客户端请求,每一个不同的request_scheduler_id都有一个单独的队列,具体的option会由request_scheduler_options设置
      request_scheduler_options:如果用NoScheduler,那么没有option,如果用RoundRobin,那么会有3个子选项:1,throttle_limit,每个客户端的请求数量阀值,超过这个数量的请求都会进入队列,大小设置一般是(并行读+并行写)*2;2,default_weight,可选选项,默认权值的设置,原先是1,但是可以自己设定;3,weights,也是可选选项,如果不写,那么权值会被设置成default_weight,这个参数是设定每轮RoundRobin中,基于scheduler id的权值,有多少请求会被处理,scheduler id的设置在下面。
      request_scheduler_id:基于这个id来进行请求调度,当前唯一的选择是keyspace
37、index_interval:对一个sstable的row key进行采样的大小,采样越大,index越有效,但是要消耗更多的空间
38、encryption_options:节点间的加密

Advertisements

One response to “2011/06/15-17 在Eclipse中配置Cassandra——配置文件介绍

  1. Pingback: 2011/06/20 在Eclipse中配置Cassandra——配置文件介绍2 « Hycz's Blog

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: