前言

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

集群大小最大容错
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主节点

实现后关上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-reloadsystemctl enable etcdsystemctl restart etcdexport 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"