On Fri, Nov 5, 2021, at 08:10, David Arthur wrote: > Colin and Jun, thanks for the additional comments! > > Colin: > >> We've been talking about having an automated RPC compatibility checker > > Do we have a way to mark fields in schemas as deprecated? It can stay in > the RPC, it just complicates the logic a bit. >
Hi David, The easiest thing to do is probably just to add a comment to the "description" field. Thinking about it more, I really think we should stick to the normal RPC versioning rules. Making exceptions just tends to lead to issues down the road. >> It would be nice if the active controller could validate that a majority > of the quorum could use the proposed metadata.version. The active > controller should have this information, right? If we don't have recent > information from a quorum of voters, we wouldn't be active. > > I believe we should have this information from the ApiVersionsResponse. It > would be good to do this validation to avoid a situation where a > quorum leader can't be elected due to unprocessable records. > Sounds good... can you add this to the KIP? >> Do we need delete as a command separate from downgrade? > > I think from an operator's perspective, it is nice to distinguish between > changing a feature flag and unsetting it. It might be surprising to an > operator to see the flag's version set to nothing when they requested the > downgrade to version 0 (or less). > Fair enough. If we want to go this route we should also specify whether set to 0 is legal, or whether it's necessary to use "delete". Jun's proposal of using "disable" instead of delete also seems reasonable here... > > > it seems like we should spell out that metadata.version begins at 1 in > >KRaft clusters > > I added this text: > Thanks. > > We probably also want an RPC implemented by both brokers and controllers > > that will reveal the min and max supported versions for each feature level > > supported by the server > > This is available in ApiVersionsResponse (we include the server's supported > features as well as the cluster's finalized features) Good point. > > Jun: > > 20. Indeed snapshots are not strictly necessary during an upgrade, I've > reworded this > I thought we agreed that we would do a snapshot before each upgrade so that if there was a big problem with the new metadata version, we would at least have a clean snapshot to fall back on? best, Colin > > Thanks! > David > > > On Thu, Nov 4, 2021 at 6:51 PM Jun Rao <j...@confluent.io.invalid> wrote: > >> Hi, David, Jose and Colin, >> >> Thanks for the reply. A few more comments. >> >> 12. It seems that we haven't updated the AdminClient accordingly? >> >> 14. "Metadata snapshot is generated and sent to the other inactive >> controllers and to brokers". I thought we wanted each broker to generate >> its own snapshot independently? If only the controller generates the >> snapshot, how do we force other brokers to pick it up? >> >> 16. If a feature version is new, one may not want to enable it immediately >> after the cluster is upgraded. However, if a feature version has been >> stable, requiring every user to run a command to upgrade to that version >> seems inconvenient. One way to improve this is for each feature to define >> one version as the default. Then, when we upgrade a cluster, we will >> automatically upgrade the feature to the default version. An admin could >> use the tool to upgrade to a version higher than the default. >> >> 20. "The quorum controller can assist with this process by generating a >> metadata snapshot after a metadata.version increase has been committed to >> the metadata log. This snapshot will be a convenient way to let broker and >> controller components rebuild their entire in-memory state following an >> upgrade." The new version of the software could read both the new and the >> old version. Is generating a new snapshot during upgrade needed? >> >> Jun >> >> >> On Wed, Nov 3, 2021 at 5:42 PM Colin McCabe <cmcc...@apache.org> wrote: >> >> > On Tue, Oct 12, 2021, at 10:34, Jun Rao wrote: >> > > Hi, David, >> > > >> > > One more comment. >> > > >> > > 16. The main reason why KIP-584 requires finalizing a feature manually >> is >> > > that in the ZK world, the controller doesn't know all brokers in a >> > cluster. >> > > A broker temporarily down is not registered in ZK. in the KRaft world, >> > the >> > > controller keeps track of all brokers, including those that are >> > temporarily >> > > down. This makes it possible for the controller to automatically >> > finalize a >> > > feature---it's safe to do so when all brokers support that feature. >> This >> > > will make the upgrade process much simpler since no manual command is >> > > required to turn on a new feature. Have we considered this? >> > > >> > > Thanks, >> > > >> > > Jun >> > >> > Hi Jun, >> > >> > I guess David commented on this point already, but I'll comment as well. >> I >> > always had the perception that users viewed rolls as potentially risky >> and >> > were looking for ways to reduce the risk. Not enabling features right >> away >> > after installing new software seems like one way to do that. If we had a >> > feature to automatically upgrade during a roll, I'm not sure that I would >> > recommend that people use it, because if something fails, it makes it >> > harder to tell if the new feature is at fault, or something else in the >> new >> > software. >> > >> > We already tell users to do a "double roll" when going to a new IBP. >> (Just >> > to give background to people who haven't heard that phrase, the first >> roll >> > installs the new software, and the second roll updates the IBP). So this >> > KIP-778 mechanism is basically very similar to that, except the second >> > thing isn't a roll, but just an upgrade command. So I think this is >> > consistent with what we currently do. >> > >> > Also, just like David said, we can always add auto-upgrade later if there >> > is demand... >> > >> > best, >> > Colin >> > >> > >> > > >> > > On Thu, Oct 7, 2021 at 5:19 PM Jun Rao <j...@confluent.io> wrote: >> > > >> > >> Hi, David, >> > >> >> > >> Thanks for the KIP. A few comments below. >> > >> >> > >> 10. It would be useful to describe how the controller node determines >> > the >> > >> RPC version used to communicate to other controller nodes. There seems >> > to >> > >> be a bootstrap problem. A controller node can't read the log and >> > >> therefore the feature level until a quorum leader is elected. But >> leader >> > >> election requires an RPC. >> > >> >> > >> 11. For downgrades, it would be useful to describe how to determine >> the >> > >> downgrade process (generating new snapshot, propagating the snapshot, >> > etc) >> > >> has completed. We could block the UpdateFeature request until the >> > process >> > >> is completed. However, since the process could take time, the request >> > could >> > >> time out. Another way is through DescribeFeature and the server only >> > >> reports downgraded versions after the process is completed. >> > >> >> > >> 12. Since we are changing UpdateFeaturesRequest, do we need to change >> > the >> > >> AdminClient api for updateFeatures too? >> > >> >> > >> 13. For the paragraph starting with "In the absence of an operator >> > >> defined value for metadata.version", in KIP-584, we described how to >> > >> finalize features with New cluster bootstrap. In that case, it's >> > >> inconvenient for the users to have to run an admin tool to finalize >> the >> > >> version for each feature. Instead, the system detects that the >> /features >> > >> path is missing in ZK and thus automatically finalizes every feature >> > with >> > >> the latest supported version. Could we do something similar in the >> KRaft >> > >> mode? >> > >> >> > >> 14. After the quorum leader generates a new snapshot, how do we force >> > >> other nodes to pick up the new snapshot? >> > >> >> > >> 15. I agree with Jose that it will be useful to describe when >> > generating a >> > >> new snapshot is needed. To me, it seems the new snapshot is only >> needed >> > >> when incompatible changes are made. >> > >> >> > >> 7. Jose, what control records were you referring? >> > >> >> > >> Thanks, >> > >> >> > >> Jun >> > >> >> > >> >> > >> On Tue, Oct 5, 2021 at 8:53 AM David Arthur <davidart...@apache.org> >> > >> wrote: >> > >> >> > >>> Jose, thanks for the thorough review and comments! >> > >>> >> > >>> I am out of the office until next week, so I probably won't be able >> to >> > >>> update the KIP until then. Here are some replies to your questions: >> > >>> >> > >>> 1. Generate snapshot on upgrade >> > >>> > > Metadata snapshot is generated and sent to the other nodes >> > >>> > Why does the Active Controller need to generate a new snapshot and >> > >>> > force a snapshot fetch from the replicas (inactive controller and >> > >>> > brokers) on an upgrade? Isn't writing the FeatureLevelRecord good >> > >>> > enough to communicate the upgrade to the replicas? >> > >>> >> > >>> >> > >>> You're right, we don't necessarily need to _transmit_ a snapshot, >> since >> > >>> each node can generate its own equivalent snapshot >> > >>> >> > >>> 2. Generate snapshot on downgrade >> > >>> > > Metadata snapshot is generated and sent to the other inactive >> > >>> > controllers and to brokers (this snapshot may be lossy!) >> > >>> > Why do we need to send this downgraded snapshot to the brokers? The >> > >>> > replicas have seen the FeatureLevelRecord and noticed the >> downgrade. >> > >>> > Can we have the replicas each independently generate a downgraded >> > >>> > snapshot at the offset for the downgraded FeatureLevelRecord? I >> > assume >> > >>> > that the active controller will guarantee that all records after >> the >> > >>> > FatureLevelRecord use the downgraded version. If so, it would be >> good >> > >>> > to mention that explicitly. >> > >>> >> > >>> >> > >>> Similar to above, yes a broker that detects a downgrade via >> > >>> FeatureLevelRecord could generate its own downgrade snapshot and >> reload >> > >>> its >> > >>> state from that. This does get a little fuzzy when we consider cases >> > where >> > >>> brokers are on different software versions and could be generating a >> > >>> downgrade snapshot for version X, but using different versions of the >> > >>> code. >> > >>> It might be safer to let the controller generate the snapshot so each >> > >>> broker (regardless of software version) gets the same records. >> However, >> > >>> for >> > >>> upgrades (or downgrades) we expect the whole cluster to be running >> the >> > >>> same >> > >>> software version before triggering the metadata.version change, so >> > perhaps >> > >>> this isn't a likely scenario. Thoughts? >> > >>> >> > >>> >> > >>> 3. Max metadata version >> > >>> > >For the first release that supports metadata.version, we can >> simply >> > >>> > initialize metadata.version with the current (and only) version. >> For >> > >>> future >> > >>> > releases, we will need a mechanism to bootstrap a particular >> version. >> > >>> This >> > >>> > could be done using the meta.properties file or some similar >> > mechanism. >> > >>> The >> > >>> > reason we need the allow for a specific initial version is to >> support >> > >>> the >> > >>> > use case of starting a Kafka cluster at version X with an older >> > >>> > metadata.version. >> > >>> >> > >>> >> > >>> I assume that the Active Controller will learn the metadata version >> of >> > >>> > the broker through the BrokerRegistrationRequest. How will the >> Active >> > >>> > Controller learn about the max metadata version of the inactive >> > >>> > controller nodes? We currently don't send a registration request >> from >> > >>> > the inactive controller to the active controller. >> > >>> >> > >>> >> > >>> This came up during the design, but I neglected to add it to the KIP. >> > We >> > >>> will need a mechanism for determining the supported features of each >> > >>> controller similar to how brokers use BrokerRegistrationRequest. >> > Perhaps >> > >>> controllers could write a FeatureLevelRecord (or similar) to the >> > metadata >> > >>> log indicating their supported version. WDYT? >> > >>> >> > >>> Why do you need to bootstrap a particular version? Isn't the intent >> > >>> > that the broker will learn the active metadata version by reading >> the >> > >>> > metadata before unfencing? >> > >>> >> > >>> >> > >>> This bootstrapping is needed for when a KRaft cluster is first >> > started. If >> > >>> we don't have this mechanism, the cluster can't really do anything >> > until >> > >>> the operator finalizes the metadata.version with the tool. The >> > >>> bootstrapping will be done by the controller and the brokers will see >> > this >> > >>> version as a record (like you say). I'll add some text to clarify >> this. >> > >>> >> > >>> >> > >>> 4. Reject Registration - This is related to the bullet point above. >> > >>> > What will be the behavior of the active controller if the broker >> > sends >> > >>> > a metadata version that is not compatible with the cluster wide >> > >>> > metadata version? >> > >>> >> > >>> >> > >>> If a broker starts up with a lower supported version range than the >> > >>> current >> > >>> cluster metadata.version, it should log an error and shutdown. This >> is >> > in >> > >>> line with KIP-584. >> > >>> >> > >>> 5. Discover upgrade >> > >>> > > This snapshot will be a convenient way to let broker and >> controller >> > >>> > components rebuild their entire in-memory state following an >> upgrade. >> > >>> > Can we rely on the presence of the FeatureLevelRecord for the >> > metadata >> > >>> > version for this functionality? If so, it avoids having to reload >> the >> > >>> > snapshot. >> > >>> >> > >>> >> > >>> For upgrades, yes probably since we won't need to "rewrite" any >> > records in >> > >>> this case. For downgrades, we will need to generate the snapshot and >> > >>> reload >> > >>> everything. >> > >>> >> > >>> 6. Metadata version specification >> > >>> > > V4(version=4, isBackwardsCompatible=false, description="New >> > metadata >> > >>> > record type Bar"), >> > >>> >> > >>> >> > >>> Very cool. Do you have plans to generate Apache Kafka HTML >> > >>> > documentation for this information? Would be helpful to display >> this >> > >>> > information to the user using the kafka-features.sh and feature >> RPC? >> > >>> >> > >>> >> > >>> Hm good idea :) I'll add a brief section on documentation. This would >> > >>> certainly be very useful >> > >>> >> > >>> 7.Downgrade records >> > >>> > I think we should explicitly mention that the downgrade process >> will >> > >>> > downgrade both metadata records and controller records. In KIP-630 >> we >> > >>> > introduced two control records for snapshots. >> > >>> >> > >>> >> > >>> Yes, good call. Let me re-read that KIP and include some details. >> > >>> >> > >>> Thanks again for the comments! >> > >>> -David >> > >>> >> > >>> >> > >>> On Wed, Sep 29, 2021 at 5:09 PM José Armando García Sancio >> > >>> <jsan...@confluent.io.invalid> wrote: >> > >>> >> > >>> > One more comment. >> > >>> > >> > >>> > 7.Downgrade records >> > >>> > I think we should explicitly mention that the downgrade process >> will >> > >>> > downgrade both metadata records and controller records. In KIP-630 >> we >> > >>> > introduced two control records for snapshots. >> > >>> > >> > >>> >> > >> >> > >> > > > -- > -David