这里以两台机器A和B示例,它们的IP分别为192.168.20.1和192.168.20.2。
A的配置如下:
cluster_name:'FirstCluster'
seeds: "192.168.20.1,192.168.20.2"
listen_address: 192.168.20.1
rpc_address: 0.0.0.0
B的配置如下:
cluster_name:'FirstCluster'
seeds: "192.168.20.2,192.168.20.1"
listen_address: 192.168.20.2
rpc_address: 0.0.0.0
其实A和B的seeds配置没必要都一样,只要有其中一个配置了对方的IP,保证他们可以互相通信就可以了。因此若我们想再加入一台节点C,则我们只需要在C的seeds里加上A或B的IP就可以了,A和B的seeds不需要变。但官网推荐seeds都配置成一样的,因为这样会更健壮。假如C只写了A的IP,那么若A断了,则B和C也断了。因此可以的话,尽量将集群里所有节点的seeds配置成一样的。
在192.168.20.1执行,若能看到两个节点ip,说明配置成功
[root@localhost ~]# apache-cassandra-1.2.1/bin/nodetool -host192.168.20.1 ring
集群里,数据会自动分布到对应的节点上,但我们可能想数据存储多个副本,那么可以设置replication_factor属性。replication_factor表示一个数据存放多少个副本,以前该属性可以在配置文件里修改,但最新的cassandra取消了这个做法,你需要启动客户端来修改。进入bin,打开客户端cassandra-cli:
connect localhost/9160;
use DEMO;
update keyspace DEMO with placement_strategy = 'org.apache.cassandra.locator.SimpleStrategy' and strategy_options={replication_factor:3};
这条语句,首先将placement_strategy从默认的NetworkTopologyStrategy修改为SimpleStrategy,然后我们才能设置replication_factor属性。
修改完成后,数据将会自动存储多个副本在不同的节点上,第一个数据副本存储在最适合的token节点上,第二个副本的节点选择将按照第一个的token递增。
但这个同步并不是立刻完成的,若你想立刻看它们散布副本,可以对所有节点使用repair命令。
nodetool.bat -h <ip> repair
此时再使用ring命令,就会发现节点的Load应该都增多了。
若集群里有新节点加入,则它们会分掉一部分的token范围,但原来已经分配好的数据却可能不会随着新token而重新分布(这里说的是集群自动分配token,如果你使用了move命令手动重新分配了token,则数据也会随之重新分布)。若你想让它们重新分布,则在加入新节点后,使用repair命令,它们会自动去索引自己的数据。而此时老节点上又存在一些不属于自己的数据,我们可以使用cleanup命令来清除冗余数据:
nodetool.bat -h <ip> cleanup
注意,你最好确认新机器可以正常工作后再使用这个命令。