...
- communication: Communication messages consists of two parts:
- Message format: message format itself. Communication API should be reworked to force backward compatible messages.
- User data: Message can store user data. User data format must be backward compatible.
- discovery:
- Message format: message format itself. Communication API must be reworked to force backward compatible messages.
- binary marshaller:
- Currently, binary marshaller code highly coupled with the other Ignite code. We must modularize Binary infrastructure (IEP-119 Binary infrastructure modularization) and provide compatibility guarantees for each part of it.
- features:
- Framework to enable/disable features for mixed version clusters must be developed.
- affinity:
- Affinity function must the same for each online node version.
Current Ignite codebase
- Is there any primitives, building blocks to provide compatibility?
- Difficulties for day by day coding.
- Compatibility testing.
- New feature implementation, enabling.
Additional materials
Many distributed open source systems has rolling upgrade feature, already.
We must study implemented approaches to gain some insights from them.
...
- Is there rolling upgrade feature?
- How it implemented?
- How it tested?
- When it tested: Each PR? Weekly? Only on release?
- Network message format.
- Serdes implementation implementation.
- How many earlier releases can be upgraded.
Apache Cassandra
- Rolling upgrade implemented. Guide -
- https://www.datastax.com/learn/whats-new-for-cassandra-4/migrating-cassandra-4x
- https://docs.datastax.com/en/luna-cassandra/guides/upgrade/overview.html
- Server-client compatibility works similar to Ignite Thin Client protocol.
- Compatibility checked with the special test framework - https://github.com/apache/cassandra-dtest/blob/trunk/upgrade_tests/README.md
At a first glance, there are no special source code checks to ensure compatibility in day by day coding. - On release or by request.
- POJO
- Internal serdes.
- ?
Apache Kafka
- Rolling upgrade implemented. Guide - https://kafka.apache.org/documentation/#upgrade
- Message formats checked on PR reivew.
At a first glance, there are no special source code checks to ensure compatibility in day by day coding.
But, all machinery to code compatible implemented in code generation framework - https://github.com/apache/kafka/blob/trunk/clients/src/main/resources/common/message/AlterPartitionResponse.json - Compatibility checked with the special test framework ducktest - https://github.com/apache/kafka/blob/trunk/tests/kafkatest/tests/core/kraft_upgrade_test.py
- On release or by request.
Kafka doesn't provide public resources to run ducktests. Run done by contributors or by confluent employers on private hosts. - POJO
- Internal autogenerated serdes.
- ?
Yugabyte
- Rolling upgrade implemented. Doc - https://docs.yugabyte.com/preview/manage/upgrade-deployment/
- It seems compatibility checked on review (see commit message section "Upgrade/Rollback safety") - https://github.com/yugabyte/yugabyte-db/commit/e9ab17dea0d3b4f1673531c07404a290f9fbd8f2
- ???
- ???
- simple data structures.
- protobuf.
- ?
YDB
- Rolling upgrade implemented.
- Message formats checked on PR rivew - grpc+protobuf helps to maintain compatibility.
- Compatibility checked with the special test framework - https://github.com/ydb-platform/ydb/blob/main/ydb/tests/functional/restarts/
- On request.
- simple data structures
- protobuf
- ?
Cockroach DB
- Rolling upgrade implemented.
- g?
- ?
- ?
- simple data structures.
- protobuf.
- ?
Alternative designs
- subsystem API versions (like in REST API)
- runtime component(IgniteProcessor, IgniteManager) upgrade with the dynamic class loading.
- ability to run tests with random node versions
- patterns for implementing commons cases: new version of algorithmes, testing against new versions.