[ https://issues.apache.org/jira/browse/IGNITE-24556?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17936490#comment-17936490 ]
Mikhail Efremov edited comment on IGNITE-24556 at 3/18/25 2:22 PM: ------------------------------------------------------------------- During the colocation track (IGNITE-22115) a question about in-memory feature intergration was emerged. So we have to figure out how to do this and what technical decisions should be done about creation of 3 types of storages: # table storages that are storing user data and snapshots; # RAFT storages that are storing RAFT-related information like RAFT-log; # transactions states storages. At the moment before the colocation there was created only one table-partition replication group with all 3 types of storages per table. After the colocation we should have one zone-partition replication group with one RAFT node and its storage per zone, one transactions states storage per zone and N table storages per table in the zone. Also we should consider that transactions states storage is presented as *persistent only*. This solution was done because a transaction may works across both volatile and persistent table set. Thus, before the colocation {{isVolatile}} flag belongs to table and the whole its replication group, but after IGNITE-22115 we should have a rule how to enable or disable the flag per zone with mix of persistent and in-memory storages. Mostly, the question is related to RAFT storages: tables' ones depend on storage profile from table creation statement. Certain storage profile triggers certain storage engine to create a certain instance of table storage. The {{isVolatile}} flag affects only on RAFT storage. Previously, {{isVolatile}} flag was taken from internal table implementation and is passed to RAFT group starting method. So we could start set of storages with in-memory per table individually. During colocation we should find a rule that maintains that previous behavior for in-memory tables or/and partially breaks compatibility. Besides we should consider the follow current in-memory implementation issues: # one out of three state (transactions states storage) is persistent only that degrades exected performance benefit of in-memory mode that looks counterintuitive; # as before the colocation as after after a node restart we may lose user data if a snapshot of a volatile table storeage and volatile RAFT log comaction were made before, because the snapshot is used for recovery and in volatile case we doesn't save the snapshot on a disk. The second issue can not be solved through a combination of persistent RAFT storage with volatile table storage, moreover we may consider that in-memory approach assumes data lost due to nodes or a cluster restarts. Nevetheless we should take into the account that in-memory performance always will be resticted from the top by persistent transactions states storages. All in all we may have three possible solutions: || || all volitile || mix || all persistent || | TxState | P | P | P | | Raft | V | ? | P | | MvPartition | V | ? | P | # For a zone with any persistent storage we consider {{isVolatile}} as {{false}} and iif all zone's storages are volatile then {{isVolatile}} is {{true}}. Only in the last case we create both volatile RAFT and table storages. Otherwise we create persistent RAFT storage and a table storage depends on its storage profile. #* Pros: #** Clear approach that preserves previous in-memory logic as expected from user's point of view (volatile storages both table and RAFT are created only with explicit usage of in-memory mode. #** Top possible performance (restricted by transactions states storages). #* Cons: #** Demands a new restrictions on a zone alterations that deny an alteration that is trying to add a persistent profile to a zone that originally was created with volatile-only storage profiles. #** User data may be lost, but this behavior may be consdered as expected. # For a zone with any volatile storage we consider {{isVolatile}} as {{true}} and will start volatile RAFT storage in this case #* Cons: #** User may loses data with expected persistent behavior for petsistent profile tables in such volatile zone. #** Performance is still restricted by transactions states storage. # Always consider {{isVolatile}} as {{false}} until all issues related to in-memory track will be fixed. After discussions there was a chosen solution from p.1. This means that: # IGNITE-22391 should be closed because there nothing to do, because replicas will use: #* Persistent only transactional state storage. #* RAFT storage depends on {{isVolatile}} flag is discussed above. #* Table storage in table processors that are created and loaded to a zone-replica in {{TableManager}} depends on storage profile during a table creation. # IGNITE-24371 should be updated with the decision above. # IGNITE-24828 is created for new restrictions on a zone alteration implementation. # IGNITE-24829 is created for a documentation for p.3 changes. was (Author: JIRAUSER303791): During the colocation track (IGNITE-22115) a question about in-memory feature intergration was emerged. So we have to figure out how to do this and what technical decisions should be done about creation of 3 types of storages: # table storages that are storing user data and snapshots; # RAFT storages that are storing RAFT-related information like RAFT-log; # transactions states storages. At the moment before the colocation there was created only one table-partition replication group with all 3 types of storages per table. After the colocation we should have one zone-partition replication group with one RAFT node and its storage per zone, one transactions states storage per zone and N table storages per table in the zone. Also we should consider that transactions states storage is presented as *persistent only*. This solution was done because a transaction may works across both volatile and persistent table set. Thus, before the colocation {{isVolatile}} flag belongs to table and the whole its replication group, but after IGNITE-22115 we should have a rule how to enable or disable the flag per zone with mix of persistent and in-memory storages. Mostly, the question is related to RAFT storages: tables' ones depend on storage profile from table creation statement. Certain storage profile triggers certain storage engine to create a certain instance of table storage. The {{isVolatile}} flag affects only on RAFT storage. Previously, {{isVolatile}} flag was taken from internal table implementation and is passed to RAFT group starting method. So we could start set of storages with in-memory per table individually. During colocation we should find a rule that maintains that previous behavior for in-memory tables or/and partially breaks compatibility. Besides we should consider the follow current in-memory implementation issues: # one out of three state (transactions states storage) is persistent only that degrades exected performance benefit of in-memory mode that looks counterintuitive; # as before the colocation as after after a node restart we may lose user data if a snapshot of a volatile table storeage and volatile RAFT log comaction were made before, because the snapshot is used for recovery and in volatile case we doesn't save the snapshot on a disk. The second issue can not be solved through a combination of persistent RAFT storage with volatile table storage, moreover we may consider that in-memory approach assumes data lost due to nodes or a cluster restarts. Nevetheless we should take into the account that in-memory performance always will be resticted from the top by persistent transactions states storages. All in all we may have three possible solutions: || || all volitile || mix || all persistent || | TxState | P | P | P | | Raft | V | ? | P | | MvPartition | V | ? | P | # For a zone with any persistent storage we consider {{isVolatile}} as {{false}} and iif all zone's storages are volatile then {{isVolatile}} is {{true}}. Only in the last case we create both volatile RAFT and table storages. Otherwise we create persistent RAFT storage and a table storage depends on its storage profile. #* Pros: #** Clear approach that preserves previous in-memory logic as expected from user's point of view (volatile storages both table and RAFT are created only with explicit usage of in-memory mode. #** Top possible performance (restricted by transactions states storages). #* Cons: #** Demands a new restrictions on a zone alterations that deny an alteration that is trying to add a persistent profile to a zone that originally was created with volatile-only storage profiles. #** User data may be lost, but this behavior may be consdered as expected. # For a zone with any volatile storage we consider {{isVolatile}} as {{true}} and will start volatile RAFT storage in this case #* Cons: #** User may loses data with expected persistent behavior for petsistent profile tables in such volatile zone. #** Performance is still restricted by transactions states storage. # Always consider {{isVolatile}} as {{false}} until all issues related to in-memory track will be fixed. After discussions there was a chosen solution from p.1. This means that: # IGNITE-22391 should be closed because there nothing to do, because replicas will use: #* Persistent only transactional state storage. #* RAFT storage depends on {{isVolatile}} flag is discussed above. #* Table storage in table processors that are created and loaded to a zone-replica in {{TableManager}} depends on storage profile during a table creation. # IGNITE-24371 should be updated with the decision above. # IGNITE-24828 is created for new restrictions on a zone alteration implementation. # IGNITE-24829 is created for a documentation for p.3 changes. > Refine in-memory storage support within colocation track > -------------------------------------------------------- > > Key: IGNITE-24556 > URL: https://issues.apache.org/jira/browse/IGNITE-24556 > Project: Ignite > Issue Type: Task > Reporter: Alexander Lapin > Assignee: Mikhail Efremov > Priority: Major > Labels: ignite-3 > > h3. Motivation > We have two ticket for in-memory storage support > * https://issues.apache.org/jira/browse/IGNITE-22391 > * https://issues.apache.org/jira/browse/IGNITE-24371 > First one lacks description. Let's refine what is expected to be done within > aforementioned tickets and estimate them. > h3. Definition of Done > * Meaningful description is added to IGNITE-22391 > * It's clear how to implement given tickets. -- This message was sent by Atlassian Jira (v8.20.10#820010)