在建立cassandra系统时,如果不去设定每个node里cassandra.yaml配置的initial_token参数,新节点会被自动指派一个token值,但是自动指派的token值通常会造成每个node在整个ring裡的距离不相等,进而导致每个node负责的partition大小不相等。如果一开始就要让partition相等,可以利用下面的这个Java版CassandraTokenCalc(这个Sample是网路上抄来的,不知道第儿手了,别问我来源跟演算法的根据是什么...:P)来算出合适的token,然后手动指派initial_token参数值。
public class CassandraTokenCalc {
public static void main(String[] args) {
String input = null;
int nodeAmount = 0;
try {
System.out.print("Number of Cassandra Nodes: ");
BufferedReader is = new BufferedReader(new InputStreamReader(System.in));
input = is.readLine();
nodeAmount = Integer.parseInt(input);
}
catch (NumberFormatException ex) {
System.err.println("Not a valid number: " + input);
}
catch (IOException e) {
System.err.println("Unexpected IO ERROR: " + e);
}
BigInteger tok = new BigInteger("170141183460469231731687303715884105728");
for(int i=0; i<nodeAmount; i++){
System.out.println("Node: " + i);
System.out.println("initial_token: " + tok.multiply(BigInteger.valueOf(i)).divide(BigInteger.valueOf(nodeAmount)));
}
}
}
执行后的结果类似下面这样
Number of Cassandra Nodes: 3
Node: 0
initial_token: 0
Node: 1
initial_token: 56713727820156410577229101238628035242
Node: 2
initial_token: 113427455640312821154458202477256070485
如果是现行已建置好的cassandra系统里发现每个node所分配的partition不一致,可利用上面算出来的token值再配合 nodetool...move... 指令来搬移现行的token,进而达到每个partition大小一致的目标。