头图

前言

​ 本文主要介绍etcd的基本原理及基于CentOS模板机克隆搭建etcd集群。

简介

​ etcd这个名字源于两个想法,即unix “/etc” 文件夹和分布式系统”d”istibuted。 “/etc” 文件夹为单个系统存储配置数据的地方,而 etcd 存储大规模分布式系统的配置信息。因此,”d”istibuted 的 “/etc” ,故而称之为 “etcd”。

​ etcd 是一个用Go编写的高可用 Key/Value 存储系统,分布式系统中最关键的数据的分布式、可靠的键值存储(配置文件基本格式为key=value ),etcd 的灵感来自于 ZooKeeper 和 Doozer,它具有出色的跨平台支持,小型二进制文件和背后的优秀社区。

Kubernetes 将配置数据存储到etcd中,用于服务发现和集群管理; etcd 的一致性对于正确安排和运行服务至关重要。Kubernetes API 服务器将群集状态持久化在 etcd 中。它使用etcd的 watch API监视集群,并发布关键的配置更改。

官方网站:https://etcd.io/

特征

  • 安装使用简单:使用标准HTTP工具(如curl)读取和写入值。
  • 支持分布式配置、服务发现、分布式协调功能:键值存储,将数据存储在按层次组织的目录中,支持监视特定的键或目录中的更改,并对值的更改作出反应。它提供了数据TTL失效、数据改变监视、多值、目录监听、分布式锁原子操作等功能,可以方便的跟踪并管理集群节点的状态。
  • 安全:可选 SSL 客户端证书认证。
  • 快速:单实例支持每秒 2k+ 读操作,单实例可达每秒1k 次写操作。

    • etcd定位是来代替配置文件的,所以其吞吐量不会很高 ,要是把它当redis用那就大错特错了,一个三成员etcd集群在轻负载下可以在每秒完成1000个请求,重负载下可以每秒完成超过30000个请求。
  • 可靠:通信使用 Raft 协议作为一致性算法实现分布式。

    • etcd目前默认使用2379端口提供http服务,2380 端口和 peers(集群内其他节点)通信。
    • 虽然 etcd 支持单点部署,但在生产环境中推荐使用集群部署方式,etcd 官方文档推荐的 etcd 集群大小是3、5、7、9奇数个节点。
    • etcd 会保证所有的节点都会保存数据,并保证数据的一致性和正确性。
    • 在etcd的集群中会选举出一位leader,其他etcd服务节点就会成为follower,在此过程其他follower会同步leader的数据,所有的follower都需要从leader同步完数据之后,leader才能继续写入新的数据,所以如果etcd的节点数量过多,则会导致同步的时间变长、导致leader的写入效率降低。

工作原理

架构

image-202103071321344621

  • HTTP Server:接受客户端发出的 API 请求以及其它 etcd 节点的同步与心跳信息请求。
  • Store:用于处理 etcd 支持的各类功能的事务,包括数据索引、节点状态变更、监控与反馈、事件处理与执行等等,是 etcd 对用户提供的大多数 API 功能的具体实现。
  • Raft:强一致性算法的具体实现,是 etcd 的核心算法。
  • WAL(Write Ahead Log,预写式日志):是 etcd 的数据存储方式,etcd 会在内存中储存所有数据的状态以及节点的索引,此外etcd 还会通过 WAL 进行持久化存储。WAL 中所有的数据提交前都会事先记录日志。

    • Snapshot 是为了防止数据过多而进行的状态快照;
    • Entry 表示存储的具体日志内容。

通常,一个用户的请求发送过来,会经由 HTTP Server 转发给 Store 进行具体的事务处理,如果涉及到节点数据的修改,则交给 Raft 模块进行状态的变更、日志的记录,然后再同步给别的 etcd 节点以确认数据提交,最后进行数据的提交,再次同步。

原理

etcd术语

  • Raft:etcd所采用的保证分布式系统强一致性的算法。
  • Node:一个Raft状态机实例。
  • Member: 一个etcd实例。它管理着一个Node,并且可以为客户端请求提供服务。
  • Cluster:由多个Member构成可以协同工作的etcd集群。
  • Peer:对同一个etcd集群中另外一个Member的称呼。
  • Client: 向etcd集群发送HTTP请求的客户端。
  • WAL:预写式日志,etcd用于持久化存储的日志格式。
  • snapshot:etcd防止WAL文件过多而设置的快照,存储etcd数据状态。
  • Proxy:etcd的一种模式,为etcd集群提供反向代理服务。
  • Leader:Raft算法中通过竞选而产生的处理所有数据提交的节点。
  • Follower:竞选失败的节点作为Raft中的从属节点,为算法提供强一致性保证。
  • Candidate:当Follower超过一定时间接收不到Leader的心跳时转变为Candidate开始竞选。
  • Term:某个节点成为Leader到下一次竞选时间,称为一个Term。
  • Index:数据项编号。Raft中通过Term和Index来定位数据。

数据写一致性保证

etcd集群由多个 Node 相互通信构成整体对外服务,每个 Node 都维护了一个状态机。集群中同一时刻至多存在一个有效的Leader Node(主节点),多个Follower Node(从节点)。

  • 若客户端向 Leader Node 执行写入操作,则会通过 Raft 协议保证写入操作对状态机的改动会可靠的同步到其他 Follower Node。
  • 若客户端向 Follower Node 执行写入操作,则会将写入操作转发给 Leader Node ,由 Leader Node 写入之后再分发给集群上的所有其他Node。

最终达到每个 Node 都存储了完整一致的的数据。

数据读一致性保证

etcd集群数据流向都是从 Leader Node 流向 Follower Node,达到所有 Follower Node 的数据必须与 Leader Node 保持一致,如果不一致则会被覆盖。因为每个节点保存的数据是强一致的,所以客户端可以对任意节点进行读取。

集群搭建

根据 etcd 的分布式数据冗余策略,集群节点越多,容错能力(Failure Tolerance)越强,同时写性能也会越差,所以关于集群大小的优化,其实就是容错和写性能的一个平衡。etcd 官方文档推荐的 etcd 集群大小是 3, 5, 7这种奇数的节点个数(依赖于主从节点投票选举策略)。所以实际搭建需要综合考虑性能和容错能力再定,关于节点数和容错能力对应关系,如下表:

集群大小最大容错
10
31
41
52
62
73
83
94

etcd 集群的搭建有三种方式,包括:static 方式,etcd discovery 方式 和 DNS discovery。

接下来将演示3节点的etcd集群环境搭建。

静态IP地址方式

主机规划

nameIPHOSTNAME
etcd-master10.0.0.20etcd-master
etcd-slave-node0110.0.0.21etcd-slave-node01
etcd-slave-node0210.0.0.22etcd-slave-node02

节点虚拟机搭建

基于《分布式集群中间件搭建(1):VMware workstation pro16虚拟机安装以及CentOS7调优模板机封装》搭建后的模板机我们克隆3个节点并修改静态IP地址。

etcd主节点虚拟机

选中模板机克隆出etcd主节点

image-202103071407437811

image-20210307140946809

image-20210307140958163

image-20210307141128276

完成后打开etcd-master虚拟机,输入命令 cd /etc/sysconfig/network-scripts 打开网卡配置vim ifcfg-ens33 配置静态IP地址,

image-20210307141619401

image-20210307141920466

:wq!保存后,然后输入hostnamectl set-hostname etcd-master 设置主机名,然后输入service network restart重启网卡。

image-20210307142817362

查看ifconfig后IP已经变成10.0.0.20了。

etcd子节点虚拟机

按照etcd主节点的方式再克隆2个子节点,分别

etcd-slave-node01:

IPADDR="10.0.0.21"
hostnamectl set-hostname etcd-slave-node01

etcd-slave-node02:

IPADDR="10.0.0.22"
hostnamectl set-hostname etcd-slave-node02

image-20210307143405416

image-20210307144220699

三台搭建完毕后,下面就可以使用shell命令客户端工具(Xshell、MobaXterm等)连接虚拟机做etcd搭建操作了。

etcd集群搭建

etcd安装

使用客户端连接CentOS虚拟机

image-20210307145341958

输入命令yum install -y etcd 安装etcd

image-20210307150014695

进入etcd配置文件目录,先使用命令 cp /etc/etcd/etcd.conf /etc/etcd/etcd.conf.bak 备份etcd.conf防止丢失。

image-202103071506458861

然后在修改etcd.conf配置文件来搭建集群节点。我们先vim etcd.conf打开配置文件看看里面的内容(属性详解见“etcd配置文件属性详解”章节)。

image-20210307150757628

修改etcd-master的etcd.conf配置文件:

#[Member]
ETCD_NAME="etcd-master"
ETCD_LISTEN_PEER_URLS="http://10.0.0.20:2380"
ETCD_LISTEN_CLIENT_URLS="http://10.0.0.20:2379,http://127.0.0.1:2379"

#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.0.0.20:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://10.0.0.20:2379"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER="etcd-master=http://10.0.0.20:2380,etcd-slave-node01=http://10.0.0.21:2380,etcd-slave-node02=http://10.0.0.22:2380"

image-20210307160152349

修改etcd-slave-node01的etcd.conf配置文件:

#[Member]
ETCD_NAME="etcd-slave-node01"
ETCD_LISTEN_PEER_URLS="http://10.0.0.21:2380"
ETCD_LISTEN_CLIENT_URLS="http://10.0.0.21:2379,http://127.0.0.1:2379"

#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.0.0.21:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://10.0.0.21:2379"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER="etcd-master=http://10.0.0.20:2380,etcd-slave-node01=http://10.0.0.21:2380,etcd-slave-node02=http://10.0.0.22:2380"

image-20210307160323697

修改etcd-slave-node02的etcd.conf配置文件:

#[Member]
ETCD_NAME="etcd-slave-node02"
ETCD_LISTEN_PEER_URLS="http://10.0.0.22:2380"
ETCD_LISTEN_CLIENT_URLS="http://10.0.0.22:2379,http://127.0.0.1:2379"

#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.0.0.22:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://10.0.0.22:2379"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER="etcd-master=http://10.0.0.20:2380,etcd-slave-node01=http://10.0.0.21:2380,etcd-slave-node02=http://10.0.0.22:2380"

image-20210307161937248

etcd启动

执行命令启动etcd,可以看到集群已搭建成功。

systemctl daemon-reload
systemctl enable etcd
systemctl restart etcd
export ETCDCTL_API=3

使用命令etcdctl member list 查看节点状态。

image-20210307164952622

如上已成功搭建3节点的etcd集群环境。

etcd配置文件属性详解

Member 成员信息

  • #ETCD_CORS=""
    逗号分隔的CORS原始白名单(跨源资源共享)
  • ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
    指定节点的数据存储目录,若不指定,则默认是当前目录。这些数据包括节点ID,集群ID,集群初始化配置,Snapshot文件,若未指定–wal-dir,还会存储WAL文件
  • #ETCD_WAL_DIR=""
    独立设置wal目录,etcd会将WAL文件写入–wal-dir而不是–data-dir。独立的wal路径,有助于避免日志记录和其他IO操作之间的竞争。
  • #ETCD_LISTEN_PEER_URLS="http://localhost:2380"
    和成员之间通信的地址。用于监听其他etcd member的url
  • ETCD_LISTEN_CLIENT_URLS="http://localhost:2379"
    对外提供服务的地址
  • #ETCD_MAX_SNAPSHOTS="5"
    要保留的最大快照文件数(0表示不受限制)。
  • #ETCD_MAX_WALS="5"
    要保留的最大wal文件数(0表示不受限制)。
  • #ETCD_NAME="default"
    节点名称
  • #ETCD_SNAPSHOT_COUNT="100000"
    指定有多少事务(transaction)被提交时,触发截取快照保存到磁盘。
  • #ETCD_HEARTBEAT_INTERVAL="100"
    leader 多久发送一次心跳到 followers。
  • #ETCD_ELECTION_TIMEOUT="1000"
    重新投票的超时时间,如果 follow 在该时间间隔没有收到心跳包,会触发重新投票,默认为 1000 ms。
  • #ETCD_QUOTA_BACKEND_BYTES="0"
    当后端大小超过给定配额时(0默认为低空间配额),引发警报。
  • #ETCD_MAX_REQUEST_BYTES="1572864"
    服务器将接受的最大客户端请求大小(字节)。
  • #ETCD_GRPC_KEEPALIVE_MIN_TIME="5s"
    客户端在ping服务器之前应等待的最短持续时间间隔。
  • #ETCD_GRPC_KEEPALIVE_INTERVAL="2h0m0s"
    服务器到客户端ping的频率持续时间,以检查连接是否处于活动状态(0表示禁用)。
  • #ETCD_GRPC_KEEPALIVE_TIMEOUT="20s"
    关闭非响应连接之前的额外持续等待时间(0表示禁用)。

Clustering 集群信息

  • #ETCD_INITIAL_ADVERTISE_PEER_URLS="http://localhost:2380"
    该节点成员对等URL地址,且会通告群集的其余成员节点。
  • #ETCD_ADVERTISE_CLIENT_URLS="http://localhost:2379"
    此成员的客户端URL列表,用于通告群集的其余部分。这些URL可以包含域名。
  • #ETCD_DISCOVERY=""
    用于引导群集的发现URL。
  • #ETCD_DISCOVERY_FALLBACK="proxy"
    发现服务失败时的预期行为(“退出”或“代理”)。“proxy”仅支持v2 API。
  • #ETCD_DISCOVERY_PROXY=""
    用于流量到发现服务的HTTP代理。
  • #ETCD_DISCOVERY_SRV=""
    DNS srv域用于引导群集。
  • #ETCD_INITIAL_CLUSTER="default=http://localhost:2380"
    集群中所有节点的信息。此处default为节点的–name指定的名字
  • #ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
    创建集群的 token,这个值每个集群保持唯一。
  • #ETCD_INITIAL_CLUSTER_STATE="new"
    设置new为初始静态或DNS引导期间出现的所有成员。如果将此选项设置为existing,则etcd将尝试加入现有群集。
  • #ETCD_STRICT_RECONFIG_CHECK="true"
    拒绝可能导致仲裁丢失的重新配置请求。
  • #ETCD_ENABLE_V2="true"
    接受etcd V2客户端请求

Proxy 代理

  • #ETCD_PROXY="off"
  • #ETCD_PROXY_FAILURE_WAIT="5000"
  • #ETCD_PROXY_REFRESH_INTERVAL="30000"
  • #ETCD_PROXY_DIAL_TIMEOUT="1000"
  • #ETCD_PROXY_WRITE_TIMEOUT="5000"
  • #ETCD_PROXY_READ_TIMEOUT="0"

Security 安全

  • #ETCD_CERT_FILE=""

客户端服务器TLS证书文件的路径。

  • #ETCD_KEY_FILE=""

客户端服务器TLS密钥文件的路径。

  • #ETCD_CLIENT_CERT_AUTH="false"

启用客户端证书验证。

  • #ETCD_TRUSTED_CA_FILE=""

客户端服务器的路径TLS可信CA证书文件。

  • #ETCD_AUTO_TLS="false"

客户端TLS使用生成的证书

  • #ETCD_PEER_CERT_FILE=""

对等服务器TLS证书文件的路径。这是对等流量的证书,用于服务器和客户端。

  • #ETCD_PEER_KEY_FILE=""

对等服务器TLS密钥文件的路径。这是对等流量的关键,用于服务器和客户端。

  • #ETCD_PEER_CLIENT_CERT_AUTH="false"

启用对等客户端证书验证。

  • #ETCD_PEER_TRUSTED_CA_FILE=""

对等服务器TLS可信CA文件的路径。

  • #ETCD_PEER_AUTO_TLS="false"

Peer TLS使用自动生成的证书

Logging 日志

  • #ETCD_DEBUG="false"
  • #ETCD_LOG_PACKAGE_LEVELS=""
  • #ETCD_LOG_OUTPUT="default"

Unsafe

  • #ETCD_FORCE_NEW_CLUSTER="false"

强制创建新的单成员群集。它提交配置更改,强制删除集群中的所有现有成员并添加自身。需要将其设置为还原备份。

Profiling 配置信息

  • #ETCD_ENABLE_PPROF="false"

通过HTTP服务器启用运行时分析数据。地址位于客户端URL +“/ debug / pprof /”

  • #ETCD_METRICS="basic"

设置导出的指标的详细程度,指定“扩展”以包括直方图指标。

Auth 认证

  • #ETCD_AUTH_TOKEN="simple"

Version 版本

  • #ETCD_VERSION="false"#ETCD_AUTO_COMPACTION_RETENTION="0"

王继红
595 声望406 粉丝

我将来要当一名麦田里的守望者。有那么一群孩子在一大块麦田里玩。几千几万的小孩子,附近没有一个大人,我是说—除了我。我呢。就在那混帐的悬崖边。我的职务就是在那守望。要是有哪个孩子往悬崖边来,我就把他捉...


引用和评论

0 条评论