Prefer "update" over "upgrade" when rolling (#29523)

This commit is contained in:
Ignasi Marimon-Clos 2020-08-25 11:11:06 +02:00 committed by GitHub
parent 728dda874e
commit 418d6d3ec0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 19 additions and 19 deletions

View file

@ -27,30 +27,30 @@ There are two parts of Akka that need careful consideration when performing an r
1. Serialization format of persisted events and snapshots. New nodes must be able to read old data, and
during the update old nodes must be able to read data stored by new nodes.
There are many more application specific aspects for serialization changes during rolling upgrades to consider.
There are many more application specific aspects for serialization changes during rolling updates to consider.
For example based on the use case and requirements, whether to allow dropped messages or tear down the TCP connection when the manifest is unknown.
When some message loss during a rolling upgrade is acceptable versus a full shutdown and restart, assuming the application recovers afterwards
When some message loss during a rolling update is acceptable versus a full shutdown and restart, assuming the application recovers afterwards
* If a `java.io.NotSerializableException` is thrown in `fromBinary` this is treated as a transient problem, the issue logged and the message is dropped
* If other exceptions are thrown it can be an indication of corrupt bytes from the underlying transport, and the connection is broken
For more zero-impact rolling upgrades, it is important to consider a strategy for serialization that can be evolved.
One approach to retiring a serializer without downtime is described in @ref:[two rolling upgrade steps to switch to the new serializer](../serialization.md#rolling-upgrades).
For more zero-impact rolling updates, it is important to consider a strategy for serialization that can be evolved.
One approach to retiring a serializer without downtime is described in @ref:[two rolling update steps to switch to the new serializer](../serialization.md#rolling-updates).
Additionally you can find advice on @ref:[Persistence - Schema Evolution](../persistence-schema-evolution.md) which also applies to remote messages when deploying with rolling updates.
## Cluster Sharding
During a rolling upgrade, sharded entities receiving traffic may be moved during @ref:[shard rebalancing](../typed/cluster-sharding-concepts.md#shard-rebalancing),
During a rolling update, sharded entities receiving traffic may be moved during @ref:[shard rebalancing](../typed/cluster-sharding-concepts.md#shard-rebalancing),
to an old or new node in the cluster, based on the pluggable allocation strategy and settings.
When an old node is stopped the shards that were running on it are moved to one of the
other old nodes remaining in the cluster. The `ShardCoordinator` is itself a cluster singleton.
To minimize downtime of the shard coordinator, see the strategies about @ref[ClusterSingleton](#cluster-singleton) rolling upgrades below.
To minimize downtime of the shard coordinator, see the strategies about @ref[ClusterSingleton](#cluster-singleton) rolling updates below.
A few specific changes to sharding configuration require @ref:[a full cluster restart](#cluster-sharding-configuration-change).
## Cluster Singleton
Cluster singletons are always running on the oldest node. To avoid moving cluster singletons more than necessary during a rolling upgrade,
it is recommended to upgrade the oldest node last. This way cluster singletons are only moved once during a full rolling upgrade.
Cluster singletons are always running on the oldest node. To avoid moving cluster singletons more than necessary during a rolling update,
it is recommended to upgrade the oldest node last. This way cluster singletons are only moved once during a full rolling update.
Otherwise, in the worst case cluster singletons may be migrated from node to node which requires coordination and initialization
overhead several times.
@ -160,5 +160,5 @@ Rolling update is not supported when @ref:[changing the remoting transport](../r
### Migrating from Classic Sharding to Typed Sharding
If you have been using classic sharding it is possible to do a rolling upgrade to typed sharding using a 3 step procedure.
If you have been using classic sharding it is possible to do a rolling update to typed sharding using a 3 step procedure.
The steps along with example commits are detailed in [this sample PR](https://github.com/akka/akka-samples/pull/110)

View file

@ -92,7 +92,7 @@ This means that a rolling update will have to go through at least one of 2.6.2,
Issue: [#28918](https://github.com/akka/akka/issues/28918). JacksonCborSerializer was using plain JSON format
instead of CBOR.
If you have `jackson-cbor` in your `serialization-bindings` a rolling upgrade will have to go through 2.6.5 when
If you have `jackson-cbor` in your `serialization-bindings` a rolling update will have to go through 2.6.5 when
upgrading to 2.6.5 or higher.
In Akka 2.6.5 the `jackson-cbor` binding will still serialize to JSON format to support rolling update from 2.6.4.

View file

@ -180,7 +180,7 @@ should be serialized by it.
It's recommended to throw `IllegalArgumentException` or `java.io.NotSerializableException` in
`fromBinary` if the manifest is unknown. This makes it possible to introduce new message types and
send them to nodes that don't know about them. This is typically needed when performing
rolling upgrades, i.e. running a cluster with mixed versions for a while.
rolling updates, i.e. running a cluster with mixed versions for a while.
Those exceptions are treated as a transient problem in the classic remoting
layer. The problem will be logged and the message dropped. Other exceptions will tear down
the TCP connection because it can be an indication of corrupt bytes from the underlying
@ -252,24 +252,24 @@ akka.actor.warn-about-java-serializer-usage = off
It is not safe to mix major Scala versions when using the Java serialization as Scala does not guarantee compatibility
and this could lead to very surprising errors.
## Rolling upgrades
## Rolling updates
A serialized remote message (or persistent event) consists of serializer-id, the manifest, and the binary payload.
When deserializing it is only looking at the serializer-id to pick which `Serializer` to use for `fromBinary`.
The message class (the bindings) is not used for deserialization. The manifest is only used within the
`Serializer` to decide how to deserialize the payload, so one `Serializer` can handle many classes.
That means that it is possible to change serialization for a message by performing two rolling upgrade steps to
That means that it is possible to change serialization for a message by performing two rolling update steps to
switch to the new serializer.
1. Add the `Serializer` class and define it in `akka.actor.serializers` config section, but not in
`akka.actor.serialization-bindings`. Perform a rolling upgrade for this change. This means that the
`akka.actor.serialization-bindings`. Perform a rolling update for this change. This means that the
serializer class exists on all nodes and is registered, but it is still not used for serializing any
messages. That is important because during the rolling upgrade the old nodes still don't know about
messages. That is important because during the rolling update the old nodes still don't know about
the new serializer and would not be able to deserialize messages with that format.
1. The second change is to register that the serializer is to be used for certain classes by defining
those in the `akka.actor.serialization-bindings` config section. Perform a rolling upgrade for this
those in the `akka.actor.serialization-bindings` config section. Perform a rolling update for this
change. This means that new nodes will use the new serializer when sending messages and old nodes will
be able to deserialize the new format. Old nodes will continue to use the old serializer when sending
messages and new nodes will be able to deserialize the old format.

View file

@ -140,7 +140,7 @@ The reason for only using a limited number of nodes is to keep the number of con
centers low. The same nodes are also used for the gossip protocol when disseminating the membership
information across data centers. Within a data center all nodes are involved in gossip and failure detection.
This influences how rolling upgrades should be performed. Don't stop all of the oldest that are used for gossip
This influences how rolling updates should be performed. Don't stop all of the oldest that are used for gossip
at the same time. Stop one or a few at a time so that new nodes can take over the responsibility.
It's best to leave the oldest nodes until last.

View file

@ -293,7 +293,7 @@ Cluster Sharding uses its own Distributed Data `Replicator` per node.
If using roles with sharding there is one `Replicator` per role, which enables a subset of
all nodes for some entity types and another subset for other entity types. Each replicator has a name
that contains the node role and therefore the role configuration must be the same on all nodes in the
cluster, for example you can't change the roles when performing a rolling upgrade.
cluster, for example you can't change the roles when performing a rolling update.
Changing roles requires @ref:[a full cluster restart](../additional/rolling-updates.md#cluster-sharding-configuration-change).
The `akka.cluster.sharding.distributed-data` config section configures the settings for Distributed Data.
@ -413,7 +413,7 @@ akka.persistence.cassandra.journal {
}
```
Once you have migrated you cannot go back to the old persistence store, a rolling upgrade is therefore not possible.
Once you have migrated you cannot go back to the old persistence store, a rolling update is therefore not possible.
When @ref:[Distributed Data mode](#distributed-data-mode) is used the identifiers of the entities are
stored in @ref:[Durable Storage](distributed-data.md#durable-storage) of Distributed Data. You may want to change the