云原生存储组件Etcd快速入门

Posted DevOps云学堂

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了云原生存储组件Etcd快速入门相关的知识,希望对你有一定的参考价值。


2018年12月 etcd 作为孵化项目 CNCF(云原生计算基金会),几天前 CNCF 宣布 etcd 正式毕业,成为 CNCF 顶级项目。CNCF 官方表示 etcd 项目的采用率持续增加,也有稳定的治理流程,功能已达一定成熟度。

etcd 已经被许多公司用于实际生产,其中包括亚马逊、百度、思科、EMC、谷歌、阿里、华为、IBM、Red Hat、Uber、Verizon 等;而且其身影也出现在包括 Kubernetes、CoreDNS、M3、Rook 以及 TiKV 等项目当中。

前面的系列 etcd 文章已经部分介绍了 etcd。本文将会做一个快速入门的介绍,带领大家十分钟快速入门云原生存储组件 etcd,主要内容如下(本文较长,建议收藏):

  • etcd 简介,以及其应用场景
  • etcd 的多种安装模式及高可用运维
  • etcd v3 的架构解析
  • etcdctl 的实践应用

1 etcd 介绍

2013 年 6 月,CoreOS 发起了 etcd 项目。etcd 使用 Go 语言实现,是分布式系统中重要的基础组件,目前最新版本为 V3.4.9。etcd 可以用来构建高可用的分布式键值数据库,根据官网介绍,总结来说有如下的特点:

  • 简单:etcd 的安装简单,且为用户提供了 HTTP API,用户使用起来也很简单
  • 存储:etcd 的基本功能,数据分层存储在文件目录中,类似于我们日常使用的文件系统
  • Watch 机制:Watch 指定的键、前缀目录的更改,并对更改时间进行通知
  • 安全通信:SSL 证书验证
  • 高性能:etcd 单实例可以支持 2k/s 读操作,官方也有提供基准测试脚本
  • 一致可靠:基于 Raft 共识算法,实现分布式系统数据的高可用性、一致性

etcd 是一个分布式键值存储数据库,支持跨平台,拥有强大的社区。etcd 的 Raft 算法,提供了可靠的方式存储分布式集群涉及的数据。etcd 广泛应用在微服务架构和 Kubernates 集群中,不仅可以作为服务注册与发现,还可以作为键值对存储的中间件。从业务系统 Web 到 Kubernetes 集群,都可以很方便地从 etcd 中读取、写入数据。

2 etcd 应用场景

etcd 在稳定性、可靠性和可伸缩性表现极佳,同时也为云原生应用系统提供了协调机制。etcd 经常用于服务注册与发现的场景,此外还有键值对存储、消息发布与订阅、分布式锁等场景。

2.1 键值对存储

如下是官方对 etcd 的描述:

A highly-available key value store for shared configuration and service discovery.
一个用于配置共享和服务发现的键值存储系统。

从其定义来看,etcd 是一个「键值存储」的组件,存储是 etcd 最基本的功能,其他应用场景都是建立在 etcd 的可靠存储上。etcd 的存储有如下特点:

  • 采用键值对数据存储,读写性能一般高于关系型数据库;
  • etcd 集群分布式存储,多节点集群更加可靠;
  • etcd 的存储采用类似文件目录的结构:
    • 叶子节点存储数据,其他节点不存储,这些数据相当于文件;
    • 非叶节点一定是目录,这些节点不能存储数据。

比如 Kubernetes 将一些元数据存储在 etcd 中,将存储状态数据的的复杂工作交给 etcd,Kubernetes 自身的功能和架构能够更加专注。

2.2 服务注册与发现

分布式环境中,业务服务多实例部署,这个时候涉及到服务之间调用,就不能简单使用硬编码的方式指定服务实例信息。服务注册与发现就是解决如何找到分布式集群中的某一个服务(进程),并与之建立联系。

服务注册与发现涉及三个主要的角色:服务请求者、服务提供者和服务注册中心。

云原生存储组件Etcd快速入门
三大支柱

etcd 基于 Raft 算法,能够有力地保证分布式场景中的一致性。各个服务启动时注册到 etcd 上,同时为这些服务配置键的 TTL 时间,定时保持服务的心跳以达到监控健康状态的效果。通过在 etcd 指定的主题下注册的服务也能在对应的主题下查找到。为了确保连接,我们可以在每个服务机器上都部署一个 Proxy 模式的 etcd,这样就可以确保访问 etcd 集群的服务都能够互相连接。

2.3 消息发布与订阅

在分布式系统中,服务之间还可以通过消息通信,即消息的发布与订阅。通过构建一个消息中间件,服务提供者发布对应主题的消息,而消费者则订阅他们关心的主题,一旦对应的主题有消息发布,即会产生订阅事件,消息中间件就会通知该主题所有的订阅者。

2.4 分布式锁

分布式系统中涉及到多个服务实例,存在跨进程之间资源调用,对于资源的协调分配,单体架构中的锁已经无法满足需要,需要引入分布式锁的概念。分布式锁可以将资源标记存储,这里的存储不是单纯属于某个进程,而是公共存储,诸如 Redis、Memcache、关系型数据库、文件等。

etcd 基于 Raft 算法,实现分布式集群的一致性,存储到 etcd 集群中的值必然是全局一致的,因此基于 etcd 很容易实现分布式锁。分布式锁有两种使用方式:保持独占和控制时序。

云原生存储组件Etcd快速入门保持独占,从字面可以知道,所有获取资源的请求,只有一个成功。etcd 通过分布式锁原子操作 CAS 的 API,设置 prevExist 值,从而保证在多个节点同时去创建某个目录时,最后只有一个成功,创建成功的请求获取到锁。

控制时序,有点类似于队列缓冲,所有的请求都会被安排分配资源,但是获得锁的顺序也是全局唯一的,执行按照先后的顺序。etcd 提供了一套自动创建有序键的 API,对一个目录的建值操作,这样 etcd 会自动生成一个当前最大的值为键,并存储该值。同时还可以使用 API 按顺序列出当前目录下的所有键值。

3 etcd 的多种安装方法

etcd 的安装非常简单,我们在本小节实践 etcd 单机和集群的几种安装方式。

3.1 etcd 概念词汇表

下文的安装实践可能会涉及到 etcd 相关的概念词汇,因此我们首先了解下 etcd 的概念词汇表,以便于下文的理解。

  • Raft:分布式一致性算法;
  • Node:Raft 状态机实例;
  • Member:管理着 Node 的 etcd 实例,为客户端请求提供服务;
  • Cluster:etcd 集群,由多个 Member 构成;
  • Peer:同一个 etcd 集群中的另一个 Member;
  • Client:客户端,向 etcd 发送 HTTP 请求;
  • WAL:持久化存储的日志格式,预写式日志;
  • Snapshot:etcd 数据快照,防止 WAL 文件过多而设置的快照。

在了解了 etcd 的常用术语之后,我们下面开始介绍 etcd v3 的架构。

etcd 的安装有多种方式,笔者以 Centos 7 和 MacOS 10.15 为例,可以通过 yum install etcdbrew install etcd进行安装。

然而通过系统工具安装的 etcd 版本比较滞后,如果需要安装最新版本的 etcd ,我们可以通过二进制包、源码编译以及 docker 容器安装。

3.2 etcd 单机安装部署

etcd 的安装有多种方式,笔者以 Centos 7 和 MacOS 10.15 为例,可以通过 yum install etcdbrew install etcd进行安装。

然而通过系统工具安装的 etcd 版本比较滞后,如果需要安装最新版本的 etcd ,我们可以通过二进制包、源码编译以及 docker 容器安装。

3.2.1 二进制安装

在 macOS 下,安装 3.4.5,指定 etcd 版本,执行如下的脚本:

ETCD_VER=v3.4.5
GITHUB_URL=https://github.com/etcd-io/etcd/releases/download
DOWNLOAD_URL=${GITHUB_URL}

rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test

curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-darwin-amd64.zip -o /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
unzip /tmp/etcd-${ETCD_VER}-darwin-amd64.zip -d /tmp && rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
mv /tmp/etcd-${ETCD_VER}-darwin-amd64/* /tmp/etcd-download-test && rm -rf mv /tmp/etcd-${ETCD_VER}-darwin-amd64

/tmp/etcd-download-test/etcd --version
/tmp/etcd-download-test/etcdctl version

执行完上面的脚本,控制台即可输出如下的结果:

etcd Version: 3.4.5
Git SHA: c65a9e2dd
Go Version: go1.12.12
Go OS/Arch: darwin/amd64

根据控制台的显示,etcd 安装成功,版本为 etcd 3.4.5,基于的 Go 语言版本为 1.12.12

Linux 上的操作也类似,Centos 7 系统执行的脚本可以参考 etcd 官方提供的脚本。

我们在这一小节演示了单机 etcd 在 macOS 和 Linux 上的安装。etcd 在 Windows 系统的安装比较简单,下载可执行文件,其中 etcd.exe 是 etcd Server,etcdctl.exe 命令行工具。

3.2.2 源码安装

对于那些想尝试最新版本的同学,可以从 master 分支构建 etcd。使用源码安装,首先需要确保本地的 Go 语言环境。如未安装,请参考 https://golang.org/doc/install。需要 Go 版本为 1.13+,来构建最新版本的 etcd。本地的 Go 版本为:

$ go version

go version go1.14.2 darwin/amd64

基于 master 分支构建 etcd,脚本如下:

git clone https://github.com/etcd-io/etcd.git
cd etcd
./build

安装完记得执行测试命令,确保 etcd 源码编译安装成功。


此篇文章作者新出的ETCD专栏,非常不错。已经学习了两讲内容,很接地气。推荐给大家

以上是关于云原生存储组件Etcd快速入门的主要内容,如果未能解决你的问题,请参考以下文章

云原生训练营模块五 Kubernetes 控制平面组件:etcd

云原生训练营模块五 Kubernetes 控制平面组件:etcd

从零开始入门 K8s | etcd 性能优化实践

etcd-operator快速入门完全教程

云原生安全系列 5:ETCD 安全加固

阿里巴巴云原生 etcd 服务集群管控优化实践