Специальные записи означают, что запись журнала, когда она применяется, не вносит изменений в конечный автомат, а вместо этого представляет собой специальную структуру, которая несет информацию о конфигурации кластера.Если ваш конечный автомат представляет собой простое хранилище значений ключей, эта новая запись не будет похожа на другие (set x = 5
), вместо этого она будет содержать конфигурацию кластера (обычно адрес и порт), что-то вроде [1 = {1.2.3.4, 10000}, 2 = {1.2.3.5, 10001}, ...]
.Да, каждый сервер имеет полную конфигурацию кластера в своем журнале, и они всегда используют самую последнюю версию.
В диссертации PhD , глава 4.4,
Например, RPC AddServer и RemoveServer на рисунке 4.1 могут быть вызваны администраторами напрямую, или они могут быть вызваны сценарием, который использует серию односерверных шагов для произвольного изменения конфигурации.
сказал бы, что администратор должен иметь способ выполнить вызов RPC для кластера Raft.Это означает, что вам нужен способ отправки этого RPC на все серверы, и, сделав это, вы также проинформируете текущего лидера.
То, как вы отправляете RPC на все серверы, - это деталь реализации, которую вы могли бы сделатьэто как отдельный «клиент», который только это делает, или с некоторыми флагами командной строки, которые сообщают новому серверу, что он также должен отправить RPC AddServer
на все серверы при запуске.
Ваше понимание выглядит хорошо для меня, за исключением части, которая отправляет новую конфигурацию руководителю.Он должен транслировать AddServer
RPC.Текущий руководитель затем создаст новую запись в журнале с конфигурацией, содержащей новый сервер, и начнет реплицировать ее.