From 80250cd884362181533872dc815dc24333a89516 Mon Sep 17 00:00:00 2001 From: Peter Vlugter Date: Tue, 25 Oct 2011 16:28:12 +0200 Subject: [PATCH] Some docs for new clustering --- akka-docs/cluster/images/member-states.png | Bin 0 -> 39317 bytes .../cluster/{cluster => images}/more.png | Bin akka-docs/cluster/new.rst | 365 ++++++++++++++++++ 3 files changed, 365 insertions(+) create mode 100644 akka-docs/cluster/images/member-states.png rename akka-docs/cluster/{cluster => images}/more.png (100%) create mode 100644 akka-docs/cluster/new.rst diff --git a/akka-docs/cluster/images/member-states.png b/akka-docs/cluster/images/member-states.png new file mode 100644 index 0000000000000000000000000000000000000000..f11aee7dbfc53203beb52a8fa8cd0ef195ee8661 GIT binary patch literal 39317 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 F2>=n%l<)um literal 0 HcmV?d00001 diff --git a/akka-docs/cluster/cluster/more.png b/akka-docs/cluster/images/more.png similarity index 100% rename from akka-docs/cluster/cluster/more.png rename to akka-docs/cluster/images/more.png diff --git a/akka-docs/cluster/new.rst b/akka-docs/cluster/new.rst new file mode 100644 index 0000000000..283f6a04d5 --- /dev/null +++ b/akka-docs/cluster/new.rst @@ -0,0 +1,365 @@ + +.. _cluster: + +################ + New Clustering +################ + + +Membership +========== + +A cluster is made up of a set of member nodes. The identifier for each node is a +host:port pair. An Akka application is distributed over a cluster with each node +hosting some part of the application. Cluster membership and partitioning of the +application are decoupled. A node could be a member of a cluster without hosting +any actors. + + +Gossip +------ + +The cluster membership used in Akka is based on the Dynamo system and +particularly the approach taken in Riak. Cluster membership is communicated +using a gossip protocol. The current state of the cluster is gossiped randomly +through the cluster. Joining a cluster is initiated by specifying a set of seed +nodes with which to begin gossiping. + +TODO: More details about the gossip approach (push-pull-gossip?). Gossiping to a +random member node, random unreachable node, random seed node. + + +Vector Clocks +------------- + +Vector clocks are used to reconcile and merge differences in cluster state +during gossiping. A vector clock is a set of (node, counter) pairs. Each update +to the cluster state has an accompanying update to the vector clock. + + +Gossip convergence +------------------ + +Information about the cluster converges at certain points of time. This is when +all nodes have seen the same cluster state. To be able to recognise this +convergence a map from node to current vector clock is also passed as part of +the gossip state. Gossip convergence cannot occur while any nodes are +unreachable, either the nodes become reachable again, or the nodes need to be +moved into the ``down`` or ``removed`` states (see below). + + +Leader +------ + +After gossip convergence a leader for the cluster can be determined. There is no +leader election process, the leader can always be recognised deterministically +by any node whenever there is gossip convergence. The leader is simply the first +node in sorted order that is able to take the leadership role, where the only +allowed member states for a leader are ``up`` or ``leaving``. + +The role of the leader is to shift members in and out of the cluster, changing +``joining`` members to the ``up`` state or ``exiting`` members to the +``removed`` state, and to schedule rebalancing across the cluster. Currently +leader actions are only triggered by receiving a new cluster state with gossip +convergence but it may also be possible for the user to explicitly rebalance the +cluster by specifying migrations, or to rebalance the cluster automatically +based on metrics gossiped by the member nodes. + + +Membership lifecycle +-------------------- + +A node begins in the ``joining`` state. Once all nodes have seen that the new +node is joining (through gossip convergence) the leader will set the member +state to ``up`` and can start assigning partitions to the new node. + +If a node is leaving the cluster in a safe, expected manner then it switches to +the ``leaving`` state. The leader will reassign partitions across the cluster +(it is possible for a leaving node to itself be the leader). When all partition +handoff has completed then the node will change to the ``exiting`` state. Once +all nodes have seen the exiting state (convergence) the leader will remove the +node from the cluster, marking it as ``removed``. + +A node can also be removed forcefully by moving it directly to the ``removed`` +state using the ``remove`` action. The cluster will rebalance based on the new +cluster membership. + +If a node is unreachable then gossip convergence is not possible and therefore +any leader actions are also not possible (for instance, allowing a node to +become a part of the cluster, or changing actor distribution). To be able to +move forward the state of the unreachable nodes must be changed. If the +unreachable node is experiencing only transient difficulties then it can be +explicitly marked as ``down`` using the ``down`` user action. When this node +comes back up and begins gossiping it will automatically go through the joining +process again. If the unreachable node will be permanently down then it can be +removed from the cluster directly with the ``remove`` user action. The cluster +can also *auto-down* a node using the accrual failure detector. + +TODO: more information about the accrual failure detection and auto-downing + + +State diagram for the member states +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. image:: images/member-states.png + + +Member states +^^^^^^^^^^^^^ + +- **joining** + transient state when joining a cluster + +- **up** + normal operating state + +- **leaving** / **exiting** + states during graceful removal + +- **removed** + tombstone state (no longer a member) + +- **down** + marked as down/offline/unreachable + + +User actions +^^^^^^^^^^^^ + +- **join** + join a single node to a cluster - can be explicit or automatic on + startup if a list of seed nodes have been specified in the configuration + +- **leave** + tell a node to leave the cluster gracefully + +- **down** + mark a node as temporarily down + +- **remove** + remove a node from the cluster immediately + + +Leader actions +^^^^^^^^^^^^^^ + +- shifting members in and out of the cluster + + - joining -> up + + - exiting -> removed + +- partition distribution + + - scheduling handoffs (pending changes) + + - setting the partition table (partition path -> base node) + + +Partitioning +============ + +Each partition (an actor or actor subtree) in the actor system is assigned to a +base node. The mapping from partition path (actor address) to base node is +stored in the partition table and is maintained as part of the cluster state +through the gossip protocol. The partition table is only updated by the leader +node. If the partition has a configured instance count (N value) greater than +one, then the location of the other instances can be found deterministically by +counting from the base node. The first instance will be found on the base node, +and the other instances on the next N-1 nodes, given the nodes in sorted order. + +TODO: discuss how different N values within the tree work (especially subtrees +with a greater or lesser N value). A simple implementation would only allow the +highest-up-the-tree, non-singular (greater than one) value to be used for any +subtree. + +When rebalancing is required the leader will schedule handoffs, gossiping a set +of pending changes, and when each change is complete the leader will update the +partition table. + +TODO: look further into how actors will be distributed and also avoiding +unnecessary migrations just to create a more balanced cluster. + + +Handoff +------- + +Handoff for an actor-based system is different than for a data-based system. The +most important point is that message ordering (from a given node to a given +actor) may need to be maintained. If an actor is a singleton actor then the +cluster may also need to assure that there is only one such actor active at any +one time. Both of these situations can be handled by forwarding and buffering +messages during transitions. + +A *graceful handoff* (one where the previous host node is up and running during +the handoff), given a previous host node ``N1``, a new host node ``N2``, and an +actor partition ``A`` to be migrated from ``N1`` to ``N2``, has this general +structure: + + 1. the leader sets a pending change for ``N1`` to handoff ``A`` to ``N2`` + + 2. ``N1`` notices the pending change and sends an initialization message to ``N2`` + + 3. in response ``N2`` creates ``A`` and sends back a ready message + + 4. after receiving the ready message ``N1`` marks the change as complete + + 5. the leader sees the migration is complete and updates the partition table + + 6. all nodes eventually see the new partitioning and use ``N2`` + + +Transitions +^^^^^^^^^^^ + +There are transition times in the handoff process where different approaches can +be used to give different guarantees. + + +Migration transition +~~~~~~~~~~~~~~~~~~~~ + +The first transition starts when ``N1`` initiates the moving of ``A`` and ends +when ``N1`` receives the ready message, and is referred to as the *migration +transition*. + +The first question is: during the migration transition should ``N1`` continue to +process messages for ``A``? Or is it important that no messages for ``A`` are +processed on ``N1`` once migration begins? + +If it is okay for the previous host node to process messages during migration +then there is nothing that needs to be done at this point. + +If no messages are to be processed on the previous host node during migration +then there are two possibilities: the messages are forwarded to the new host and +buffered until the actor is ready, or the messages are simply dropped by +terminating the actor and allowing the normal dead letter process to be used. + + +Update transition +~~~~~~~~~~~~~~~~~ + +The second transition begins when the migration is marked as complete and ends +when all nodes have the updated partition table (when all nodes will use ``N2`` +as the host for ``A``), and is referred to as the *update transition*. + +Once the update transition begins ``N1`` can forward any messages it receives +for ``A`` to the new host ``N2``. The question is whether or not message +ordering needs to be preserved. If messages sent to the previous host node +``N1`` are being forwarded, then it is possible that a message sent to ``N1`` +could be forwarded after a direct message to the new host ``N2``, breaking +message ordering from a client to actor ``A``. + +In this situation ``N2`` can keep a buffer for messages per sending node. Each +buffer is flushed and removed when an acknowledgement has been received. When +each node in the cluster sees the partition update it first sends an ack message +to the previous host node ``N1`` before beginning to use ``N2`` as the new host +for ``A``. Any messages sent from the client node directly to ``N2`` will be +buffered. ``N1`` can count down the number of acks to determine when no more +forwarding is needed. The ack message from any node will always follow any other +messages sent to ``N1``. When ``N1`` receives the ack message it also forwards +it to ``N2`` and again this ack message will follow any other messages already +forwarded for ``A``. When ``N2`` receives an ack message the buffer for the +sending node can be flushed and removed. Any subsequent messages from this +sending node can be queued normally. Once all nodes in the cluster have +acknowledged the partition change and ``N2`` has cleared all buffers, the +handoff is complete and message ordering has been preserved. In practice the +buffers should remain small as it is only those messages sent directly to ``N2`` +before the acknowledgement has been forwarded that will be buffered. + + +Graceful handoff +^^^^^^^^^^^^^^^^ + +A more complete process for graceful handoff would be: + + 1. the leader sets a pending change for ``N1`` to handoff ``A`` to ``N2`` + + + 2. ``N1`` notices the pending change and sends an initialization message to + ``N2``. Options: + + a. keep ``A`` on ``N1`` active and continuing processing messages as normal + + b. ``N1`` forwards all messages for ``A`` to ``N2`` + + c. ``N1`` drops all messages for ``A`` (terminate ``A`` with messages + becoming dead letters) + + + 3. in response ``N2`` creates ``A`` and sends back a ready message. Options: + + a. ``N2`` simply processes messages for ``A`` as normal + + b. ``N2`` creates a buffer per sending node for ``A``. Each buffer is + opened (flushed and removed) when an acknowledgement for the sending + node has been received (via ``N1``) + + + 4. after receiving the ready message ``N1`` marks the change as complete. Options: + + a. ``N1`` forwards all messages for ``A`` to ``N2`` during the update transition + + b. ``N1`` drops all messages for ``A`` (terminate ``A`` with messages + becoming dead letters) + + + 5. the leader sees the migration is complete and updates the partition table + + + 6. all nodes eventually see the new partitioning and use ``N2`` + + i. each node sends an acknowledgement message to ``N1`` + + ii. when ``N1`` receives the acknowledgement it can count down the pending + acknowledgements and remove forwarding when complete + + iii. when ``N2`` receives the acknowledgement it can open the buffer for the + sending node (if buffers are used) + + +The default approach is to take options 2a, 3a, and 4a - allowing ``A`` on +``N1`` to continue processing messages during migration and then forwarding any +messages during the update transition. This assumes stateless actors that do not +have a dependency on message ordering from any given source. + +If an actor has a distributed durable mailbox then nothing needs to be done, +other than migrating the actor. + +If message ordering needs to be maintained during the update transition then +option 3b can be used, creating buffers per sending node. + +If the actors are robust to message send failures then the dropping messages +approach can be used (with no forwarding or buffering needed). + +If an actor is a singleton (only one instance possible throughout the cluster) +and state is transfered during the migration initialization, then options 2b and +3b would be required. + + +Terms +===== + +**node** + A logical member of a cluster. There could be multiple nodes on a physical + machine. + +**cluster** + A set of nodes. Contains distributed Akka applications. + +**partition** + An actor (possibly a subtree of actors) in the Akka application that + is distributed within the cluster. + +**partition path** + Also referred to as the actor address. + +**base node** + The first node (with nodes in sorted order) that contains a partition. + +**partition table** + A mapping from partition path to base node. + +**instance count** + The number of instances of a partition in the cluster. Also referred to as the + N value of the partition.