Sergey, > From the code complexity perspective I'm trying to design the feature in > such a way that all maintenance code is as encapsulated as possible and > avoids massive interventions into main workflows of components.
Could please briefly tell what means do you use to achieve encapsulation? Are Discovery, Communication, Checkpointer and other components started in a maintenance mode in current design? 2020-09-21 15:19 GMT+03:00, Nikolay Izhikov <nizhi...@apache.org>: > Hello, Sergey. > >> At the moment I'm aware about two use cases for this feature: corrupted >> PDS cleanup and defragmentation. > > AFAIKU There is third use-case for this mode. > > Change encryption master key in case node was down during cluster master key > change. > In this case, node can’t join to the cluster, because it’s master key > differs from the cluster. > To recover node Ignite should locally change master key before join. > > Please, take a look into source code [1] > > [1] > https://github.com/apache/ignite/blob/master/modules/core/src/main/java/org/apache/ignite/internal/managers/encryption/GridEncryptionManager.java#L710 > >> 21 сент. 2020 г., в 14:37, Sergey Chugunov <sergey.chugu...@gmail.com> >> написал(а): >> >> Ivan, >> >> Sorry for some confusion, MM indeed is not a normal mode. What I was >> trying >> to say is that when in MM node still starts and allows the user to >> perform >> actions with it like sending commands via control utility/JMX APIs or >> reading metrics. >> >> This is the key point: although the node is not in the cluster but it is >> still alive can be monitored and supports management to do maintenance. >> >> From the code complexity perspective I'm trying to design the feature in >> such a way that all maintenance code is as encapsulated as possible and >> avoids massive interventions into main workflows of components. >> At the moment I'm aware about two use cases for this feature: corrupted >> PDS >> cleanup and defragmentation. As far as I know it won't bring too much >> complexity in both cases. >> >> I cannot say for other components but I believe it will be possible to >> integrate MM feature into their workflow as well with reasonable amount >> of >> refactoring. >> >> Does it make sense to you? >> >> On Sun, Sep 6, 2020 at 8:08 AM Ivan Pavlukhin <vololo...@gmail.com> >> wrote: >> >>> Sergey, >>> >>> Thank you for your answer! >>> >>> Might be I am looking at the subject from a different angle. >>> >>>> I think of a node in MM as an almost normal one >>> I cannot think of such a mode as a normal one, because it apparently >>> does not perform usual cluster node functions. It is not a part of a >>> cluster, caches data is not available, Discovery and Communication are >>> not needed. >>> >>> I fear that with "node started in a special mode" approach we will get >>> an additional flag in the code making the code more complex and >>> fragile. Should not I worry about it? >>> >>> 2020-09-02 10:45 GMT+03:00, Sergey Chugunov <sergey.chugu...@gmail.com>: >>>> Vladislav, Ivan, >>>> >>>> Thank you for your questions and suggestions. Let me answer them. >>>> >>>> Vladislav, >>>> >>>> If I understood you correctly, you're talking about a node performing >>> some >>>> automatic actions to fix the problem and then join the cluster as >>>> usual. >>>> >>>> However the original ticket [1] where we faced the need for Maintenance >>>> Mode is about exactly the opposite: avoid doing automatic actions and >>> give >>>> a user the ability to decide what to do. >>>> >>>> Also the idea of Maintenance Mode is that the node is able to accept >>>> commands, expose metrics and so on, thus we need all components to be >>>> initialized (some of them may be partially initialized due to their own >>>> maintenance). >>>> To achieve that we need to go through a full cycle of node >>>> initialization >>>> including discovery initialization. When discovery is initialized (in >>>> special isolated mode) I don't think it is easy to switch back to >>>> normal >>>> operations without a restart. >>>> >>>> Ivan, >>>> >>>> I think of a node in MM as an almost normal one (maybe with some >>> components >>>> skipped some steps of their initialization). Commands are accepted, >>>> appropriate metrics are exposed e.g. through JMX API and so on. >>>> >>>> So as I see it we'll have special commands for control.{sh|bat} CLI >>>> allowing user to see reasons why node switched to maintenance mode >>>> and/or >>>> trigger actions to fix the problem (I'm still thinking about proper >>> design >>>> of these actions though). >>>> >>>> Of course the user should also be able to fix the problem manually e.g. >>> by >>>> manually deleting corrupted PDS files when node is down. Ideally >>>> Maintenance Mode should be smart enough to figure that out and switch >>>> to >>>> normal operations without a restart but I'm not sure if it is possible >>>> without invasive changes of our components' lifecycle. >>>> So I believe this model (node truly started in Maintenance Mode and new >>>> commands in control.{sh|bat}) is a good fit for our current APIs and >>>> ways >>>> to interact with the node. >>>> >>>> Does it sound reasonable to you? >>>> >>>> Thank you! >>>> >>>> [1] https://issues.apache.org/jira/browse/IGNITE-13366 >>>> >>>> On Tue, Sep 1, 2020 at 2:07 PM Ivan Pavlukhin <vololo...@gmail.com> >>> wrote: >>>> >>>>> Sergey, >>>>> >>>>> Actually, I missed the point that the discussed mode affects a single >>>>> node but not a whole cluster. Perhaps I mixed terms "mode" and >>>>> "state". >>>>> >>>>> My next thoughts about maintenance routines are about special >>>>> utilities. As far as I remember MySQL provides a bunch of scripts for >>>>> various maintenance purposes. What user interface for maintenance >>>>> tasks execution is assumed? And what do we mean by "starting" a node >>>>> in a maintenance mode? Can we do some routines without "starting" >>>>> (e.g. try to recover PDS or cleanup)? >>>>> >>>>> 2020-08-31 23:41 GMT+03:00, Vladislav Pyatkov <vldpyat...@gmail.com>: >>>>>> Hi Sergey. >>>>>> >>>>>> As I understand any switching from/to MM possible only through manual >>>>>> restart a node. >>>>>> But in your example that look like a technical actions, that only >>>>> possible >>>>>> in the case. >>>>>> Do you plan to provide a possibility for client where he can make a >>>>>> decision without a manual intervention? >>>>>> >>>>>> For example: Start node and manually agree with an option and after >>>>>> automatically resolve conflict and back to topology as a stable node. >>>>>> >>>>>> On Mon, Aug 31, 2020 at 5:41 PM Sergey Chugunov < >>>>> sergey.chugu...@gmail.com> >>>>>> wrote: >>>>>> >>>>>>> Hello Ivan, >>>>>>> >>>>>>> Thank you for raising the good question, I didn't think of >>> Maintenance >>>>>>> Mode >>>>>>> from that perspective. >>>>>>> >>>>>>> In short, Maintenance Mode isn't related to Cluster States concept. >>>>>>> According to javadoc documentation of ClusterState enum [1] it is >>>>>>> solely >>>>>>> about cache operations and to some extent doesn't affect other >>>>> components >>>>>>> of Ignite node. >>>>>>> From APIs perspective putting the methods to manage Cluster State to >>>>>>> IgniteCluster interface doesn't look ideal to me but it is as it is. >>>>>>> >>>>>>> On the other hand Maintenance Mode as I see it will be managed >>> through >>>>>>> different APIs than a ClusterState and this difference definitely >>> will >>>>> be >>>>>>> reflected in the documentation of the feature. >>>>>>> >>>>>>> Ignite node is a complex piece of many components interacting with >>>>>>> each >>>>>>> other, they may have different lifecycles and states; states of >>>>> different >>>>>>> components cannot be reduced to the lowest common denominator. >>>>>>> >>>>>>> However if you have an idea of how to call the feature better to let >>>>>>> the >>>>>>> user easier distinguish it from other similar features please share >>> it >>>>>>> with >>>>>>> us. Personally I'm very welcome to any suggestions that make design >>>>>>> more >>>>>>> intuitive and easy-to-use. >>>>>>> >>>>>>> Thanks! >>>>>>> >>>>>>> [1] >>>>>>> >>>>>>> >>>>> >>> https://github.com/apache/ignite/blob/master/modules/core/src/main/java/org/apache/ignite/cluster/ClusterState.java >>>>>>> >>>>>>> On Mon, Aug 31, 2020 at 12:32 PM Ivan Pavlukhin <vololo...@gmail.com >>>> >>>>>>> wrote: >>>>>>> >>>>>>>> Hi Sergey, >>>>>>>> >>>>>>>> Thank you for bringing attention to that important subject! >>>>>>>> >>>>>>>> My note here is about one more cluster mode. As far as I know >>>>>>>> currently we already have 3 modes (inactive, read-only, read-write) >>>>>>>> and the subject is about one more. From the first glance it could >>> be >>>>>>>> hard for a user to understand and use all modes properly. Do we >>>>>>>> really >>>>>>>> need all spectrum? Could we simplify things somehow? >>>>>>>> >>>>>>>> 2020-08-27 15:59 GMT+03:00, Sergey Chugunov >>>>>>>> <sergey.chugu...@gmail.com>: >>>>>>>>> Hello Nikolay, >>>>>>>>> >>>>>>>>> Created one, available by link [1] >>>>>>>>> >>>>>>>>> Initially there was an intention to develop it under IEP-47 [2] >>>>>>>>> and >>>>>>> there >>>>>>>>> is even a separate section for Maintenance Mode there. >>>>>>>>> But it looks like this feature is useful in more cases and >>>>>>>>> deserves >>>>>>>>> its >>>>>>>> own >>>>>>>>> IEP. >>>>>>>>> >>>>>>>>> [1] >>>>>>>>> >>>>>>>> >>>>>>> >>>>> >>> https://cwiki.apache.org/confluence/display/IGNITE/IEP-53%3A+Maintenance+Mode >>>>>>>>> [2] >>>>>>>>> >>>>>>>> >>>>>>> >>>>> >>> https://cwiki.apache.org/confluence/display/IGNITE/IEP-47:+Native+persistence+defragmentation >>>>>>>>> >>>>>>>>> On Thu, Aug 27, 2020 at 11:01 AM Nikolay Izhikov >>>>>>>>> <nizhi...@apache.org> >>>>>>>>> wrote: >>>>>>>>> >>>>>>>>>> Hello, Sergey! >>>>>>>>>> >>>>>>>>>> Thanks for the proposal. >>>>>>>>>> Let’s have IEP for this feature. >>>>>>>>>> >>>>>>>>>>> 27 авг. 2020 г., в 10:25, Sergey Chugunov < >>>>>>> sergey.chugu...@gmail.com> >>>>>>>>>> написал(а): >>>>>>>>>>> >>>>>>>>>>> Hello Igniters, >>>>>>>>>>> >>>>>>>>>>> I want to start a discussion about new supporting feature that >>>>>>>>>>> could >>>>>>>> be >>>>>>>>>>> very useful in many scenarios where persistent storage is >>>>>>>>>>> involved: >>>>>>>>>>> Maintenance Mode. >>>>>>>>>>> >>>>>>>>>>> *Summary* >>>>>>>>>>> Maintenance Mode (MM for short) is a special state of Ignite >>>>>>>>>>> node >>>>>>> when >>>>>>>>>> node >>>>>>>>>>> doesn't serve user requests nor joins the cluster but waits >>> for >>>>>>>>>>> user >>>>>>>>>>> commands or performs automatic actions for maintenance >>>>>>>>>>> purposes. >>>>>>>>>>> >>>>>>>>>>> *Motivation* >>>>>>>>>>> There are situations when node cannot participate in regular >>>>>>>> operations >>>>>>>>>> but >>>>>>>>>>> at the same time should not be shut down. >>>>>>>>>>> >>>>>>>>>>> One example is a ticket [1] where I developed the first draft >>>>>>>>>>> of >>>>>>>>>>> Maintenance Mode. >>>>>>>>>>> Here we get into a situation when node has potentially >>>>>>>>>>> corrupted >>>>>>>>>>> PDS >>>>>>>>>>> thus >>>>>>>>>>> cannot proceed with restore routine and join the cluster as >>>>> usual. >>>>>>>>>>> At the same time node should not fail nor be stopped for >>> manual >>>>>>>>>>> cleanup. >>>>>>>>>>> Manual cleanup is not always an option (e.g. restricted access >>>>>>>>>>> to >>>>>>> file >>>>>>>>>>> system); in managed environments failed node will be restarted >>>>>>>>>>> automatically so user won't have time for performing necessary >>>>>>>>>> operations. >>>>>>>>>>> Thus node needs to function in a special mode allowing user to >>>>>>> connect >>>>>>>>>>> to >>>>>>>>>>> it and perform necessary actions. >>>>>>>>>>> >>>>>>>>>>> Another example is described in IEP-47 [2] where >>>>>>>>>>> defragmentation >>>>>>>>>>> is >>>>>>>>>>> being >>>>>>>>>>> developed. Node defragmenting its PDS should not join the >>>>>>>>>>> cluster >>>>>>>> until >>>>>>>>>> the >>>>>>>>>>> process is finished so it needs to enter Maintenance Mode as >>>>> well. >>>>>>>>>>> >>>>>>>>>>> *Suggested design* >>>>>>>>>>> I suggest MM to work as follows: >>>>>>>>>>> 1. Node enters MM if special markers are found on disk. These >>>>>>> markers >>>>>>>>>>> called Maintenance Records could be created automatically >>> (e.g. >>>>>>>>>>> when >>>>>>>>>>> storage component detects corrupted storage) or by user >>> request >>>>>>> (when >>>>>>>>>> user >>>>>>>>>>> requests defragmentation of some caches). So entering MM >>>>>>>>>>> requires >>>>>>> node >>>>>>>>>>> restart. >>>>>>>>>>> 2. Started in MM node doesn't join the cluster but finishes >>>>>>>>>>> startup >>>>>>>>>> routine >>>>>>>>>>> so it is able to receive commands and provide metrics to the >>>>> user. >>>>>>>>>>> 3. When all necessary maintenance operations are finished, >>>>>>> Maintenance >>>>>>>>>>> Records for these operations are deleted from disk and node >>>>>>> restarted >>>>>>>>>> again >>>>>>>>>>> to enter normal service. >>>>>>>>>>> >>>>>>>>>>> *Example* >>>>>>>>>>> To put it into a context let's consider an example of how I >>> see >>>>>>>>>>> the >>>>>>> MM >>>>>>>>>>> workflow in case of PDS corruption. >>>>>>>>>>> >>>>>>>>>>> 1. Node has failed in the middle of checkpoint when WAL is >>>>>>> disabled >>>>>>>>>>> for >>>>>>>>>>> a particular cache -> data files of the cache are >>> potentially >>>>>>>>>> corrupted. >>>>>>>>>>> 2. On next startup node detects this situation, creates >>>>>>> Maintenance >>>>>>>>>>> Record on disk and shuts down. >>>>>>>>>>> 3. On next startup node sees Maintenance Record, enters >>>>>>> Maintenance >>>>>>>>>> Mode >>>>>>>>>>> and waits for user to do specific actions: clean potentially >>>>>>>>>>> corrupted >>>>>>>>>> PDS. >>>>>>>>>>> 4. When user has done necessary actions he/she removes >>>>>>>>>>> Maintenance >>>>>>>>>>> Record using Maintenance Mode API exposed via >>>>>>>>>>> control.{sh|bat} >>>>>>>> script >>>>>>>>>> or >>>>>>>>>>> JMX. >>>>>>>>>>> 5. On next startup node goes to normal operations as >>>>> maintenance >>>>>>>>>>> reason >>>>>>>>>>> is fixed. >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> I prepared a PR [3] for ticket [1] with draft implementation. >>>>>>>>>>> It >>>>>>>>>>> is >>>>>>>> not >>>>>>>>>>> ready to be merged to master branch but is already fully >>>>>>>>>>> functional >>>>>>>> and >>>>>>>>>> can >>>>>>>>>>> be reviewed. >>>>>>>>>>> >>>>>>>>>>> Hope you'll share your feedback on the feature and/or any >>>>> thoughts >>>>>>> on >>>>>>>>>>> implementation. >>>>>>>>>>> >>>>>>>>>>> Thank you! >>>>>>>>>>> >>>>>>>>>>> [1] https://issues.apache.org/jira/browse/IGNITE-13366 >>>>>>>>>>> [2] >>>>>>>>>>> >>>>>>>>>> >>>>>>>> >>>>>>> >>>>> >>> https://cwiki.apache.org/confluence/display/IGNITE/IEP-47:+Native+persistence+defragmentation >>>>>>>>>>> [3] https://github.com/apache/ignite/pull/8189 >>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> >>>>>>>> Best regards, >>>>>>>> Ivan Pavlukhin >>>>>>>> >>>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> Vladislav Pyatkov >>>>>> >>>>> >>>>> >>>>> -- >>>>> >>>>> Best regards, >>>>> Ivan Pavlukhin >>>>> >>>> >>> >>> >>> -- >>> >>> Best regards, >>> Ivan Pavlukhin >>> > > -- Best regards, Ivan Pavlukhin