概述
Etcd是CoreOS基于Raft开发的分布式key-value存储,可用于服务发现、共享配置以及一致性
保障(如数据库选主、分布式锁等)。
在分布式系统中,如何管理节点间的状态一直是一个难题,etcd像是专门为集群环境的服务发现
和注册而设计,它提供了数据TTL失效、数据改变监视、多值、目录监听、分布式锁原子操作等
功能,可以方便的跟踪并管理集群节点的状态。
键值对存储:将数据存储在分层组织的目录中,如同在标准文件系统中
监测变更:监测特定的键或目录以进行更改,并对值的更改做出反应
简单: curl可访问的用户的API(HTTP+JSON)
安全: 可选的SSL客户端证书认证
快速: 单实例每秒1000次写操作,2000+次读操作
可靠: 使用Raft算法保证一致性
主要功能
基本的key-value存储
监听机制
key的过期及续约机制,用于监控和服务发现
原子Compare And Swap和Compare And Delete,用于分布式锁和leader选举
使用场景
键值对存储
基本的key-value存储
监听机制
key的过期及续约机制,用于监控和服务发现
原子Compare And Swap和Compare And Delete,用于分布式锁和leader选举
键值对存储
etcd 是一个键值存储的组件,其他的应用都是基于其键值存储的功能展开。
采用kv型数据存储,一般情况下比关系型数据库快。
支持动态存储(内存)以及静态存储(磁盘)。
分布式存储,可集成为多节点集群。
存储方式,采用类似目录结构。(B+tree)
• 只有叶子节点才能真正存储数据,相当于文件。
• 叶子节点的父节点一定是目录,目录不能存储数据。
服务注册与发现
强一致性、高可用的服务存储目录
基于 Raft 算法的 etcd 天生就是这样一个强一致性、高可用的服务存储目录。
一种注册服务和服务健康状况的机制
用户可以在 etcd 中注册服务,并且对注册的服务配置 key TTL,定时保持服务的心跳以达
到监控健康状态的效果
强一致性、高可用的服务存储目录
基于 Raft 算法的 etcd 天生就是这样一个强一致性、高可用的服务存储目录。
一种注册服务和服务健康状况的机制
用户可以在 etcd 中注册服务,并且对注册的服务配置 key TTL,定时保持服务的心跳以达
到监控健康状态的效果
消息发布与订阅
在分布式系统中,最适用的一种组件间通信方式就是消息发布与订阅。
即构建一个配置共享中心,数据提供者在这个配置中心发布消息,而消息使用者则订阅他们 关心的主题,一旦主题有消息发布,就会实时通知订阅者。
通过这种方式可以做到分布式系统配置的集中式管理与动态更新。
应用中用到的一些配置信息放到etcd上进行集中管理。
应用在启动的时候主动从etcd获取一次配置信息,同时,在etcd节点上注册一个Watcher并 等待,以后每次配置有更新的时候,etcd都会实时通知订阅者,以此达到获取最新配置信息 的目的。
在分布式系统中,最适用的一种组件间通信方式就是消息发布与订阅。
即构建一个配置共享中心,数据提供者在这个配置中心发布消息,而消息使用者则订阅他们 关心的主题,一旦主题有消息发布,就会实时通知订阅者。
通过这种方式可以做到分布式系统配置的集中式管理与动态更新。
应用中用到的一些配置信息放到etcd上进行集中管理。
应用在启动的时候主动从etcd获取一次配置信息,同时,在etcd节点上注册一个Watcher并 等待,以后每次配置有更新的时候,etcd都会实时通知订阅者,以此达到获取最新配置信息 的目的。
ETCD 部署
# 下载 ETCD 的二进制包,官方 Github 地址:https://github.com/etcd-io/etcd/releases,下载如下文件:
wget https://github.com/etcd-io/etcd/releases/download/v3.4.13/etcd-v3.4.13-linux-amd64.tar.gz
$ tar xf etcd-v3.4.13-linux-amd64.tar.gz
$ ls etcd-v3.4.13-linux-amd64/
documentation etcd etcdctl README-etcdctl.md README.md READMEv2-etcdctl.md
#将二进制包移动到 bin 目录下:
$ mkdir -p /opt/etcd/bin/
$ mv etcd-v3.4.13-linux-amd64/{etcd,etcdctl} /opt/etcd/bin/
# Systemd 管理
# 创建 ETCD 的 Systemd service 文件:
$ cat /usr/lib/systemd/system/etcd.service
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
ExecStart=/opt/etcd/bin/etcd
Restart=on-failure
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
# 启动Etcd
$ systemctl daemon-reload
$ systemctl start etcd
$ systemctl enable etcd
Etcd 日常命令
# 查看集群成员状态
$ etcdctl member list --write-out=table
+------------------+---------+---------+-----------------------+-----------------------+------------+
| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER |
+------------------+---------+---------+-----------------------+-----------------------+------------+
| 8e9e05c52164694d | started | default | http://localhost:2380 | http://localhost:2379 | false |
+------------------+---------+---------+-----------------------+-----------------------+------------+
# 写入数据
$ etcdctl --endpoints=localhost:2379 put /kubesre 123
OK
# 读取数据
$ etcdctl --endpoints=localhost:2379 get /kubesre
/kubesre
123
# 按key的前缀查询数据
$ etcdctl --endpoints=localhost:2379 get --prefix /
/kubesre
123
# 只显示键值
etcdctl --endpoints=localhost:2379 get --prefix / --keys-only --debug
ETCDCTL_CACERT=
ETCDCTL_CERT=
ETCDCTL_COMMAND_TIMEOUT=5s
ETCDCTL_DEBUG=true
ETCDCTL_DIAL_TIMEOUT=2s
ETCDCTL_DISCOVERY_SRV=
ETCDCTL_DISCOVERY_SRV_NAME=
ETCDCTL_ENDPOINTS=[localhost:2379]
ETCDCTL_HEX=false
ETCDCTL_INSECURE_DISCOVERY=true
ETCDCTL_INSECURE_SKIP_TLS_VERIFY=false
ETCDCTL_INSECURE_TRANSPORT=true
ETCDCTL_KEEPALIVE_TIME=2s
ETCDCTL_KEEPALIVE_TIMEOUT=6s
ETCDCTL_KEY=
ETCDCTL_PASSWORD=
ETCDCTL_USER=
ETCDCTL_WRITE_OUT=simple
WARNING: 2021/12/22 20:32:52 Adjusting keepalive ping interval to minimum period of 10s
WARNING: 2021/12/22 20:32:52 Adjusting keepalive ping interval to minimum period of 10s
INFO: 2021/12/22 20:32:52 parsed scheme: "endpoint"
INFO: 2021/12/22 20:32:52 ccResolverWrapper: sending new addresses to cc: [{localhost:2379 0 }]
/kubesre
点击 "阅读原文" 获取更好的阅读体验!
# 查看集群成员状态
$ etcdctl member list --write-out=table
+------------------+---------+---------+-----------------------+-----------------------+------------+
| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER |
+------------------+---------+---------+-----------------------+-----------------------+------------+
| 8e9e05c52164694d | started | default | http://localhost:2380 | http://localhost:2379 | false |
+------------------+---------+---------+-----------------------+-----------------------+------------+
# 写入数据
$ etcdctl --endpoints=localhost:2379 put /kubesre 123
OK
# 读取数据
$ etcdctl --endpoints=localhost:2379 get /kubesre
/kubesre
123
# 按key的前缀查询数据
$ etcdctl --endpoints=localhost:2379 get --prefix /
/kubesre
123
# 只显示键值
etcdctl --endpoints=localhost:2379 get --prefix / --keys-only --debug
ETCDCTL_CACERT=
ETCDCTL_CERT=
ETCDCTL_COMMAND_TIMEOUT=5s
ETCDCTL_DEBUG=true
ETCDCTL_DIAL_TIMEOUT=2s
ETCDCTL_DISCOVERY_SRV=
ETCDCTL_DISCOVERY_SRV_NAME=
ETCDCTL_ENDPOINTS=[localhost:2379]
ETCDCTL_HEX=false
ETCDCTL_INSECURE_DISCOVERY=true
ETCDCTL_INSECURE_SKIP_TLS_VERIFY=false
ETCDCTL_INSECURE_TRANSPORT=true
ETCDCTL_KEEPALIVE_TIME=2s
ETCDCTL_KEEPALIVE_TIMEOUT=6s
ETCDCTL_KEY=
ETCDCTL_PASSWORD=
ETCDCTL_USER=
ETCDCTL_WRITE_OUT=simple
WARNING: 2021/12/22 20:32:52 Adjusting keepalive ping interval to minimum period of 10s
WARNING: 2021/12/22 20:32:52 Adjusting keepalive ping interval to minimum period of 10s
INFO: 2021/12/22 20:32:52 parsed scheme: "endpoint"
INFO: 2021/12/22 20:32:52 ccResolverWrapper: sending new addresses to cc: [{localhost:2379 0 }]
/kubesre
点击 "阅读原文" 获取更好的阅读体验!



