初识 etcd

概述 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选举
使用场景 键值对存储
etcd 是一个键值存储的组件,其他的应用都是基于其键值存储的功能展开。
  • 采用kv型数据存储,一般情况下比关系型数据库快。
  • 支持动态存储(内存)以及静态存储(磁盘)。
  • 分布式存储,可集成为多节点集群。
  • 存储方式,采用类似目录结构。(B+tree)
    ? 只有叶子节点才能真正存储数据,相当于文件。
    ? 叶子节点的父节点一定是目录,目录不能存储数据。
服务注册与发现
  • 强一致性、高可用的服务存储目录
    基于 Raft 算法的 etcd 天生就是这样一个强一致性、高可用的服务存储目录。
  • 一种注册服务和服务健康状况的机制
    【初识 etcd】用户可以在 etcd 中注册服务,并且对注册的服务配置 key TTL,定时保持服务的心跳以达
    到监控健康状态的效果
初识 etcd
文章图片

消息发布与订阅
  • 在分布式系统中,最适用的一种组件间通信方式就是消息发布与订阅。
  • 即构建一个配置共享中心,数据提供者在这个配置中心发布消息,而消息使用者则订阅他们 关心的主题,一旦主题有消息发布,就会实时通知订阅者。
  • 通过这种方式可以做到分布式系统配置的集中式管理与动态更新。
  • 应用中用到的一些配置信息放到etcd上进行集中管理。
  • 应用在启动的时候主动从etcd获取一次配置信息,同时,在etcd节点上注册一个Watcher并 等待,以后每次配置有更新的时候,etcd都会实时通知订阅者,以此达到获取最新配置信息 的目的。
初识 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/ DocumentationetcdetcdctlREADME-etcdctl.mdREADME.mdREADMEv2-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

点击 " 阅读原文" 获取更好的阅读体验!

    推荐阅读