I'm testing the behaviour of a Cassandra cluster with different configurations. One of them uses a ByteOrderedPartitioner to distribute the keys along the nodes.
The data model is made by fat rows, each of them with a integer (IntegerType) as key with a value from 0 to 9999. I setted a ring of 10 nodes in such way:
Address Rack Status State Owns Token
Token(bytes[0900])
node1 Up Normal 5.14 MB 10.00% Token(bytes[00])
node2 Up Normal 377.42 MB 10.00% Token(bytes[0100])
node3 Up Normal 373.06 MB 10.00% Token(bytes[0200])
node4 Up Normal 966.15 KB 10.00% Token(bytes[0300])
node5 Up Normal 953.4 KB 10.00% Token(bytes[0400])
node6 Up Normal 953.26 KB 10.00% Token(bytes[0500])
node7 Up Normal 944.54 KB 10.00% Token(bytes[0600])
node8 Up Normal 953.4 KB 10.00% Token(bytes[0700])
node9 Up Normal 962.42 KB 10.00% Token(bytes[0800])
node10 Up Normal 961.31 KB 10.00% Token(bytes[0900])
but all the load goes on the node2 and on the node3 for replica.
Why these tokens don't work? How I should fix them?
First, you should run cleanup on each node to make sure you're not seeing extra data that the node is no longer responsible for, post-bootstrap.
Once that is done, you can use the getRangeKeySample JMX method to get a sample of the keys on a node. You can then adjust its token to a value that moves an appropriate amount of keys to its neighbor, if necessary.
That said: you should almost certainly be using RandomPartitioner instead, to avoid exactly this problem. I've explained in posts like this how you can use clustering within a partition key to do the kind of ordering you might otherwise be tempted to use BOP for.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With