etcd是一个高可用的键值存储系统,主要用于共享配置和服务发现。etcd是由CoreOS开发并维护的,灵感来自于 ZooKeeper 和 Doozer,它使用Go语言编写,并通过Raft一致性算法处理日志复制以保证强一致性。Raft是一个来自Stanford的新的一致性算法,适用于分布式系统的日志复制,Raft通过选举的方式来实现一致性,在Raft中,任何一个节点都可能成为Leader。Google的容器集群管理系统Kubernetes、开源PaaS平台Cloud Foundry和CoreOS的Fleet都广泛使用了etcd。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开始Leader竞选。 |
Term | 某个节点成为Leader到下一次竞选开始的时间周期,称为一个Term。 |
Index | 数据项编号。Raft中通过Term和Index来定位数据。 |
etcd主要分为四个部分:
etcd使用Raft协议来维护集群内各个节点状态的一致性。简单说,ETCD集群是一个分布式系统,由多个节点相互通信构成整体对外服务,每个节点都存储了完整的数据,并且通过Raft协议保证每个节点维护的数据是一致的。
Raft 是一种为了管理复制日志的一致性算法。它提供了和 Paxos 算法相同的功能和性能,但是它的算法结构和 Paxos 不同,使得 Raft 算法更加容易理解并且更容易构建实际的系统。一致性算法允许一组机器像一个整体一样工作,即使其中一些机器出现故障也能够继续工作下去。正因为如此,一致性算法在构建可信赖的大规模软件系统中扮演着重要的角色。Raft算法分为三部分,分别是Leader选举、日志复制和安全性。
Raft 状态机
和Raft算法中的Term(任期)
两部分。作为Proxy角色的节点不会参与Leader的选举
,只是将所有接收到的用户查询和修改请求转发到任意一个Follower或者Leader节点上。)etcd应用场景很多,主要的有以下六种:服务发现、消息发布与订阅(配置中心)、负载均衡(集群管理)、分布式锁、分布式队列、集群监控与LEADER竞选。
服务发现(Service Discovery)要解决的是分布式系统中最常见的问题之一,即在同一个分布式集群中的进程或服务如何才能找到对方并建立连接。
从本质上说,服务发现就是想要了解集群中是否有进程在监听udp或tcp端口,并且通过名字就可以进行查找和连接。要解决服务发现的问题,需要有下面三大支柱,缺一不可。
在分布式系统中,最为适用的组件间通信方式是消息发布与订阅机制。
具体而言,即构建一个配置共享中心,数据提供者在这个配置中心发布消息,而消息使用者则订阅他们关心的主题,一旦相关主题有消息发布,就会实时通知订阅者。
通过这种方式可以实现分布式系统配置的集中式管理与实时动态更新。
利用etcd维护一个负载均衡节点表。etcd可以监控一个集群中多个节点的状态,当有一个请求发过来后,可以轮询式地把请求转发给存活着的多个节点。
类似KafkaMQ,通过Zookeeper来维护生产者和消费者的负载均衡。同样也可以用etcd来做Zookeeper的工作。
因为etcd使用Raft算法保持了数据的强一致性,某次操作存储到集群中的值必然是全局一致的,所以很容易实现分布式锁。
锁服务有以下两种使用方式:
在保证队列达到某个条件时再统一按顺序执行。这种方法的实现可以在/queue这个目录中另外建立一个/queue/condition节点。
通过etcd来进行监控实现起来非常简单并且实时性强,用到了以下两点特性。
这样就可以第一时间检测到各节点的健康状态,以完成集群的监控要求。
参数 | 使用说明 |
---|---|
--name 'default’ | 本member的名字 |
--data-dir '${name}.etcd’ | 指定节点的数据存储目录,这些数据包括节点ID,集群ID,集群初始化配置,Snapshot文件,若未指定-wal-dir,还会存储WAL文件;如果不指定会用缺省目录。 |
--listen-peer-urls http://0.0.0.0:2380 | 本member侧使用,用于监听其他member发送信息的地址。ip为全0代表监听本member侧所有接口 |
--listen-client-urls http://0.0.0.0:2379 | 本member侧使用,用于监听etcd客户发送信息的地址。ip为全0代表监听本member侧所有接口 |
--wal-dir ‘path’ | 到专用wal目录的路径 |
--snapshot-count ‘100000’ | number of committed transactions to trigger a snapshot to disk |
--heartbeat-interval ‘100’ | 检测间隔的时间(毫秒) |
--election-timeout ‘1000’ | 超时时间(毫秒) |
--initial-election-tick-advance ‘true’ | 是否提前初始化选举时钟启动,以便更快的选举 |
--max-snapshots ‘5’ | 要保留的最大快照文件数(0是无限的) |
--max-wals ‘5’ | 要保留的最大wal文件数(0是无限的) |
--cors ‘’ | comma-separated whitelist of origins for CORS (cross-origin resource sharing) |
--quota-backend-bytes ‘0’ | 当后端大小超过给定限额时发出警报(0默认为低空间限额) |
--max-txn-ops ‘128’ | 事务中允许的最大操作数 |
--max-request-bytes ‘1572864’ | 服务器将接受的最大客户端请求大小(以字节为单位) |
--grpc-keepalive-min-time ‘5s’ | 客户端在ping服务器之前应该等待的最小持续时间间隔 |
--grpc-keepalive-interval ‘2h’ | 检查连接是否激活的服务器到客户机ping的频率持续时间(0表示禁用) |
--grpc-keepalive-timeout ‘20s’ | 关闭无响应连接之前的额外等待时间(0表示禁用) |
参数 | 使用说明 |
---|---|
--initial-advertise-peer-urls 'http://localhost:2380’ | 其他member使用,其他member通过该地址与本member交互信息。一定要保证从其他member能可访问该地址。静态配置方式下,该参数的value一定要同时在–initial-cluster参数中存在。 memberID的生成受–initial-cluster-token和–initial-advertise-peer-urls影响。 |
--initial-cluster 'etcd01=http://localhost01:2380, etcd02=http://localhost02:2380, etcd03=http://localhost03:2380’ |
本member侧使用。描述集群中所有节点的信息,本member根据此信息去联系其他member。 memberID的生成受–initial-cluster-token和–initial-advertise-peer-urls影响。 |
--initial-cluster-state 'new’ | 用于指示本次是否为新建集群。有两个取值new和existing。如果填为existing,则该member启动时会尝试与其他member交互。集群初次建立时,要填为new,经尝试最后一个节点填existing也正常,其他节点不能填为existing。集群运行过程中,一个member故障后恢复时填为existing,经尝试填为new也正常。 |
--initial-cluster-token 'etcd-cluster’ | 引导期间etcd集群的初始集群令牌。 在运行多个集群时,指定此参数可以防止意外的跨集群交互。 |
--advertise-client-urls 'http://localhost:2379’ | etcd客户使用,客户通过该地址与本member交互信息。一定要保证从客户侧能可访问该地址 |
--discovery ’ ’ | 用于引导集群的发现URL,指定第三方etcd上key地址,要建立的集群各member都会向其注册自己的地址 |
--enable-v2 ‘true’ | 接受etcd V2客户端请求 |
--discovery-fallback ‘proxy’ | 当发现服务失败时的预期行为(“exit”或“proxy”)。“proxy”只支持v2 API |
--discovery-proxy ’ ’ | 用于传输到发现服务的HTTP代理 |
--discovery-srv ’ ’ | 用于引导集群的dns srv域 |
--strict-reconfig-check ‘true’ | 拒绝可能导致仲裁丢失的重新配置请求 |
--auto-compaction-retention ‘0’ | auto compaction retention length. 0 means disable auto compaction |
--auto-compaction-mode ‘periodic’ | interpret ‘auto-compaction-retention’ one of: periodic丨revision. ‘periodic’ for duration based retention, defaulting to hours if no time unit is provided (e.g. ‘5m’). ‘revision’ for revision number based retention. |
参数 | 使用说明 |
---|---|
--proxy ‘off’ | proxy mode setting (‘off’, ‘readonly’ or ‘on’). |
--proxy-failure-wait 5000 | time (in milliseconds) an endpoint will be held in a failed state |
--proxy-refresh-interval 30000 | time (in milliseconds) of the endpoints refresh interval |
--proxy-dial-timeout 1000 | time (in milliseconds) for a dial to timeout |
--proxy-write-timeout 5000 | time (in milliseconds) for a write to timeout. |
--proxy-read-timeout 0 | time (in milliseconds) for a read to timeout. |
参数 | 使用说明 |
---|---|
--ca-file ’ ’ [DEPRECATED] | 客户端服务器TLS CA文件的路径。“-ca-file ca.crt”可以替换为“-trusted-ca-file ca.crt -client-cert-auth”,etcd将执行相同的操作。 |
--cert-file ’ ’ | 客户端服务器TLS证书文件的路径 |
--key-file ‘’ | 客户端服务器TLS密钥文件的路径 |
--client-cert-auth ‘false’ | 启用客户证书认证 |
--client-crl-file ’ ’ | 客户端证书撤销列表文件的路径 |
--trusted-ca-file ’ ’ | 客户端服务器TLS信任CA证书文件的路径 |
--auto-tls ‘false’ | 客户端TLS使用生成的证书 |
--peer-ca-file ’ ’ [DEPRECATED] | path to the peer server TLS CA file. ‘-peer-ca-file ca.crt’ could be replaced by ‘-peer-trusted-ca-file ca.crt -peer-client-cert-auth’ and etcd will perform the same. |
--peer-cert-file ’ ’ | path to the peer server TLS cert file. |
--peer-key-file ’ ’ | path to the peer server TLS key file. |
--peer-client-cert-auth ‘false’ | enable peer client cert authentication. |
--peer-trusted-ca-file ’ ’ | path to the peer server TLS trusted CA file. |
--peer-auto-tls ‘false’ | peer TLS using self-generated certificates if --peer-key-file and --peer-cert-file are not provided. |
--peer-crl-file ’ ’ | path to the peer certificate revocation list file. |
参数 | 使用说明 |
---|---|
--debug ‘false’ | enable debug-level logging for etcd. |
--log-package-levels ’ ’ | 为每个etcd包指定一个特定的日志级别(例如:‘etcdmain=CRITICAL,etcdserver=DEBUG’)。 |
--log-output ‘default’ | 指定“stdout”或“stderr”以跳过日志记录,即使在systemd下运行时也是如此。 |
参数 | 使用说明 |
---|---|
--force-new-cluster ‘false’ | 强制创建一个新的单成员集群。 |
参数 | 使用说明 |
---|---|
--auth-token ‘simple’ | 指定v3认证令牌类型及其选项(‘simple’或’jwt’). |
参数 | 使用说明 |
---|---|
--enable-pprof ‘false’ | Enable runtime profiling data via HTTP server. Address is at client URL + “/debug/pprof/” |
--metrics ‘basic’ | Set level of detail for exported metrics, specify ‘extensive’ to include histogram metrics. |
--listen-metrics-urls ’ ’ | List of URLs to listen on for metrics. |
参数 | 使用说明 |
---|---|
--experimental-initial-corrupt-check ‘false’ | enable to check data corruption before serving any client/peer traffic. |
--experimental-corrupt-check-time ‘0s’ | duration of time between cluster corruption check passes. |
--experimental-enable-v2v3 ’ ’ | serve v2 requests through the v3 backend under a given prefix. |
etcd最新的API版本是v3,与v2相比,v3更高效更清晰。k8s默认使用的etcd V3版本API,ectdctl默认使用V2版本API。要使用v3,设置环境变量export ETCDCTL_API=3临时更改为V3或者vim /etc/profile后在里面添加export ETCDCTL_API=3,然后执行source /etc/profile则永久更改为V3。
命令 | 用法 | 说明 | 可选参数 |
---|---|---|---|
get |
USAGE: etcdctl get [options] |
获取一个或一个范围内的键 |
OPTIONS: --consistency=“l” 线性化(l)或串行化(s) --from-key[=false] 利用byte(字节)进行比较的方式获取大于或等于给定键的键--keys-only[=false] 只获取键,不获取键值--limit=0 显示结果的最大数量--order="" 结果排序,可设置为ASCEND 或 DESCEND (默认为ASCEND )--prefix[=false] 获取前缀匹配到的键--print-value-only[=false] 当使用“simple”输出格式时,只写值 --rev=0 指明kv的修订版本 --sort-by="" 按目标排序,可设置的值有CREATE , KEY , MODIFY , VALUE , VERSION |
put |
USAGE: etcdctl put [options] |
设置键 |
OPTIONS: --ignore-lease[=false] 使用当前租约更新key,key不存在时报错 --ignore-value[=false] 使用key当前的value更新key,key不存在时报错 --lease="0" 请将lease ID(十六进制)附加到key从而指定租约,租约过期key自动删除--prev-kv[=false] 返回修改前的键值对 |
del |
USAGE: etcdctl del [options] |
删除键[key]和键值[value] | OPTIONS:--from-key[=false] 利用byte(字节)进行比较的方式删除大于或等于给定键的键--prefix[=false] 删除前缀匹配到的键--prev-kv[=false] 返回已删除的键值对 |
txn | USAGE:etcdctl txn [options] | Txn处理一个事务中的所有请求 | OPTIONS: -i, --interactive[=false] 在交互模式下输入事务 |
compaction | USAGE: etcdctl compaction [options] |
压缩etcd中的事件历史记录 | OPTIONS: --physical[=false] “true”用于等待压缩从物理上删除所有旧修订; |
alarm disarm | USAGE:etcdctl alarm disarm | 解除所有警报 | - |
alarm list | USAGE:etcdctl alarm list | 列出所有警报 | - |
defrag | USAGE:etcdctl defrag | 使用给定端点对etcd成员的存储进行碎片整理 | OPTIONS: --data-dir="" 可选的。如果存在,对etcd不使用的数据目录进行碎片整理。 |
endpoint health |
USAGE:etcdctl endpoint health | 检查--endpoints 标志中指定的端点的健康状况 |
- |
endpoint status |
USAGE:etcdctl endpoint status | 打印出--endpoints 标志中指定的端点的状态 |
- |
endpoint hashkv |
USAGE:etcdctl endpoint hashkv | 在–endpoints中为每个端点打印KV历史记录 | OPTIONS: --rev=0 最大散列修订(默认:所有修订) |
move-leader |
USAGE: etcdctl move-leader |
将领导转移到另一个etcd集群成员 | - |
watch |
USAGE: etcdctl watch [options] |
在键或前缀上观察事件流,当监视到时可以执行相应命令 | OPTIONS: -i, --interactive[=false] 进入交互模式 --prefix[=false] 如果设置了前缀,则监视这个前缀--prev-kv[=false] 获取事件发生之前的键值对 --rev=0 开始监视这个修订 |
version |
USAGE:etcdctl version | 输出版本号 | - |
lease grant | USAGE:etcdctl lease grant |
创造租约,可以为key设置超时时间后自动删除key | - |
lease revoke | USAGE:etcdctl lease revoke |
撤销租约 ,并删除所有关联的key | - |
lease timetolive | USAGE: etcdctl lease timetolive |
获取租赁信息 | OPTIONS: --keys[=false] 获取附在租约上的键 |
lease list | USAGE:etcdctl lease list | 列出所有有效租约 | - |
lease keep-alive | USAGE: etcdctl lease keep-alive [options] |
让租约保持活力(续订) | OPTIONS: --once[=false] 将keep-alive时间重置为其原始值并立即退出 |
member add |
USAGE: etcdctl member add |
添加一个成员到集群 | OPTIONS: --peer-urls="" |
member remove |
USAGE: etcdctl member remove |
从集群中删除一个成员 | - |
member update |
USAGE: etcdctl member update |
在集群中更新一个成员 | OPTIONS: --peer-urls="" |
member list |
USAGE:etcdctl member list | 显示集群内所有成员 | - |
snapshot save | USAGE: etcdctl snapshot save |
将etcd节点后端快照存储到给定文件 | - |
snapshot restore | USAGE: etcdctl snapshot restore |
将etcd成员快照还原到etcd目录 | OPTIONS: --data-dir="" 数据目录的路径 --initial-advertise-peer-urls=“http://localhost:2380” 此成员要向集群的其余部分发布的对等url列表 --initial-cluster=“default=http://localhost:2380” 用于恢复引导的初始集群配置 --initial-cluster-token=“etcd-cluster” 恢复引导期间etcd集群的初始集群令牌 --name=“default” 此成员的可读名称 --skip-hash-check[=false] 忽略快照完整性散列值(如果从数据目录复制的请求) --wal-dir="" WAL目录的路径(如果没有指定,则使用–data-dir ) |
snapshot status | USAGE: etcdctl snapshot status |
获取给定文件的后端快照状态 | - |
make-mirror | USAGE: etcdctl make-mirror [options] |
在目标etcd集群中创建镜像 | OPTIONS: --dest-cacert="" 使用此CA包验证启用了TLS的安全服务器的证书 --dest-cert="" 使用此TLS证书文件为目标集群标识安全客户端 --dest-insecure-transport[=true] 为客户端连接禁用传输安全性 --dest-key="" 使用此TLS密钥文件识别安全客户端 --dest-prefix="" 将一个前缀映射到目标集群中的另一个前缀 --no-dest-prefix[=false] 将key-values映射到目标集群的root --prefix="" 到镜像的键值前缀 |
migrate | USAGE:etcdctl migrate | 将v2存储中的密钥迁移到mvcc存储 | OPTIONS: --data-dir="" 数据目录的路径 --no-ttl[=false] 不转换TTL keys --transformer="" 用户提供的转换器程序的路径 --wal-dir="" 到WAL目录的路径 |
lock | USAGE: etcdctl lock |
获取一个命名锁 | OPTIONS: --ttl=10 会话超时 |
elect | USAGE: etcdctl elect |
观察并参与领导人选举 | OPTIONS: -l, --listen[=false] 观察模式 |
auth enable |
USAGE:etcdctl auth enable | 启用身份认证 | - |
auth disable |
USAGE:etcdctl auth disable | 禁用身份认证 | - |
user add |
USAGE: etcdctl user add |
添加一个新用户 | OPTIONS: --interactive[=true] 从stdin读取密码,而不是交互式终端 |
user delete |
USAGE: etcdctl user delete |
删除一个用户 | - |
user get |
USAGE: etcdctl user get |
获取用户的详细信息 | OPTIONS: --detail[=false] 显示授予用户的角色权限 |
user list |
USAGE:etcdctl user list | 显示所有用户 | - |
user passwd |
USAGE: etcdctl user passwd |
更改用户密码 | OPTIONS: --interactive[=true] 如果是true则从stdin读取密码,而不是交互式终端 |
user grant-role |
USAGE: etcdctl user grant-role |
授予用户角色 | - |
user revoke-role |
USAGE: etcdctl user revoke-role |
撤消用户的角色 | - |
role add |
USAGE:etcdctl role add |
添加新角色 | - |
role delete |
USAGE:etcdctl role delete |
删除一个角色 | - |
role get |
USAGE:etcdctl role get |
获取角色的详细信息 | - |
role list |
USAGE:etcdctl role list | 显示所有角色 | - |
role grant-permission | USAGE: etcdctl role grant-permission [options] |
授予钥密给角色 | OPTIONS: --from-key[=false] 利用byte(字节)进行比较的方式授予大于或等于给定键的键的权限 --prefix[=false] 授予前缀匹配到的键的权限 |
role revoke-permission | USAGE: etcdctl role revoke-permission |
从角色中撤消密钥 | OPTIONS: --from-key[=false] 利用byte(字节)进行比较的方式撤销大于或等于给定键的键的权限 --prefix[=false] 撤销前缀匹配到的键的权限 |
check perf | USAGE:etcdctl check perf [options] | 检查etcd集群的性能 | OPTIONS: --load=“s” 性能检查的工作负载模型。可接受的工作负载:s(小)、m(中)、l(大)、xl(xLarge) --prefix="/etcdctl-check-perf/" 写入性能检查键的前缀。 |
help | USAGE:etcdctl help [command] | 帮助信息 | - |
全局参数 | 说明 |
---|---|
--cacert="" | 使用CA包验证启用了tls的安全服务器的证书 |
--cert="" | 使用此TLS证书文件识别安全客户端 |
--command-timeout=5s | 短时间运行命令超时(不包括拨号超时) |
--debug[=false] | 启用客户端调试日志记录 |
--dial-timeout=2s | 客户端连接的拨号超时 |
-d, --discovery-srv="" | 要查询描述集群端点的SRV记录的域名 |
--endpoints=[127.0.0.1:2379] | gRPC端点 |
--hex[=false] | 将字节字符串打印为十六进制编码的字符串 |
--insecure-discovery[=true] | 接受描述集群端点的不安全SRV记录 |
--insecure-skip-tls-verify[=false] | 跳过服务器证书验证 |
--insecure-transport[=true] | 为客户端连接禁用传输安全性 |
--keepalive-time=2s | 保持客户端连接的存活时间 |
--keepalive-timeout=6s | 保持客户端连接的超时 |
--key="" | 使用此TLS密钥文件识别安全客户端 |
--user="" | 用于身份验证的用户名[:password](如果没有提供密码,则提示) |
-w, --write-out=“simple” | 设置输出格式 (fields, json, protobuf, simple, table) |
本次搭建的基础环境:操作系统centos7(已安装docker)
首先在服务器上先下载最新的etcd镜像,可在docker Hub官网上搜索etcd,寻找最新的etcd镜像下载。
本次使用的镜像是quay.io/coreos/etcd;
可在操作系统上执行docker pull quay.io/coreos/etcd来下载镜像,如下图所示:
1.在服务器A(172.27.0.42)上运行一个ETCD实例,取名为etcd01,注意其状态为new,“-initial-cluster”中只有自己的IP:
docker run -d -p 2379:2379 -p 2380:2380 --name etcd01 quay.io/coreos/etcd:latest etcd --name etcd01 --advertise-client-urls http://172.27.0.42:2379 --listen-client-urls http://0.0.0.0:2379 --initial-advertise-peer-urls http://172.27.0.42:2380 --listen-peer-urls http://0.0.0.0:2380 --initial-cluster-token etcd-cluster --initial-cluster etcd01=http://172.27.0.42:2380 --initial-cluster-state new
2.在服务器A的ETCD服务上,通过调用API添加一个新的节点B(172.27.0.16):
curl http://127.0.0.1:2379/v2/members -XPOST -H “Content-Type: application/json” -d ‘{“peerURLs”: [“http://172.27.0.16:2380”]}’
3.在服务器B(172.27.0.16)上运行一个ETCD实例,取名为etcd02,注意其状态为existing,“-initial-cluster”中有前一个IP及自己的IP:
docker run -d -p 2379:2379 -p 2380:2380 --name etcd02 quay.io/coreos/etcd:latest etcd --name etcd02 --advertise-client-urls http://172.27.0.16:2379 --listen-client-urls http://0.0.0.0:2379 --initial-advertise-peer-urls http://172.27.0.16:2380 --listen-peer-urls http://0.0.0.0:2380 --initial-cluster-token etcd-cluster --initial-cluster etcd01=http://172.27.0.42:2380,etcd02=http://172.27.0.16:2380 --initial-cluster-state existing
4.在服务器A的ETCD服务上,通过调用API添加一个新的节点C(172.27.0.39):
curl http://127.0.0.1:2379/v2/members -XPOST -H “Content-Type: application/json” -d ‘{“peerURLs”: [“http://172.27.0.39:2380”]}’
5.在服务器C(172.27.0.39)上运行一个ETCD实例,取名为etcd03,注意其状态为existing,“-initial-cluster”中有前一个IP及自己的IP:
docker run -d -p 2379:2379 -p 2380:2380 --name etcd03 quay.io/coreos/etcd:latest etcd --name etcd03 --advertise-client-urls http://172.27.0.39:2379 --listen-client-urls http://0.0.0.0:2379 --initial-advertise-peer-urls http://172.27.0.39:2380 --listen-peer-urls http://0.0.0.0:2380 --initial-cluster-token etcd-cluster --initial-cluster etcd01=http://172.27.0.42:2380,etcd02=http://172.27.0.16:2380,etcd03=http://172.27.0.39:2380 --initial-cluster-state existing
两种方法部署的etcd可通过以下方式进行验证是否成功:
1.验证集群members,在集群中的每台机器上查看members,得出的结果应该是相同的;
curl -L http://127.0.0.1:2379/v2/members
2.可在任一服务器上进入etcd容器执行命令etcdctl member list或etcdctl cluster-health验证;
3.某台机器上添加数据,其他机器上查看数据,得出的结果应该是相同的,例如:
A上执行:curl -L http://127.0.0.1:2379/v2/keys/message -XPUT -d value=“Hello World”
B、C上执行:curl -L http://127.0.0.1:2379/v2/keys/message
环境:
服务器名称 | 服务器ip |
---|---|
etcd01 | 172.27.18.9 |
etcd02 | 172.27.17.220 |
etcd03 | 172.27.16.105 |
安装方式:
目前我这里采用的是直接通过yum install etcd -y 安装, yum安装的etcd默认的配置文件为/etc/etcd/etcd.conf,文件如下:
[root@VM_18_9_centos /]# cat /etc/etcd/etcd.conf
#[Member]
#ETCD_CORS=""
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
#ETCD_WAL_DIR=""
#ETCD_LISTEN_PEER_URLS="http://localhost:2380"
ETCD_LISTEN_CLIENT_URLS="http://localhost:2379"
#ETCD_MAX_SNAPSHOTS="5"
#ETCD_MAX_WALS="5"
ETCD_NAME="default"
#ETCD_SNAPSHOT_COUNT="100000"
#ETCD_HEARTBEAT_INTERVAL="100"
#ETCD_ELECTION_TIMEOUT="1000"
#ETCD_QUOTA_BACKEND_BYTES="0"
#ETCD_MAX_REQUEST_BYTES="1572864"
#ETCD_GRPC_KEEPALIVE_MIN_TIME="5s"
#ETCD_GRPC_KEEPALIVE_INTERVAL="2h0m0s"
#ETCD_GRPC_KEEPALIVE_TIMEOUT="20s"
#
#[Clustering]
#ETCD_INITIAL_ADVERTISE_PEER_URLS="http://localhost:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://localhost:2379"
#ETCD_DISCOVERY=""
#ETCD_DISCOVERY_FALLBACK="proxy"
#ETCD_DISCOVERY_PROXY=""
#ETCD_DISCOVERY_SRV=""
#ETCD_INITIAL_CLUSTER="default=http://localhost:2380"
#ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
#ETCD_INITIAL_CLUSTER_STATE="new"
#ETCD_STRICT_RECONFIG_CHECK="true"
#ETCD_ENABLE_V2="true"
#
#[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=""
#ETCD_KEY_FILE=""
#ETCD_CLIENT_CERT_AUTH="false"
#ETCD_TRUSTED_CA_FILE=""
#ETCD_AUTO_TLS="false"
#ETCD_PEER_CERT_FILE=""
#ETCD_PEER_KEY_FILE=""
#ETCD_PEER_CLIENT_CERT_AUTH="false"
#ETCD_PEER_TRUSTED_CA_FILE=""
#ETCD_PEER_AUTO_TLS="false"
#
#[Logging]
#ETCD_DEBUG="false"
#ETCD_LOG_PACKAGE_LEVELS=""
#ETCD_LOG_OUTPUT="default"
#
#[Unsafe]
#ETCD_FORCE_NEW_CLUSTER="false"
#
#[Version]
#ETCD_VERSION="false"
#ETCD_AUTO_COMPACTION_RETENTION="0"
#
#[Profiling]
#ETCD_ENABLE_PPROF="false"
#ETCD_METRICS="basic"
#
#[Auth]
#ETCD_AUTH_TOKEN="simple"
[root@VM_18_9_centos /]#
在etcd01(172.27.18.9)修改etcd.conf启动参数,执行vim /etc/etcd/etcd.conf来修改,修改内容如下:
ETCD_DATA_DIR="/data/etcd.etcd" # 存放etcd数据的路径,注意使用新目录时需要先创建该目录
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379" # 监听的用于客户端通信的url,同样可以监听多个。
ETCD_NAME="etcd01" # etcd集群中的节点名,这里可以随意,可区分且不重复就行
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380" # 监听的用于节点之间通信的url,可监听多个,集群内部将通过这些url进行数据交互(如选举,数据同步等)
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.27.18.9:2380" # 建议用于节点之间通信的url,节点间将以该值进行通信。
ETCD_ADVERTISE_CLIENT_URLS="http://172.27.18.9:2379" # 建议使用的客户端通信url,该值用于etcd代理或etcd成员与etcd节点通信。
ETCD_INITIAL_CLUSTER="etcd01=http://172.27.18.9:2380,etcd02=http://172.27.17.220:2380,etcd03=http://172.27.16.105:2380" # 也就是集群中所有的initial-advertise-peer-urls 的合集
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" # 节点的token值,设置该值后集群将生成唯一id,并为每个节点也生成唯一id,当使用相同配置文件再启动一个集群时,只要该token值不一样,etcd集群就不会相互影响。
ETCD_INITIAL_CLUSTER_STATE="new" # 新建集群的标志,初始化状态使用 new,建立之后改此值为 existing
修改完etcd.conf文件后还需要修改/usr/lib/systemd/system/etcd.service服务文件的ExecStart部分,与etcd.conf修改的相对应,修改内容如下所示:
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
WorkingDirectory=/var/lib/etcd/
EnvironmentFile=-/etc/etcd/etcd.conf
ExecStart=/bin/bash -c "GOMAXPROCS=$(nproc) /usr/bin/etcd \
--name=${ETCD_NAME} \
--listen-client-urls=${ETCD_LISTEN_CLIENT_URLS} \
--listen-peer-urls=${ETCD_LISTEN_PEER_URLS} \
--advertise-client-urls=${ETCD_ADVERTISE_CLIENT_URLS} \
--initial-advertise-peer-urls=${ETCD_INITIAL_ADVERTISE_PEER_URLS} \
--initial-cluster=${ETCD_INITIAL_CLUSTER} \
--initial-cluster-token=${ETCD_INITIAL_CLUSTER_TOKEN} \
--initial-cluster-state=new"
User=etcd
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
然后执行systemctl start etcd.service启动服务,然后执行etcdctl member listf返回类似如下信息则配置成功;
etcd02、etcd03服务器部署同etcd01一致,只需要把ETCD_NAME、ETCD_ADVERTISE_CLIENT_URLS和ETCD_INITIAL_ADVERTISE_PEER_URLS换成etcd02或etcd03的配置即可;