Hello, Maxim.

Great to see such an important feature in Ignite!
Please, let me know if you need any help with review.

> 7 апр. 2020 г., в 22:10, Maxim Muzafarov <maxmu...@gmail.com> написал(а):
> 
> Igniters,
> 
> 
> I'd like to back to the discussion of a snapshot operation for Apache
> Ignite for persistence cache groups and I propose my changes below. I
> have prepared everything so that the discussion is as meaningful and
> specific as much as possible:
> 
> - IEP-43: Cluster snapshot [1]
> - The Jira task IGNITE-11073 [2]
> - PR with described changes, Patch Available [4]
> 
> Changes are ready for review.
> 
> 
> Here are a few implementation details and my thoughts:
> 
> 1. Snapshot restore assumed to be manual at the first step. The
> process will be described on our documentation pages, but it is
> possible to start node right from the snapshot directory since the
> directory structure is preserved (check
> `testConsistentClusterSnapshotUnderLoad` in the PR). We also have some
> options here about how the restore process must look like:
> - fully manual snapshot restore (will be documented)
> - ansible or shell scripts for restore
> - Java API for restore (I doubt we should go this way).
> 
> 3. The snapshot `create` procedure creates a snapshot of all
> persistent caches available on the cluster (see limitations [1]).
> 
> 2. The snapshot `create` procedure is available through Java API and
> JMX (control.sh may be implemented further).
> 
> Java API:
> IgniteFuture<Void> fut = ignite.snapshot()
> .createSnapshot(name);
> 
> JMX:
> SnapshotMXBean mxBean = getMBean(ignite.name());
> mxBean.createSnapshot(name);
> 
> 3. The Distribute Process [3] is used to perform a cluster-wide
> snapshot procedure, so we've avoided a lot of boilerplate code here.
> 
> 4. The design document [1] contains also an internal API for creating
> a consistent local snapshot of requested cache groups and transfer it
> to another node using the FileTransmission protocol [6]. This is one
> of the parts of IEP-28 [5] for cluster rebalancing via partition files
> and an important part for understanding the whole design.
> 
> Java API:
> public IgniteInternalFuture<Void> createRemoteSnapshot(
>    UUID rmtNodeId,
>    Map<Integer, Set<Integer>> parts,
>    BiConsumer<File, GroupPartitionId> partConsumer);
> 
> 
> Please, share your thoughts and take a loot at my changes [4].
> 
> 
> [1] 
> https://cwiki.apache.org/confluence/display/IGNITE/IEP-43%3A+Cluster+snapshots
> [2] https://issues.apache.org/jira/browse/IGNITE-11073
> [3] 
> https://github.com/apache/ignite/blob/master/modules/core/src/main/java/org/apache/ignite/internal/util/distributed/DistributedProcess.java#L49
> [4] https://github.com/apache/ignite/pull/7607
> [5] 
> https://cwiki.apache.org/confluence/display/IGNITE/IEP-28%3A+Cluster+peer-2-peer+balancing#IEP-28:Clusterpeer-2-peerbalancing-Filetransferbetweennodes
> [6] 
> https://github.com/apache/ignite/blob/master/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/TransmissionHandler.java#L42
> 
> 
> On Thu, 28 Feb 2019 at 14:43, Dmitriy Pavlov <dpav...@apache.org> wrote:
>> 
>> Hi Maxim,
>> 
>> I agree with Denis and I have just one concern here.
>> 
>> Apache Ignite has quite a long story (started even before Apache), and now
>> it has a way too huge number of features. Some of these features
>> - are developed and well known by community members,
>> - some of them were contributed a long time ago and nobody develops it,
>> - and, actually, in some rare cases, nobody in the community knows how it
>> works and how to change it.
>> 
>> Such features may attract users, but a bug in it may ruin impression about
>> the product. Even worse, nobody can help to solve it, and only user himself
>> or herself may be encouraged to contribute a fix.
>> 
>> And my concern here, such a big feature should have a number of interested
>> contributors, who can support it in case if others lost interest. I will be
>> happy if 3-5 members will come and say, yes, I will do a review/I will help
>> with further changes.
>> 
>> Just to be clear, I'm not against it, and I'll never cast -1 for it, but it
>> would be more comfortable to develop this feature with understanding that
>> this work will not be useless.
>> 
>> Sincerely,
>> Dmitriy Pavlov
>> 
>> ср, 27 февр. 2019 г. в 23:36, Denis Magda <dma...@apache.org>:
>> 
>>> Maxim,
>>> 
>>> GridGain has this exact feature available for Ignite native persistence
>>> deployments. It's not as easy as it might have been seen from the
>>> enablement perspective. Took us many years to make it production ready,
>>> involving many engineers. If the rest of the community wants to create
>>> something similar and available in open source then please take this
>>> estimate into consideration.
>>> 
>>> -
>>> Denis
>>> 
>>> 
>>> On Wed, Feb 27, 2019 at 8:53 AM Maxim Muzafarov <maxmu...@gmail.com>
>>> wrote:
>>> 
>>>> Igniters,
>>>> 
>>>> Some of the stores with which the Apache Ignite is often compared has
>>>> a feature called Snapshots [1] [2]. This feature provides an
>>>> eventually consistent view on stored data for different purposes (e.g.
>>>> moving data between environments, saving a backup of data for the
>>>> further restore procedure and so on). The Apache Ignite has all
>>>> opportunities and machinery to provide cache and\or data region
>>>> snapshots out of the box but still don't have them.
>>>> 
>>>> This issue derives from IEP-28 [5] on which I'm currently working on
>>>> (partially described in the section [6]). I would like to solve this
>>>> issue too and make Apache Ignite more attractive to use on a
>>>> production environment. I've haven't investigated in-memory type
>>>> caches yet, but for caches with enabled persistence, we can do it
>>>> without any performance impact on cache operations (some additional IO
>>>> operations are needed to copy cache data to backup store, copy on
>>>> write technique is used here). We just need to use our DiscoverySpi,
>>>> PME and Checkpointer process the right way.
>>>> 
>>>> For the first step, we can store all backup data on each of cache
>>>> affinity node locally. For instance, the `backup\snapshotId\cache0`
>>>> folder will be created and all `cache0` partitions will be stored
>>>> there for each local node for the snapshot process with id
>>>> `snapshotId`. In future, we can teach nodes to upload snapshotted
>>>> partitions to the one remote node or cloud.
>>>> 
>>>> --
>>>> 
>>>> High-level process overview
>>>> 
>>>> A new snapshot process is managed via DiscoverySpi and
>>>> CommunicationSpi messages.
>>>> 
>>>> 1. The initiator sends a request to the cluster (DiscoveryMessage).
>>>> 2. When the node receives a message it initiates PME.
>>>> 3. The node begins checkpoint process (holding write lock a short time)
>>>> 4. The node starts to track any write attempts to the snapshotting
>>>> partition and places the copy of original pages to the temp file.
>>>> 5. The node performs merge the partition file with the corresponding
>>> delta.
>>>> 6. When the node finishes the backup process it sends ack message with
>>>> saved partitions to the initiator (or the error response).
>>>> 7. When all ack messages received the backup is finished.
>>>> 
>>>> The only problem here is that when the request message arrives at the
>>>> particular node during running checkpoint PME will be locked until it
>>>> ends. This is not good. But hopefully, it will be fixed here [4].
>>>> 
>>>> --
>>>> 
>>>> Probable API
>>>> 
>>>> From the cache perspective:
>>>> 
>>>> IgniteFuture<IgniteSnapshot> snapshotFut =
>>>>    ignite.cache("default")
>>>>        .shapshotter()
>>>>        .create("myShapshotId");
>>>> 
>>>> IgniteSnapshot cacheSnapshot = snapshotFut.get();
>>>> 
>>>> IgniteCache<K, V> copiedCache =
>>>>    ignite.createCache("CopyCache")
>>>>        .withConfiguration(defaultCache.getConfiguration())
>>>>        .loadFromSnapshot(cacheSnapshot.id());
>>>> 
>>>> From the command line perspective:
>>>> 
>>>> control.sh --snapshot take cache0,cache1,cache2
>>>> 
>>>> --
>>>> 
>>>> WDYT?
>>>> Will it be a useful feature for the Apache Ignite?
>>>> 
>>>> 
>>>> [1]
>>>> 
>>> https://geode.apache.org/docs/guide/10/managing/cache_snapshots/chapter_overview.html
>>>> [2]
>>>> 
>>> https://docs.datastax.com/en/cassandra/3.0/cassandra/operations/opsBackupTakesSnapshot.html
>>>> [3]
>>>> 
>>> http://apache-ignite-developers.2346864.n4.nabble.com/Data-Snapshots-in-Ignite-td4183.html
>>>> [4] https://issues.apache.org/jira/browse/IGNITE-10508
>>>> [5]
>>>> 
>>> https://cwiki.apache.org/confluence/display/IGNITE/IEP-28%3A+Cluster+peer-2-peer+balancing
>>>> [6]
>>>> 
>>> https://cwiki.apache.org/confluence/display/IGNITE/IEP-28%3A+Cluster+peer-2-peer+balancing#IEP-28:Clusterpeer-2-peerbalancing-Checkpointer
>>>> 
>>> 

Reply via email to