[翻译]Cassandra经常被问到的问题(三)

14、是不是单个seed意味着单点故障?

即便没有seed节点,集群也可以运行和重启,但是不能再往集群里增加节点。还是推荐在生产系统中配置多个种子节点。

15、为什么不可以在jconsole里调用某个jmx方法呢?

一些JMX操作的参数是个数组,而Jconsole并不支持数组型参数。对于那些不能用jconsole调用的操作(在jconsole里点击按钮无效)。有需要自己写一个JMX客户端去调用,或者使用一个支持数组的jmx监控工具。

16、为什么我会在日志文件里看到 “… messages dropped …”这样的信息?

这是cassandra在面对超出自己处理能力的请求时,为了保护自己做出的流控措施。
一个节点接收到其它节点发送过来的消息,但是在他们合适的超时时间内不能得到处理(具体参考 read_request_timeout, write_request_timeout等配置项)。就会被丢弃,而不是处理(因为接受用户请求的节点也就是协调节点不会再等这个响应返回)

对于写,这意味着它的请求不会被写入所有的副本,这个一致性将会被读修复、hints或者是人工修复等方式修复。因为这,一个写操作返回给客户端的结果就是超时的。

对于读,意味着一个读请求可能没有完成。负载流控是cassandra架构的一部分,如果这个问题一直持续下去,这标志着你的节点或者集群已经超载了。

17、Cassandra因为java.lang.OutOfMemoryError: Map failed挂掉了

如果cassandra挂掉的时候输出“Map failed”的消息,表示操作系统不允许java锁定更多的内存。在linux里,内存锁定是有限制的,你可以通过/proc//limits确认,并提高它(比如适应ulimit命令)。还有vm.max_map_cout参数。注意debian安装包会自动为你调整这些参数。

18、如果再同一时刻发生两次更新会发生什么?

更新顺序必须是可交换的,因为他们很有可能到达不同副本的顺序是不一样的。只要cassandra有一个确定的方法选出这个赢家(相同的时间戳),那么这在其它节点也是一样的,这是一个重要的实现细节。也就是说,对于相同时间戳的操作,Cassandra遵循以下两个原则:第一:删除要优先于更新和插入,第二:如果两个都是更新,那个在语法上比较大的更新会被选中。

19、为什么在加入一个新节点的时候,会有Stream failed错误?

两个可能性:
GC可能导致的长时间暂停可能会扰乱传输进程
在后台执行的压缩会导致传输时间太长从而TCP连接断开。

对于第一种情况,建议在应用中经常的进行GC优化,
第二种情况,你需要设置系统的TCP keepalive参数短一些(linux中默认是很长的),尝试执行下面的语句:

 sudo /sbin/sysctl -w net.ipv4.tcp_keepalive_time=60 net.ipv4.tcp_keepalive_intvl=60 net.ipv4.tcp_keepalive_probes=5

如果要让这些配置永久有效,需要把他们加入到/etc/sysctl.conf文件中。

注意:GCE(Google的云服务吧)的防火墙经常切断TCP连接,当一个连接超过10分钟不活动的话。这种情况强烈推荐执行上述命令。

留言

提示:你的email不会被公布,欢迎留言^_^

*

验证码 * Time limit is exhausted. Please reload CAPTCHA.