热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

入门篇:从etcd名字的由来,到安装部署和使用姿势

etcd简介etcd是一个可靠的分布式key-value存储系统,主要用于配置共享和服务注册和发现,具有以下特性:简单:

etcd 简介

etcd 是一个可靠的分布式 key-value 存储系统,主要用于配置共享服务注册和发现,具有以下特性:

  • 简单:基于 gRPC 定义了清晰、面向用户的 API。
  • 安全:支持可选的客户端 TLS 证书自动认证特性。
  • 快速:支持每秒 10000 次的写入。
  • 可靠:基于 Raft 算法协议保证一致性。

etcd 使用 Go 语言开发,底层基于 Raft 共识算法管理高可用的复制日志。当前已经被许多公司用于关键生产项目,比如:Kubernetes、locksmith、vulcand、Doorman 等。

当然,也有其他组件可以提供配置共享和服务注册和发现的功能,比如最为广泛和大家最为熟知的 Zookeeper,也被很多 Java 系的知名开源项目认可和使用,比如:Hadoop、HBase、Kafka 等。

但 etcd 是唯一一个可以媲美甚至超越 Zookeeper 的组件。

相较之下,Zookeeper 有如下缺点[3]:

  • 复杂:Zookeeper 基于 ZAB 协议,属于类 Paxos 协议,而 Paxos 算法素以复杂难懂闻名;Zookeeper 的使用也比较复杂,需要安装客户端,而官方目前只提供了 Java 和 C 两种语言接口。
  • 发展慢:由于基金会庞大的结构以及松散的管理,导致项目发展缓慢。

而 etcd 作为后起之秀,其优点也很明显:

  • 简单:使用 Go 语言编写部署简单;使用 gRPC 定义接口,支持跨语言、跨平台特性;使用了易于用户理解的 Raft 算法保证一致性,优于 Paxos 算法。
  • 发展快:etcd 正处于高速迭代开发中。
  • 性能优越:官方提供的基准测试数据中,etcd 集群可以支持每秒 10000+ 次的写入,性能优于 Zookeeper。
  • 安全性:etcd 支持 TLS 访问,而 ZooKeeper 在权限控制方面做得略显粗糙。

环境搭建


一、本地安装包部署

「下载」:下载最新的安装包(当前最新:v3.5.4),下载地址:https://github.com/etcd-io/etcd/releases/


「安装」:在解压后的文件目录下etcdetcdctl分别为安装包和客户端的编译后的执行文件,可使用三种方法进行运行配置。

  • 方法一:解压目录下直接运行
  • 方法二:把etcdetcdctl文件复制到GOBIN目录下。
  • 方法三:在环境变量里添加etcdetcdctl文件所在的目录。

注:运行过程中,可能会涉及权限问题,授权即可。

「验证」:

# 验证 etcd 版本
$ etcd --versionetcd Version: 3.5.4
Git SHA: 08407ff76
Go Version: go1.16.15
Go OS/Arch: darwin/amd64# 验证 etcdctl 版本
$ etcdctl versionetcdctl version: 3.5.4
API version: 3.5

二、本地编译部署

「下载」:使用以下命令克隆代码

# 下载最新版
$ git clone https://github.com/etcd-io/etcd.git
# 指定版本下载
$ git clone -b v3.5.4 https://github.com/etcd-io/etcd.git

「编译安装」:

# 编译
$ cd etcd
$ make build# 安装
$ export PATH="$PATH:`pwd`/bin"

「验证」:

# 验证 etcd 版本
$ etcd --version# 验证 etcdctl 版本
$ etcdctl version# 验证 etcdutl 版本
$ etcdutl version

三、本地集群部署

首先需要安装goreman组件,它基于 Procfile 配置文件管理 etcd 应用进程。

$ go install github.com/mattn/goreman@latest

「启动集群」:源码目录下Procfile脚本已经构建好了本地演示集群,直接运行启动即可

$ goreman start

「验证」

$ etcdctl member list8211f1d0f64f3269, started, infra1, http://127.0.0.1:12380, http://127.0.0.1:2379, false
91bc3c398fb3c146, started, infra2, http://127.0.0.1:22380, http://127.0.0.1:22379, false
fd422379fda50e48, started, infra3, http://127.0.0.1:32380, http://127.0.0.1:32379, false

该脚本创建包含 3 个 etcd 成员节点的集群,每个集群成员都接收键值的读取和写入。也可以按照Procfile.learner脚本指导,学习集群新增节点的操作。

四、Docker 单机部署

此处通过docker-compose进行实验配置。

「镜像拉取」

$ docker pull bitnami/etcd:3.5.2

「编辑docker-compose.yml」

version: '3.5'services:etcd:container_name: builder-etcdimage: bitnami/etcd:3.5.2ports:- 2379:2379environment:- ALLOW_NONE_AUTHENTICATION=yes- ETCD_AUTO_COMPACTION_MODE=revision- ETCD_AUTO_COMPACTION_RETENTION=1002- ETCD_QUOTA_BACKEND_BYTES=4294967296volumes:- ${DOCKER_ROOT_DIR:-.}/volumes/etcd/data:/bitnami/etcdnetworks:default:name: builder_dev

「启动服务」

$ docker-compose -f docker-compose.yml up

「验证」:验证集群节点的版本

$ docker exec -it builder-etcd /bin/bash -c "etcd --version"etcd Version: 3.5.2
Git SHA: 99018a77b
Go Version: go1.16.3
Go OS/Arch: linux/amd64

五、Docker 集群部署

「编辑docker-compose.yml」

version: '3.5'services:etcd1:container_name: builder-etcd1image: bitnami/etcd:3.5.2ports:- 12379:2379environment:- ALLOW_NONE_AUTHENTICATION=yes- ETCD_AUTO_COMPACTION_MODE=revision- ETCD_AUTO_COMPACTION_RETENTION=1002- ETCD_QUOTA_BACKEND_BYTES=4294967296- ETCD_NAME=etcd1- ETCD_INITIAL_ADVERTISE_PEER_URLS=http://etcd1:2380- ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379- ETCD_ADVERTISE_CLIENT_URLS=http://etcd1:2379- ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster- ETCD_INITIAL_CLUSTER=etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380- ETCD_INITIAL_CLUSTER_STATE=newvolumes:- ${DOCKER_ROOT_DIR:-.}/volumes/etcd/data1:/bitnami/etcdetcd2:container_name: builder-etcd2image: bitnami/etcd:3.5.2ports:- 22379:2379environment:- ALLOW_NONE_AUTHENTICATION=yes- ETCD_AUTO_COMPACTION_MODE=revision- ETCD_AUTO_COMPACTION_RETENTION=1002- ETCD_QUOTA_BACKEND_BYTES=4294967296- ETCD_NAME=etcd2- ETCD_INITIAL_ADVERTISE_PEER_URLS=http://etcd2:2380- ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379- ETCD_ADVERTISE_CLIENT_URLS=http://etcd2:2379- ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster- ETCD_INITIAL_CLUSTER=etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380- ETCD_INITIAL_CLUSTER_STATE=newvolumes:- ${DOCKER_ROOT_DIR:-.}/volumes/etcd/data2:/bitnami/etcdetcd3:container_name: builder-etcd3image: bitnami/etcd:3.5.2ports:- 32379:2379environment:- ALLOW_NONE_AUTHENTICATION=yes- ETCD_AUTO_COMPACTION_MODE=revision- ETCD_AUTO_COMPACTION_RETENTION=1002- ETCD_QUOTA_BACKEND_BYTES=4294967296- ETCD_NAME=etcd3- ETCD_INITIAL_ADVERTISE_PEER_URLS=http://etcd3:2380- ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379- ETCD_ADVERTISE_CLIENT_URLS=http://etcd3:2379- ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster- ETCD_INITIAL_CLUSTER=etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380- ETCD_INITIAL_CLUSTER_STATE=newvolumes:- ${DOCKER_ROOT_DIR:-.}/volumes/etcd/data3:/bitnami/etcdnetworks:default:name: builder_dev

部署配置文件 docker-compose.yml 细节,详见etcd docker-compose yml[4]

「启动服务」

$ docker-compose -f docker-compose.yml up

「验证」:验证集群节点的版本

$ docker exec -it builder-etcd1 /bin/bash -c "etcd --version"
$ docker exec -it builder-etcd2 /bin/bash -c "etcd --version"
$ docker exec -it builder-etcd3 /bin/bash -c "etcd --version"# 输出
etcd Version: 3.5.2
Git SHA: 99018a77b
Go Version: go1.16.3
Go OS/Arch: linux/amd64

API 学习

此处,通过使用etcdctl[5]进行 API 学习验证,etcdctl 是一个用于与 etcd 服务器交互的命令行工具。

一、查看版本

$ etcdctl versionetcdctl version: 3.6.0-alpha.0
API version: 3.6

二、写入 key

$ etcdctl put foo bar
OK

三、读取 key

$ etcdctl get foo
foo
bar
# 只是获取值
$ etcdctl get foo --print-value-only
bar

四、批量取值

$ etcdctl put foo1 bar1
$ etcdctl put foo3 bar2
$ etcdctl put foo3 bar3# 获取从 foo 到 foo3 的值,不包括 foo3
$ etcdctl get foo foo3 --print-value-only
bar
bar1
bar2# 获取前缀为 foo 的值
$ etcdctl get --prefix foo --print-value-only
bar
bar1
bar2
bar3# 获取符合前缀的前两个值
$ etcdctl get --prefix --limit=2 foo --print-value-only
bar
bar1

五、删除 key

# 删除 foo 的值
$ etcdctl del foo
1# 删除 foo 到 foo2 且不包括 foo2 的值
$ etcdctl del foo foo2
1
# 删除前缀为 foo 的所有值
$ etcdctl del --prefix foo
2

六、监听

# 监听 foo 单个 key
$ etcdctl watch foo
# 另一个控制台执行: etcdctl put foo bar
PUT
foo
bar# 同时监视多个值
$ etcdctl watch -i
$ watch foo
$ watch zoo
# 另一个控制台执行: etcdctl put foo bar
PUT
foo
bar# 另一个控制台执行: etcdctl put zoo val
PUT
zoo
val# 监视 foo 前缀命中的 key
$ etcdctl watch --prefix foo
# 另一个控制台执行: etcdctl put foo1 bar1
PUT
foo1
bar1
# 另一个控制台执行: etcdctl put fooz1 barz1
PUT
fooz1
barz1

七、设置租约

当一个 key 被绑定到一个租约上时,它的生命周期与租约的生命周期即绑定。

# 设置10秒后过期时间
$ etcdctl lease grant 10
lease 32698142c52a170a granted with TTL(10s)# 把 foo 和租约绑定,设置成 10 秒后过期
$ etcdctl put --lease=32698142c52a170a foo bar
OK
$ etcdctl get foo
foo
bar# 10 秒后,获取不到 foo
$ etcdctl get foo
# 返回空

八、撤销租约

通过租约 ID 撤销租约,撤销租约将删除其所有绑定的 key。

$ etcdctl lease grant 10
lease 32698142c52a170c granted with TTL(10s)
$ etcdctl put --lease=32698142c52a170c foo bar
OK# 撤销租约
$ etcdctl lease revoke 32698142c52a170c
lease 32698142c52a170c revoked$ etcdctl get foo
# 返回空

九、续约

通过刷新 TTL 值来保持租约的有效,使其不会过期。

# 设置 10 秒后过期租约
$ etcdctl lease grant 10
lease 32698142c52a170f granted with TTL(10s)# 把 foo 和租约绑定,设置成 10 秒后过期
$ etcdctl put foo bar --lease=32698142c52a170f# 自动定时执行续约,续约成功后每次租约为 10 秒
$ etcdctl lease keep-alive 32698142c52a170f
lease 32695410dcc0ca06 keepalived with TTL(10)
lease 32695410dcc0ca06 keepalived with TTL(10)
lease 32695410dcc0ca06 keepalived with TTL(10)
...

十、查看租约

查看租约信息,以便续租或查看租约是否仍然存在或已过期

# 设置 50 秒 TTL
$ etcdctl lease grant 50
lease 32698142c52a1711 granted with TTL(50s)# zoo1 绑定 32698142c52a1711 租约
$ etcdctl put --lease=32698142c52a1711 zoo1 val1
OK# 查看租约,remaining(32s) 剩余有效时间32秒;--keys 获取租约绑定的 key
$ etcdctl lease timetolive --keys 32698142c52a1711
lease 32698142c52a1711 granted with TTL(50s), remaining(32s), attached keys([zoo1])

注:一个租约支持绑定多个 key

$ etcdctl lease grant 50
lease 32698142c52a1713 granted with TTL(50s)$ etcdctl put --lease=32698142c52a1713 zoo1 val1
OK$ etcdctl put --lease=32698142c52a1713 zoo2 val2
OK$ etcdctl put --lease=32698142c52a1713 zoo3 val3
OK

租约过期后,所有 key 值都会被删除,因此:

  • 当租约只绑定了一个 key 时,想删除这个 key,最好的办法是撤销它的租约,而不是直接删除这个 key。
  • 当租约没有绑定key时,应主动把它撤销掉,单纯删除 key 后,续约操作持续进行,会造成内存泄露。

# 方法一:直接删除`key`
# 设置租约并绑定 zoo1
$ etcdctl lease grant 50
lease 32698142c52a1715 granted with TTL(50s)
$ etcdctl --lease=32698142c52a1715 put zoo1 val1
OK# 续约
$ etcdctl lease keep-alive 32698142c52a1715
lease 32698142c52a1715 keepalived with TTL(50)# 另一个控制台执行:etcdctl del zoo1
# 单纯删除 key 后,续约操作持续进行,会造成内存泄露
lease 32698142c52a1715 keepalived with TTL(50)
lease 32698142c52a1715 keepalived with TTL(50)
lease 32698142c52a1715 keepalived with TTL(50)
...# 方法二:撤销`key`的租约
# 设置租约并绑定 zoo1
$ etcdctl lease grant 50
lease 32698142c52a1717 granted with TTL(50s)
$ etcdctl --lease=32698142c52a1717 put zoo1 val1
OK# 续约
$ etcdctl lease keep-alive 32698142c52a1717
lease 32698142c52a1717 keepalived with TTL(50)
lease 32698142c52a1717 keepalived with TTL(50)# 另一个控制台执行:etcdctl lease revoke 32698142c52a1717# 续约撤销并退出
lease 32698142c52a1717 expired or revoked.
$ etcdctl get zoo1
# 返回空

以上,就是今天的全部内容,几乎包含了 etcd 安装和使用的各种姿势,欢迎各位号友敬请尝试。

References


  • [0] 三十一: http://www.lee31.cn/assets/image/ThirtyOneLee.jpeg
  • [1] etcd: https://github.com/etcd-io/etcd
  • [2] etcd 名字的由来: https://etcd.io/docs/v3.5/faq/
  • [3] https://www.infoq.cn/article/etcd-interpretation-application-scenario-implement-principle/
  • [4] etcd docker-compose yml: https://github.com/liyaodev/docker-compose
  • [5] etcdctl: https://etcd.io/docs/v3.5/dev-g

 


推荐阅读
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了如何清除Eclipse中SVN用户的设置。首先需要查看使用的SVN接口,然后根据接口类型找到相应的目录并删除相关文件。最后使用SVN更新或提交来应用更改。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • Hadoop2.6.0 + 云centos +伪分布式只谈部署
    3.0.3玩不好,现将2.6.0tar.gz上传到usr,chmod-Rhadoop:hadophadoop-2.6.0,rm掉3.0.32.在etcp ... [详细]
  • ZooKeeper 学习
    前言相信大家对ZooKeeper应该不算陌生。但是你真的了解ZooKeeper是个什么东西吗?如果别人面试官让你给他讲讲ZooKeeper是个什么东西, ... [详细]
  • mapreduce源码分析总结
    这篇文章总结的非常到位,故而转之一MapReduce概述MapReduce是一个用于大规模数据处理的分布式计算模型,它最初是由Google工程师设计并实现的ÿ ... [详细]
  • 【转】腾讯分析系统架构解析
    TA(TencentAnalytics,腾讯分析)是一款面向第三方站长的免费网站分析系统,在数据稳定性、及时性方面广受站长好评,其秒级的实时数据更新频率也获得业界的认可。本文将从实 ... [详细]
  • Java开发实战讲解!字节跳动三场技术面+HR面
    二、回顾整理阿里面试题基本就这样了,还有一些零星的问题想不起来了,答案也整理出来了。自我介绍JVM如何加载一个类的过程,双亲委派模型中有 ... [详细]
  • 本文_大数据之非常详细Sqoop安装和基本操作
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了大数据之非常详细Sqoop安装和基本操作相关的知识,希望对你有一定的参考价值。大数据大数据之 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
author-avatar
倒骑毛驴笑看人生gnWC_659
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有