初学etcd
知识背景:了解完Docker、Mesos、Zookeeper等容器技术
疑问1:指的是什么
疑问2:有什么用处
疑问3:怎么使用
一、etcd是什么
CoreOS 是一个基于 Docker 的轻量级容器化 Linux 发行版,专为大型数据中心而设计,旨在通过轻量的系统架构和灵活的应用程序部署能力简化数据中心的维护成本和复杂度。CoreOS 作为 Docker 生态圈中的重要一员,日益得到各大云服务商的重视,目前已经完成了 A 轮融资,发展风头正劲。如果说 Docker 是下一代的虚拟机,那 CoreOS 就应该是下一代的服务器 Linux。
raft
协议作为一致性算法,etcd基于Go语言实现。 3. 它的结构
一个 etcd 节点的核心由三部分组成:
WAL (Write-ahead logging),是用于向系统提供原子性和持久性的一系列技术。在使用 WAL 的系提供中,所有的修改在提交之前都要先写入 log 文件中。etcd 的 WAL 由日志存储与快照存储两部分组成,其中 Entry 负责存储具体日志的内容,而 Snapshot 负责在日志内容发生变化的时候保存 raft 的状态。WAL 会在本地磁盘的一个指定目录下分别日志条目与快照内容。
4. etcd基础知识
每个 etcd cluster 都是有若干个 member 组成的,每个 member 是一个独立运行的 etcd 实例,单台机器上可以运行多个 member。
在正常运行的状态下,集群中会有一个 leader,其余的 member 都是 followers。leader 向 followers 同步日志,保证数据在各个 member 都有副本。leader 还会定时向所有的 member 发送心跳报文,如果在规定的时间里 follower 没有收到心跳,就会重新进行选举。
客户端所有的请求都会先发送给 leader,leader 向所有的 followers 同步日志,等收到超过半数的确认后就把该日志存储到磁盘,并返回响应客户端。
每个 etcd 服务有三大主要部分组成:raft 实现、WAL 日志存储、数据的存储和索引。WAL 会在本地磁盘(就是之前提到的 --data-dir
)上存储日志内容(wal file)和快照(snapshot)。
二、etcd应用场景
etcd比较多的应用场景是用于服务发现,服务发现(Service Discovery)要解决的是分布式系统中最常见的问题之一,即在同一个分布式集群中的进程或服务如何才能找到对方并建立连接。
从本质上说,服务发现就是要了解集群中是否有进程在监听upd或者tcp端口,并且通过名字就可以进行查找和链接。
要解决服务发现的问题,需要下面三大支柱,缺一不可。
基于Ralf算法的etcd天生就是这样一个强一致性、高可用的服务存储目录。
用户可以在etcd中注册服务,并且对注册的服务配置key TTL,定时保持服务的心跳以达到监控健康状态的效果。
通过在etcd指定的主题下注册的服务业能在对应的主题下查找到。为了确保连接,我们可以在每个服务机器上都部署一个proxy模式的etcd,这样就可以确保访问etcd集群的服务都能够互相连接。
三、使用:etcd集群的安装
在安装和启动 etcd 服务的时候,各个节点需要知道集群中其他节点的信息(一般是 ip 和 port 信息)。根据你是否可以提前知道每个节点的 ip,有几种不同的启动方案:
--initial-cluster
参数配置好所有的节点信息discovery.etcd.io
etcd 的安装文档官网已经给出了,这里不再赘述。当然,你也可以通过 docker 来安装 etcd,具体的文档可以看这里。
下面给出可以常用配置的参数和它们的解释,方便理解:
--name
:方便理解的节点名称,默认为 default
,在集群中应该保持唯一,可以使用 hostname--data-dir
:服务运行数据保存的路径,默认为 ${name}.etcd
--snapshot-count
:指定有多少事务(transaction)被提交时,触发截取快照保存到磁盘--heartbeat-interval
:leader 多久发送一次心跳到 followers。默认值是 100ms--eletion-timeout
:重新投票的超时时间,如果 follow 在该时间间隔没有收到心跳包,会触发重新投票,默认为 1000 ms--listen-peer-urls
:和同伴通信的地址,比如 http://ip:2380
,如果有多个,使用逗号分隔。需要所有节点都能够访问,所以不要使用 localhost!--listen-client-urls
:对外提供服务的地址:比如 http://ip:2379,http://127.0.0.1:2379
,客户端会连接到这里和 etcd 交互--advertise-client-urls
:对外公告的该节点客户端监听地址,这个值会告诉集群中其他节点--initial-advertise-peer-urls
:该节点同伴监听地址,这个值会告诉集群中其他节点--initial-cluster
:集群中所有节点的信息,格式为 node1=http://ip1:2380,node2=http://ip2:2380,…
。注意:这里的 node1
是节点的 --name
指定的名字;后面的 ip1:2380
是 --initial-advertise-peer-urls
指定的值--initial-cluster-state
:新建集群的时候,这个值为 new
;假如已经存在的集群,这个值为 existing
--initial-cluster-token
:创建集群的 token,这个值每个集群保持唯一。这样的话,如果你要重新创建集群,即使配置和之前一样,也会再次生成新的集群和节点 uuid;否则会导致多个集群之间的冲突,造成未知的错误所有以 --init
开头的配置都是在 bootstrap 集群的时候才会用到,后续节点的重启会被忽略。
NOTE:所有的参数也可以通过环境变量进行设置,--my-flag
对应环境变量的 ETCD_MY_FLAG
;但是命令行指定的参数会覆盖环境变量对应的值。
请在生产环境中配置 etcd 集群,并使用 SSL 安全机制。
更加详细的配置操作、Key的配置、TTL的配置、监听、原子操作。参考以下链接。
本文的产生,是作者通过以下参考文献学习的,有兴趣的可以看看。
https://www.hi-linux.com/posts/40915.html
https://cizixs.com/2016/08/02/intro-to-etcd/
https://www.infoq.cn/article/coreos-analyse-etcd/