注意:不要把apiserver当作controller与agent交互的中间对象来使用,保持单向性原则,一方修
改,另一方得到配置,避免同时修改一个字段。apiserver放的是配置,应当只有controller下发配
置,agent得到配置执行。agent通过status更新的最好是状态,对于agent需要上报的数据,应该
走数据通道。
etcd
etcd 是一个分布式、可靠的键值存储系统,主要用于共享配置和服务发现等场景,在分布式系统领域有着重要地位,以下是关于它的详细介绍:
基本特点
分布式架构
etcd 采用分布式的设计理念,数据会在多个节点之间进行复制和存储。这意味着即使部分节点出现故障,整个系统依然能够正常运行,提供数据的读取和写入服务,有效提高了系统的可用性和可靠性。
例如,在一个由 5 个节点组成的 etcd 集群中,当其中 1 个节点发生故障时,其余 4 个节点仍可继续处理客户端的请求,保证业务不受太大影响。
一致性保证
它基于 Raft 算法来实现强一致性。Raft 算法确保在集群中的各个节点对于数据的状态能够达成一致的认识。
也就是说,无论客户端从哪个节点进行数据的读写操作,都能得到相同且最新的结果,避免了数据不一致可能导致的各种问题,如业务逻辑混乱等。
键值存储模型
etcd 以简单的键值对形式来存储数据。键(Key)是用于唯一标识数据的字符串,值(Value)则可以是任意类型的数据,比如字符串、数字、JSON 格式的数据等。
例如,可以将应用程序的配置参数以键值对的形式存储在 etcd 中,如 “app_config.port”: “8080” 就表示将应用程序的端口配置参数存储其中,方便进行统一管理和动态更新。
主要用途
配置管理
在分布式系统中,往往有大量的应用程序和服务,每个都有各自的配置参数。etcd 可以作为一个集中的配置存储中心,将这些配置参数以键值对的形式存储起来。
当需要修改配置时,只需更新 etcd 中的相应键值对,各个应用程序和服务就可以实时获取到最新的配置,无需逐个去重启或重新配置每个应用,大大提高了配置管理的效率和灵活性。
服务发现
对于由众多微服务组成的分布式系统,服务之间需要相互发现和通信。etcd 可以记录各个服务的实例信息,如服务的 IP 地址、端口号、服务状态等。
当一个服务需要调用另一个服务时,它可以通过查询 etcd 来获取目标服务的最新实例信息,从而实现准确的服务连接和调用,使得微服务架构下的服务间协作更加顺畅。
分布式锁
在一些需要对共享资源进行互斥访问的场景中,etcd 可以用来实现分布式锁。通过在 etcd 中创建特定的键值对来表示锁的状态,多个客户端可以竞争获取这个锁。
只有获取到锁的客户端才能对共享资源进行操作,操作完成后再释放锁,保证了在分布式环境下对共享资源的有序访问,避免了资源冲突等问题。
与其他类似系统的比较
与 Zookeeper 的比较
一致性模型方面:etcd 基于 Raft 算法实现强一致性,而 Zookeeper 采用的是 ZAB 算法。虽然都能保证一致性,但实现方式有所不同。
数据模型方面:etcd 采用简单的键值对模型,相对更加简洁直观;Zookeeper 的数据模型则相对复杂一些,它除了可以存储键值对外,还支持类似文件系统的层次结构存储。
在应用场景上,两者都可用于配置管理、服务发现等,但由于 etcd 的键值对模型简洁以及 Raft 算法在一些情况下更易理解和维护,使得它在一些新兴的分布式系统项目中应用越来越广泛。
与 Consul 的比较
服务发现功能上:Consul 在服务发现方面有自己的特色,它除了可以像 etcd 那样记录服务的基本信息用于发现外,还提供了健康检查等更多功能来确保服务的可用性。
数据存储方面:etcd 是单纯的键值存储系统,而 Consul 除了存储键值对外,还存储了大量与服务相关的信息,其数据存储结构相对复杂一些。
两者在分布式系统中都有各自的优势,具体使用哪种更多取决于项目的具体需求和侧重点。
总之,etcd 作为一种分布式键值存储系统,凭借其分布式架构、强一致性以及在配置管理、服务发现等方面的出色表现,在现代分布式系统的构建和运行中发挥着重要作用。
Raft 算法
很简单。 分布式储存系统中存在 Leader 、 Follower 、 Candidate, 一个 Leader 负责整个系统, 然后 Leader 坏了就重选一个。使用心跳包来确认各个角色是正常的。 同步机制是
Leader 将请求转化为日志条目发送给 Follower 复制,多数节点成功复制某条日志条目后该条目对应的操作才被认为已提交。
ZAB 算法
增加了 Observer 角色, 同样要心跳包、 要选举。同步机制是 Leader 接收到事务请求后转化为事务并加入事务队列,通过广播形式发送给 Follower 和 Observer,Follower 和 Observer 需检查日志匹配情况后处理事务。
资源定义
API-Server 作为 controller 和 Agent 之间配置交互的通道,负责配置资源的管理。Controller 上与 Agent 相关的配置抽象成资源,每种资源定义一个资源文件,基于资源文件生成客户端代码,使用客户端代码对资源进行增删改查监听等操作。