Redis 5 集群选举原理分析 Redis系统介绍: Redis的基础介绍与安装使用步骤:https://www.jianshu.com/p/2a23257af57b Redis的基础数据结构与使用 :https://www.jianshu.com/p/c95c8450c5b6 Redis核心原理:https://www.jianshu.com/p/4e6b7809e10a Redis 5 之后版本的高可用集群搭建 :https://www.jianshu.com/p/8045b92fafb2 Redis 5 版本的高可用集群的水平扩展:https://www.jianshu.com/p/6355d0827aea Redis 5 集群选举原理分析:https://www.jianshu.com/p/e6894713a6d5 Redis 5 通信协议解析以及手写一个Jedis客户端:https://www.jianshu.com 从节点并不是在主节点一进入 FAIL 状态就马上尝试发起选举,而是有一定延迟,一定的延迟确保我们等待FAIL状态在集群中传播,slave如果立即尝试选举,其它masters或许尚未意识到FAIL状态,可能会拒绝投票
对于 onos,我认真读的也就是集群这块,也大概浏览了下其他模块的源码。 大体列下提纲: 集群选举 onos 中 Raft 协议实现概论 onos 中 gossip 协议的实现 集群基本原语支持,onos 支持分布式的 ConcurrentHashMap,AtomicCount 本篇主要分析 onos 集群选举的代码路径。 集群协议概述 集群选举, onos 用的 Raft 协议。 (其中 C++ 和 Go 的也都有 5 个) Jraft : 缺少文档, jsimpledb : 并不是只实现 Raft C5 replicator : 实现了 Raft 协议 jgropu-raft ONOS 集群选举 注: 本文基于 onos 1.6 分支来进行分析。 ONOS 对集群的选举暴露出了一组接口,如下所示。
,选举期间导致短暂不可用。 与创建节点的进程一样 Sequence Nodes 创建的节点有序 client开发步骤 设计 path 选择znode类型 设计znode存储的内容 设计Watch client 关注什么事件,事件发生后如何处理 集群选举算法 - 最小节点获胜 算法说明 当 Leader 节点挂掉的时候,持有最小编号 znode 的集群节点成为新的 Leader 设计path 集群公用父节点,例如:/examples/leader 设计Znode ,这个方法应该一致 不返回 final int waitSeconds = (int) (5 * Math.random()) + 1; long sessionId = -lock-0000000234, stat /examples/leader/_c_cdbf26bd-2b3f-4c6e-9386-a9b258c5f0c9-lock-0000000234
我们还可以增加更多的服务器到ZooKeeper集群中,这样就可以处理更多的读请求,大幅提高整体处理能力。 Leader没有进行选举期间,epoch是一致不会变化的。 一、选举初始化 Leader选举初始化入口:QuorumPeer.startLeaderElection(),代码如下: public synchronized void startLeaderElection FastLeaderElection,早期Zookeeper实现了四种选举算法,但是后面废弃了三种,最新版本只保留FastLeaderElection这一种选举算法; Leader选举期间集群中各节点之间互相进行投票 Leader选举涉及到两个核心类:QuorumCnxManager和FastLeaderElection,下面分别详细介绍 二、网络IO QuorumCnxManager维护选举期间的网络IO的大致流程
在一台物理机上启动6个Redis实例,组成3主3从集群,端口号依次为:1379 ~ 1384,端口号1379、1380和1384三个为master,端口1379的进程ID为17620。 现将进程17620暂停(发送SIGSTOP信号),观察集群发现故障时长,和主从切换时长。 # 暂停进程17620(端口1379),然后每秒查看一次集群状态 $ kill -19 17620;for ((i=0;i<10000000;++i)) do date +'[%H:%M:%S]';redis-cli f6080015129eada3261925cc1b466f1824263358 192.168.31.98:1380 myself,master - 0 0 134 connected 5458-10922 [14:23:55] 第4秒发现故障,但未选举出新的 ,仍未选举出新的master f03b1008988acbb0f69d96252decda9adf747be9 192.168.31.98:1384 master - 0 1525847036207
4.zookeeper集群选举与集群操作 4.1 集群选举机制 4.1.1 第一次启动 4.1.2 非第一次启动 4.2 zookeeper启动停止脚本 4.2.1 脚本编写 4.2.2 脚本测试 4.1 集群选举机制 4.1.1 第一次启动 这里假设有5台服务器。 其实我们稍微总结一下,原来第一次选举就是选举myid 在中位的那台服务器啊,果然大佬都是站在c位的。 但是现在是服务集群,可能有多台客户端向不同的服务器发送写的操作请求,这就需要考虑数据一致性的问题了。 STARTED 最后集群测试下。 [wangzhou@zookeeper01 bin]$ .
一个高可用的集群里,一般都会存在主节点的选举机制。这里以elasticsearch集群为例,介绍一下集群的节点选举方法。 假设我们有这样一个集群:集群中有5个节点,分别是A、B、C、D和E。所有的节点都是普通节点,大家的职责没有任何区别,而且每一个节点都知道其它节点的信息。 5个节点累计做了4X5=20次通信。这只是一个5节点到集群,如果50个节点,一次投票则需要50X49= 2450次通信。如果每次决策都需要全民投票,那么实在是太重了。 右侧有三个节点,满足法定人数要求,则可以选举master。比如,选举C节点为master,那么右侧3个节点可以继续正常工作。当交换机之间的连接通了以后,A和B会重新加入以C为master的集群。 当它们重新介入集群时,它们当数据和集群中其它节点的数据也就不会有冲突。 法定人数一般设置为N/2+1。N为集群的节点数。 集群是怎么选举master的?
在这里初始化节点的集群状态,然后启动用于将节点加入集群的线程joinThreadControl,其中这些操作都需要进行同步以防止并发问题,在JoinThreadControl中有很多判断,如assert { running.set(true); } } zenPing.start,zenPing为UnicastZenPing类型的,主要是用于选举时集群间的 下面来看看节点是怎样与集群通信并进行选举的。 这个函数保证加入集群或者在当失败时产生一个新的join线程。 /验证 (当连不上集群其他节点出现网络分区或其他网络问题时,本地节点连不上集群,如果允许自己选自己,那么本地节点就可能在没有其他节点验证的情况下成为主节点) if (pingResponse.master
本文的目的是尽量抽丝剥茧,首先从 raft 最基本的功能——选举来入手,构建一个小的集群 demo,一步一步说明 etcd/raft 的用法。 Demo 功能 这个小 demo 只实现一个功能:已知数量的集群节点,能够进行 leader 的选举。更多的功能(比如数据的存储)在以后的文章陆续解析。 在本文中,我们只关心节点的选举,该场景下我们需要实现的功能有以下两个: 节点内部心跳机制 Raft 节点依赖定期的心跳来进行周期性的状态机流转,应用程序需要给 raft 节点提供。 `protobuf:"varint,4,opt,name=term" json:"term"` LogTerm uint64 `protobuf:"varint,5, 原文标题:用 etcd/raft 组建能够选举的最简集群 demo 发布日期:2020/06/12 原文链接:https://cloud.tencent.com/developer/article/1644111
5.如果需要精确的字段搜索,请使用过滤器而不是查询,因为过滤器比查询更有效。过滤结果也可以缓存。6.3个主节点集群是首选。 作为 ping 过程的一部分,新的 Elasticsearch 集群会进行选举,其中从所有符合主节点的节点中选出一个节点作为主节点,其他节点加入主节点。 如果 master 失败,集群中的节点会再次开始 ping 以开始另一次选举。如果节点意外地认为主节点发生故障并通过其他节点发现主节点,则此 ping 过程也有帮助。 注意:默认情况下,客户端和数据节点不参与选举过程。 此属性需要活动主节点的法定人数,以加入新当选的主节点,以便选举过程完成,并让新主节点接受其主节点。这是确保集群稳定性的一个极其重要的属性,并且可以在集群大小发生变化时进行动态更新。
简单测试 [root@h104 ~]# curl http://127.0.0.1:2379/v2/keys/message -XPUT -d value="set by h104" {"action":"set","node":{"key":"/message","value":"set by h104","modifiedIndex":11,"createdIndex":11},"prevNode":{"key":"/message","value":"abc","modifiedIndex":10,"
拷贝目录 [root@h101 zk]# rsync -av zookeeper-3.4.6-real root@192.168.100.102:/root/zk/zookeeper-3.4.6-real/ root@192.168.100.102's password: sending incremental file list created directory /root/zk/zookeeper-3.4.6-real zookeeper-3.4.6-real/ zookeeper-3.4.6-r
脱离集群 可以使用 Ctrl-C 来平滑地退出,也可以强行Kill退出,区别是主动告知其它节点自己的离开,和被其它节点标记为失效,被发现离开 ---- 健康检查 健康检查对于避免将请求发送给运行不正常的服务是一个相当关键的机制
在Master节点发生故障后,Backup节点之间将进行“民主选举”,通过对节点优先级值“priority”和“weight”的计算,选出新的Master节点接管集群服务。 分析一下产生这种情况的原因,这也就是Keepalived集群中主、备角色选举策略的问题。 下面总结了在Keepalived中使用vrrp_script模块时整个集群角色的选举算法,由于“weight”值可以是正数也可以是负数,因此,要分两种情况进行说明。 在熟悉了Keepalived主、备角色的选举策略后,再来分析一下刚才的实例。 由于A、B两个节点设置的“weight”值都为10,因此符合选举策略的第一种。 由此可见,对于“weight”值的设置,要非常谨慎,如果设置不好,将导致集群角色选举失败,使集群陷于瘫痪状态。
zookeeper会认为这个集群时不可用的,同理我们如果是5台服务器的情况,有两台宕机了,可以正常运行,三台宕机了,才被认为是不可用的,这个很重要,包括后面的选举机制也是这样的。 IP:选举时通讯的IP。 observer配置: 只要在集群配置中加上observer后缀即可,示例如下: server.3=127.0.0.1:2889:3889:observer 选举机制: 先说一个简单的,投票机制的。 假设我们现在有1,2,3,4,5五个follower要进行选举。 ? 留下一个思考题,5台服务器,如果启动可以指定 4号为leader服务 。
Leader选举 概述 在Zookeeper集群正常运行期间,一旦选举出Leader,所有服务器的集群状态一般不会发生改变,即使是新机器加入、非Leader机器挂了,也不会影响Leader。 但是一旦Leader挂了,那么整个集群将暂时无法对外服务,而是进入新的一轮Leader选举。服务器运行期间的Leader选举和服务器启动期间的Leader选举基本过程是一致的。 在服务器集群初始化节点,有一台机器(假设这台机器myId=1,我们称他为Server1)启动的时候,那么1台机器是无法进行选举的。 如果集群总机器数是n,那么quorum=(2/n)+ 1; 下面开始算法分析: 进入Leader选举 当Zookeeper集群中一台服务器出现下面2种情况之一时,就会进入Leader选举: 服务器初始化启动 服务器无法和Leader保持连接 当一台机器进入Leader选举流程时,当前集群也可能处于以下2种状态: 集群中本来就已经存在一个Leader 会被告知Leader信息,当前机器仅仅需要和Leader
选举机制(面试重点) 1)半数机制:集群中半数以上机器存活,集群可用。所以Zookeeper适合安装奇数台服务器。 2)Zookeeper虽然在配置文件中并没有指定Master和Slave。 但是,Zookeeper工作时,是有一个节点为Leader,其他则为Follower,Leader是通过内部的选举机制临时产生的。 3)以一个简单的例子来说明整个选举的过程。 假设有五台服务器组成的Zookeeper集群,它们的id从1-5,同时它们都是最新启动的,也就是没有历史数据,在存放数据量这一点上,都是一样的。假设这些服务器依序启动,来看看会发生什么,如图所示。 (3)服务器3启动,根据前面的理论分析,服务器3成为服务器1、2、3中的老大,而与上面不同的是,此时有三台服务器选举了它,所以它成为了这次选举的Leader。 (5)服务器5启动,同4一样当小弟。
Leader选举是保证Zookeeper集群数据一致性的关键,只有Leader确定的情况下,集群才可以对外提供服务,通常分为启动时Leader选举和运行时Leader选举。 启动时选举: 首先,每一个节点都会向其他所有节点发出一个投票,投票形式为(myId,ZXID)。 由于是全新的集群,ZXID都为0,所以,各个节点的投票形式如:node01为(1,0),node02为(2,0),node03为(3,0); 然后,每个节点将对收到其他机器的投票进行校验: 判断是否是本轮投票 运行时选举: 首先,需要生成投票,每个节点仍然是向所有其他节点发出一个投票信息。 由于集群运行了一段时间,所有,每个节点的ZXID可能不相同,如:node01为(1,101),node02为(2,100),node03为(3,100); 然后,每个节点收到其他机器的选票要进行PK,策略依旧
Observer节点接收来自leader的inform信息,更新自己的本地存储,不参与提交和选举投票。通常在不影响集群事务处理能力的前提下提升集群的非事务处理能力。 Observer应用场景: 提升集群的读性能。因为Observer和不参与提交和选举的投票过程,所以可以通过往集群里面添加observer节点来提高整个集群的读性能。 跨数据中心部署。 B 是这个服务器的地址; C 是这个服务器Follower与集群中的Leader服务器交换信息的端口; D 是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口 .4lw.commands.whitelist=* ${ZOOMAIN}" stat 命令 stat 命令用于查看 zk 的状态信息,实例如下: $ echo stat | nc 192.168.65.156 2181 5、 2、运行过程中的 leader 选举 当集群中 leader 服务器出现宕机或者不可用情况时,整个集群无法对外提供服务,进入新一轮的 leader 选举。 变更状态。
3、Zookeeper集群初始化启动时Leader选举若进行Leader选举,则至少需要两台机器,这里选取3台机器组成的服务器集群为例。 初始化启动期间Leader选举流程如下图所示。 ? 在集群初始化阶段,当有一台服务器ZK1启动时,其单独无法进行和完成Leader选举,当第二台服务器ZK2启动时,此时两台机器可以相互通信,每台机器都试图找到Leader,于是进入Leader选举过程。 4、Zookeeper集群运行期间Leader重新选在Zookeeper运行期间,如果Leader节点挂了,那么整个Zookeeper集群将暂停对外服务,进入新一轮Leader选举。 (5) 统计投票。与启动时过程相同。 (6) 改变服务器的状态。与启动时过程相同。 华为面试题: 举例,初始情况下5台机器,sid分别为1、2、3、4、5,逻辑时钟都是0。 依次启动后,开始选举,所有的机器逻辑时钟自增为1。经过多次投票,假设第三台机器为leader,其他4台机器为follower,此时5台机器的逻辑时钟都为1。 一般情况下,逻辑时钟应该都是相同的。