[ 
https://issues.apache.org/jira/browse/RATIS-2597?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Ivan Andika updated RATIS-2597:
-------------------------------
    Description: 
Simply an idea. 

Currently, each Ratis group contains a single Raft log and StateMachine (+ 
updater). This makes every Ratis transactions to be serialized. However, in the 
case of key value store there are possible cases where there are some 
independent shard (e.g. prefix) where operations is guaranteed to be within 
that shard). In this case, the single StateMachine can cause operations across 
independent shards to content with each other. In the context of Apache Ozone, 
currently metadata operations are independent for different buckets, but since 
Ozone uses a single Ratis group for the namespace, one bucket operations can 
block other bucket operations.

We can technically create multiple Ratis groups where each Ratis group is a 
shard. This is usually done by either creating a static sharding mechanism 
(e.g. divide the namespace to 256 shards) or using a separate shard manager 
that will be able to do split, merge a single namespace to multiple shards 
(e.g. TiKV, HBase regions, CockroachDB, etc). However, usually this causes more 
complexity (especially the later), since we have to manage N Raft groups, each 
with their own leader and follower combination. Additionally, in the case of 
Ozone, we want OM to still share a single RocksDB state so that we can halt the 
Raft group if there is a InstallSnapshot. This is very difficult if we have 
multiple independent Raft groups.

What if we can make a single Raft group be transparently contain multiple Raft 
logs, each with a single StateMachineUpdater. The Raft group contains only a 
single leader and followers combination (unlike multiple Raft groups), but 
underneath there are sharded logs that can be used to improve the paralellism. 
This way, the Raft group is transparent to client and client does not need to 
keep track of different Raft groups with different leaders. One requirement is 
that each request now needs to specify a shard key (e.g. in Ozone case the 
shard key is the bucket name or ID) so that it can be routed to the correct 
StateMachine shard. In the future, we can have some kind of 2PC protocol if we 
want support cross-shard transactions.

Drawbacks
 * The leader for sharded Ratis is shared among the shards which can be the new 
bottleneck
 * Raft implementation can become more complicated since we need to keep track 
of the states of each shard.

 

  was:
Simply an idea. 

Currently, each Ratis group contains a single Raft log and StateMachine (+ 
updater). This makes every Ratis transactions to be serialized. However, in the 
case of key value store there are possible cases where there are some 
independent shard (e.g. prefix) where operations is guaranteed to be within 
that shard). In this case, the single StateMachine can cause operations across 
independent shards to content with each other. In the context of Apache Ozone, 
currently metadata operations are independent for different buckets, but since 
Ozone uses a single Ratis group for the namespace, one bucket operations can 
block other bucket operations.

We can technically create multiple Ratis groups where each Ratis group is a 
shard. This is usually done by either creating a static sharding mechanism 
(e.g. divide the namespace to 256 shards) or using a separate shard manager 
that will be able to do split, merge a single namespace to multiple shards 
(e.g. TiKV, HBase regions, CockroachDB, etc). However, usually this causes more 
complexity (especially the later), since we have to manage N Raft groups, each 
with their own leader and follower combination. Additionally, in the case of 
Ozone, we want OM to still share a single RocksDB state so that we can halt the 
Raft group if there is a InstallSnapshot. This is very difficult if we have 
multiple independent Raft groups.

What if we can make a single Raft group be transparently contain multiple Raft 
logs, each with a single StateMachineUpdater. The Raft group contains only a 
single leader and followers combination (unlike multiple Raft groups), but 
underneath there are sharded logs that can be used to improve the paralellism. 
This way, the Raft group is transparent to client and client does not need to 
keep track of different Raft groups with different leaders. One requirement is 
that each request now needs to specify a shard key (e.g. in Ozone case the 
shard key is the bucket name or ID) so that it can be routed to the correct 
StateMachine shard. In the future, we can have some kind of 2PC protocol if we 
want to do cross-shard transactions.

Drawbacks
 * The leader for sharded Ratis is shared among the shards which can be the new 
bottleneck
 * Raft implementation can become more complicated since we need to keep track 
of the states of each shard.

 


> Local StateMachine Sharding within a Ratis group
> ------------------------------------------------
>
>                 Key: RATIS-2597
>                 URL: https://issues.apache.org/jira/browse/RATIS-2597
>             Project: Ratis
>          Issue Type: New Feature
>            Reporter: Ivan Andika
>            Assignee: Ivan Andika
>            Priority: Major
>
> Simply an idea. 
> Currently, each Ratis group contains a single Raft log and StateMachine (+ 
> updater). This makes every Ratis transactions to be serialized. However, in 
> the case of key value store there are possible cases where there are some 
> independent shard (e.g. prefix) where operations is guaranteed to be within 
> that shard). In this case, the single StateMachine can cause operations 
> across independent shards to content with each other. In the context of 
> Apache Ozone, currently metadata operations are independent for different 
> buckets, but since Ozone uses a single Ratis group for the namespace, one 
> bucket operations can block other bucket operations.
> We can technically create multiple Ratis groups where each Ratis group is a 
> shard. This is usually done by either creating a static sharding mechanism 
> (e.g. divide the namespace to 256 shards) or using a separate shard manager 
> that will be able to do split, merge a single namespace to multiple shards 
> (e.g. TiKV, HBase regions, CockroachDB, etc). However, usually this causes 
> more complexity (especially the later), since we have to manage N Raft 
> groups, each with their own leader and follower combination. Additionally, in 
> the case of Ozone, we want OM to still share a single RocksDB state so that 
> we can halt the Raft group if there is a InstallSnapshot. This is very 
> difficult if we have multiple independent Raft groups.
> What if we can make a single Raft group be transparently contain multiple 
> Raft logs, each with a single StateMachineUpdater. The Raft group contains 
> only a single leader and followers combination (unlike multiple Raft groups), 
> but underneath there are sharded logs that can be used to improve the 
> paralellism. This way, the Raft group is transparent to client and client 
> does not need to keep track of different Raft groups with different leaders. 
> One requirement is that each request now needs to specify a shard key (e.g. 
> in Ozone case the shard key is the bucket name or ID) so that it can be 
> routed to the correct StateMachine shard. In the future, we can have some 
> kind of 2PC protocol if we want support cross-shard transactions.
> Drawbacks
>  * The leader for sharded Ratis is shared among the shards which can be the 
> new bottleneck
>  * Raft implementation can become more complicated since we need to keep 
> track of the states of each shard.
>  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to