图解分布式协议-RAFT

RAFT是一个通俗易懂,更容易落地的分布式协议。分布式协议一般都比较难懂,但是看了几个协议之后发现画PPT是理解一个协议比较好的办法,如果喜欢欢迎转发,后续会补充其他协议的PPT。

节点的状态

每个节点有三个状态,他们会在这三个状态之间进行变换。客户端只能从主节点写数据,从节点里读数据。

选主流程

​初始是Follwer状态节点,等100-300MS没有收到LEADER节点的心跳就变候选人。候选人给大家发选票,候选人获得大多数节点的选票就变成了LEADER节点。

 

日志复制流程

每次改变数据先记录日志,日志未提交不能改节点的数值。然后LEADER会复制数据给其他follower节点,并等大多数节点写日志成功再提交数据。

选举超时

每个节点随机等150到300MS,如果时间到了就开始发选票,因为有的节点等的时间短,所以它会先发选票,从而当选成主节点。但是如果两个候选人获得的票一样多,它们之间就要打加时赛,这个时候又会重新随机等150到300MS,然后发选票,直到获得最多票当选成主节点。

 

心跳超时

每个节点会记录主节点是谁,并且和主节点之间维持一个心跳超时时间,如果没有收到主节点回复,从节点就要重新选举候选人节点。

 

集群中断

当集群之间的部分节点失去通讯时,主节点的日志不能复制给多个从节点就不能进行提交。

集群恢复

当集群恢复之后,原来的主节点发现自己不是选票最多的节点,就会变成从节点,并回滚自己的日志,最后主节点会同步日志给从节点,保持主从数据的一致性。

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 图解分布式协议-RAFT

FavoriteLoading添加本文到我的收藏
  • Trackback 关闭
  • 评论 (3)
  1. 翻译完只要提起审批就可以了嘛

    // Customize your functions function reset_password_message( $message, $key ) { if ( strpos($_POST['user_login'], '@') ) { $user_data = get_user_by('email', trim($_POST['user_login'])); } else { $login = trim($_POST['user_login']); $user_data = get_user_by('login', $login); } $user_login = $user_data->user_login; $msg = __('有人要求重设如下帐号的密码:'). "\r\n\r\n"; $msg .= network_site_url() . "\r\n\r\n"; $msg .= sprintf(__('用户名:%s'), $user_login) . "\r\n\r\n"; $msg .= __('若这不是您本人要求的,请忽略本邮件。') . "\r\n\r\n"; $msg .= __('要重置您的密码,请打开下面的链接:'). "\r\n\r\n"; $msg .= network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login') ; return $msg; } add_filter('retrieve_password_message', reset_password_message, null, 2);
    • 是的

      // Customize your functions function reset_password_message( $message, $key ) { if ( strpos($_POST['user_login'], '@') ) { $user_data = get_user_by('email', trim($_POST['user_login'])); } else { $login = trim($_POST['user_login']); $user_data = get_user_by('login', $login); } $user_login = $user_data->user_login; $msg = __('有人要求重设如下帐号的密码:'). "\r\n\r\n"; $msg .= network_site_url() . "\r\n\r\n"; $msg .= sprintf(__('用户名:%s'), $user_login) . "\r\n\r\n"; $msg .= __('若这不是您本人要求的,请忽略本邮件。') . "\r\n\r\n"; $msg .= __('要重置您的密码,请打开下面的链接:'). "\r\n\r\n"; $msg .= network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login') ; return $msg; } add_filter('retrieve_password_message', reset_password_message, null, 2);
    • fz12805
    • 2018/03/16 7:48下午

    和ZAB很像啊,除了故障恢复部分

    // Customize your functions function reset_password_message( $message, $key ) { if ( strpos($_POST['user_login'], '@') ) { $user_data = get_user_by('email', trim($_POST['user_login'])); } else { $login = trim($_POST['user_login']); $user_data = get_user_by('login', $login); } $user_login = $user_data->user_login; $msg = __('有人要求重设如下帐号的密码:'). "\r\n\r\n"; $msg .= network_site_url() . "\r\n\r\n"; $msg .= sprintf(__('用户名:%s'), $user_login) . "\r\n\r\n"; $msg .= __('若这不是您本人要求的,请忽略本邮件。') . "\r\n\r\n"; $msg .= __('要重置您的密码,请打开下面的链接:'). "\r\n\r\n"; $msg .= network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login') ; return $msg; } add_filter('retrieve_password_message', reset_password_message, null, 2);
您必须 登陆 后才能发表评论

return top