Well, that's a shame... That part of the code has been changed in trunk and now it uses BootStrapper.getBootstrapTokens() instead of getRandomToken() when auto boostrap is disabled : https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/service/StorageService.java#L938
I was hoping this would already be the case in 3.0.x/3.11.x :( Maybe that change should be backported to 3.11.x ? It doesn't seem like a big change actually (I can be wrong though, Cassandra is a complex beast...) and your use case doesn't seem to be that exotic. One would expect that a new DC can be created with balanced ownership, which is obviously not the case. On Wed, Jan 17, 2018 at 6:27 PM Oleksandr Shulgin < oleksandr.shul...@zalando.de> wrote: > On Wed, Jan 17, 2018 at 4:21 AM, kurt greaves <k...@instaclustr.com> > wrote: > >> I believe you are able to get away with just altering the keyspace to >> include both DC's even before the DC exists, and then adding your nodes to >> that new DC using the algorithm. Note you'll probably want to take the >> opportunity to reduce the number of vnodes to something reasonable. Based >> off memory from previous testing you can get a good token balance with 16 >> vnodes if you have at least 6 nodes per rack (with RF=3 and 3 racks). >> > > Alexander, Kurt, > > Thank you for the suggestions. > > None of them did work in the end, unfortunately: > > 1. Using auto_bootstrap=false always results in random token allocation, > ignoring the allocate_tokens_for_keyspace option. > > The token allocation option is only considered if shouldBootstrap() > returns true: > > https://github.com/apache/cassandra/blob/cassandra-3.0.15/src/java/org/apache/cassandra/service/StorageService.java#L790 > if (shouldBootstrap()) { > > https://github.com/apache/cassandra/blob/cassandra-3.0.15/src/java/org/apache/cassandra/service/StorageService.java#L842 > BootStrapper.getBootstrapTokens() (the only place in code using the > token allocation option) > > https://github.com/apache/cassandra/blob/cassandra-3.0.15/src/java/org/apache/cassandra/service/StorageService.java#L901 > else { ... > > 2. Using auto_bootstrap=true and allocate_tokens_for_keyspace=data_ks > gives us balanced range ownership on the new empty DC. The problem though, > is that rebuilding of an already bootstrapped node doesn't work: the node > believes that it already has all the data. > > We are going to proceed by manually assigning a small number of tokens to > the nodes in new DC with auto_bootstrap=false and only use the automatic > token allocation when we need to scale it out. This seems to be the only > supported way to use it anyway. > > Regards, > -- > Alex > > -- ----------------- Alexander Dejanovski France @alexanderdeja Consultant Apache Cassandra Consulting http://www.thelastpickle.com