2016-12-21 2 views
0

Я немного смущен тем, как cassandra обеспечивает согласованность при добавлении нового узла в кластер. Я знаю, что cassandra будет выполнять перемещения диапазона и передавать данные на новый добавленный узел. Вопрос в том, что cassandra также передает данные вторичной реплики в новый добавленный узел.Как Cassandra гарантирует согласованность при добавлении нового узла

Например, у нас есть 4 узла в кластере с ВЧ = 3 (A, B, C, D) A (x = 1, y = 2), B (x = 1, y = 3), C (x = 1), D (y = 2). Клавиша раздела «x» будет удерживаться символами A, B, C, в то время как ключ раздела «y» будет удерживаться клавишами D, A, B. Если я добавлю новый узел A 'между A и B. Я думаю, что он будет передавать раздел «x» из A. Но также ли он переводит раздел «y» из B или D?

Если это потоковая секция «y», какой узел будет кассандра выбрать для потоковой передачи? От official document. Он будет передаваться из первичной реплики, которая равна D. Если это так, когда D имеет устаревшие данные (это нормально, если вы добавляете новый узел, как A и B, так и последние данные, которые соответствуют кворуму), после потоковой передачи для запроса устаревших данных из D и A '. Я прав?

ответ

0

Возможно, вы правы. Перед добавлением нового узла рекомендуется выполнить ремонт nodetool, чтобы в кластере не было несогласованности.

1

Кассандра будет течь информацию от узла, который отказывается от права собственности на маркер

То есть, в вашем примере: RF = 3 (А, В, С, D) А (х = 1, у = 2), B (x = 1, y = 3), C (x = 1), D (y = 2). Если E добавляется между A, B и A, он откажется от владения X-E, а B откажется от владения y. Затем A отправит свое значение от X до E и B отправит свое значение Y в E, поэтому конечным результатом будет A (y = 2), E (X = 1, y = 3), B (x = 1), C (x = 1), D (y = 2).

Обратите внимание, что после добавления узла A имеет устаревшую копию X и B имеет устаревшую копию Y, и они должны запускать «очистку nodetool», чтобы избавиться от этого.

+0

Спасибо Shlomi. Означает ли это, что [официальный документ] (https://github.com/apache/cassandra/blob/cassandra-3.9/doc/source/operation/topo_changes.rst#range -streaming) неточен? –

+0

И когда я смотрю исходный код cassandra в 'RangeStreamer', если rangemovement истинно (по умолчанию), вот код для выбора исходного узла' InetAddress sourceIp = addressList.iterator(). Next(); 'Как это сделать? убедитесь, что это узел, который отказывается от прав собственности? –

+0

Глядя на багажник (https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/dht/RangeStreamer.java#L176). Поскольку число узлов в кластере больше, чем RF, тогда вызов addRanges на RangeStreamer вызовет getAllRangesWithStrictSourcesFor (учитывая, что у нас установлен strictConsistency). getAllRangesWithStrictSourcesFor обеспечивает последовательную передачу. –

Смежные вопросы