#-------- start 3 nodes a, b, c iex --name a@127.0.0.1 -S mix iex --name b@127.0.0.1 -S mix iex --name c@127.0.0.1 -S mix #-------- on node a: cluster_name = :cluster system_name = :system machine = {:simple, fn command, _state -> command end, 0} nodes = [node_a, node_b, node_c] = [:"a@127.0.0.1", :"b@127.0.0.1", :"c@127.0.0.1"] server_ids = [server_id_a, server_id_b, server_id_c] = for node <- nodes, do: {cluster_name, node} for node <- nodes, do: true = Node.connect(node) for node <- nodes, do: :rpc.call(node, :ra, :start, []) :ra.start_cluster(:default, cluster_name, machine, [server_id_b]) :ra.start_server(:default, cluster_name, server_id_a, machine, [server_id_b]) :ra.add_member(server_id_b, server_id_a) :ra.start_server(:default, cluster_name, server_id_c, machine, [server_id_b]) :ra.add_member(server_id_b, server_id_c) #-------- manually shutdown all followers (a and c) #-------- start a new node d iex --name d@127.0.0.1 -S mix cluster_name = :cluster system_name = :system machine = {:simple, fn command, _state -> command end, 0} nodes = [node_a, node_b, node_c] = [:"a@127.0.0.1", :"b@127.0.0.1", :"c@127.0.0.1"] server_ids = [server_id_a, server_id_b, server_id_c] = for node <- nodes, do: {cluster_name, node} server_id_d = {cluster_name, :"d@127.0.0.1"} :ra.start() :ra.start_server(:default, cluster_name, server_id_d, machine, [server_id_b]) :ra.add_member(server_id_b, server_id_d) #>>>>>>> added (not expected as no majority is reached) #-------- start a new node e iex --name e@127.0.0.1 -S mix cluster_name = :cluster system_name = :system machine = {:simple, fn command, _state -> command end, 0} nodes = [node_a, node_b, node_c] = [:"a@127.0.0.1", :"b@127.0.0.1", :"c@127.0.0.1"] server_ids = [server_id_a, server_id_b, server_id_c] = for node <- nodes, do: {cluster_name, node} server_id_e = {cluster_name, :"e@127.0.0.1"} :ra.start() :ra.start_server(:default, cluster_name, server_id_e, machine, [server_id_b]) :ra.add_member(server_id_b, server_id_e) #>>>>>>> not added {:error, :cluster_change_not_permitted} (expected)