云原生存储组件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 基于 Raft 算法,能够有力地保证分布式场景中的一致性。各个服务启动时注册到 etcd 上,同时为这些服务配置键的 TTL 时间,定时保持服务的心跳以达到监控健康状态的效果。通过在 etcd 指定的主题下注册的服务也能在对应的主题下查找到。为了确保连接,我们可以在每个服务机器上都部署一个 Proxy 模式的 etcd,这样就可以确保访问 etcd 集群的服务都能够互相连接。
2.3 消息发布与订阅
在分布式系统中,服务之间还可以通过消息通信,即消息的发布与订阅。通过构建一个消息中间件,服务提供者发布对应主题的消息,而消费者则订阅他们关心的主题,一旦对应的主题有消息发布,即会产生订阅事件,消息中间件就会通知该主题所有的订阅者。
2.4 分布式锁
分布式系统中涉及到多个服务实例,存在跨进程之间资源调用,对于资源的协调分配,单体架构中的锁已经无法满足需要,需要引入分布式锁的概念。分布式锁可以将资源标记存储,这里的存储不是单纯属于某个进程,而是公共存储,诸如 Redis、Memcache、关系型数据库、文件等。
etcd 基于 Raft 算法,实现分布式集群的一致性,存储到 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 etcd
和 brew install etcd
进行安装。
然而通过系统工具安装的 etcd 版本比较滞后,如果需要安装最新版本的 etcd ,我们可以通过二进制包、源码编译以及 docker 容器安装。
3.2 etcd 单机安装部署
etcd 的安装有多种方式,笔者以 Centos 7 和 MacOS 10.15 为例,可以通过 yum install etcd
和 brew 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