ZooKeeper 选举原理解析

STM32F0 硬件I2C读取AT24C64 AT24C32、AT24C64都是大容量的,寄存器地址要用16位如果I2C总线上只挂一个芯片,直接把写保护、A0、A1、A2全部拉低即可I2C的读可以跨页,但是不能跨块,AT24C08等小容量的块大小是256K字节,AT24C64的块大小是8192字节,而且读的字节数越多,中间出错的概率也变大了,因此不建议一次性读取太多的字节数。I2C的写是不能跨页的,因此要做到忽略硬件页的影响,需要自己设计算法,把应用层的一次写,在底层分为多次写来实现。 阅读详情

        ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等。Zookeeper是hadoop的一个子项目,其发展历程无需赘述。在分布式应用中,由于工程师不能很好地使用锁机制,以及基于消息的协调机制不适合在某些应用中使用,因此需要有一种可靠的、可扩展的、分布式的、可配置的协调机制来统一系统的状态。Zookeeper的目的就在于此。本文简单分析zookeeper的工作原理,对于如何使用zookeeper不是本文讨论的重点。

1 Zookeeper的基本概念

1.1 角色

Zookeeper中的角色主要有以下三类,如下表所示:

系统模型如图所示:

1.2 设计目的

1.最终一致性:client不论连接到哪个Server,展示给它都是同一个视图,这是zookeeper最重要的性能。

2 .可靠性:具有简单、健壮、良好的性能,如果消息m被到一台服务器接受,那么它将被所有的服务器接受。

3 .实时性:Zookeeper保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息。但由于网络延时等原因,Zookeeper不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口。

4 .等待无关(wait-free):慢的或者失效的client不得干预快速的client的请求,使得每个client都能有效的等待。

5.原子性:更新只能成功或者失败,没有中间状态。

6 .顺序性:包括全局有序和偏序两种:全局有序是指如果在一台服务器上消息a在消息b前发布,则在所有Server上消息a都将在消息b前被发布;偏序是指如果一个消息b在消息a后被同一个发送者发布,a必将排在b前面。

2 ZooKeeper的工作原理

Zookeeper的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议。Zab协议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)。当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和leader的状态同步以后,恢复模式就结束了。状态同步保证了leader和Server具有相同的系统状态。

为了保证事务的顺序一致性,zookeeper采用了递增的事务id号(zxid)来标识事务。所有的提议(proposal)都在被提出的时候加上了zxid。实现中zxid是一个64位的数字,它高32位是epoch用来标识leader关系是否改变,每次一个leader被选出来,它都会有一个新的epoch,标识当前属于那个leader的统治时期。低32位用于递增计数。

每个Server在工作过程中有三种状态:

  • LOOKING:当前Server不知道leader是谁,正在搜寻

  • LEADING:当前Server即为选举出来的leader

  • FOLLOWING:leader已经选举出来,当前Server与之同步

2.1 选主流程

当leader崩溃或者leader失去大多数的follower,这时候zk进入恢复模式,恢复模式需要重新选举出一个新的leader,让所有的Server都恢复到一个正确的状态。Zk的选举算法有两种:一种是基于basic paxos实现的,另外一种是基于fast paxos算法实现的。系统默认的选举算法为fast paxos。先介绍basic paxos流程:

  1. 1 .选举线程由当前Server发起选举的线程担任,其主要功能是对投票结果进行统计,并选出推荐的Server;

  2. 2 .选举线程首先向所有Server发起一次询问(包括自己);

  3. 3 .选举线程收到回复后,验证是否是自己发起的询问(验证zxid是否一致),然后获取对方的id(myid),并存储到当前询问对象列表中,最后获取对方提议的leader相关信息(id,zxid),并将这些信息存储到当次选举的投票记录表中;

  4. 4.  收到所有Server回复以后,就计算出zxid最大的那个Server,并将这个Server相关信息设置成下一次要投票的Server;

  5. 5.  线程将当前zxid最大的Server设置为当前Server要推荐的Leader,如果此时获胜的Server获得n/2 + 1的Server票数, 设置当前推荐的leader为获胜的Server,将根据获胜的Server相关信息设置自己的状态,否则,继续这个过程,直到leader被选举出来。

通过流程分析我们可以得出:要使Leader获得多数Server的支持,则Server总数必须是奇数2n+1,且存活的Server的数目不得少于n+1.

每个Server启动后都会重复以上流程。在恢复模式下,如果是刚从崩溃状态恢复的或者刚启动的server还会从磁盘快照中恢复数据和会话信息,zk会记录事务日志并定期进行快照,方便在恢复时进行状态恢复。选主的具体流程图如下所示:

fast paxos流程是在选举过程中,某Server首先向所有Server提议自己要成为leader,当其它Server收到提议以后,解决epoch和zxid的冲突,并接受对方的提议,然后向对方发送接受提议完成的消息,重复这个流程,最后一定能选举出Leader。其流程图如下所示:

2.2 同步流程

选完leader以后,zk就进入状态同步过程。

  1. 1. leader等待server连接;

  2. 2 .Follower连接leader,将最大的zxid发送给leader;

  3. 3 .Leader根据follower的zxid确定同步点;

  4. 4 .完成同步后通知follower 已经成为uptodate状态;

  5. 5 .Follower收到uptodate消息后,又可以重新接受client的请求进行服务了。

流程图如下所示:

2.3 工作流程

2.3.1 Leader工作流程

Leader主要有三个功能:

  1. 1 .恢复数据;

  2. 2 .维持与Learner的心跳,接收Learner请求并判断Learner的请求消息类型;

  3. 3 .Learner的消息类型主要有PING消息、REQUEST消息、ACK消息、REVALIDATE消息,根据不同的消息类型,进行不同的处理。

PING消息是指Learner的心跳信息;REQUEST消息是Follower发送的提议信息,包括写请求及同步请求;ACK消息是Follower的对提议的回复,超过半数的Follower通过,则commit该提议;REVALIDATE消息是用来延长SESSION有效时间。
Leader的工作流程简图如下所示,在实际实现中,流程要比下图复杂得多,启动了三个线程来实现功能。

2.3.2 Follower工作流程

Follower主要有四个功能:

  1. 1. 向Leader发送请求(PING消息、REQUEST消息、ACK消息、REVALIDATE消息);

  2. 2 .接收Leader消息并进行处理;

  3. 3 .接收Client的请求,如果为写请求,发送给Leader进行投票;

  4. 4 .返回Client结果。

Follower的消息循环处理如下几种来自Leader的消息:

  1. 1 .PING消息: 心跳消息;

  2. 2 .PROPOSAL消息:Leader发起的提案,要求Follower投票;

  3. 3 .COMMIT消息:服务器端最新一次提案的信息;

  4. 4 .UPTODATE消息:表明同步完成;

  5. 5 .REVALIDATE消息:根据Leader的REVALIDATE结果,关闭待revalidate的session还是允许其接受消息;

  6. 6 .SYNC消息:返回SYNC结果到客户端,这个消息最初由客户端发起,用来强制得到最新的更新。

Follower的工作流程简图如下所示,在实际实现中,Follower是通过5个线程来实现功能的。

对于observer的流程不再叙述,observer流程和Follower的唯一不同的地方就是observer不会参加leader发起的投票。


主流应用场景:

Zookeeper的主流应用场景实现思路(除去官方示例) 

(1)配置管理
集中式的配置管理在应用集群中是非常常见的,一般商业公司内部都会实现一套集中的配置管理中心,应对不同的应用集群对于共享各自配置的需求,并且在配置变更时能够通知到集群中的每一个机器。

Zookeeper很容易实现这种集中式的配置管理,比如将APP1的所有配置配置到/APP1 znode下,APP1所有机器一启动就对/APP1这个节点进行监控(zk.exist("/APP1",true)),并且实现回调方法Watcher,那么在zookeeper上/APP1 znode节点下数据发生变化的时候,每个机器都会收到通知,Watcher方法将会被执行,那么应用再取下数据即可(zk.getData("/APP1",false,null));

以上这个例子只是简单的粗颗粒度配置监控,细颗粒度的数据可以进行分层级监控,这一切都是可以设计和控制的。     
(2)集群管理 
应用集群中,我们常常需要让每一个机器知道集群中(或依赖的其他某一个集群)哪些机器是活着的,并且在集群机器因为宕机,网络断链等原因能够不在人工介入的情况下迅速通知到每一个机器。

Zookeeper同样很容易实现这个功能,比如我在zookeeper服务器端有一个znode叫/APP1SERVERS,那么集群中每一个机器启动的时候都去这个节点下创建一个EPHEMERAL类型的节点,比如server1创建/APP1SERVERS/SERVER1(可以使用ip,保证不重复),server2创建/APP1SERVERS/SERVER2,然后SERVER1和SERVER2都watch /APP1SERVERS这个父节点,那么也就是这个父节点下数据或者子节点变化都会通知对该节点进行watch的客户端。因为EPHEMERAL类型节点有一个很重要的特性,就是客户端和服务器端连接断掉或者session过期就会使节点消失,那么在某一个机器挂掉或者断链的时候,其对应的节点就会消失,然后集群中所有对/APP1SERVERS进行watch的客户端都会收到通知,然后取得最新列表即可。

另外有一个应用场景就是集群选master,一旦master挂掉能够马上能从slave中选出一个master,实现步骤和前者一样,只是机器在启动的时候在APP1SERVERS创建的节点类型变为EPHEMERAL_SEQUENTIAL类型,这样每个节点会自动被编号

我们默认规定编号最小的为master,所以当我们对/APP1SERVERS节点做监控的时候,得到服务器列表,只要所有集群机器逻辑认为最小编号节点为master,那么master就被选出,而这个master宕机的时候,相应的znode会消失,然后新的服务器列表就被推送到客户端,然后每个节点逻辑认为最小编号节点为master,这样就做到动态master选举。

Zookeeper 监视(Watches) 简介

Zookeeper C API 的声明和描述在 include/zookeeper.h 中可以找到,另外大部分的 Zookeeper C API 常量、结构体声明也在 zookeeper.h 中,如果如果你在使用 C API 是遇到不明白的地方,最好看看 zookeeper.h,或者自己使用 doxygen 生成 Zookeeper C API 的帮助文档。

Zookeeper 中最有特色且最不容易理解的是监视(Watches)。Zookeeper 所有的读操作——getData(), getChildren(), 和 exists() 都 可以设置监视(watch),监视事件可以理解为一次性的触发器, 官方定义如下: a watch event is one-time trigger, sent to the client that set the watch, which occurs when the data for which the watch was set changes。对此需要作出如下理解:

  • (一次性触发)One-time trigger

    当设置监视的数据发生改变时,该监视事件会被发送到客户端,例如,如果客户端调用了 getData("/znode1", true) 并且稍后 /znode1 节点上的数据发生了改变或者被删除了,客户端将会获取到 /znode1 发生变化的监视事件,而如果 /znode1 再一次发生了变化,除非客户端再次对 /znode1 设置监视,否则客户端不会收到事件通知。

  • (发送至客户端)Sent to the client

    Zookeeper 客户端和服务端是通过 socket 进行通信的,由于网络存在故障,所以监视事件很有可能不会成功地到达客户端,监视事件是异步发送至监视者的,Zookeeper 本身提供了保序性(ordering guarantee):即客户端只有首先看到了监视事件后,才会感知到它所设置监视的 znode 发生了变化(a client will never see a change for which it has set a watch until it first sees the watch event). 网络延迟或者其他因素可能导致不同的客户端在不同的时刻感知某一监视事件,但是不同的客户端所看到的一切具有一致的顺序。

  • (被设置 watch 的数据)The data for which the watch was set

    这意味着 znode 节点本身具有不同的改变方式。你也可以想象 Zookeeper 维护了两条监视链表:数据监视和子节点监视(data watches and child watches) getData() and exists() 设置数据监视,getChildren() 设置子节点监视。 或者,你也可以想象 Zookeeper 设置的不同监视返回不同的数据,getData() 和 exists() 返回 znode 节点的相关信息,而 getChildren() 返回子节点列表。因此, setData() 会触发设置在某一节点上所设置的数据监视(假定数据设置成功),而一次成功的 create() 操作则会出发当前节点上所设置的数据监视以及父节点的子节点监视。一次成功的 delete() 操作将会触发当前节点的数据监视和子节点监视事件,同时也会触发该节点父节点的child watch。

Zookeeper 中的监视是轻量级的,因此容易设置、维护和分发。当客户端与 Zookeeper 服务器端失去联系时,客户端并不会收到监视事件的通知,只有当客户端重新连接后,若在必要的情况下,以前注册的监视会重新被注册并触发,对于开发人员来说 这通常是透明的。只有一种情况会导致监视事件的丢失,即:通过 exists() 设置了某个 znode 节点的监视,但是如果某个客户端在此 znode 节点被创建和删除的时间间隔内与 zookeeper 服务器失去了联系,该客户端即使稍后重新连接 zookeeper服务器后也得不到事件通知。

Zookeeper C API 常量与部分结构(struct)介绍

与 ACL 相关的结构与常量:

struct Id 结构为:

struct Id {     char * scheme;     char * id; };

 

struct ACL 结构为:

struct ACL {     int32_t perms;     struct Id id; };

 

struct ACL_vector 结构为:

struct ACL_vector {     int32_t count;     struct ACL *data; };

 

与 znode 访问权限有关的常量

  • const int ZOO_PERM_READ; //允许客户端读取 znode 节点的值以及子节点列表。

  • const int ZOO_PERM_WRITE;// 允许客户端设置 znode 节点的值。

  • const int ZOO_PERM_CREATE; //允许客户端在该 znode 节点下创建子节点。

  • const int ZOO_PERM_DELETE;//允许客户端删除子节点。

  • const int ZOO_PERM_ADMIN; //允许客户端执行 set_acl()。

  • const int ZOO_PERM_ALL;//允许客户端执行所有操作,等价与上述所有标志的或(OR) 。

与 ACL IDs 相关的常量

  • struct Id ZOO_ANYONE_ID_UNSAFE; //(‘world’,’anyone’)

  • struct Id ZOO_AUTH_IDS;// (‘auth’,’’)

三种标准的 ACL

  • struct ACL_vector ZOO_OPEN_ACL_UNSAFE; //(ZOO_PERM_ALL,ZOO_ANYONE_ID_UNSAFE)

  • struct ACL_vector ZOO_READ_ACL_UNSAFE;// (ZOO_PERM_READ, ZOO_ANYONE_ID_UNSAFE)

  • struct ACL_vector ZOO_CREATOR_ALL_ACL; //(ZOO_PERM_ALL,ZOO_AUTH_IDS)

与 Interest 相关的常量:ZOOKEEPER_WRITE, ZOOKEEPER_READ

这 两个常量用于标识感兴趣的事件并通知 zookeeper 发生了哪些事件。Interest 常量可以进行组合或(OR)来标识多种兴趣(multiple interests: write, read),这两个常量一般用于 zookeeper_interest() 和 zookeeper_process()两个函数中。

与节点创建相关的常量:ZOO_EPHEMERAL, ZOO_SEQUENCE

zoo_create 函数标志,ZOO_EPHEMERAL 用来标识创建临时节点,ZOO_SEQUENCE 用来标识节点命名具有递增的后缀序号(一般是节点名称后填充 10 位字符的序号,如 /xyz0000000000, /xyz0000000001, /xyz0000000002, ...),同样地,ZOO_EPHEMERAL, ZOO_SEQUENCE 可以组合。

与连接状态 Stat 相关的常量

以下常量均与 Zookeeper 连接状态有关,他们通常用作监视器回调函数的参数。

ZOOAPI const int ZOO_EXPIRED_SESSION_STATE
ZOOAPI const int ZOO_AUTH_FAILED_STATE
ZOOAPI const int ZOO_CONNECTING_STATE
ZOOAPI const int ZOO_ASSOCIATING_STATE
ZOOAPI const int ZOO_CONNECTED_STATE

与监视类型(Watch Types)相关的常量

以下常量标识监视事件的类型,他们通常用作监视器回调函数的第一个参数。

  • ZOO_CREATED_EVENT; // 节点被创建(此前该节点不存在),通过 zoo_exists() 设置监视。

  • ZOO_DELETED_EVENT; // 节点被删除,通过 zoo_exists() 和 zoo_get() 设置监视。

  • ZOO_CHANGED_EVENT; // 节点发生变化,通过 zoo_exists() 和 zoo_get() 设置监视。

  • ZOO_CHILD_EVENT; // 子节点事件,通过zoo_get_children() 和 zoo_get_children2()设置监视。

  • ZOO_SESSION_EVENT; // 会话丢失

  • ZOO_NOTWATCHING_EVENT; // 监视被移除。

Zookeeper C API 错误码介绍 ZOO_ERRORS

ZOK 

正常返回

ZSYSTEMERROR 

系统或服务器端错误(System and server-side errors),服务器不会抛出该错误,该错误也只是用来标识错误范围的,即大于该错误值,且小于 ZAPIERROR 都是系统错误。

ZRUNTIMEINCONSISTENCY 

运行时非一致性错误。

ZDATAINCONSISTENCY 

数据非一致性错误。

ZCONNECTIONLOSS 

Zookeeper 客户端与服务器端失去连接

ZMARSHALLINGERROR 

在 marshalling 和 unmarshalling 数据时出现错误(Error while marshalling or unmarshalling data)

ZUNIMPLEMENTED 

该操作未实现(Operation is unimplemented)

ZOPERATIONTIMEOUT 

该操作超时(Operation timeout)

ZBADARGUMENTS 

非法参数错误(Invalid arguments)

ZINVALIDSTATE 

非法句柄状态(Invliad zhandle state)

ZAPIERROR 

API 错误(API errors),服务器不会抛出该错误,该错误也只是用来标识错误范围的,错误值大于该值的标识 API 错误,而小于该值的标识 ZSYSTEMERROR。

ZNONODE 

节点不存在(Node does not exist)

ZNOAUTH 

没有经过授权(Not authenticated)

ZBADVERSION 

版本冲突(Version conflict)

ZNOCHILDRENFOREPHEMERALS 

临时节点不能拥有子节点(Ephemeral nodes may not have children)

ZNODEEXISTS 

节点已经存在(The node already exists)

ZNOTEMPTY 

该节点具有自身的子节点(The node has children)

ZSESSIONEXPIRED 

会话过期(The session has been expired by the server)

ZINVALIDCALLBACK 

非法的回调函数(Invalid callback specified)

ZINVALIDACL 

非法的ACL(Invalid ACL specified)

ZAUTHFAILED 

客户端授权失败(Client authentication failed)

ZCLOSING 

Zookeeper 连接关闭(ZooKeeper is closing)

ZNOTHING 

并非错误,客户端不需要处理服务器的响应(not error, no server responses to process)

ZSESSIONMOVED 

会话转移至其他服务器,所以操作被忽略(session moved to another server, so operation is ignored)

 

Watch事件类型:

 

ZOO_CREATED_EVENT:节点创建事件,需要watch一个不存在的节点,当节点被创建时触发,此watch通过zoo_exists()设置
ZOO_DELETED_EVENT:节点删除事件,此watch通过zoo_exists()或zoo_get()设置
ZOO_CHANGED_EVENT:节点数据改变事件,此watch通过zoo_exists()或zoo_get()设置
ZOO_CHILD_EVENT:子节点列表改变事件,此watch通过zoo_get_children()或zoo_get_children2()设置
ZOO_SESSION_EVENT:会话失效事件,客户端与服务端断开或重连时触发
ZOO_NOTWATCHING_EVENT:watch移除事件,服务端出于某些原因不再为客户端watch节点时触发

【接口协议】FPGA实现IIC协议对EEPROM进行数据存储与读取(AT24C64) 使用vivado实现IIC协议对EEPROM进行数据存储与读取。本文是基于正点原子的“达芬奇”开发板资料进行学习的笔记,对部分地方进行了修改,并进行了详细的讲解。 阅读详情

相关推荐

ESP32 操作AT24C32或AT24C64

容量有两个型号AT24C32/64 提供32,768/65,536 bits ,也就是4096字节(4k字节)或8192字节(8K字节)Flash 在写入前,需要擦除,且擦除是按照page进行的。比如spi flash。设备地址,如果引脚A0~A2都接地,则IIC地址为0x50.EEPROM在写入前不需要擦除page,直接写入就行。使用16bit来确定存储的地址。有引脚可以配置IIC的地址。电压2.7V-5.5V。每个page 32字节。

zhu378287521的博客 2385

ZooKeeper原理分析

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等。Zookeeper是hadoop的一个子项目,其发展历程无需赘述。在分布式应用中,由于工程师不能很好地使用锁机制,以及基于消息的协调机制不适合在某些应用中使用,因此需要有一种可靠的、可扩展的、分布式的、可配置的协调机制来统一系统的状态。Zookee...

weixin_30678349的博客 847

Zookeeper(2)基础架构与内部原理解析(数据存储、watch机制、监听器、选举机制)

目录 一、概述 二、特点 三、应用场景 1、 统一命名服务 2、统一配置管理 3、统一集群管理 4、服务器节点动态上下线 5、软负载均衡 四、工作原理 五、数据与存储 1、内存数据 2、事务日志 3、snapshot-数据快照 4、初始化 5、数据同步 6、写数据流程 六、watch机制 七、监听器原理(面试重点) 八、选举机制(面试重点) 一、概述 Zookeeper是一个分布式应用程序的协调服务。它是一个为分布式应用提供一致性服务的软件,提供的性能包括:配置维护

weixin_43230682的博客 2068

Zookeeper系列(十六)Zookeeper原理解析之选举之选举流程

QuorumPeer的run方法中主要用来进行选举,以及选举后进入各角色,角色被打破重新再进行选举,下图大体流程 2.1.1基本概念 Logicalclock, currentEpoch,acceptedEpoch   epoch  zxid 2.2.2选举算法创建          Zookeeper启动的时候,quorumPeer线程的start

luckykapok918的专栏 560

浅谈Zookeeper【三】ZK中Leader选举算法

文章目录一、前言二、Leader选举基本概念集群服务节点状态 State:选票模型 Vote选举网络通信管理器 QuorumCnxManager三、Leader选举触发时机四、Leader选举过程集群初始化选举Leader宕机后选举五、新节点加入与选举规则新节点加入选举规则六、选举算法FastLeaderElection解析七、总结 一、前言 前面已经介绍过Zookeeper的基础知识以及ZAB协议的一些概念,其中ZAB协议中关键性的发现步骤,也就是Leader选举机制是如何完成的,在这里简单介绍一下。 二

Yu_uuuuu的博客 1674

物联网实战--驱动篇之(一)EEPROM存储器(AT24C64)

AT24C64的驱动程序讲解

ypp240124016的博客 6467

ZooKeeper ZAB 协议:选举与广播原理解析

基于源码深度解析,ZooKeeper ZAB 协议:选举与广播原理解析

m0_57877510的博客 858

Zynq实战:如何用AXI4-Stream To Video Out实现HDMI视频输出(附时序调试技巧)

本文详细介绍了基于Zynq平台使用AXI4-Stream To Video Out IP核实现HDMI视频输出的工程化解决方案。内容涵盖系统架构设计、AXI4-Stream接口优化、异步FIFO配置、时序同步调试技巧等核心环节,特别针对1080p60视频输出提供具体参数配置和性能优化建议,帮助开发者快速构建稳定的视频处理系统。

sql99的博客 463

Zookeeper系列(二十三)Zookeeper原理解析之选举流程

选举之QuorumPeerMain加载 Zookeeper集群启动的入口类是QuorumPeerMain来加载配置启动QuorumPeer线程。首先我们来看下QuorumPeer, 谷歌翻译quorum是法定人数,定额的意思, peer是对等的意思,那么QuorumPeer中quorum代表的意思就是每个zookeeper集群启动的时候集群中zookeeper服务数量就已经确定了,在每个

luckykapok918的专栏 489

产品竞争策略方法论:构建“差异化 + 结构化 + 系统化”的竞争优势

本文系统探讨了IoT产品竞争策略,指出当前企业普遍存在硬件能力强但商业竞争能力不足的问题。文章构建了五层竞争模型(产品层、体验层、服务层、数据层、生态层),提出五大核心竞争策略(成本领先、差异化竞争、聚焦竞争、生态竞争、数据驱动竞争),并详细阐述了差异化设计方法。通过行业案例分析(小米、苹果、特斯拉)和五步落地方法,强调从硬件竞争向系统优势转变的重要性。文章指出IoT竞争胜负关键在后半场的数据运营和服务延伸,建议企业通过构建差异化能力、完善服务体系、建立数据体系、逐步构建生态来避免价格战陷阱,实现从跟随到领

专注智能硬件软硬件产品经理成长与实战,分享从需求定义到量产落地的真实日记。涵盖IoT趋势洞察、研发协作经验、产品方法论与工具箱,用轻松有趣的“汪式”视角,陪伴产品经理成长、避坑与升级。 360

模电仿真软件:MultSim14.3下载与安装

在setup文件夹中,找到【Install.exe】文件,然后右键单击选择【以管理员身份运行】(这一步超级重要,否则可能会出现权限不足导致安装失败)!解压完成后,打开解压出来的文件夹,找到并进入【setup】文件夹(这一步很重要,不要进错文件夹)。4、在弹出的安装向导中,仔细阅读许可协议后,选择【我接受】,然后点击【下一步】继续安装过程。首先我们需要将下载好的安装包解压到本地文件夹,确保有足够的磁盘空间(建议至少5GB以上)!按照安装向导的提示,点击【下一步】继续(保持默认设置即可,除非你有特殊需求)

weixin_44264994的博客 2343

ZooKeeper集群架构解析:分布式环境下的Leader选举机制与实现原理

ZooKeeper 是一个开源的分布式协调框架,提供分布式系统中的数据一致性保障和协同服务。它通过共享配置存储、命名服务、分布式锁、Master选举等功能,帮助系统实现跨节点协作与状态管理。

mxt51220的博客 822

1553B通信项目开发笔记(一)协议概述

最近接了个项目,需要用1553B协议通信,仅作为RT端口进行通信,控制器采用ARM 使用芯片为国产的BU61580芯片,功能和引脚和DDC的61580完全一致。

u010396127的博客 2万+

(十一)Zookeeper原理源码分析之FLE(FastLeaderElection)算法集群选举原理流程源码解析

目录 1.前话 2.源码分析 2.1 FastLeaderElection选举发送通知 2.2 通信对的SendWorker对象监听集合并发送消息 2.3 通信对的RecvWorker对象接收消息 2.4 WorkerReceiver处理通信对接收到的消息 2.5 FastLeaderElection对象处理集群响应消息 2.6 QuorumPeer处理选举结果 1.前话 前面一篇已经分析过了FLE算法各个机器间创建通信结构的流程源码,即分析原理流程的时候各个机器是可以正常的发送及接收消

Armyyyyy丶的博客 542

Unity中实现HLS视频加密与流式播放的完整方案

本文详细介绍了在Unity中实现HLS视频加密与流式播放的完整方案。针对Unity原生VideoPlayer无法直接支持实时解密的问题,提出了基于HLS协议与AES-128加密的成熟解决方案,并重点阐述了如何利用AVPro Video插件进行集成。文章涵盖了从密钥生成、使用FFmpeg进行视频加密切片,到在Unity中动态加载密钥并播放加密流的全流程,为保护付费课程、独家动画等视频内容提供了安全且高效的实践路径。

weixin_29290963的博客 393

手把手教你用二茂铁催化剂搞定醇的动力学拆分(保姆级实验避坑指南)

本文详细介绍了使用平面手性二茂铁催化剂进行醇的动力学拆分的全流程,包括催化剂选择与制备、反应体系搭建与条件优化、实时监测与反应淬灭、产物分离与纯化等关键步骤。通过实战案例和避坑指南,帮助实验人员实现>98% ee的拆分效果,特别适合需要高光学纯度二级芳基醇或烯丙醇的研究者。

weixin_30500105的博客 440

Zookeeper leader选举机制

在Zookeeper中,分为两种选举情况,一种是初始化集群分布式的时候会进行leader选举,另外一种是在运行期间leader出现故障会进行选举,所以一般Zookeeper的服务器机器数量都会选择为奇数。在分布式CAP理论中,zookeeper属于一个CP系统,即一致性、分区容错性,它保证了集群数据的一致性,但适当舍弃了一些高可用。 zookeeper节点的4种状态: LEADIN...

程序员 1万+

汽车行业OTD业务模式入门学习

本文是在学习彭俊松老师的《汽车行业整车订单交付系统》后,对于OTD理解的一些摘录,供诸位参考学习。

qq_40664711的博客 1万+

Zookeeper选举整体流程源码解析

一 Zookeeper选举流程概述 Zookeeper选举机制分为两种:第一次启动的时候和非第一次启动的时候。假设有5个节点,如图1.1所示: 图1.1 ZK集群 1.1 第一次启动 (1)服务器1启动,发起选举。服务器1投自己一票,此时服务器1有一票,未超过半数以上票数,选择无法完成,服务器保持状态为LOOKING; (2)服务器2启动,再次发起选举。服务器1和服务器2分半先投给自己1票,服务器1和服务器2会通信,此时服务器1发现服务器2的myid比自己大,...

xad669475795的博客 950

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【Zookeeper进阶】大白话解释Zookeeper的选举机制

Zookeeper 是一个分布式服务框架,主要是用来解决分布式应用中遇到的一些数据管理问题如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。 我们可以简单把 Zookeeper 理解为分布式家庭的大管家,那么管家团队是如何选出Leader的呢?好奇吗,接下来带领大家一探究竟。 人类选举的基本原理 讲解 Zookeeper 选举过程前先来介绍一下人类的选举。 我们每个人或多或少都经历过几次选举,在投票的过程中可能会遇到这样几种情况: 情况1:自己与几个候选人都比较熟,你会将票投给你认为能力.

LoveSummer 774

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

Zookeeper选举算法原理

一、前言 前面学习了Zookeeper服务端的相关细节,其中对于集群启动而言,很重要的一部分就是Leader选举,接着就开始深入学习Leader选举。 二、Leader选举 2.1 Leader选举概述 Leader选举是保证分布式数据一致性的关键所在。当Zookeeper集群中的一台服务器出现以下两种情况之一时,需要进入Leader选举。 (1) 服务器初始化启动。 (2) 服务器运...

La victoria的博客 2800

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

zookeeper的leader选举原理和底层源码实现超级详解

zookeeper选举超级详解

zhenghuishengq的博客 5385

Zookeeper集群leader选举机制

目录 一、概述 二、zab协议 三、Zookeeper的leader选举 四、总结 一、概述 前面一篇文章我们总结了如何在linux中搭建zookeeper集群,并且可以看到三台服务器分别启动后,zookeeper内部会自动选举出一个leader领导者,其他两台服务器都是作为follower跟随者角色存在,那么,zookeeper内部具体是如何选举产生这个leader的呢?本篇我们文章我们就将一一分析。 二、zab协议 zab协议的全称是 Zookeeper Atomic Broadcast

weixiaohuai的博客 1646

Apache ZooKeeper之选举机制

zookeeper默认的算法是FastLeaderElection,采用投票数大于半数则胜出的逻辑。 选举机制概念 : 一 服务器ID 比如有三台服务器,编号分别是1,2,3。 编号越大在选择算法中的权重越大。 二 选举状态 LOOKING,竞选状态。 FOLLOWING,随从状态,同步leader状态,参与投票。 OBSERVING,观察状态,同步leader...

最慢的步伐不是跬步,而是徘徊;最快的脚步不是冲刺,而是坚持 6755

zookeeper集群选举机制

选举机制 1)半数机制:集群中半数以上机器存活,集群可用。所以zookeeper适合装在奇数台机器上。 2)Zookeeper虽然在配置文件中并没有指定master和slave。但是,zookeeper工作时,是有一个节点为leader,其他则为follower,Leader是通过内部的选举机制临时产生的 3)以一个简单的例子来说明整个选举的过程。 假设有五台服务器组成的zookeeper...

kxj19980524的博客 1588
上一篇: 知识技能学习表
nigel-wang
博客等级 码龄10年 6粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值