You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@hbase.apache.org by "Andrew Purtell (JIRA)" <ji...@apache.org> on 2019/03/08 19:42:00 UTC

[jira] [Comment Edited] (HBASE-21856) Consider Causal Replication Ordering

    [ https://issues.apache.org/jira/browse/HBASE-21856?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16788236#comment-16788236 ] 

Andrew Purtell edited comment on HBASE-21856 at 3/8/19 7:41 PM:
----------------------------------------------------------------

There are two aspects of this:

1: Source side ordering. Sources need to ensure that all/any logs which contain the edits for a given region and row are processed in order. Today we can have the region open on one server generating edits and a recovery queue from a crashed regionserver somewhere else, leading to interleaving. [~lhofhansl]'s suggestions in the issue description are a solution for this. A strawman ideal solution: Upon failure of a replication source, the replication queues are split into per region queues, just like WALs are split into per region recovered edits files. Each split-replication-queue is assigned to the current replication source handling the region's edits. The source will drain the recovery queue before shipping newer edits. 

2. Sink side ordering. All of the work above is useless if sources then send batches of work containing the edits for a given region and row to more than one destination over at the sink. Who can say in what order the sinks will process the replication RPC? They could be processed out or order or in parallel. The sources should build replication batch RPCs by region (the code today does this in part) and should chose a constant destination for a region's batched edits with a consistent hash. (Multiple pending batches for the same remote regionserver can be merged as an optimization.) Given a set of sink endpoints and an encoded region name, always choose the same sink. This guarantees at most one live endpoint in the sink will be processing a region's edits, and so can apply the edits in a total order. 


was (Author: apurtell):
There are two aspects of this:

1: Source side ordering. Sources need to ensure that all/any logs which contain the edits for a given region and row are processed in order. Today we can have the region open on one server generating edits and a recovery queue from a crashed regionserver somewhere else, leading to interleaving. [~lhofhansl]'s suggestions in the issue description are a solution for this. A strawman ideal solution: Replication queues are split into per region queues, just like WALs are split into per region recovered edits files. The new owner of the primary region takes ownership of the split-replication-queue and drains the queue before shipping newer edits. 

2. Sink side ordering. All of the work above is useless if sources then send batches of work containing the edits for a given region and row to more than one destination over at the sink. Who can say in what order the sinks will process the replication RPC? They could be processed out or order or in parallel. The sources should build replication batch RPCs by region (the code today does this in part) and should chose a constant destination for a region's batched edits with a consistent hash. (Multiple pending batches for the same remote regionserver can be merged as an optimization.) Given a set of sink endpoints and an encoded region name, always choose the same sink. This guarantees at most one live endpoint in the sink will be processing a region's edits, and so can apply the edits in a total order. 

> Consider Causal Replication Ordering
> ------------------------------------
>
>                 Key: HBASE-21856
>                 URL: https://issues.apache.org/jira/browse/HBASE-21856
>             Project: HBase
>          Issue Type: Brainstorming
>            Reporter: Lars Hofhansl
>            Priority: Major
>
> We've had various efforts to improve the ordering guarantees for HBase replication, most notably Serial Replication.
> I think in many cases guaranteeing a Total Replication Order is not required, but a simpler Causal Replication Order is sufficient.
> Specifically we would guarantee causal ordering for a single Rowkey. Any changes to a Row - Puts, Deletes, etc - would be replicated in the exact order in which they occurred in the source system.
> Unlike total ordering this can be accomplished with only local region server control.
> I don't have a full design in mind, let's discuss here. It should be sufficient to to the following:
> # RegionServers only adopt the replication queues from other RegionServers for regions they (now) own. This requires log splitting for replication.
> # RegionServers ship all edits for queues adopted from other servers before any of their "own" edits are shipped.
> It's probably a bit more involved, but should be much cheaper that the total ordering provided by serial replication.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)