一、维护
日志:log4j-server.properties文件,生产环境下更适宜将日志级别调到WARN或是ERROR,因为过繁琐的输出可能会让服务器变慢很多
通过Cassandra自动的Nodetool工具(/bin目录下),可以查看集群、了解其行为并调整集群的功能,查看每个节点负责的区间,在节点间移动数据、退服节点、修复遇到问题的节点
命令
bin/nodetool -h 192.168.6.186 info
获取关于某节点当前状态的基本数据
bin/nodetool -host 192.168.6.186 ring
查看环上所有节点的信息。keyspace中的数据会划分为区间,Cassandra为集群中的每个几点分配唯一的令牌,称为区间令牌,这决定了哪个键值的主副本会放在这个节点上,使用ring开关进行查询得到的区间列就是每个节点负责的令牌
bin/nodetool -host 192.168.6.186 cfstats
显示集群的性能指标,包括每个列族的统计数据
bin/nodetool -host 192.168.6.186 tpstats
获取线程池的统计信息
修复
运行nodetool repair会让Cassandra执行一次主压紧,目标节点会计算出一个数据的Merkle树,然后将它与其他副本上的树进行对比,如果不匹配就会进行重新协调(或“修复”),来确定它们应该设置为最新的数据值。该命令需要传入需要修复的确定的keyspace名字:
bin/nodetool repair Keyspacename -h 192.168.6.186
因为主压紧是个非常复杂和敏感的操作,所以这个任务不应该运行得太过频繁(不应该每天运行),只应该在低负载的时候进行。
刷写
数据存放于memtable中,要强制把memtable中的数据写到文件系统上的SSTable中,可以使用如下命令:
bin/nodetool flush -h 192.168.6.186 -p 9160
清理
一个已经运行了一段时间的集群,希望修改副本因子或副本策略。这种工作不应该在运行的集群中进行,所以一般需要关闭一些节点,再重新启动它们。然后运行命令:bin/nodetool cleanup -h 192.168.6.186
快照
快照用于对一个节点的某些或全部keyspace进行复制,并将它保存到一个独立的数据库文件中去。有一个问题,如果数据存在于commit log之中,它将不是快照的一部分,只有被刷写之后的数据才能成为快照的一部分。进行快照可以使用如下命令:
bin/nodetool -h 192.168.6.186 snapshot
对一个指定的keyspace进行快照:
bin/nodetool -h 192.168.6.186 snapshot Keyspacename
如果希望恢复一个之前进行的快照,首先需要关闭节点,并删除旧的SSTable和commit log,然后把快照目录里的所有文件复制到常规数据目录里即可。
清除快照:bin/nodetool -h 192.168.6.186 clearsnapshot
对集群进行负载均衡
使用loadbalance开关执行Nodetool会将一个节点退服,并将它的令牌发给其他节点,然后再让它重新自举。如果数据量很大,负载均衡会消耗很长时间。可以通过stream开关调用Nodetool来监控负载均衡操作
bin/nodetool -host 192.168.6.186 loadbalance bin/nodetool steam -h 192.168.6.186
使用ring参数运行Nodetool就可以看到节点已经分配到了新的区间
退服节点
退服一个节点就是将一个节点从服务中撤下来。bin/nodetool decommission -h 192.168.6.186
执行退服命令的基本步骤是:
①关闭gossiper,这样就不会收到更多数据了
②关闭这个节点的信息服务
③关闭SEDA阶段管理器,因为不会接受更多的任务在阶段间移动了
④状态设置为“decommissioned”
⑤存储服务确定哪些可用节点对于需要传输数据的区间比较合适,将数据流到其他节点
⑥一旦接收节点确认数据传输成功,没有其他数据要传输了,服务器就可以离开环了更新节点
bin/nodetool -h 192.168.6.186 removetoken tokenid
删除节点,不能删除一个节点自己的令牌,因为这样会破坏节点的完整性。
bin/nodetool -h 192.168.6.186 getcompactionthreshold
获取一个节点当前的压紧阈值。默认为4,这个值不应太小,否则Cassandra会经常因为过多的压紧而消耗资源;也不应太大,这样Cassandra就需要花费太高的资源来进行很多压紧工作
在一个运行中的Cassandra集群中添加、删除或重命名列族:
①使用Nodetool,运行drain来清空commit log
②关闭Cassandra并确保commit log中没有剩余的数据
③删除SSTable文件。这些文件存在于数据目录中,名为-Data.db、-Index.db和-Filter.db。找到要改变的、前缀为列族名的文件。按照对应的命名方式,重命名这些文件
二、性能调优
作为一个通用的规则,必须要注意,简单直接的把一个节点加入到集群中并不会改善性能。需要合适的分布数据副本,然后将客户端的流量分配到所有的节点上。
数据存储
Cassandra在处理更新操作时会写两类文件:commit log和数据文件
commit log:可以看做是短期存储,是以原始顺序文件追加的形式写入。重新启动节点时,commit log被重放,以恢复数据。事实上,commit log只有在这个时候才会被读取,客户端从来不会读取它。但是,通常对commit log的写入操作是阻塞写,所以它可能会非常影响性能,因为它需要客户端等待它写完。
数据文件是指有序字符串表(SSTable)。数据是异步写入这个文件的,SSTable在周期性的主压紧中进行归并,从而释放出空间。要做到这点,Cassandra会归并键值、合并列、并删除墓碑。
读操作可以通过内存中缓存进行,如果给Cassandra配置很多GB的内存,那么当行缓存和键缓存命中的时候,可以极大的提升性能。
在将所有追加写入的数据成功刷写到特定的数据文件中后,commit log会被周期性移除。建议将数据文件和commit log分别放到不同的硬盘上,以使性能最大化。并发
Cassandra和很多数据存储系统的一大不同,就是提供了比读性能更高的写性能。concurrent_reads设置多少个线程可以执行读操作,设置在每个处理器核两个线程的时候是最优的。例如,8核服务器,设置为16.默认为8,需根据具体核数设置缓存
Cassandra中有两类缓存:行缓存和键值缓存。行缓存会缓存整行数据,所以它是键缓存的超集。缓存策略应根据以下条件确定:
①使用更适合查询方式的缓存类型
②考虑堆内存和缓存尺寸的比例,不要让缓存占满堆容量
③考虑行尺寸和键值尺寸
keys_cached设置的是存储在内存中的键位置,如果使用小数,是指定了一个要缓存的键值的百分比;如果使用整数,则是指定将要缓存的键值位置的绝对数值。keys_cached是一个列族的设置,所以不同的列族可以有不同的键值位置缓存数量
可以在服务器启动时就填入行缓存,使用preload_row_cache元素。这个设置默认为false。设置它为true的代价是,如果要预装载很多列族的数据,自举的时间可能会更长
rows_cached设置指定了将被缓存的行数,默认为0。如果使用,方法同keys_cached。除非确定某些行会有很高的命中率,否则不建议设置。JVM调优
cassandra.in.sh文件中包含了很多JVM设置相关的选项,可以进行修改之后,重新启动Cassandra以载入新的配置。