乐趣区

关于etcd:分布式集群中间件搭建2-etcd集群搭建

前言

​ 本文次要介绍 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 的写入效率升高。

工作原理

架构

  • 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这种奇数的节点个数(依赖于主从节点投票选举策略)。所以理论搭建须要综合思考性能和容错能力再定,对于节点数和容错能力对应关系,如下表:

集群大小 最大容错
1 0
3 1
4 1
5 2
6 2
7 3
8 3
9 4

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

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

动态 IP 地址形式

主机布局

name IP HOSTNAME
etcd-master 10.0.0.20 etcd-master
etcd-slave-node01 10.0.0.21 etcd-slave-node01
etcd-slave-node02 10.0.0.22 etcd-slave-node02

节点虚拟机搭建

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

etcd 主节点虚拟机

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

实现后关上 etcd-master 虚拟机,输出命令 cd /etc/sysconfig/network-scripts 关上网卡配置vim ifcfg-ens33 配置动态 IP 地址,

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

查看 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

三台搭建结束后,上面就能够应用 shell 命令客户端工具(Xshell、MobaXterm 等)连贯虚拟机做 etcd 搭建操作了。

etcd 集群搭建

etcd 装置

应用客户端连贯 CentOS 虚拟机

输出命令yum install -y etcd 装置 etcd

进入 etcd 配置文件目录,先应用命令 cp /etc/etcd/etcd.conf /etc/etcd/etcd.conf.bak 备份 etcd.conf 避免失落。

而后在批改 etcd.conf 配置文件来搭建集群节点。咱们先 vim etcd.conf 关上配置文件看看外面的内容(属性详解见“etcd 配置文件属性详解”章节)。

批改 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"

批改 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"

批改 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"

etcd 启动

执行命令启动 etcd,能够看到集群已搭建胜利。

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

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

如上已胜利搭建 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"
退出移动版