Я немного смущен тем, как 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 '. Я прав?
Спасибо Shlomi. Означает ли это, что [официальный документ] (https://github.com/apache/cassandra/blob/cassandra-3.9/doc/source/operation/topo_changes.rst#range -streaming) неточен? –
И когда я смотрю исходный код cassandra в 'RangeStreamer', если rangemovement истинно (по умолчанию), вот код для выбора исходного узла' InetAddress sourceIp = addressList.iterator(). Next(); 'Как это сделать? убедитесь, что это узел, который отказывается от прав собственности? –
Глядя на багажник (https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/dht/RangeStreamer.java#L176). Поскольку число узлов в кластере больше, чем RF, тогда вызов addRanges на RangeStreamer вызовет getAllRangesWithStrictSourcesFor (учитывая, что у нас установлен strictConsistency). getAllRangesWithStrictSourcesFor обеспечивает последовательную передачу. –