参考Etcd 使用入门
参考Etcd简介

1 etcd简介

1.1 概述

etcd这个名字由两部分组成:etc和d,即UNIX/Linux操作系统的/etc目录和分布式(distributed)首字母的d。/etc目录一般用于存储UNIX/Linux操作系统的配置信息因此etc和d合起来就是一个分布式的/etc目录。由此可见,etcd的寓意是为大规模分布式系统存储配置信息。

etcd用于提供可靠的分布式键值(key-value)存储、配置共享和服务发现等功能。
在这里插入图片描述
etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。etcd内部采用raft协议作为一致性算法,etcd基于Go语言实现。

(1)etcd作为服务发现系统的特点
简单:安装配置简单,而且提供了HTTP API进行交互,使用也很简单。
安全:支持SSL证书验证。
快速:根据官方提供的benchmark数据,单实例支持每秒2k+读操作。
可靠:采用raft算法,实现分布式系统数据的可用性和一致性。

(2)etcd应用场景
etcd比较多的应用场景是用于服务发现,服务发现(Service Discovery)要解决的是分布式系统中最常见的问题之一,即在同一个分布式集群中的进程或服务如何才能找到对方并建立连接。

从本质上说,服务发现就是要了解集群中是否有进程在监听upd或者tcp端口,并且通过名字就可以进行查找和链接。

(2-1)一个强一致性、高可用的服务存储目录
基于Ralf算法的etcd天生就是这样一个强一致性、高可用的服务存储目录。

(2-2)一种注册服务和监控服务健康状况的机制

用户可以在etcd中注册服务,并且对注册的服务配置key TTL,定时保持服务的心跳以达到监控健康状态的效果。

(2-3)一种查找和连接服务的机制

通过在etcd指定的主题下注册的服务也能在对应的主题下查找到。为了确保连接,我们可以在每个服务机器上都部署一个proxy模式的etcd,这样就可以确保访问etcd集群的服务都能够互相连接。

在这里插入图片描述

1.2 术语

一致性(Consistency)一直是分布式系统里一个很重要的话题。在存储系统中,为了避免数据丢失,我们都会对数据进行持久化。

对数据进行持久化可以避免宕机带来的数据丢失问题,但是不能解决单机永久性故障的问题。存储系统作为基础设施,在单机上持久化是远远不够的,我们需要将数据复制到多台机器上以提升系统的可用性和可靠性。

一旦数据被复制到多个节点,那么就产生了一致性的问题。系统需要定义一组协议来规定用户读写多副本的行为,这组协议称之为一致性模型(Consistency Model)。在分布式系统领域,谈论一致性时通常谈论的都是一致性模型。

Strict Consistency是最强的一致性模型,要求任何读取操作都能读取到最新的值,换句话说,要求任何写入操作立即同步给所有进程。在分布式系统中,数据的同步是需要时间的,因此在分布式系统下无法严格实现Strict Consistency。除非让所有的读写操作都只在一个进程的一个线程中执行或者读写操作被锁保护起来。(根据CAP的原理,这个一致性模型在没有牺牲可用性的前提下是不能得到满足的。 性能也是不可接受的:所有的写操作需要同步到所有节点之后再返回给客户端。)
CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。

(1)Raft: etcd所采用的保证分布式系统强一致性的算法。
(2)Node:一个Raft状态机实例。
(3)Member:一个etcd实例。它管理着一个Node,并且可以为客户端请求提供服务。
(4)Cluster:由多个Member构成的,遵循Raft一致性协议的etcd集群。
(5)Peer:对同一个etcd集群中另外一个Member的叫法。
(6)Client:凡是连接etcd服务器请求服务的,例如获取key-value、写数据或watch更新的程序,都统称为Client。
(7)Proposal:一个需要经过Raft一致性协议的请求,例如,写请求或配置更新请求。
   
(8)WAL:预写式日志,etcd用于持久化存储的日志格式。
(9)Snapshot:etcd集群状态在某一时间点的快照(备份),etcd为防止WAL文件过多而设置的快照,用于存储etcd的数据状态。
(10)Proxy:etcd的一种模式,为etcd集群提供反向代理服务。
(11)Leader:Raft算法中通过竞选而产生的处理所有数据提交的节点。
(12)Follower:竞选失败的节点作为Ra位中的从属节点,为算法提供强一致性保证。
(13)Candidate:当Follower超过一定的时间还接收不到Leader的心跳时转为Candidate开始竞选。
(14)Term:某个节点从成为Leader到下一次竞选的时间,称为一个Term。
(15)Index:WAL日志数据项编号。Raft中通过Term和Index来定位数据。
(16)Key:用户定义的用于存储和获取用户定义数据的标识符。
(17)Key space:键空间,etcd集群内所有键的集合。
(18)Revision:etcd集群范围内64位的计数器,键空间的每次修改都会导致该计数器的增加。
(19)ModificationRevision:一个key最后一次修改的revision。
(20)Lease:一个短时的(会过期),可续订的契约(租约),当它过期时,就会删除与之关联的所有键。
(21)Transition:事务,一个自动执行的操作集,要么一块成功,要么一块失败。
(22)Watcher:观察者,etcd最具特色的概念之一。客户端通过打开一个观察者来获取一个给定键范围的更新。
(23)Key Range:键范围,一个键的集合,这个集合既可以是只有一个key或者是在一个字典区间,例如(a,b],或者是大于某个key的所有key。
(24)Endpoint:指向etcd服务或资源的URL。
(25)Compaction:etcd的压缩(Compaction)操作,丢弃所有etcd的历史数据并且取代一个给定revision之前的所有key。压缩操作通常用于重新声明etcd后端数据库的存储空间。其与Raft的日志压缩是一个原理。
(26)key version:键版本,即一个键从创建开始的写(修改)次数,从l开始。一个不存在或已删除的键版本是0。其与revision的概念不同。

Quorum:Raft协议需要的、能够修改集群状态的、活跃的etcd集群成员数量称为Quorum(法定人数)。通俗地讲,即etcd集群成员的半数以上。etcd使用仲裁机制,若集群中存在几个节点,那么集群中有(n+1)/2个节点达成一致,则操作成功。建议的最优节点数量为3,5,7。大多数用户场景中,一个包含7个节点的集群是足够的。更多的节点(比如9,11等)可以最大限度地保证数据安全,但是写性能会受影响,因为需要向更多的集群写人数据

2 etcd安装

etcd在生产环境中一般推荐集群方式部署。
etcd默认使用2379端口提供HTTP API服务。
etcd默认使用2380端口和peer(同级)通信。
这两个端口已经被IANA官方预留给etcd。IANA(The Internet Assigned Numbers Authority,互联网数字分配机构)是负责协调一些使Internet正常运作的机构。同时,由于Internet已经成为一个全球范围的不受集权控制的全球网络,为了使网络在全球范围内协调,存在对互联网一些关键的部分达成技术共识的需要,而这就是IANA的任务。
etcd是go语言编写的,安装只需要下载对应的二进制文件,并放到合适的路径即可。

2.1 下载解压安装

#wget https://github.com/coreos/etcd/releases/download/v3.2.12/etcd-v3.2.12-linux-amd64.tar.gz
#tar xzvf etcd-v3.2.12-linux-amd64.tar.gz
# mkdir -p /opt/etcd/bin
# mv etcd-v3.2.12-linux-amd64/{etcd,etcdctl} /opt/etcd/bin/

在这里插入图片描述
解压后是一些文档和两个二进制文件etcd和etcdctl。etcd是server端,etcdctl是客户端。
在测试环境,启动一个单节点的etcd服务,只需要运行etcd命令即可。

#/opt/etcd/bin/etcd
(1)基础版本信息
etcdmain: etcd Version: 3.2.12
etcdmain: Git SHA: b19dae0
etcdmain: Go Version: go1.8.5
etcdmain: Go OS/Arch: linux/amd64
etcdmain: setting maximum number of CPUs to 2, total number of available CPUs is 2
etcdmain: no data-dir provided, using default data-dir ./default.etcd
保存日志和快照的目录,默认为当前工作目录default.etcd/目录下。
etcdmain: the server is already initialized as member before, starting as etcd member...

(2)交互信息
embed: listening for peers on http://localhost:2380
embed: listening for client requests on localhost:2379
etcdserver: name = default
在http://localhost:2380和集群中其他节点通信。
在http://localhost:2379提供HTTP API服务,供客户端交互。
name表示节点名称,默认为default。

(3)配置参数
etcdserver: data dir = default.etcd
etcdserver: member dir = default.etcd/member
etcdserver: heartbeat = 100ms
etcdserver: election = 1000ms
etcdserver: snapshot count = 100000
etcdserver: advertise client URLs = http://localhost:2379
heartbeat参数是leader多久发送一次心跳到followers,默认100ms。
election参数是重新投票的超时时间,若followers在该时间间隔没有收到心跳包,会触发重新投票,默认1000ms。
snapshot count参数的作用是指定有多少事务被提交时,触发截取快照保存到磁盘。

(4)集群和每个节点都会生成一个uuid
etcdserver: restarting member 8e9e05c52164694d in cluster cdf818194e3a8c32 at commit index 4
集群cdf818194e3a8c32
节点8e9e05c52164694d

(5)启动的时候会运行raft,选举出leader
raft: 8e9e05c52164694d became follower at term 2
raft: newRaft 8e9e05c52164694d [peers: [], term: 2, commit: 4, applied: 0, lastindex: 4, lastterm: 2]
auth: simple token is not cryptographically密码地 signed
etcdserver: starting server... [version: 3.2.12, cluster version: to_be_decided]
etcdserver/membership: added member 8e9e05c52164694d [http://localhost:2380] to cluster cdf818194e3a8c32
etcdserver/membership: set the initial cluster version to 3.2
etcdserver/api: enabled capabilities for version 3.2
raft: 8e9e05c52164694d is starting a new election at term 2
raft: 8e9e05c52164694d became candidate at term 3
raft: 8e9e05c52164694d received MsgVoteResp from 8e9e05c52164694d at term 3
raft: 8e9e05c52164694d became leader at term 3
raft: raft.node: 8e9e05c52164694d elected leader 8e9e05c52164694d at term 3

(6)开始对外服务
etcdserver: published {Name:default ClientURLs:[http://localhost:2379]} to cluster cdf818194e3a8c32
embed: ready to serve client requests
etcdmain: forgot to set Type=notify in systemd service file?
etcdserver/api/v3rpc: dialing to target with scheme: ""
etcdserver/api/v3rpc: could not get resolver for scheme: ""
embed: serving insecure client requests on 127.0.0.1:2379, this is strongly discouraged!

UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,是一种软件建构的标准,亦为开放软件基金会组织在分布式计算环境领域的一部分。其目的,是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。如此一来,每个人都可以创建不与其它人冲突的UUID。在这样的情况下,就不需考虑数据库创建时的名称重复问题。

上面的方法只是简单的启动一个etcd服务,但要长期运行的话,还是做成一个服务好一些。

2.2 设置开机自启动

(1)建立相关目录
mkdir -p /var/lib/etcd/
mkdir -p /opt/etcd/config/
(2)创建etcd配置文件
#cat /opt/etcd/config/etcd.conf

#节点名称
ETCD_NAME=$(hostname -s)
#数据存放位置
ETCD_DATA_DIR=/var/lib/etcd

(3)创建systemd配置文件
#cat /etc/systemd/system/etcd.service

[Unit]
Description=Etcd Server
Documentation=https://github.com/coreos/etcd
After=network.target

[Service]
Type=notify
EnvironmentFile=- /opt/etcd/config/etcd.conf
ExecStart=/opt/etcd/bin/etcd
Restart=on-failure
LimitNOFILE=40000

[Install]
WantedBy=multi-user.target

(4)启动etcd

systemctl daemon-reload
systemctl enable etcd
systemctl start etcd

3 etcd基本使用

etcdctl是一个命令行客户端,它能提供一些简洁的命令,供用户直接跟etcd服务打交道,而无需基于 HTTP API方式。可以方便我们在对服务进行测试或者手动修改数据库内容,这些操作跟HTTP API基本上是对应的。

etcd项目二进制发行包中已经包含了etcdctl工具,etcdctl支持的命令大体上分为数据库操作和非数据库操作两类。

在这里插入图片描述

#/opt/etcd/bin/etcdctl -h查看帮助


版权声明:本文为qq_20466211原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_20466211/article/details/114916059