Skip to main content

moregeek program

分布式存储之 etcd 的集群管理_mb60939e30d6d2e的博客-多极客编程

在分布式文件存储中,我们通常会面临集群选主,配置共享和节点状态监控的问题。通过 etcd(基于 Raft 协议))可以实现超大规模集群的管理,以及多节点的服务可靠性。今天,我们就聊聊 etcd 在分布式存储中的具体应用。


什么是 etcd ?

分布式存储之 etcd 的集群管理_高性能


etcd 是由 CoreOS 公司开发的一个开源的分布式 KV 存储,主要用于服务发现、共享配置以及一致性保障。etcd 的灵感来自于 ZooKeeper 和 Doozer,但它更侧重以下几点:


  • 简单:安装配置简单,支持 curl 方式的用户 API (HTTP+JSON)。
  • 安全:可选支持 SSL 客户端证书验证。
  • 快速:根据官方提供的 benchmark 数据,单实例支持每秒 1w+ 写操作。
  • 可靠:采用 Raft 算法,实现分布式系统数据的可用性和一致性。


为什么采用 etcd ?

谈到 etcd,我们不免会与 Zookeeper(以下简称 ZK)或 Consul 进行比较,Consul 的可靠性和稳定性还需要时间来验证(项目发起方自己也并未使用);ZK 和 etcd 都是顺序一致性的(满足 CAP 的 CP),这就意味着无论我们访问任意节点,都将获得最终一致的数据视图。对比 ZK, etcd 具有以下优势:


  • 一致性:etcd 使用 Raft 协议,简单易懂,而 ZK 使用 ZAB(类 paxos 协议),该协议以复杂著称,尤其对初学者来说。
  • 运维方面 :etcd 比 ZK 更容易运维。
  • 项目活跃度 :etcd 社区比较活跃,代码贡献者超 700 人,目前一直在更新。而 ZK 社区相比活跃度不是那么高,代码贡献者 170 多人,版本很久没有更新。
  • 接口方面:etcd 提供了 http + json,grpc 接口,支持跨平台。而 ZK 需要使用其专属客户端。
  • 安全性:etcd 支持 https 访问,ZK 在这方面缺失。


etcd 架构及工作原理

etcd 架构图

分布式存储之 etcd 的集群管理_分布式存储_02

  • 网络层 HTTP Server:用于处理用户发送的 API 请求以及其它 etcd 节点的同步与心跳信息请求。
  • Raft 模块:Raft 强一致性算法的具体实现,是 etcd 的核心。
  • Store 模块:涉及 KV 存储、WAL 文件、Snapshot 管理等,用户处理 etcd 支持的各类功能的事务,包括数据索引节点状态变更、监控与反馈、事件处理与执行,是 etcd 对用户提供的大多数 API 功能的具体实现。
  • 副本状态机:这是一个抽象的模块,状态机的数据维护在内存中,定期持久化到磁盘,每次写请求都会持久化到 WAL 文件,并根据写请求的内容修改状态机数据。

etcd 工作原理

etcd 集群是一个分布式系统,由多个节点相互通信构成整体对外服务。每个节点都存储了完整的数据,并且通过 Raft 协议保证每个节点维护数据的一致性。在 Raft 协议中,有一个强 leader,由它全权负责接收客户端的请求命令,并将命令作为日志条目复制给其他服务器,在确认安全后,将日志命令提交执行。当 leader 故障时,会选举产生一个新的 leader。在强 leader 的帮助下,Raft 将一致性问题分解为三个子问题:

1、Leader 选举:当已有的 leader 故障时必须选出一个新的 leader。

2、日志复制:leader 接受来自客户端的命令,记录为日志,并复制给集群中的其他服务器,并强制其他节点的日志与 leader 保持一致。

3、安全 safety 措施:通过一些措施确保系统的安全性,如确保所有状态机按照相同顺序执行相同命令的措施。

etcd 在分布式存储中的应用

对于分布式存储来说,需要存储提供一些公用的配置信息,提供统一的集群视图。存储具备读写速度快,支持高可用且部署简单。此时,就需要使用到 etcd 了。

分布式存储节点角色一般有:mgr,mds 和 oss。其中 mgr 是集群的管理节点,提供共享配置和维护集群主从视图,mds 存储集群的元数据,oss 则用来存储用户数据。

将 etcd 纳入分布式存储内部的架构图如下所示:

分布式存储之 etcd 的集群管理_分布式存储_03

利用 etcd lease 机制为分布式存储选主

etcd lease 机制能够确保一个 etcd 集群中的 key 拥有一种临时性的特征,被指定某个 lease 的 key 只能在集群中存活某一段时间,时间到了就会被集群自动删除。这段存活时间叫做 TTL (Time To Live)。

mgr 节点之间可以竞争 etcd 中同一个拥有 lease 属性的 key,比如: “/dfs/mgr/master”。当一个 mgr 节点竞争到这个 key,他就成为了mgr 主,同时其他节点就成为了 mgr 从。mgr 节点存活期间,定期给自己的 lease 续租,就可以一直保持自己的 mgr 主身份。一旦 mgr 主发生异常(比如宕机),过了 TTL 时间后,其持有的 key 就会被自动删除。此时,mgr 从节点发现 “/dfs/mgr/master” key 不存在后,就会重新竞争 mgr 主,重新获得此 key 的 mgr 升级为新的 mgr 主。

利用 etcd watch 机制为组件探活

etcd 提供了watch 机制,客户端 watch 了一系列 key,当这些被 watch 的 key 数据发生变化时,就会产生相应的事件通知客户端,相关的事件类型有:set, delete, update, create, compareAndSwap, compareAndDelete。

在 mds 服务启动时,向 etcd 注册自己的 ip(例如 /dfs/mds_nodes/, /dfs/mds_nodes/...),该 key 拥有 lease 属性。一旦 mds 服务异常,该 mds 的 ip 就会从 etcd 中 /dfs/mds_nodes 自动删除。这样,我们在 mgr 主节点启动监听 /dfs/mds_nodes 目录,就会得到某个 mds 上线和下线的事件通知,并且可以对 mds 相应的状态做标记,如果是 mds 主下线,则立即执行 mds 主从切换。

oss 同 mds 一样,监听的的目录变为 /dfs/oss_nodes。

通过 etcd 的 watch 机制,我们能快速地感知到 mds 或 oss 故障,进行 mds 或 oss 的主从切换(时间控制在 10 秒以内),从而保证客户端业务不受影响。

利用 etcd 做配置共享

etcd 高可用特性和快速读写,为我们使用配置共享提供了基础。我们把 mgr,mds,oss 的配置信息写入 etcd 集群中,各个组件从 etcd 集群中读取相应配置即可。

etcd 集群节点个数和性能

据 etcd 官网介绍,etcd V3 版本最高可以提供每秒 1 万次写入操作。但是随着 etcd 节点个数的增加,其写入性能会逐渐降低,所以我们一般采用 3 节点,5 节点或 7 节点部署 etcd 集群。大家可能会问:为什么不采用偶数节点,比如 4 节点,6 节点呢?因为 etcd 采用 Raft 协议,是 quorum 机制,要求半数以上节点在线。所以 4 节点的容错性和 3 节点是等价的,都是只能允许一个节点故障。但是多一个节点,一方面写入性能不如 3 节点,另一方面偶数节点在 etcd 内部选主时,有可能造成某一轮两个 candidate 节点获取的选票一致,从而延长选主时间。

etcd 支持 IPv6 协议

对于某些用户,为了安全,不提供 IPv4 地址,主机只有 IPv6 地址。这时候,etcd 的 IPv6 就发挥作用了。我们用实例展示,etcd 如何配置 IPv6 进行节点间通信,如下图所示(etcd 单节点集群):

分布式存储之 etcd 的集群管理_高性能_04

该实例的 IPv6 地址为 2022::24, 使用时,用 [] 将 IPv6 地址括起来即可。需要注意的是该 IPv6 地址只能使用 Scope global 类型,不能使用 Scope link 类型,否则,在启动 etcd 服务时,会报 bind 地址无效错误。

据统计,目前至少有 CoreOS、 Kubernetes、Cloud Foundry, 以及在 Github 上超过 500 个项目在使用 etcd。

©著作权归作者所有:来自51CTO博客作者YRCloudFile的原创作品,请联系作者获取转载授权,否则将追究法律责任

prometheus alertmanager 生产实践-直接根据 to_email label 发 alert 到对应邮箱_东风微鸣云原生观察的博客-多极客编程

## 概述通过之前的文章 - [Prometheus Alertmanager 生产配置趟过的坑总结](​​https://ewhisper.cn/posts/31626/​​), 我们已经知道 AlertManager 作为告警平台,是非常强大的,可以去重 (deduplicating),分组 (grouping),并将它们路由 (routing) 到正确的接收器 (receiver) 集成,如

振弦采集模块的通讯速率和软件握手( uart)_河北稳控科技的博客-多极客编程

振弦采集模块的通讯速率和软件握手( UART) 1 通讯速率 VMXXX 的 UART 接口支持 9600~460800bps 通讯速率,通过设置寄存器 BAUD.[13:0]来改变通讯速率, BAUD.[13:0]的单位为“每秒百位” 或“ 百 bps” 。 寄存器取值与对应的通讯速率如下表:在条件允许情况下,尽量使用较高的通讯速率, 缩短数据传输时间。 注:关于 UART 通讯的其它参数(校验

多线程的那点儿事(之多核编程)-多极客编程_多核多线程编程

    多核编程并不是最近才兴起的新鲜事物。早在intel发布双核cpu之前,多核编程已经在业内存在了,只不过那时候是多处理器编程而已。为了实现多核编程,人们开发实现了几种多核编程的标准。open-mp就是其中的一种。对于open-mp还不太熟悉的朋友,可以参照​​维基百科​​的相关解释。    open-mp的格式非常简单,原理也不难。它的基本原理就是创建多个线程,操作系统把这几个线程分到几个

来聊聊怎么做硬件兼容性检测,快速迁移到openeuler?_openeuler的博客-多极客编程

作为一款免费的企业级 Linux 操作系统,自CentOS 8 宣布停止维护以来(2021年底),就引发行业的广泛关注。究其原因,不仅在于 CentOS 用户群体庞大,还在于迁移 CentOS 并不是简单的系统重新安装,而是需要对操作系统及其上搭载的应用软件和业务系统进行替代、适配、迁移和重构等。因此,如何高效安全且低风险地实现应用迁移,成为用户所关心的核心问题。国内操作系统迁移方案很多,开源操作

面向大规模队列,百万并发的多优先级消费系统设计_阿里云视频云的博客-多极客编程

大规模队列的核心诉求,不仅需要「快」,还需要兼顾「公平」。 01 引言 HTTP是一种常用的通信协议,除了常见网站访问、上传下载,HTTP协议还经常被用在消息推送场景上。   设想你搭建了一个电商平台,有很多大型商家入驻了该电商平台并售卖各类商品,在消费者购买某个商品后,平台会通过HTTP协议将消费者购买商品的信息通知商家,商家则会在后台接收平台推送过来的消息。   一般情况下,所有的系统都正

vmware esxi 日常维护及 vsan 常用指令_虚拟的现实的博客-多极客编程

1.Esxi 主机升级步骤VMWare群集主机升级UEFI(BIOS)维护步骤:1、关停群集DRS2、迁出需维护主机的所有运行中虚拟机到群集其他主机3、主机进入维护模式4、带外升级固件5、升级完成确认版本及硬件等状态6、主机退出维护模式7、开启DRS2.VSAN 相关指令语法格式:vsish [参数]常用参数:ls    显示所有的节点信息set    设置vc配置参考实例获取内存映射表:[roo

uos本地源配置_影玺阁的博客-多极客编程

创建iso挂载点:root@Ispsrv:~# mkdir /mnt/uos配置永久挂载:root@Ispsrv:~# vi /etc/fstab #添加内容/dev/cdrom /mnt/uos iso9660 defaults 0 0挂载全部:root@Ispsrv:~# mount -amount: /mnt/uos: WARNING: device write-protected, mou

深入浅出文件系统新形态_mb60939e30d6d2e的博客-多极客编程

文件系统历史悠久,在各种场景中都得到了广泛的应用,从独立的一块硬盘 DAS、到集中的 NAS、再到目前广泛使用的分布式文件存储、云存储等。从发展历程来看,主要是从数据规模角度解决了业务对文件系统的需求,但并未给实际使用场景带来本质变化,依然需要维护大量的硬件资源;在业务发展进程中,依然存在各自为政的“烟囱”式存储;数据共享需要依赖拷贝的方式,从而导致数据重复。究其根源是缺少有效合理的数据分享机制,

[nrf51][nrf52] 非静态地址设置白名单,导致程序死机_xuejianqiang的博客-多极客编程

静态地址规则这种特定类型的蓝牙地址可作为公共地址的一种流行替代方法,因为使用它无需付费。随机静态地址可以通过以下两种方式之一使用:可以在设备的使用寿命内分配和固定它可以在启动时更改但是,无法在运行时更改它。随机静态地址的格式如下:随机静态地址格式1和1固定在最低有效位剩余的46位由开发人员/制造商随机选择重要说明:所有蓝牙设备都必须使用以下两种类型之一:公共地址或随机静态地址。 静态设备地址的特征

自建云服务计费系统_赵大奇的博客-多极客编程

自从Laxcus分布式操作系统正式开源两个月以来,可能是它一站式云计算平台属性和超大规模计算能力,给用户带来极大的便利,下载量一直持续增加,最近网站后台总是有用户在问,在Laxcus分布式操作系统的社区版本基础上,编写一个计费系统,应该如何实现,分哪些步骤之类的问题。下面简单说一下这个问题,先说下计费编程的大概情况,下一篇咱们再详细说如何编写Laxcus云计费系统。​标准的云服务计费系统,目前是属

redis 部署文档_赵承胜博客的博客-多极客编程

redis 部署文档集群规划主节点从节点端口192.168.40.181/24192.168.40.180/247000添加用户groupadd -g 11111 redis;useradd -d /home/redis -g 11111 -u 11111 -m redis;echo 'redis:Zj!@#1022' | chpasswd;chage -M 99999 redis;usermod

aws 强制 开启 mfa_秋枫鹤泣的博客-多极客编程

创建一个策略{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowViewAccountInfo", "Effect": "Allow", "Action": [ "iam:GetAccountPasswordPoli