RATIS-1273. Fix split brain by leader lease - #383

Closed
runzhiwang wants to merge 2 commits into
apache:masterfrom
runzhiwang:leader-lease
Closed

RATIS-1273. Fix split brain by leader lease#383
runzhiwang wants to merge 2 commits into
apache:masterfrom
runzhiwang:leader-lease

Conversation

@runzhiwang

@runzhiwangrunzhiwang commented Dec 29, 2020

Copy link
Copy Markdown
Contributor

What changes were proposed in this pull request?

What's the problem ?

For example, there are 3 servers: s1, s2, s3, and s1 is leader. When split-brain happens, s2 was elected as new leader, but s1 still think it's leader, when client read from s1, if s2 has processed write request, client will read old data from s1.

How to fix ?
As the raft paper described, assign the leader with a lease, the leader would use the normal heartbeat mechanism to maintain a lease. Once the leader’s heartbeats were acknowledged by a majority of the cluster, it would extends its lease to start+ election timeout, since the followers shouldn’t time out before then, so we can make sure there will no new leader was elected(need pre-vote feature and need to consider transferLeadership feature) , so before start + election timeout, there will not split-brain happens.
image.

[TODO] Why need pre-vote feature ?

As the image shows, s1 is leader, but s1 can not connect with s2, even though s1 extend its lease to start+ election timeout when s1 receive acknowledgement from s3, but before start+ election timeout, s1 isolated from all servers, and s2 maybe timeout and start election and change to leader immediately with vote from s3, so both s1 and s2 think itself as leader before start+ election timeout. But if with pre-vote feature, when s2 request vote, s3 check s1's leadership is still valid, s3 will reject vote to s2, only one leader exists.

image

[TODO] How to address transferLeadership ?

For example, s1 is leader and extend its lease to start+ election timeout when s1 receive acknowledgement from s2 and s3. But before start+ election timeout, admin maybe call transferLeadership(s2), after s1 send StartLeaderElectionRequest to s2, s1 isolated from all servers, then s2 start election and change to leader immediately with vote from s3, so both s1 and s2 think itself as leader before start+ election timeout.

So s1 should step down as a follower when s1 send StartLeaderElectionRequest to s2.

@szetszwo Could you help review this proposal ?

What is the link to the Apache JIRA

https://issues.apache.org/jira/browse/RATIS-1273

How was this patch tested?

TODO

@runzhiwang
runzhiwang marked this pull request as draft December 29, 2020 03:34
@runzhiwang
runzhiwang marked this pull request as ready for review December 31, 2020 06:51
@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo Could you help review this proposal ?

@szetszwo

Copy link
Copy Markdown
Contributor

Sure, will review this.

@szetszwo

Copy link
Copy Markdown
Contributor

The design looks good. Will look at the code changes.

@runzhiwangrunzhiwang reopened this Jan 5, 2021
@szetszwo

Copy link
Copy Markdown
Contributor

Question: when the leader has lost the leader lease, should it step down?

@szetszwoszetszwo left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The calculation is a little bit tricky. See the comment inlined.

Comment threadratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerImpl.java Outdated
@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo Hi, because this PR depends on Pre-Vote PR: #161. So I want to modify Pre-Vote PR first, after Pre-Vote PR was merged, then I continue to work on this PR. what do you think ?

@szetszwo

Copy link
Copy Markdown
Contributor

Sure, the plan sounds great.

@runzhiwangrunzhiwang reopened this Jan 8, 2021
@runzhiwangrunzhiwang reopened this Jan 8, 2021
@szetszwo

Copy link
Copy Markdown
Contributor

We may not need the LEADER_LEASE_TIMEOUT_RATIO_KEY at the very beginning. ...

I agree with @GlenGeng that we may not need LEADER_LEASE_TIMEOUT_RATIO_KEY. If we take rpc-send-time right before sending out appendEntries, it seems pretty safe to use min-rpc-timeout as the leader-lease-timeout. If split brain happens, it has to take at least (min-rpc-timeout + leader election time) to elect a new leader. Then, the old leader lease must be expired by that time.

@runzhiwang , what do you think?

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

I agree with @GlenGeng that we may not need LEADER_LEASE_TIMEOUT_RATIO_KEY. If we take rpc-send-time right before sending out appendEntries, it seems pretty safe to use min-rpc-timeout as the leader-lease-timeout. If split brain happens, it has to take at least (min-rpc-timeout + leader election time) to elect a new leader. Then, the old leader lease must be expired by that time.

@szetszwo I agree. There are some failed ut related to this PR, let me fix them.

@szetszwo

Copy link
Copy Markdown
Contributor

@runzhiwang , thanks a lot.

BTW, we should add confs to enable/disable PreVote and LeaderLease. Some applications may not require these features. This is suggested by @bshashikant .

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo@bharatviswa504 Thanks, got it. I will add config in next PR.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo@bharatviswa504 Sorry, I have a question, I understand LeaderLease maybe not needed in some applications. But
in my thinking PreVote is needed in any application, it can make the leader more steady, what do you think ?

@szetszwo

Copy link
Copy Markdown
Contributor

@runzhiwang , in general, I agree that PreVote should help for all the applications. However, PreVote needs an additional phase before the real election. It could potentially slows down some applications. Individual applications like Ozone may want to benchmark it. If it is not configurable, it is impossible to benchmark.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo Thanks, got it. With leader lease, some ut become flaky, I need some time to fix them.

@szetszwo

Copy link
Copy Markdown
Contributor

@runzhiwang , No problem. Please take you time. Thanks a lot for working hard on this.

@GlenGeng-awx

Copy link
Copy Markdown
Contributor

For now, me and @runzhiwang is developing SCM HA.

In SCM HA, SCM will cache isLeader and term, updating them when underlying RaftServer steps down or becomes leader, by implementing StateMachine#notifyNotLeader and StateMachine#notifyLeaderChanged.

SCM HA does not invoke DivisionInfo#isLeader() but query its cached isLeader to decide whether underlying RaftServer is leader or not, thus it expects RaftServer to step down when lease is expired.

I suggest to implement the leader with lease solution in LeaderStateImpl#checkLeadership, and add a switch to decide to step down whether when lease is expired or when it can not hear from majority.

What do you think @szetszwo@runzhiwang ?

@runzhiwang

runzhiwang commented Jan 17, 2021

Copy link
Copy Markdown
ContributorAuthor

@szetszwo Hi, with leader lease, the CI becomes flaky, there are 2 reasons:

  1. The CI environment' machine has a low performance, some times one rpc call cost more then 20ms from send to receive.
  2. In current ratis implementation, leader sends log or heartbeat to follower every 75ms, if there is log, leader will not send heartbeat again. For example, at 0ms there is log and leader send log to follower, at 75ms there is log and leader send log to follower again, ..., at 750ms there is log and leader send log to follower again. So you can find from 0ms to 750ms, log always exist, leader always send log, never heartbeat. But if each log need more than 1000ms to: WriteDisk, applyTransaction, then leader will not receive any reply from 0-1000ms, then leader lease becomes invalid frequently.

I think we have following options:

  1. Increase rpc.timeout.min from 150ms to 1500ms in CI
  2. Default disable leader lease, then CI need not to consider leader lease

What do you think ?

@szetszwo

Copy link
Copy Markdown
Contributor

@runzhiwang , thanks again for working on this.

  1. In current ratis implementation, leader sends log or heartbeat to follower every 75ms, if there is log, leader will not send heartbeat again. For example, at 0ms there is log and leader send log to follower, at 75ms there is log and leader send log to follower again, ..., at 750ms there is log and leader send log to follower again. So you can find from 0ms to 750ms, log always exist, leader always send log, never heartbeat. But if each log need more than 1000ms to: WriteDisk, applyTransaction, then leader will not receive any reply from 0-1000ms, then leader lease becomes invalid frequently.

With the leader lease feature, the leader probably should send heartbeat separately since followers may take a long time to process log entires. (The followers do not count the log processing time when counting heartbeat timeout. However, it is impossible for the leader to do the same discount.)

@szetszwo

Copy link
Copy Markdown
Contributor
  1. Default disable leader lease, then CI need not to consider leader lease

Let's disable leader lease as default. When the feature becomes stable, we can change the default to enable.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

When the feature becomes stable, we can change the default to enable.

@szetszwo Hi, I find it's almost impossible to enable leader lease in CI, because sometimes it cost 300ms from leader send heart to follower receive heartbeat. So CI will become very unstable, unless we increase rpc.timeout.min.

Besides, what do you think of @GlenGeng 's suggestion: leader step down when lease become invalid ? In SCM HA, we do not check isLeaderReady, we depends on StateMachine#notifyLeaderChanged to change leadership.

@szetszwo

Copy link
Copy Markdown
Contributor

..., I find it's almost impossible to enable leader lease in CI, because sometimes it cost 300ms from leader send heart to follower receive heartbeat. So CI will become very unstable, unless we increase rpc.timeout.min.

Yes, we may increase rpc.timeout.min if necessary.

... leader step down when lease become invalid ? ...

Let's also make it configurable? It seems that both ways have its own benefit.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

Let's also make it configurable? It seems that both ways have its own benefit.

@szetszwo Thanks, I agree.

@runzhiwang

runzhiwang commented Jan 20, 2021

Copy link
Copy Markdown
ContributorAuthor

this pr depends on: #398

@JacksonYao287

JacksonYao287 commented Sep 5, 2021

Copy link
Copy Markdown

hi, i am not sure are you still working on this jira? as a good raft implementation, i think leader lease is very important for ratis, we should continue and complete the work. if Needed, it is my pleasure to continue this work! @szetszwo

@szetszwo

Copy link
Copy Markdown
Contributor

It seems that @runzhiwang is no longer working on this. (Please correct me if I am wrong.)

@JacksonYao287 , please feel free to take over this. Thanks a lot.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo sorry for the delay. @JacksonYao287 please feel free to take over this, thanks.

@github-actions

Copy link
Copy Markdown

This PR has been marked as stale due to 60 days of inactivity. Please comment or remove the stale label to keep it open. Otherwise, it will be automatically closed in ~30 days.

@github-actions

Copy link
Copy Markdown

Thank you for your contribution. This PR is being closed due to inactivity. Please contact a maintainer if you would like to reopen it.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@runzhiwang@szetszwo@GlenGeng-awx@JacksonYao287
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

RATIS-1273. Fix split brain by leader lease - #383

Closed
runzhiwang wants to merge 2 commits into
apache:masterfrom
runzhiwang:leader-lease
Closed

RATIS-1273. Fix split brain by leader lease#383
runzhiwang wants to merge 2 commits into
apache:masterfrom
runzhiwang:leader-lease

Conversation

@runzhiwang

@runzhiwangrunzhiwang commented Dec 29, 2020

Copy link
Copy Markdown
Contributor

What changes were proposed in this pull request?

What's the problem ?

For example, there are 3 servers: s1, s2, s3, and s1 is leader. When split-brain happens, s2 was elected as new leader, but s1 still think it's leader, when client read from s1, if s2 has processed write request, client will read old data from s1.

How to fix ?
As the raft paper described, assign the leader with a lease, the leader would use the normal heartbeat mechanism to maintain a lease. Once the leader’s heartbeats were acknowledged by a majority of the cluster, it would extends its lease to start+ election timeout, since the followers shouldn’t time out before then, so we can make sure there will no new leader was elected(need pre-vote feature and need to consider transferLeadership feature) , so before start + election timeout, there will not split-brain happens.
image.

[TODO] Why need pre-vote feature ?

As the image shows, s1 is leader, but s1 can not connect with s2, even though s1 extend its lease to start+ election timeout when s1 receive acknowledgement from s3, but before start+ election timeout, s1 isolated from all servers, and s2 maybe timeout and start election and change to leader immediately with vote from s3, so both s1 and s2 think itself as leader before start+ election timeout. But if with pre-vote feature, when s2 request vote, s3 check s1's leadership is still valid, s3 will reject vote to s2, only one leader exists.

image

[TODO] How to address transferLeadership ?

For example, s1 is leader and extend its lease to start+ election timeout when s1 receive acknowledgement from s2 and s3. But before start+ election timeout, admin maybe call transferLeadership(s2), after s1 send StartLeaderElectionRequest to s2, s1 isolated from all servers, then s2 start election and change to leader immediately with vote from s3, so both s1 and s2 think itself as leader before start+ election timeout.

So s1 should step down as a follower when s1 send StartLeaderElectionRequest to s2.

@szetszwo Could you help review this proposal ?

What is the link to the Apache JIRA

https://issues.apache.org/jira/browse/RATIS-1273

How was this patch tested?

TODO

@runzhiwang
runzhiwang marked this pull request as draft December 29, 2020 03:34
@runzhiwang
runzhiwang marked this pull request as ready for review December 31, 2020 06:51
@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo Could you help review this proposal ?

@szetszwo

Copy link
Copy Markdown
Contributor

Sure, will review this.

@szetszwo

Copy link
Copy Markdown
Contributor

The design looks good. Will look at the code changes.

@runzhiwangrunzhiwang reopened this Jan 5, 2021
@szetszwo

Copy link
Copy Markdown
Contributor

Question: when the leader has lost the leader lease, should it step down?

@szetszwoszetszwo left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The calculation is a little bit tricky. See the comment inlined.

Comment threadratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerImpl.java Outdated
@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo Hi, because this PR depends on Pre-Vote PR: #161. So I want to modify Pre-Vote PR first, after Pre-Vote PR was merged, then I continue to work on this PR. what do you think ?

@szetszwo

Copy link
Copy Markdown
Contributor

Sure, the plan sounds great.

@runzhiwangrunzhiwang reopened this Jan 8, 2021
@runzhiwangrunzhiwang reopened this Jan 8, 2021
@szetszwo

Copy link
Copy Markdown
Contributor

We may not need the LEADER_LEASE_TIMEOUT_RATIO_KEY at the very beginning. ...

I agree with @GlenGeng that we may not need LEADER_LEASE_TIMEOUT_RATIO_KEY. If we take rpc-send-time right before sending out appendEntries, it seems pretty safe to use min-rpc-timeout as the leader-lease-timeout. If split brain happens, it has to take at least (min-rpc-timeout + leader election time) to elect a new leader. Then, the old leader lease must be expired by that time.

@runzhiwang , what do you think?

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

I agree with @GlenGeng that we may not need LEADER_LEASE_TIMEOUT_RATIO_KEY. If we take rpc-send-time right before sending out appendEntries, it seems pretty safe to use min-rpc-timeout as the leader-lease-timeout. If split brain happens, it has to take at least (min-rpc-timeout + leader election time) to elect a new leader. Then, the old leader lease must be expired by that time.

@szetszwo I agree. There are some failed ut related to this PR, let me fix them.

@szetszwo

Copy link
Copy Markdown
Contributor

@runzhiwang , thanks a lot.

BTW, we should add confs to enable/disable PreVote and LeaderLease. Some applications may not require these features. This is suggested by @bshashikant .

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo@bharatviswa504 Thanks, got it. I will add config in next PR.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo@bharatviswa504 Sorry, I have a question, I understand LeaderLease maybe not needed in some applications. But
in my thinking PreVote is needed in any application, it can make the leader more steady, what do you think ?

@szetszwo

Copy link
Copy Markdown
Contributor

@runzhiwang , in general, I agree that PreVote should help for all the applications. However, PreVote needs an additional phase before the real election. It could potentially slows down some applications. Individual applications like Ozone may want to benchmark it. If it is not configurable, it is impossible to benchmark.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo Thanks, got it. With leader lease, some ut become flaky, I need some time to fix them.

@szetszwo

Copy link
Copy Markdown
Contributor

@runzhiwang , No problem. Please take you time. Thanks a lot for working hard on this.

@GlenGeng-awx

Copy link
Copy Markdown
Contributor

For now, me and @runzhiwang is developing SCM HA.

In SCM HA, SCM will cache isLeader and term, updating them when underlying RaftServer steps down or becomes leader, by implementing StateMachine#notifyNotLeader and StateMachine#notifyLeaderChanged.

SCM HA does not invoke DivisionInfo#isLeader() but query its cached isLeader to decide whether underlying RaftServer is leader or not, thus it expects RaftServer to step down when lease is expired.

I suggest to implement the leader with lease solution in LeaderStateImpl#checkLeadership, and add a switch to decide to step down whether when lease is expired or when it can not hear from majority.

What do you think @szetszwo@runzhiwang ?

@runzhiwang

runzhiwang commented Jan 17, 2021

Copy link
Copy Markdown
ContributorAuthor

@szetszwo Hi, with leader lease, the CI becomes flaky, there are 2 reasons:

  1. The CI environment' machine has a low performance, some times one rpc call cost more then 20ms from send to receive.
  2. In current ratis implementation, leader sends log or heartbeat to follower every 75ms, if there is log, leader will not send heartbeat again. For example, at 0ms there is log and leader send log to follower, at 75ms there is log and leader send log to follower again, ..., at 750ms there is log and leader send log to follower again. So you can find from 0ms to 750ms, log always exist, leader always send log, never heartbeat. But if each log need more than 1000ms to: WriteDisk, applyTransaction, then leader will not receive any reply from 0-1000ms, then leader lease becomes invalid frequently.

I think we have following options:

  1. Increase rpc.timeout.min from 150ms to 1500ms in CI
  2. Default disable leader lease, then CI need not to consider leader lease

What do you think ?

@szetszwo

Copy link
Copy Markdown
Contributor

@runzhiwang , thanks again for working on this.

  1. In current ratis implementation, leader sends log or heartbeat to follower every 75ms, if there is log, leader will not send heartbeat again. For example, at 0ms there is log and leader send log to follower, at 75ms there is log and leader send log to follower again, ..., at 750ms there is log and leader send log to follower again. So you can find from 0ms to 750ms, log always exist, leader always send log, never heartbeat. But if each log need more than 1000ms to: WriteDisk, applyTransaction, then leader will not receive any reply from 0-1000ms, then leader lease becomes invalid frequently.

With the leader lease feature, the leader probably should send heartbeat separately since followers may take a long time to process log entires. (The followers do not count the log processing time when counting heartbeat timeout. However, it is impossible for the leader to do the same discount.)

@szetszwo

Copy link
Copy Markdown
Contributor
  1. Default disable leader lease, then CI need not to consider leader lease

Let's disable leader lease as default. When the feature becomes stable, we can change the default to enable.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

When the feature becomes stable, we can change the default to enable.

@szetszwo Hi, I find it's almost impossible to enable leader lease in CI, because sometimes it cost 300ms from leader send heart to follower receive heartbeat. So CI will become very unstable, unless we increase rpc.timeout.min.

Besides, what do you think of @GlenGeng 's suggestion: leader step down when lease become invalid ? In SCM HA, we do not check isLeaderReady, we depends on StateMachine#notifyLeaderChanged to change leadership.

@szetszwo

Copy link
Copy Markdown
Contributor

..., I find it's almost impossible to enable leader lease in CI, because sometimes it cost 300ms from leader send heart to follower receive heartbeat. So CI will become very unstable, unless we increase rpc.timeout.min.

Yes, we may increase rpc.timeout.min if necessary.

... leader step down when lease become invalid ? ...

Let's also make it configurable? It seems that both ways have its own benefit.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

Let's also make it configurable? It seems that both ways have its own benefit.

@szetszwo Thanks, I agree.

@runzhiwang

runzhiwang commented Jan 20, 2021

Copy link
Copy Markdown
ContributorAuthor

this pr depends on: #398

@JacksonYao287

JacksonYao287 commented Sep 5, 2021

Copy link
Copy Markdown

hi, i am not sure are you still working on this jira? as a good raft implementation, i think leader lease is very important for ratis, we should continue and complete the work. if Needed, it is my pleasure to continue this work! @szetszwo

@szetszwo

Copy link
Copy Markdown
Contributor

It seems that @runzhiwang is no longer working on this. (Please correct me if I am wrong.)

@JacksonYao287 , please feel free to take over this. Thanks a lot.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo sorry for the delay. @JacksonYao287 please feel free to take over this, thanks.

@github-actions

Copy link
Copy Markdown

This PR has been marked as stale due to 60 days of inactivity. Please comment or remove the stale label to keep it open. Otherwise, it will be automatically closed in ~30 days.

@github-actions

Copy link
Copy Markdown

Thank you for your contribution. This PR is being closed due to inactivity. Please contact a maintainer if you would like to reopen it.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@runzhiwang@szetszwo@GlenGeng-awx@JacksonYao287
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

RATIS-1273. Fix split brain by leader lease - #383

Closed
runzhiwang wants to merge 2 commits into
apache:masterfrom
runzhiwang:leader-lease
Closed

RATIS-1273. Fix split brain by leader lease#383
runzhiwang wants to merge 2 commits into
apache:masterfrom
runzhiwang:leader-lease

Conversation

@runzhiwang

@runzhiwangrunzhiwang commented Dec 29, 2020

Copy link
Copy Markdown
Contributor

What changes were proposed in this pull request?

What's the problem ?

For example, there are 3 servers: s1, s2, s3, and s1 is leader. When split-brain happens, s2 was elected as new leader, but s1 still think it's leader, when client read from s1, if s2 has processed write request, client will read old data from s1.

How to fix ?
As the raft paper described, assign the leader with a lease, the leader would use the normal heartbeat mechanism to maintain a lease. Once the leader’s heartbeats were acknowledged by a majority of the cluster, it would extends its lease to start+ election timeout, since the followers shouldn’t time out before then, so we can make sure there will no new leader was elected(need pre-vote feature and need to consider transferLeadership feature) , so before start + election timeout, there will not split-brain happens.
image.

[TODO] Why need pre-vote feature ?

As the image shows, s1 is leader, but s1 can not connect with s2, even though s1 extend its lease to start+ election timeout when s1 receive acknowledgement from s3, but before start+ election timeout, s1 isolated from all servers, and s2 maybe timeout and start election and change to leader immediately with vote from s3, so both s1 and s2 think itself as leader before start+ election timeout. But if with pre-vote feature, when s2 request vote, s3 check s1's leadership is still valid, s3 will reject vote to s2, only one leader exists.

image

[TODO] How to address transferLeadership ?

For example, s1 is leader and extend its lease to start+ election timeout when s1 receive acknowledgement from s2 and s3. But before start+ election timeout, admin maybe call transferLeadership(s2), after s1 send StartLeaderElectionRequest to s2, s1 isolated from all servers, then s2 start election and change to leader immediately with vote from s3, so both s1 and s2 think itself as leader before start+ election timeout.

So s1 should step down as a follower when s1 send StartLeaderElectionRequest to s2.

@szetszwo Could you help review this proposal ?

What is the link to the Apache JIRA

https://issues.apache.org/jira/browse/RATIS-1273

How was this patch tested?

TODO

@runzhiwang
runzhiwang marked this pull request as draft December 29, 2020 03:34
@runzhiwang
runzhiwang marked this pull request as ready for review December 31, 2020 06:51
@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo Could you help review this proposal ?

@szetszwo

Copy link
Copy Markdown
Contributor

Sure, will review this.

@szetszwo

Copy link
Copy Markdown
Contributor

The design looks good. Will look at the code changes.

@runzhiwangrunzhiwang reopened this Jan 5, 2021
@szetszwo

Copy link
Copy Markdown
Contributor

Question: when the leader has lost the leader lease, should it step down?

@szetszwoszetszwo left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The calculation is a little bit tricky. See the comment inlined.

Comment threadratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerImpl.java Outdated
@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo Hi, because this PR depends on Pre-Vote PR: #161. So I want to modify Pre-Vote PR first, after Pre-Vote PR was merged, then I continue to work on this PR. what do you think ?

@szetszwo

Copy link
Copy Markdown
Contributor

Sure, the plan sounds great.

@runzhiwangrunzhiwang reopened this Jan 8, 2021
@runzhiwangrunzhiwang reopened this Jan 8, 2021
@szetszwo

Copy link
Copy Markdown
Contributor

We may not need the LEADER_LEASE_TIMEOUT_RATIO_KEY at the very beginning. ...

I agree with @GlenGeng that we may not need LEADER_LEASE_TIMEOUT_RATIO_KEY. If we take rpc-send-time right before sending out appendEntries, it seems pretty safe to use min-rpc-timeout as the leader-lease-timeout. If split brain happens, it has to take at least (min-rpc-timeout + leader election time) to elect a new leader. Then, the old leader lease must be expired by that time.

@runzhiwang , what do you think?

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

I agree with @GlenGeng that we may not need LEADER_LEASE_TIMEOUT_RATIO_KEY. If we take rpc-send-time right before sending out appendEntries, it seems pretty safe to use min-rpc-timeout as the leader-lease-timeout. If split brain happens, it has to take at least (min-rpc-timeout + leader election time) to elect a new leader. Then, the old leader lease must be expired by that time.

@szetszwo I agree. There are some failed ut related to this PR, let me fix them.

@szetszwo

Copy link
Copy Markdown
Contributor

@runzhiwang , thanks a lot.

BTW, we should add confs to enable/disable PreVote and LeaderLease. Some applications may not require these features. This is suggested by @bshashikant .

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo@bharatviswa504 Thanks, got it. I will add config in next PR.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo@bharatviswa504 Sorry, I have a question, I understand LeaderLease maybe not needed in some applications. But
in my thinking PreVote is needed in any application, it can make the leader more steady, what do you think ?

@szetszwo

Copy link
Copy Markdown
Contributor

@runzhiwang , in general, I agree that PreVote should help for all the applications. However, PreVote needs an additional phase before the real election. It could potentially slows down some applications. Individual applications like Ozone may want to benchmark it. If it is not configurable, it is impossible to benchmark.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo Thanks, got it. With leader lease, some ut become flaky, I need some time to fix them.

@szetszwo

Copy link
Copy Markdown
Contributor

@runzhiwang , No problem. Please take you time. Thanks a lot for working hard on this.

@GlenGeng-awx

Copy link
Copy Markdown
Contributor

For now, me and @runzhiwang is developing SCM HA.

In SCM HA, SCM will cache isLeader and term, updating them when underlying RaftServer steps down or becomes leader, by implementing StateMachine#notifyNotLeader and StateMachine#notifyLeaderChanged.

SCM HA does not invoke DivisionInfo#isLeader() but query its cached isLeader to decide whether underlying RaftServer is leader or not, thus it expects RaftServer to step down when lease is expired.

I suggest to implement the leader with lease solution in LeaderStateImpl#checkLeadership, and add a switch to decide to step down whether when lease is expired or when it can not hear from majority.

What do you think @szetszwo@runzhiwang ?

@runzhiwang

runzhiwang commented Jan 17, 2021

Copy link
Copy Markdown
ContributorAuthor

@szetszwo Hi, with leader lease, the CI becomes flaky, there are 2 reasons:

  1. The CI environment' machine has a low performance, some times one rpc call cost more then 20ms from send to receive.
  2. In current ratis implementation, leader sends log or heartbeat to follower every 75ms, if there is log, leader will not send heartbeat again. For example, at 0ms there is log and leader send log to follower, at 75ms there is log and leader send log to follower again, ..., at 750ms there is log and leader send log to follower again. So you can find from 0ms to 750ms, log always exist, leader always send log, never heartbeat. But if each log need more than 1000ms to: WriteDisk, applyTransaction, then leader will not receive any reply from 0-1000ms, then leader lease becomes invalid frequently.

I think we have following options:

  1. Increase rpc.timeout.min from 150ms to 1500ms in CI
  2. Default disable leader lease, then CI need not to consider leader lease

What do you think ?

@szetszwo

Copy link
Copy Markdown
Contributor

@runzhiwang , thanks again for working on this.

  1. In current ratis implementation, leader sends log or heartbeat to follower every 75ms, if there is log, leader will not send heartbeat again. For example, at 0ms there is log and leader send log to follower, at 75ms there is log and leader send log to follower again, ..., at 750ms there is log and leader send log to follower again. So you can find from 0ms to 750ms, log always exist, leader always send log, never heartbeat. But if each log need more than 1000ms to: WriteDisk, applyTransaction, then leader will not receive any reply from 0-1000ms, then leader lease becomes invalid frequently.

With the leader lease feature, the leader probably should send heartbeat separately since followers may take a long time to process log entires. (The followers do not count the log processing time when counting heartbeat timeout. However, it is impossible for the leader to do the same discount.)

@szetszwo

Copy link
Copy Markdown
Contributor
  1. Default disable leader lease, then CI need not to consider leader lease

Let's disable leader lease as default. When the feature becomes stable, we can change the default to enable.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

When the feature becomes stable, we can change the default to enable.

@szetszwo Hi, I find it's almost impossible to enable leader lease in CI, because sometimes it cost 300ms from leader send heart to follower receive heartbeat. So CI will become very unstable, unless we increase rpc.timeout.min.

Besides, what do you think of @GlenGeng 's suggestion: leader step down when lease become invalid ? In SCM HA, we do not check isLeaderReady, we depends on StateMachine#notifyLeaderChanged to change leadership.

@szetszwo

Copy link
Copy Markdown
Contributor

..., I find it's almost impossible to enable leader lease in CI, because sometimes it cost 300ms from leader send heart to follower receive heartbeat. So CI will become very unstable, unless we increase rpc.timeout.min.

Yes, we may increase rpc.timeout.min if necessary.

... leader step down when lease become invalid ? ...

Let's also make it configurable? It seems that both ways have its own benefit.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

Let's also make it configurable? It seems that both ways have its own benefit.

@szetszwo Thanks, I agree.

@runzhiwang

runzhiwang commented Jan 20, 2021

Copy link
Copy Markdown
ContributorAuthor

this pr depends on: #398

@JacksonYao287

JacksonYao287 commented Sep 5, 2021

Copy link
Copy Markdown

hi, i am not sure are you still working on this jira? as a good raft implementation, i think leader lease is very important for ratis, we should continue and complete the work. if Needed, it is my pleasure to continue this work! @szetszwo

@szetszwo

Copy link
Copy Markdown
Contributor

It seems that @runzhiwang is no longer working on this. (Please correct me if I am wrong.)

@JacksonYao287 , please feel free to take over this. Thanks a lot.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo sorry for the delay. @JacksonYao287 please feel free to take over this, thanks.

@github-actions

Copy link
Copy Markdown

This PR has been marked as stale due to 60 days of inactivity. Please comment or remove the stale label to keep it open. Otherwise, it will be automatically closed in ~30 days.

@github-actions

Copy link
Copy Markdown

Thank you for your contribution. This PR is being closed due to inactivity. Please contact a maintainer if you would like to reopen it.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@runzhiwang@szetszwo@GlenGeng-awx@JacksonYao287
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

RATIS-1273. Fix split brain by leader lease - #383

Closed
runzhiwang wants to merge 2 commits into
apache:masterfrom
runzhiwang:leader-lease
Closed

RATIS-1273. Fix split brain by leader lease#383
runzhiwang wants to merge 2 commits into
apache:masterfrom
runzhiwang:leader-lease

Conversation

@runzhiwang

@runzhiwangrunzhiwang commented Dec 29, 2020

Copy link
Copy Markdown
Contributor

What changes were proposed in this pull request?

What's the problem ?

For example, there are 3 servers: s1, s2, s3, and s1 is leader. When split-brain happens, s2 was elected as new leader, but s1 still think it's leader, when client read from s1, if s2 has processed write request, client will read old data from s1.

How to fix ?
As the raft paper described, assign the leader with a lease, the leader would use the normal heartbeat mechanism to maintain a lease. Once the leader’s heartbeats were acknowledged by a majority of the cluster, it would extends its lease to start+ election timeout, since the followers shouldn’t time out before then, so we can make sure there will no new leader was elected(need pre-vote feature and need to consider transferLeadership feature) , so before start + election timeout, there will not split-brain happens.
image.

[TODO] Why need pre-vote feature ?

As the image shows, s1 is leader, but s1 can not connect with s2, even though s1 extend its lease to start+ election timeout when s1 receive acknowledgement from s3, but before start+ election timeout, s1 isolated from all servers, and s2 maybe timeout and start election and change to leader immediately with vote from s3, so both s1 and s2 think itself as leader before start+ election timeout. But if with pre-vote feature, when s2 request vote, s3 check s1's leadership is still valid, s3 will reject vote to s2, only one leader exists.

image

[TODO] How to address transferLeadership ?

For example, s1 is leader and extend its lease to start+ election timeout when s1 receive acknowledgement from s2 and s3. But before start+ election timeout, admin maybe call transferLeadership(s2), after s1 send StartLeaderElectionRequest to s2, s1 isolated from all servers, then s2 start election and change to leader immediately with vote from s3, so both s1 and s2 think itself as leader before start+ election timeout.

So s1 should step down as a follower when s1 send StartLeaderElectionRequest to s2.

@szetszwo Could you help review this proposal ?

What is the link to the Apache JIRA

https://issues.apache.org/jira/browse/RATIS-1273

How was this patch tested?

TODO

@runzhiwang
runzhiwang marked this pull request as draft December 29, 2020 03:34
@runzhiwang
runzhiwang marked this pull request as ready for review December 31, 2020 06:51
@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo Could you help review this proposal ?

@szetszwo

Copy link
Copy Markdown
Contributor

Sure, will review this.

@szetszwo

Copy link
Copy Markdown
Contributor

The design looks good. Will look at the code changes.

@runzhiwangrunzhiwang reopened this Jan 5, 2021
@szetszwo

Copy link
Copy Markdown
Contributor

Question: when the leader has lost the leader lease, should it step down?

@szetszwoszetszwo left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The calculation is a little bit tricky. See the comment inlined.

Comment threadratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerImpl.java Outdated
@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo Hi, because this PR depends on Pre-Vote PR: #161. So I want to modify Pre-Vote PR first, after Pre-Vote PR was merged, then I continue to work on this PR. what do you think ?

@szetszwo

Copy link
Copy Markdown
Contributor

Sure, the plan sounds great.

@runzhiwangrunzhiwang reopened this Jan 8, 2021
@runzhiwangrunzhiwang reopened this Jan 8, 2021
@szetszwo

Copy link
Copy Markdown
Contributor

We may not need the LEADER_LEASE_TIMEOUT_RATIO_KEY at the very beginning. ...

I agree with @GlenGeng that we may not need LEADER_LEASE_TIMEOUT_RATIO_KEY. If we take rpc-send-time right before sending out appendEntries, it seems pretty safe to use min-rpc-timeout as the leader-lease-timeout. If split brain happens, it has to take at least (min-rpc-timeout + leader election time) to elect a new leader. Then, the old leader lease must be expired by that time.

@runzhiwang , what do you think?

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

I agree with @GlenGeng that we may not need LEADER_LEASE_TIMEOUT_RATIO_KEY. If we take rpc-send-time right before sending out appendEntries, it seems pretty safe to use min-rpc-timeout as the leader-lease-timeout. If split brain happens, it has to take at least (min-rpc-timeout + leader election time) to elect a new leader. Then, the old leader lease must be expired by that time.

@szetszwo I agree. There are some failed ut related to this PR, let me fix them.

@szetszwo

Copy link
Copy Markdown
Contributor

@runzhiwang , thanks a lot.

BTW, we should add confs to enable/disable PreVote and LeaderLease. Some applications may not require these features. This is suggested by @bshashikant .

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo@bharatviswa504 Thanks, got it. I will add config in next PR.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo@bharatviswa504 Sorry, I have a question, I understand LeaderLease maybe not needed in some applications. But
in my thinking PreVote is needed in any application, it can make the leader more steady, what do you think ?

@szetszwo

Copy link
Copy Markdown
Contributor

@runzhiwang , in general, I agree that PreVote should help for all the applications. However, PreVote needs an additional phase before the real election. It could potentially slows down some applications. Individual applications like Ozone may want to benchmark it. If it is not configurable, it is impossible to benchmark.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo Thanks, got it. With leader lease, some ut become flaky, I need some time to fix them.

@szetszwo

Copy link
Copy Markdown
Contributor

@runzhiwang , No problem. Please take you time. Thanks a lot for working hard on this.

@GlenGeng-awx

Copy link
Copy Markdown
Contributor

For now, me and @runzhiwang is developing SCM HA.

In SCM HA, SCM will cache isLeader and term, updating them when underlying RaftServer steps down or becomes leader, by implementing StateMachine#notifyNotLeader and StateMachine#notifyLeaderChanged.

SCM HA does not invoke DivisionInfo#isLeader() but query its cached isLeader to decide whether underlying RaftServer is leader or not, thus it expects RaftServer to step down when lease is expired.

I suggest to implement the leader with lease solution in LeaderStateImpl#checkLeadership, and add a switch to decide to step down whether when lease is expired or when it can not hear from majority.

What do you think @szetszwo@runzhiwang ?

@runzhiwang

runzhiwang commented Jan 17, 2021

Copy link
Copy Markdown
ContributorAuthor

@szetszwo Hi, with leader lease, the CI becomes flaky, there are 2 reasons:

  1. The CI environment' machine has a low performance, some times one rpc call cost more then 20ms from send to receive.
  2. In current ratis implementation, leader sends log or heartbeat to follower every 75ms, if there is log, leader will not send heartbeat again. For example, at 0ms there is log and leader send log to follower, at 75ms there is log and leader send log to follower again, ..., at 750ms there is log and leader send log to follower again. So you can find from 0ms to 750ms, log always exist, leader always send log, never heartbeat. But if each log need more than 1000ms to: WriteDisk, applyTransaction, then leader will not receive any reply from 0-1000ms, then leader lease becomes invalid frequently.

I think we have following options:

  1. Increase rpc.timeout.min from 150ms to 1500ms in CI
  2. Default disable leader lease, then CI need not to consider leader lease

What do you think ?

@szetszwo

Copy link
Copy Markdown
Contributor

@runzhiwang , thanks again for working on this.

  1. In current ratis implementation, leader sends log or heartbeat to follower every 75ms, if there is log, leader will not send heartbeat again. For example, at 0ms there is log and leader send log to follower, at 75ms there is log and leader send log to follower again, ..., at 750ms there is log and leader send log to follower again. So you can find from 0ms to 750ms, log always exist, leader always send log, never heartbeat. But if each log need more than 1000ms to: WriteDisk, applyTransaction, then leader will not receive any reply from 0-1000ms, then leader lease becomes invalid frequently.

With the leader lease feature, the leader probably should send heartbeat separately since followers may take a long time to process log entires. (The followers do not count the log processing time when counting heartbeat timeout. However, it is impossible for the leader to do the same discount.)

@szetszwo

Copy link
Copy Markdown
Contributor
  1. Default disable leader lease, then CI need not to consider leader lease

Let's disable leader lease as default. When the feature becomes stable, we can change the default to enable.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

When the feature becomes stable, we can change the default to enable.

@szetszwo Hi, I find it's almost impossible to enable leader lease in CI, because sometimes it cost 300ms from leader send heart to follower receive heartbeat. So CI will become very unstable, unless we increase rpc.timeout.min.

Besides, what do you think of @GlenGeng 's suggestion: leader step down when lease become invalid ? In SCM HA, we do not check isLeaderReady, we depends on StateMachine#notifyLeaderChanged to change leadership.

@szetszwo

Copy link
Copy Markdown
Contributor

..., I find it's almost impossible to enable leader lease in CI, because sometimes it cost 300ms from leader send heart to follower receive heartbeat. So CI will become very unstable, unless we increase rpc.timeout.min.

Yes, we may increase rpc.timeout.min if necessary.

... leader step down when lease become invalid ? ...

Let's also make it configurable? It seems that both ways have its own benefit.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

Let's also make it configurable? It seems that both ways have its own benefit.

@szetszwo Thanks, I agree.

@runzhiwang

runzhiwang commented Jan 20, 2021

Copy link
Copy Markdown
ContributorAuthor

this pr depends on: #398

@JacksonYao287

JacksonYao287 commented Sep 5, 2021

Copy link
Copy Markdown

hi, i am not sure are you still working on this jira? as a good raft implementation, i think leader lease is very important for ratis, we should continue and complete the work. if Needed, it is my pleasure to continue this work! @szetszwo

@szetszwo

Copy link
Copy Markdown
Contributor

It seems that @runzhiwang is no longer working on this. (Please correct me if I am wrong.)

@JacksonYao287 , please feel free to take over this. Thanks a lot.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo sorry for the delay. @JacksonYao287 please feel free to take over this, thanks.

@github-actions

Copy link
Copy Markdown

This PR has been marked as stale due to 60 days of inactivity. Please comment or remove the stale label to keep it open. Otherwise, it will be automatically closed in ~30 days.

@github-actions

Copy link
Copy Markdown

Thank you for your contribution. This PR is being closed due to inactivity. Please contact a maintainer if you would like to reopen it.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@runzhiwang@szetszwo@GlenGeng-awx@JacksonYao287
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

RATIS-1273. Fix split brain by leader lease - #383

Closed
runzhiwang wants to merge 2 commits into
apache:masterfrom
runzhiwang:leader-lease
Closed

RATIS-1273. Fix split brain by leader lease#383
runzhiwang wants to merge 2 commits into
apache:masterfrom
runzhiwang:leader-lease

Conversation

@runzhiwang

@runzhiwangrunzhiwang commented Dec 29, 2020

Copy link
Copy Markdown
Contributor

What changes were proposed in this pull request?

What's the problem ?

For example, there are 3 servers: s1, s2, s3, and s1 is leader. When split-brain happens, s2 was elected as new leader, but s1 still think it's leader, when client read from s1, if s2 has processed write request, client will read old data from s1.

How to fix ?
As the raft paper described, assign the leader with a lease, the leader would use the normal heartbeat mechanism to maintain a lease. Once the leader’s heartbeats were acknowledged by a majority of the cluster, it would extends its lease to start+ election timeout, since the followers shouldn’t time out before then, so we can make sure there will no new leader was elected(need pre-vote feature and need to consider transferLeadership feature) , so before start + election timeout, there will not split-brain happens.
image.

[TODO] Why need pre-vote feature ?

As the image shows, s1 is leader, but s1 can not connect with s2, even though s1 extend its lease to start+ election timeout when s1 receive acknowledgement from s3, but before start+ election timeout, s1 isolated from all servers, and s2 maybe timeout and start election and change to leader immediately with vote from s3, so both s1 and s2 think itself as leader before start+ election timeout. But if with pre-vote feature, when s2 request vote, s3 check s1's leadership is still valid, s3 will reject vote to s2, only one leader exists.

image

[TODO] How to address transferLeadership ?

For example, s1 is leader and extend its lease to start+ election timeout when s1 receive acknowledgement from s2 and s3. But before start+ election timeout, admin maybe call transferLeadership(s2), after s1 send StartLeaderElectionRequest to s2, s1 isolated from all servers, then s2 start election and change to leader immediately with vote from s3, so both s1 and s2 think itself as leader before start+ election timeout.

So s1 should step down as a follower when s1 send StartLeaderElectionRequest to s2.

@szetszwo Could you help review this proposal ?

What is the link to the Apache JIRA

https://issues.apache.org/jira/browse/RATIS-1273

How was this patch tested?

TODO

@runzhiwang
runzhiwang marked this pull request as draft December 29, 2020 03:34
@runzhiwang
runzhiwang marked this pull request as ready for review December 31, 2020 06:51
@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo Could you help review this proposal ?

@szetszwo

Copy link
Copy Markdown
Contributor

Sure, will review this.

@szetszwo

Copy link
Copy Markdown
Contributor

The design looks good. Will look at the code changes.

@runzhiwangrunzhiwang reopened this Jan 5, 2021
@szetszwo

Copy link
Copy Markdown
Contributor

Question: when the leader has lost the leader lease, should it step down?

@szetszwoszetszwo left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The calculation is a little bit tricky. See the comment inlined.

Comment threadratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerImpl.java Outdated
@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo Hi, because this PR depends on Pre-Vote PR: #161. So I want to modify Pre-Vote PR first, after Pre-Vote PR was merged, then I continue to work on this PR. what do you think ?

@szetszwo

Copy link
Copy Markdown
Contributor

Sure, the plan sounds great.

@runzhiwangrunzhiwang reopened this Jan 8, 2021
@runzhiwangrunzhiwang reopened this Jan 8, 2021
@szetszwo

Copy link
Copy Markdown
Contributor

We may not need the LEADER_LEASE_TIMEOUT_RATIO_KEY at the very beginning. ...

I agree with @GlenGeng that we may not need LEADER_LEASE_TIMEOUT_RATIO_KEY. If we take rpc-send-time right before sending out appendEntries, it seems pretty safe to use min-rpc-timeout as the leader-lease-timeout. If split brain happens, it has to take at least (min-rpc-timeout + leader election time) to elect a new leader. Then, the old leader lease must be expired by that time.

@runzhiwang , what do you think?

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

I agree with @GlenGeng that we may not need LEADER_LEASE_TIMEOUT_RATIO_KEY. If we take rpc-send-time right before sending out appendEntries, it seems pretty safe to use min-rpc-timeout as the leader-lease-timeout. If split brain happens, it has to take at least (min-rpc-timeout + leader election time) to elect a new leader. Then, the old leader lease must be expired by that time.

@szetszwo I agree. There are some failed ut related to this PR, let me fix them.

@szetszwo

Copy link
Copy Markdown
Contributor

@runzhiwang , thanks a lot.

BTW, we should add confs to enable/disable PreVote and LeaderLease. Some applications may not require these features. This is suggested by @bshashikant .

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo@bharatviswa504 Thanks, got it. I will add config in next PR.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo@bharatviswa504 Sorry, I have a question, I understand LeaderLease maybe not needed in some applications. But
in my thinking PreVote is needed in any application, it can make the leader more steady, what do you think ?

@szetszwo

Copy link
Copy Markdown
Contributor

@runzhiwang , in general, I agree that PreVote should help for all the applications. However, PreVote needs an additional phase before the real election. It could potentially slows down some applications. Individual applications like Ozone may want to benchmark it. If it is not configurable, it is impossible to benchmark.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo Thanks, got it. With leader lease, some ut become flaky, I need some time to fix them.

@szetszwo

Copy link
Copy Markdown
Contributor

@runzhiwang , No problem. Please take you time. Thanks a lot for working hard on this.

@GlenGeng-awx

Copy link
Copy Markdown
Contributor

For now, me and @runzhiwang is developing SCM HA.

In SCM HA, SCM will cache isLeader and term, updating them when underlying RaftServer steps down or becomes leader, by implementing StateMachine#notifyNotLeader and StateMachine#notifyLeaderChanged.

SCM HA does not invoke DivisionInfo#isLeader() but query its cached isLeader to decide whether underlying RaftServer is leader or not, thus it expects RaftServer to step down when lease is expired.

I suggest to implement the leader with lease solution in LeaderStateImpl#checkLeadership, and add a switch to decide to step down whether when lease is expired or when it can not hear from majority.

What do you think @szetszwo@runzhiwang ?

@runzhiwang

runzhiwang commented Jan 17, 2021

Copy link
Copy Markdown
ContributorAuthor

@szetszwo Hi, with leader lease, the CI becomes flaky, there are 2 reasons:

  1. The CI environment' machine has a low performance, some times one rpc call cost more then 20ms from send to receive.
  2. In current ratis implementation, leader sends log or heartbeat to follower every 75ms, if there is log, leader will not send heartbeat again. For example, at 0ms there is log and leader send log to follower, at 75ms there is log and leader send log to follower again, ..., at 750ms there is log and leader send log to follower again. So you can find from 0ms to 750ms, log always exist, leader always send log, never heartbeat. But if each log need more than 1000ms to: WriteDisk, applyTransaction, then leader will not receive any reply from 0-1000ms, then leader lease becomes invalid frequently.

I think we have following options:

  1. Increase rpc.timeout.min from 150ms to 1500ms in CI
  2. Default disable leader lease, then CI need not to consider leader lease

What do you think ?

@szetszwo

Copy link
Copy Markdown
Contributor

@runzhiwang , thanks again for working on this.

  1. In current ratis implementation, leader sends log or heartbeat to follower every 75ms, if there is log, leader will not send heartbeat again. For example, at 0ms there is log and leader send log to follower, at 75ms there is log and leader send log to follower again, ..., at 750ms there is log and leader send log to follower again. So you can find from 0ms to 750ms, log always exist, leader always send log, never heartbeat. But if each log need more than 1000ms to: WriteDisk, applyTransaction, then leader will not receive any reply from 0-1000ms, then leader lease becomes invalid frequently.

With the leader lease feature, the leader probably should send heartbeat separately since followers may take a long time to process log entires. (The followers do not count the log processing time when counting heartbeat timeout. However, it is impossible for the leader to do the same discount.)

@szetszwo

Copy link
Copy Markdown
Contributor
  1. Default disable leader lease, then CI need not to consider leader lease

Let's disable leader lease as default. When the feature becomes stable, we can change the default to enable.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

When the feature becomes stable, we can change the default to enable.

@szetszwo Hi, I find it's almost impossible to enable leader lease in CI, because sometimes it cost 300ms from leader send heart to follower receive heartbeat. So CI will become very unstable, unless we increase rpc.timeout.min.

Besides, what do you think of @GlenGeng 's suggestion: leader step down when lease become invalid ? In SCM HA, we do not check isLeaderReady, we depends on StateMachine#notifyLeaderChanged to change leadership.

@szetszwo

Copy link
Copy Markdown
Contributor

..., I find it's almost impossible to enable leader lease in CI, because sometimes it cost 300ms from leader send heart to follower receive heartbeat. So CI will become very unstable, unless we increase rpc.timeout.min.

Yes, we may increase rpc.timeout.min if necessary.

... leader step down when lease become invalid ? ...

Let's also make it configurable? It seems that both ways have its own benefit.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

Let's also make it configurable? It seems that both ways have its own benefit.

@szetszwo Thanks, I agree.

@runzhiwang

runzhiwang commented Jan 20, 2021

Copy link
Copy Markdown
ContributorAuthor

this pr depends on: #398

@JacksonYao287

JacksonYao287 commented Sep 5, 2021

Copy link
Copy Markdown

hi, i am not sure are you still working on this jira? as a good raft implementation, i think leader lease is very important for ratis, we should continue and complete the work. if Needed, it is my pleasure to continue this work! @szetszwo

@szetszwo

Copy link
Copy Markdown
Contributor

It seems that @runzhiwang is no longer working on this. (Please correct me if I am wrong.)

@JacksonYao287 , please feel free to take over this. Thanks a lot.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo sorry for the delay. @JacksonYao287 please feel free to take over this, thanks.

@github-actions

Copy link
Copy Markdown

This PR has been marked as stale due to 60 days of inactivity. Please comment or remove the stale label to keep it open. Otherwise, it will be automatically closed in ~30 days.

@github-actions

Copy link
Copy Markdown

Thank you for your contribution. This PR is being closed due to inactivity. Please contact a maintainer if you would like to reopen it.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@runzhiwang@szetszwo@GlenGeng-awx@JacksonYao287
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

RATIS-1273. Fix split brain by leader lease - #383

Closed
runzhiwang wants to merge 2 commits into
apache:masterfrom
runzhiwang:leader-lease
Closed

RATIS-1273. Fix split brain by leader lease#383
runzhiwang wants to merge 2 commits into
apache:masterfrom
runzhiwang:leader-lease

Conversation

@runzhiwang

@runzhiwangrunzhiwang commented Dec 29, 2020

Copy link
Copy Markdown
Contributor

What changes were proposed in this pull request?

What's the problem ?

For example, there are 3 servers: s1, s2, s3, and s1 is leader. When split-brain happens, s2 was elected as new leader, but s1 still think it's leader, when client read from s1, if s2 has processed write request, client will read old data from s1.

How to fix ?
As the raft paper described, assign the leader with a lease, the leader would use the normal heartbeat mechanism to maintain a lease. Once the leader’s heartbeats were acknowledged by a majority of the cluster, it would extends its lease to start+ election timeout, since the followers shouldn’t time out before then, so we can make sure there will no new leader was elected(need pre-vote feature and need to consider transferLeadership feature) , so before start + election timeout, there will not split-brain happens.
image.

[TODO] Why need pre-vote feature ?

As the image shows, s1 is leader, but s1 can not connect with s2, even though s1 extend its lease to start+ election timeout when s1 receive acknowledgement from s3, but before start+ election timeout, s1 isolated from all servers, and s2 maybe timeout and start election and change to leader immediately with vote from s3, so both s1 and s2 think itself as leader before start+ election timeout. But if with pre-vote feature, when s2 request vote, s3 check s1's leadership is still valid, s3 will reject vote to s2, only one leader exists.

image

[TODO] How to address transferLeadership ?

For example, s1 is leader and extend its lease to start+ election timeout when s1 receive acknowledgement from s2 and s3. But before start+ election timeout, admin maybe call transferLeadership(s2), after s1 send StartLeaderElectionRequest to s2, s1 isolated from all servers, then s2 start election and change to leader immediately with vote from s3, so both s1 and s2 think itself as leader before start+ election timeout.

So s1 should step down as a follower when s1 send StartLeaderElectionRequest to s2.

@szetszwo Could you help review this proposal ?

What is the link to the Apache JIRA

https://issues.apache.org/jira/browse/RATIS-1273

How was this patch tested?

TODO

@runzhiwang
runzhiwang marked this pull request as draft December 29, 2020 03:34
@runzhiwang
runzhiwang marked this pull request as ready for review December 31, 2020 06:51
@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo Could you help review this proposal ?

@szetszwo

Copy link
Copy Markdown
Contributor

Sure, will review this.

@szetszwo

Copy link
Copy Markdown
Contributor

The design looks good. Will look at the code changes.

@runzhiwangrunzhiwang reopened this Jan 5, 2021
@szetszwo

Copy link
Copy Markdown
Contributor

Question: when the leader has lost the leader lease, should it step down?

@szetszwoszetszwo left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The calculation is a little bit tricky. See the comment inlined.

Comment threadratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerImpl.java Outdated
@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo Hi, because this PR depends on Pre-Vote PR: #161. So I want to modify Pre-Vote PR first, after Pre-Vote PR was merged, then I continue to work on this PR. what do you think ?

@szetszwo

Copy link
Copy Markdown
Contributor

Sure, the plan sounds great.

@runzhiwangrunzhiwang reopened this Jan 8, 2021
@runzhiwangrunzhiwang reopened this Jan 8, 2021
@szetszwo

Copy link
Copy Markdown
Contributor

We may not need the LEADER_LEASE_TIMEOUT_RATIO_KEY at the very beginning. ...

I agree with @GlenGeng that we may not need LEADER_LEASE_TIMEOUT_RATIO_KEY. If we take rpc-send-time right before sending out appendEntries, it seems pretty safe to use min-rpc-timeout as the leader-lease-timeout. If split brain happens, it has to take at least (min-rpc-timeout + leader election time) to elect a new leader. Then, the old leader lease must be expired by that time.

@runzhiwang , what do you think?

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

I agree with @GlenGeng that we may not need LEADER_LEASE_TIMEOUT_RATIO_KEY. If we take rpc-send-time right before sending out appendEntries, it seems pretty safe to use min-rpc-timeout as the leader-lease-timeout. If split brain happens, it has to take at least (min-rpc-timeout + leader election time) to elect a new leader. Then, the old leader lease must be expired by that time.

@szetszwo I agree. There are some failed ut related to this PR, let me fix them.

@szetszwo

Copy link
Copy Markdown
Contributor

@runzhiwang , thanks a lot.

BTW, we should add confs to enable/disable PreVote and LeaderLease. Some applications may not require these features. This is suggested by @bshashikant .

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo@bharatviswa504 Thanks, got it. I will add config in next PR.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo@bharatviswa504 Sorry, I have a question, I understand LeaderLease maybe not needed in some applications. But
in my thinking PreVote is needed in any application, it can make the leader more steady, what do you think ?

@szetszwo

Copy link
Copy Markdown
Contributor

@runzhiwang , in general, I agree that PreVote should help for all the applications. However, PreVote needs an additional phase before the real election. It could potentially slows down some applications. Individual applications like Ozone may want to benchmark it. If it is not configurable, it is impossible to benchmark.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo Thanks, got it. With leader lease, some ut become flaky, I need some time to fix them.

@szetszwo

Copy link
Copy Markdown
Contributor

@runzhiwang , No problem. Please take you time. Thanks a lot for working hard on this.

@GlenGeng-awx

Copy link
Copy Markdown
Contributor

For now, me and @runzhiwang is developing SCM HA.

In SCM HA, SCM will cache isLeader and term, updating them when underlying RaftServer steps down or becomes leader, by implementing StateMachine#notifyNotLeader and StateMachine#notifyLeaderChanged.

SCM HA does not invoke DivisionInfo#isLeader() but query its cached isLeader to decide whether underlying RaftServer is leader or not, thus it expects RaftServer to step down when lease is expired.

I suggest to implement the leader with lease solution in LeaderStateImpl#checkLeadership, and add a switch to decide to step down whether when lease is expired or when it can not hear from majority.

What do you think @szetszwo@runzhiwang ?

@runzhiwang

runzhiwang commented Jan 17, 2021

Copy link
Copy Markdown
ContributorAuthor

@szetszwo Hi, with leader lease, the CI becomes flaky, there are 2 reasons:

  1. The CI environment' machine has a low performance, some times one rpc call cost more then 20ms from send to receive.
  2. In current ratis implementation, leader sends log or heartbeat to follower every 75ms, if there is log, leader will not send heartbeat again. For example, at 0ms there is log and leader send log to follower, at 75ms there is log and leader send log to follower again, ..., at 750ms there is log and leader send log to follower again. So you can find from 0ms to 750ms, log always exist, leader always send log, never heartbeat. But if each log need more than 1000ms to: WriteDisk, applyTransaction, then leader will not receive any reply from 0-1000ms, then leader lease becomes invalid frequently.

I think we have following options:

  1. Increase rpc.timeout.min from 150ms to 1500ms in CI
  2. Default disable leader lease, then CI need not to consider leader lease

What do you think ?

@szetszwo

Copy link
Copy Markdown
Contributor

@runzhiwang , thanks again for working on this.

  1. In current ratis implementation, leader sends log or heartbeat to follower every 75ms, if there is log, leader will not send heartbeat again. For example, at 0ms there is log and leader send log to follower, at 75ms there is log and leader send log to follower again, ..., at 750ms there is log and leader send log to follower again. So you can find from 0ms to 750ms, log always exist, leader always send log, never heartbeat. But if each log need more than 1000ms to: WriteDisk, applyTransaction, then leader will not receive any reply from 0-1000ms, then leader lease becomes invalid frequently.

With the leader lease feature, the leader probably should send heartbeat separately since followers may take a long time to process log entires. (The followers do not count the log processing time when counting heartbeat timeout. However, it is impossible for the leader to do the same discount.)

@szetszwo

Copy link
Copy Markdown
Contributor
  1. Default disable leader lease, then CI need not to consider leader lease

Let's disable leader lease as default. When the feature becomes stable, we can change the default to enable.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

When the feature becomes stable, we can change the default to enable.

@szetszwo Hi, I find it's almost impossible to enable leader lease in CI, because sometimes it cost 300ms from leader send heart to follower receive heartbeat. So CI will become very unstable, unless we increase rpc.timeout.min.

Besides, what do you think of @GlenGeng 's suggestion: leader step down when lease become invalid ? In SCM HA, we do not check isLeaderReady, we depends on StateMachine#notifyLeaderChanged to change leadership.

@szetszwo

Copy link
Copy Markdown
Contributor

..., I find it's almost impossible to enable leader lease in CI, because sometimes it cost 300ms from leader send heart to follower receive heartbeat. So CI will become very unstable, unless we increase rpc.timeout.min.

Yes, we may increase rpc.timeout.min if necessary.

... leader step down when lease become invalid ? ...

Let's also make it configurable? It seems that both ways have its own benefit.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

Let's also make it configurable? It seems that both ways have its own benefit.

@szetszwo Thanks, I agree.

@runzhiwang

runzhiwang commented Jan 20, 2021

Copy link
Copy Markdown
ContributorAuthor

this pr depends on: #398

@JacksonYao287

JacksonYao287 commented Sep 5, 2021

Copy link
Copy Markdown

hi, i am not sure are you still working on this jira? as a good raft implementation, i think leader lease is very important for ratis, we should continue and complete the work. if Needed, it is my pleasure to continue this work! @szetszwo

@szetszwo

Copy link
Copy Markdown
Contributor

It seems that @runzhiwang is no longer working on this. (Please correct me if I am wrong.)

@JacksonYao287 , please feel free to take over this. Thanks a lot.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo sorry for the delay. @JacksonYao287 please feel free to take over this, thanks.

@github-actions

Copy link
Copy Markdown

This PR has been marked as stale due to 60 days of inactivity. Please comment or remove the stale label to keep it open. Otherwise, it will be automatically closed in ~30 days.

@github-actions

Copy link
Copy Markdown

Thank you for your contribution. This PR is being closed due to inactivity. Please contact a maintainer if you would like to reopen it.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@runzhiwang@szetszwo@GlenGeng-awx@JacksonYao287
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

RATIS-1273. Fix split brain by leader lease - #383

Closed
runzhiwang wants to merge 2 commits into
apache:masterfrom
runzhiwang:leader-lease
Closed

RATIS-1273. Fix split brain by leader lease#383
runzhiwang wants to merge 2 commits into
apache:masterfrom
runzhiwang:leader-lease

Conversation

@runzhiwang

@runzhiwangrunzhiwang commented Dec 29, 2020

Copy link
Copy Markdown
Contributor

What changes were proposed in this pull request?

What's the problem ?

For example, there are 3 servers: s1, s2, s3, and s1 is leader. When split-brain happens, s2 was elected as new leader, but s1 still think it's leader, when client read from s1, if s2 has processed write request, client will read old data from s1.

How to fix ?
As the raft paper described, assign the leader with a lease, the leader would use the normal heartbeat mechanism to maintain a lease. Once the leader’s heartbeats were acknowledged by a majority of the cluster, it would extends its lease to start+ election timeout, since the followers shouldn’t time out before then, so we can make sure there will no new leader was elected(need pre-vote feature and need to consider transferLeadership feature) , so before start + election timeout, there will not split-brain happens.
image.

[TODO] Why need pre-vote feature ?

As the image shows, s1 is leader, but s1 can not connect with s2, even though s1 extend its lease to start+ election timeout when s1 receive acknowledgement from s3, but before start+ election timeout, s1 isolated from all servers, and s2 maybe timeout and start election and change to leader immediately with vote from s3, so both s1 and s2 think itself as leader before start+ election timeout. But if with pre-vote feature, when s2 request vote, s3 check s1's leadership is still valid, s3 will reject vote to s2, only one leader exists.

image

[TODO] How to address transferLeadership ?

For example, s1 is leader and extend its lease to start+ election timeout when s1 receive acknowledgement from s2 and s3. But before start+ election timeout, admin maybe call transferLeadership(s2), after s1 send StartLeaderElectionRequest to s2, s1 isolated from all servers, then s2 start election and change to leader immediately with vote from s3, so both s1 and s2 think itself as leader before start+ election timeout.

So s1 should step down as a follower when s1 send StartLeaderElectionRequest to s2.

@szetszwo Could you help review this proposal ?

What is the link to the Apache JIRA

https://issues.apache.org/jira/browse/RATIS-1273

How was this patch tested?

TODO

@runzhiwang
runzhiwang marked this pull request as draft December 29, 2020 03:34
@runzhiwang
runzhiwang marked this pull request as ready for review December 31, 2020 06:51
@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo Could you help review this proposal ?

@szetszwo

Copy link
Copy Markdown
Contributor

Sure, will review this.

@szetszwo

Copy link
Copy Markdown
Contributor

The design looks good. Will look at the code changes.

@runzhiwangrunzhiwang reopened this Jan 5, 2021
@szetszwo

Copy link
Copy Markdown
Contributor

Question: when the leader has lost the leader lease, should it step down?

@szetszwoszetszwo left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The calculation is a little bit tricky. See the comment inlined.

Comment threadratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerImpl.java Outdated
@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo Hi, because this PR depends on Pre-Vote PR: #161. So I want to modify Pre-Vote PR first, after Pre-Vote PR was merged, then I continue to work on this PR. what do you think ?

@szetszwo

Copy link
Copy Markdown
Contributor

Sure, the plan sounds great.

@runzhiwangrunzhiwang reopened this Jan 8, 2021
@runzhiwangrunzhiwang reopened this Jan 8, 2021
@szetszwo

Copy link
Copy Markdown
Contributor

We may not need the LEADER_LEASE_TIMEOUT_RATIO_KEY at the very beginning. ...

I agree with @GlenGeng that we may not need LEADER_LEASE_TIMEOUT_RATIO_KEY. If we take rpc-send-time right before sending out appendEntries, it seems pretty safe to use min-rpc-timeout as the leader-lease-timeout. If split brain happens, it has to take at least (min-rpc-timeout + leader election time) to elect a new leader. Then, the old leader lease must be expired by that time.

@runzhiwang , what do you think?

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

I agree with @GlenGeng that we may not need LEADER_LEASE_TIMEOUT_RATIO_KEY. If we take rpc-send-time right before sending out appendEntries, it seems pretty safe to use min-rpc-timeout as the leader-lease-timeout. If split brain happens, it has to take at least (min-rpc-timeout + leader election time) to elect a new leader. Then, the old leader lease must be expired by that time.

@szetszwo I agree. There are some failed ut related to this PR, let me fix them.

@szetszwo

Copy link
Copy Markdown
Contributor

@runzhiwang , thanks a lot.

BTW, we should add confs to enable/disable PreVote and LeaderLease. Some applications may not require these features. This is suggested by @bshashikant .

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo@bharatviswa504 Thanks, got it. I will add config in next PR.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo@bharatviswa504 Sorry, I have a question, I understand LeaderLease maybe not needed in some applications. But
in my thinking PreVote is needed in any application, it can make the leader more steady, what do you think ?

@szetszwo

Copy link
Copy Markdown
Contributor

@runzhiwang , in general, I agree that PreVote should help for all the applications. However, PreVote needs an additional phase before the real election. It could potentially slows down some applications. Individual applications like Ozone may want to benchmark it. If it is not configurable, it is impossible to benchmark.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo Thanks, got it. With leader lease, some ut become flaky, I need some time to fix them.

@szetszwo

Copy link
Copy Markdown
Contributor

@runzhiwang , No problem. Please take you time. Thanks a lot for working hard on this.

@GlenGeng-awx

Copy link
Copy Markdown
Contributor

For now, me and @runzhiwang is developing SCM HA.

In SCM HA, SCM will cache isLeader and term, updating them when underlying RaftServer steps down or becomes leader, by implementing StateMachine#notifyNotLeader and StateMachine#notifyLeaderChanged.

SCM HA does not invoke DivisionInfo#isLeader() but query its cached isLeader to decide whether underlying RaftServer is leader or not, thus it expects RaftServer to step down when lease is expired.

I suggest to implement the leader with lease solution in LeaderStateImpl#checkLeadership, and add a switch to decide to step down whether when lease is expired or when it can not hear from majority.

What do you think @szetszwo@runzhiwang ?

@runzhiwang

runzhiwang commented Jan 17, 2021

Copy link
Copy Markdown
ContributorAuthor

@szetszwo Hi, with leader lease, the CI becomes flaky, there are 2 reasons:

  1. The CI environment' machine has a low performance, some times one rpc call cost more then 20ms from send to receive.
  2. In current ratis implementation, leader sends log or heartbeat to follower every 75ms, if there is log, leader will not send heartbeat again. For example, at 0ms there is log and leader send log to follower, at 75ms there is log and leader send log to follower again, ..., at 750ms there is log and leader send log to follower again. So you can find from 0ms to 750ms, log always exist, leader always send log, never heartbeat. But if each log need more than 1000ms to: WriteDisk, applyTransaction, then leader will not receive any reply from 0-1000ms, then leader lease becomes invalid frequently.

I think we have following options:

  1. Increase rpc.timeout.min from 150ms to 1500ms in CI
  2. Default disable leader lease, then CI need not to consider leader lease

What do you think ?

@szetszwo

Copy link
Copy Markdown
Contributor

@runzhiwang , thanks again for working on this.

  1. In current ratis implementation, leader sends log or heartbeat to follower every 75ms, if there is log, leader will not send heartbeat again. For example, at 0ms there is log and leader send log to follower, at 75ms there is log and leader send log to follower again, ..., at 750ms there is log and leader send log to follower again. So you can find from 0ms to 750ms, log always exist, leader always send log, never heartbeat. But if each log need more than 1000ms to: WriteDisk, applyTransaction, then leader will not receive any reply from 0-1000ms, then leader lease becomes invalid frequently.

With the leader lease feature, the leader probably should send heartbeat separately since followers may take a long time to process log entires. (The followers do not count the log processing time when counting heartbeat timeout. However, it is impossible for the leader to do the same discount.)

@szetszwo

Copy link
Copy Markdown
Contributor
  1. Default disable leader lease, then CI need not to consider leader lease

Let's disable leader lease as default. When the feature becomes stable, we can change the default to enable.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

When the feature becomes stable, we can change the default to enable.

@szetszwo Hi, I find it's almost impossible to enable leader lease in CI, because sometimes it cost 300ms from leader send heart to follower receive heartbeat. So CI will become very unstable, unless we increase rpc.timeout.min.

Besides, what do you think of @GlenGeng 's suggestion: leader step down when lease become invalid ? In SCM HA, we do not check isLeaderReady, we depends on StateMachine#notifyLeaderChanged to change leadership.

@szetszwo

Copy link
Copy Markdown
Contributor

..., I find it's almost impossible to enable leader lease in CI, because sometimes it cost 300ms from leader send heart to follower receive heartbeat. So CI will become very unstable, unless we increase rpc.timeout.min.

Yes, we may increase rpc.timeout.min if necessary.

... leader step down when lease become invalid ? ...

Let's also make it configurable? It seems that both ways have its own benefit.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

Let's also make it configurable? It seems that both ways have its own benefit.

@szetszwo Thanks, I agree.

@runzhiwang

runzhiwang commented Jan 20, 2021

Copy link
Copy Markdown
ContributorAuthor

this pr depends on: #398

@JacksonYao287

JacksonYao287 commented Sep 5, 2021

Copy link
Copy Markdown

hi, i am not sure are you still working on this jira? as a good raft implementation, i think leader lease is very important for ratis, we should continue and complete the work. if Needed, it is my pleasure to continue this work! @szetszwo

@szetszwo

Copy link
Copy Markdown
Contributor

It seems that @runzhiwang is no longer working on this. (Please correct me if I am wrong.)

@JacksonYao287 , please feel free to take over this. Thanks a lot.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo sorry for the delay. @JacksonYao287 please feel free to take over this, thanks.

@github-actions

Copy link
Copy Markdown

This PR has been marked as stale due to 60 days of inactivity. Please comment or remove the stale label to keep it open. Otherwise, it will be automatically closed in ~30 days.

@github-actions

Copy link
Copy Markdown

Thank you for your contribution. This PR is being closed due to inactivity. Please contact a maintainer if you would like to reopen it.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@runzhiwang@szetszwo@GlenGeng-awx@JacksonYao287
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

RATIS-1273. Fix split brain by leader lease - #383

Closed
runzhiwang wants to merge 2 commits into
apache:masterfrom
runzhiwang:leader-lease
Closed

RATIS-1273. Fix split brain by leader lease#383
runzhiwang wants to merge 2 commits into
apache:masterfrom
runzhiwang:leader-lease

Conversation

@runzhiwang

@runzhiwangrunzhiwang commented Dec 29, 2020

Copy link
Copy Markdown
Contributor

What changes were proposed in this pull request?

What's the problem ?

For example, there are 3 servers: s1, s2, s3, and s1 is leader. When split-brain happens, s2 was elected as new leader, but s1 still think it's leader, when client read from s1, if s2 has processed write request, client will read old data from s1.

How to fix ?
As the raft paper described, assign the leader with a lease, the leader would use the normal heartbeat mechanism to maintain a lease. Once the leader’s heartbeats were acknowledged by a majority of the cluster, it would extends its lease to start+ election timeout, since the followers shouldn’t time out before then, so we can make sure there will no new leader was elected(need pre-vote feature and need to consider transferLeadership feature) , so before start + election timeout, there will not split-brain happens.
image.

[TODO] Why need pre-vote feature ?

As the image shows, s1 is leader, but s1 can not connect with s2, even though s1 extend its lease to start+ election timeout when s1 receive acknowledgement from s3, but before start+ election timeout, s1 isolated from all servers, and s2 maybe timeout and start election and change to leader immediately with vote from s3, so both s1 and s2 think itself as leader before start+ election timeout. But if with pre-vote feature, when s2 request vote, s3 check s1's leadership is still valid, s3 will reject vote to s2, only one leader exists.

image

[TODO] How to address transferLeadership ?

For example, s1 is leader and extend its lease to start+ election timeout when s1 receive acknowledgement from s2 and s3. But before start+ election timeout, admin maybe call transferLeadership(s2), after s1 send StartLeaderElectionRequest to s2, s1 isolated from all servers, then s2 start election and change to leader immediately with vote from s3, so both s1 and s2 think itself as leader before start+ election timeout.

So s1 should step down as a follower when s1 send StartLeaderElectionRequest to s2.

@szetszwo Could you help review this proposal ?

What is the link to the Apache JIRA

https://issues.apache.org/jira/browse/RATIS-1273

How was this patch tested?

TODO

@runzhiwang
runzhiwang marked this pull request as draft December 29, 2020 03:34
@runzhiwang
runzhiwang marked this pull request as ready for review December 31, 2020 06:51
@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo Could you help review this proposal ?

@szetszwo

Copy link
Copy Markdown
Contributor

Sure, will review this.

@szetszwo

Copy link
Copy Markdown
Contributor

The design looks good. Will look at the code changes.

@runzhiwangrunzhiwang reopened this Jan 5, 2021
@szetszwo

Copy link
Copy Markdown
Contributor

Question: when the leader has lost the leader lease, should it step down?

@szetszwoszetszwo left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The calculation is a little bit tricky. See the comment inlined.

Comment threadratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerImpl.java Outdated
@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo Hi, because this PR depends on Pre-Vote PR: #161. So I want to modify Pre-Vote PR first, after Pre-Vote PR was merged, then I continue to work on this PR. what do you think ?

@szetszwo

Copy link
Copy Markdown
Contributor

Sure, the plan sounds great.

@runzhiwangrunzhiwang reopened this Jan 8, 2021
@runzhiwangrunzhiwang reopened this Jan 8, 2021
@szetszwo

Copy link
Copy Markdown
Contributor

We may not need the LEADER_LEASE_TIMEOUT_RATIO_KEY at the very beginning. ...

I agree with @GlenGeng that we may not need LEADER_LEASE_TIMEOUT_RATIO_KEY. If we take rpc-send-time right before sending out appendEntries, it seems pretty safe to use min-rpc-timeout as the leader-lease-timeout. If split brain happens, it has to take at least (min-rpc-timeout + leader election time) to elect a new leader. Then, the old leader lease must be expired by that time.

@runzhiwang , what do you think?

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

I agree with @GlenGeng that we may not need LEADER_LEASE_TIMEOUT_RATIO_KEY. If we take rpc-send-time right before sending out appendEntries, it seems pretty safe to use min-rpc-timeout as the leader-lease-timeout. If split brain happens, it has to take at least (min-rpc-timeout + leader election time) to elect a new leader. Then, the old leader lease must be expired by that time.

@szetszwo I agree. There are some failed ut related to this PR, let me fix them.

@szetszwo

Copy link
Copy Markdown
Contributor

@runzhiwang , thanks a lot.

BTW, we should add confs to enable/disable PreVote and LeaderLease. Some applications may not require these features. This is suggested by @bshashikant .

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo@bharatviswa504 Thanks, got it. I will add config in next PR.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo@bharatviswa504 Sorry, I have a question, I understand LeaderLease maybe not needed in some applications. But
in my thinking PreVote is needed in any application, it can make the leader more steady, what do you think ?

@szetszwo

Copy link
Copy Markdown
Contributor

@runzhiwang , in general, I agree that PreVote should help for all the applications. However, PreVote needs an additional phase before the real election. It could potentially slows down some applications. Individual applications like Ozone may want to benchmark it. If it is not configurable, it is impossible to benchmark.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo Thanks, got it. With leader lease, some ut become flaky, I need some time to fix them.

@szetszwo

Copy link
Copy Markdown
Contributor

@runzhiwang , No problem. Please take you time. Thanks a lot for working hard on this.

@GlenGeng-awx

Copy link
Copy Markdown
Contributor

For now, me and @runzhiwang is developing SCM HA.

In SCM HA, SCM will cache isLeader and term, updating them when underlying RaftServer steps down or becomes leader, by implementing StateMachine#notifyNotLeader and StateMachine#notifyLeaderChanged.

SCM HA does not invoke DivisionInfo#isLeader() but query its cached isLeader to decide whether underlying RaftServer is leader or not, thus it expects RaftServer to step down when lease is expired.

I suggest to implement the leader with lease solution in LeaderStateImpl#checkLeadership, and add a switch to decide to step down whether when lease is expired or when it can not hear from majority.

What do you think @szetszwo@runzhiwang ?

@runzhiwang

runzhiwang commented Jan 17, 2021

Copy link
Copy Markdown
ContributorAuthor

@szetszwo Hi, with leader lease, the CI becomes flaky, there are 2 reasons:

  1. The CI environment' machine has a low performance, some times one rpc call cost more then 20ms from send to receive.
  2. In current ratis implementation, leader sends log or heartbeat to follower every 75ms, if there is log, leader will not send heartbeat again. For example, at 0ms there is log and leader send log to follower, at 75ms there is log and leader send log to follower again, ..., at 750ms there is log and leader send log to follower again. So you can find from 0ms to 750ms, log always exist, leader always send log, never heartbeat. But if each log need more than 1000ms to: WriteDisk, applyTransaction, then leader will not receive any reply from 0-1000ms, then leader lease becomes invalid frequently.

I think we have following options:

  1. Increase rpc.timeout.min from 150ms to 1500ms in CI
  2. Default disable leader lease, then CI need not to consider leader lease

What do you think ?

@szetszwo

Copy link
Copy Markdown
Contributor

@runzhiwang , thanks again for working on this.

  1. In current ratis implementation, leader sends log or heartbeat to follower every 75ms, if there is log, leader will not send heartbeat again. For example, at 0ms there is log and leader send log to follower, at 75ms there is log and leader send log to follower again, ..., at 750ms there is log and leader send log to follower again. So you can find from 0ms to 750ms, log always exist, leader always send log, never heartbeat. But if each log need more than 1000ms to: WriteDisk, applyTransaction, then leader will not receive any reply from 0-1000ms, then leader lease becomes invalid frequently.

With the leader lease feature, the leader probably should send heartbeat separately since followers may take a long time to process log entires. (The followers do not count the log processing time when counting heartbeat timeout. However, it is impossible for the leader to do the same discount.)

@szetszwo

Copy link
Copy Markdown
Contributor
  1. Default disable leader lease, then CI need not to consider leader lease

Let's disable leader lease as default. When the feature becomes stable, we can change the default to enable.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

When the feature becomes stable, we can change the default to enable.

@szetszwo Hi, I find it's almost impossible to enable leader lease in CI, because sometimes it cost 300ms from leader send heart to follower receive heartbeat. So CI will become very unstable, unless we increase rpc.timeout.min.

Besides, what do you think of @GlenGeng 's suggestion: leader step down when lease become invalid ? In SCM HA, we do not check isLeaderReady, we depends on StateMachine#notifyLeaderChanged to change leadership.

@szetszwo

Copy link
Copy Markdown
Contributor

..., I find it's almost impossible to enable leader lease in CI, because sometimes it cost 300ms from leader send heart to follower receive heartbeat. So CI will become very unstable, unless we increase rpc.timeout.min.

Yes, we may increase rpc.timeout.min if necessary.

... leader step down when lease become invalid ? ...

Let's also make it configurable? It seems that both ways have its own benefit.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

Let's also make it configurable? It seems that both ways have its own benefit.

@szetszwo Thanks, I agree.

@runzhiwang

runzhiwang commented Jan 20, 2021

Copy link
Copy Markdown
ContributorAuthor

this pr depends on: #398

@JacksonYao287

JacksonYao287 commented Sep 5, 2021

Copy link
Copy Markdown

hi, i am not sure are you still working on this jira? as a good raft implementation, i think leader lease is very important for ratis, we should continue and complete the work. if Needed, it is my pleasure to continue this work! @szetszwo

@szetszwo

Copy link
Copy Markdown
Contributor

It seems that @runzhiwang is no longer working on this. (Please correct me if I am wrong.)

@JacksonYao287 , please feel free to take over this. Thanks a lot.

@runzhiwang

Copy link
Copy Markdown
ContributorAuthor

@szetszwo sorry for the delay. @JacksonYao287 please feel free to take over this, thanks.

@github-actions

Copy link
Copy Markdown

This PR has been marked as stale due to 60 days of inactivity. Please comment or remove the stale label to keep it open. Otherwise, it will be automatically closed in ~30 days.

@github-actions

Copy link
Copy Markdown

Thank you for your contribution. This PR is being closed due to inactivity. Please contact a maintainer if you would like to reopen it.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@runzhiwang@szetszwo@GlenGeng-awx@JacksonYao287