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

1、为什么不可以设置listen_address为0.0.0.0(意思是监听所有地址)?

Cassandra是一个基于gossip协议的分布式系统,监听地址是用来告诉其它节点来访问的,告诉别的节点说“连接我任何地址都可以”,是一个糟糕的想法,如果集群中不同的节点使用了不同方式的地址,悲剧的事情就要发生了。

如果你不想为你集群中的每个节点单独配置ip(非常可以理解),你可以不配,空着它,Cassandra将会使用InetAddress.getLocalHost()来选择地址,然后只要你或者你的运维团队保证这个是正确的(/etc/hosts/,dns 等等要配置对)。

一个例外是JMX,他默认监听的地址是0.0.0.0(这个是java的bug 6425769)

请看CASSANDRA-256 和 CASSANDRA-43获取这方面更多的细节。

2、cassandra用了哪些端口?

默认Cassandra使用7000作为集群通信端口(如果开启了SSL就是7001端口)。9042端口用于native协议的客户端连接。7199端口用于JMX,9160端口用于废弃的Thrift接口。内部节点通信以及native协议的端口在cassandra配置文件里可以配置。JMX端口可以在cassandra-env.sh配置(通过JVM的参数)。所有端口都是TCP的。

3、当往集群中增加新节点的时候,对于存在的数据发生了什么?

当一个新节点加入到集群,它将会自动连接集群中的其它节点,并且去复制正确的数据到本地,同样的增加、替换、移动、删除节点都是这样的。

4、我删除了数据,但是磁盘使用率没有变化,这是为什么?

写入到cassandra里的数据会被持久化到SSTable文件里,SSTable文件是不可改变的,也就是说当你执行删除的时候,数据不会从文件中被去除掉的。相反,一个标记(也叫tombstone)会被写入用于标记对应记录的新状态。不用担心,当数据和tombstone发生第一次compaction的时候,数据会被删除掉,相应的磁盘空间也被回收,你可以了解关于Compaction的更多细节。

5、为什么用nodetool ring只能看到一条记录? 即便所有节点输出的日志里可以看出,他们都发现彼此加入到了这个ring。

这个发生于你的所有节点都配了通用的token,不要这么做。

这经常发生于哪些使用VM部署cassandra的用户,(特别是使用Debian package,它会在安装完自动启动cassandra,所以会生成token并保存它。),安装好后就把VM整个克隆出另外的节点。

增很容易修复,只要把数据目录以及commitlog目录删除,然后保证每个节点是随机生成的token,再启动就可以了。

6、我可以修改一个正在运行中的集群中的keyspace的副本因子吗?

可以,但是修改后需要执行repair或者cleanup来改变已存数据的副本个数。

首先使用cqlsh修改目标keyspace的副本因子。
如果你是减少副本因子,你可以执行nodetool cleanup去删除多余的副本数据,对每个节点都要执行。

如果你是增加副本因子,你需要执行nodetool repair来保证数据的副本个数满足当前的配置。 Repair只要对每个副本集执行一次即可。这是个敏感的操作,这会影响集群的性能。强烈建议执行rolling repair,因为试图一次修复整个集群的话,那可能是个坑。

7 可以使用cassandra存储大的二进制字段吗?

Cassandra并没有对存储大文件或者二进制,以及这样一个二进制数据被经常读,也就是整个发送到客户端的情况进行优化。因为存储小的二进制数据(小于1MB)应该不是问题。但是还是建议把大的二进制数据分隔成小块。

需要特别注意的是,任何大于16MB的值,将被Cassandra拒绝掉,这是由max_mutation_size_in_kb配置项决定的(这个配置项默认是commitlog_segment_size_in_mb的一半,commitlog_segment_size_in_mb默认是32M)。

8、Nodetool连接远程服务器的时候,提示“Connection refused to host: 127.0.1.1” ,这是为什么?

nodetool依赖JMX,JMX依赖RMI。RMI在两端通信的时候会根据需要创建自己的listenners和connectors。通常,这些都是底层透明的,但是不正确的hostname解析,无论是在连接方还是被连接方,都会导致错乱和这样的拒绝异常。

如果你在使用DNS。确保两端机器的/etc/hosts文件是正确的。如果还是失败的,你可以尝试通过jvm选项-Djava.rmi.server.hostname=指定你要连接的远程机器名称给JMX接口,配置项大体在cassandra-env.sh文件的靠下的位置。

  1. 二师兄说道:

    读了你的很多文章。很不错,想转载一下^_^

留言

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

*

验证码 *