Etcd 简介
Etcd CoreOS 团队于 2013 年6月发起的开源项目,它的目标是构建一个高可用的分布式键值( key-value )仓库,遵循 Apache v2许可,基于 Go 语言实现,接触过分布式系统的读者应该知道,分布式系统中最基本的问题之一就是实现信息的共识,在此基础上才能实现对服务配置信息的管理、服务的发现、更新、同步,等等 而要解决这些问题,往往需要利用一套能保证一致性的分布式数据库系统,比如经典的 Apache ZooKeeper 项目 ,采用了 Paxos 算法来实现数据的强一致性。
Etcd 专门为集群环境设计,采用了更为简洁的 Raft 共识算法,Raft 是一套通过选举主节点来实现分布式系统一致性的算法,同样可以实现数据强一致性,并支持集群节点状态管理和服务自动发现等
Etcd 在进行设计的时候重点考虑了下面四个要素:
口简单:支持 RESTfulAPI和gRPCAPI;
口安全: 基于 TLS 式实 安全连接访
口快速: 支持每 一万次 并发写操作,超时控制在毫秒量级
口可靠: 支持分布式结构 基于 Raft 算法实现一致性
通常情况下,用户使用 Etcd 可以在多个节点上启动多个实例,并将它们添加为 个集群。同一个集群中的 Etcd 实例将会自动保持彼此信息的一致性,这意味着分布在各个节点上的应用也将获取到一致的信息。
安装和使用 Etcd
第一步:下载
https://github.com/etcd-io/etcd/releases
第二步:解压
[root@ken2 ~]# tar xf etcd-v3.3.1-linux-amd64.tar.gz
[root@ken2 ~]# cp etcd-v3.3.1-linux-amd64/etcd* /usr/local/bin
其中 etcd 是服务主文件, etcdctl 是提供给用户的命令客户端,其他都是文档文件
使用etcd
下面将先以单节点 式为例讲解 Etcd 支持的功能和操作
1.可通过如下命令查看 etcd 的版本信息:
[root@ken2 ~]# etcdctl --version
etcdctl version: 3.3.1
API version: 2
2.接下来,直接执行 Etcd 命令,将启动 个服务节点,监昕在本地的 2379 (客户端端口)和 2380 (其他节点连 端口
显示类似如下的信息:
[root@ken2 ~]# etcd
[WARNING] Deprecated '--logger=capnslog' flag is set; use '--logger=zap' flag instead
2019-09-10 14:24:00.393171 I | etcdmain: etcd Version: 3.4.0
2019-09-10 14:24:00.393235 I | etcdmain: Git SHA: 898bd1351
2019-09-10 14:24:00.393242 I | etcdmain: Go Version: go1.12.9
2019-09-10 14:24:00.393253 I | etcdmain: Go OS/Arch: linux/amd64
2019-09-10 14:24:00.393262 I | etcdmain: setting maximum number of CPUs to 4, total number of available CPUs is 4
2019-09-10 14:24:00.393273 W | etcdmain: no data-dir provided, using default data-dir ./default.etcd
[WARNING] Deprecated '--logger=capnslog' flag is set; use '--logger=zap' flag instead
2019-09-10 14:24:00.492487 I | embed: name = default
2019-09-10 14:24:00.492507 I | embed: data dir = default.etcd
2019-09-10 14:24:00.492513 I | embed: member dir = default.etcd/member
2019-09-10 14:24:00.492518 I | embed: heartbeat = 100ms
2019-09-10 14:24:00.492522 I | embed: election = 1000ms
2019-09-10 14:24:00.492526 I | embed: snapshot count = 100000
2019-09-10 14:24:00.492540 I | embed: advertise client URLs = http://localhost:2379
2019-09-10 14:24:00.500959 I | etcdserver: starting member 8e9e05c52164694d in cluster cdf818194e3a8c32
raft2019/09/10 14:24:00 INFO: 8e9e05c52164694d switched to configuration voters=()
raft2019/09/10 14:24:00 INFO: 8e9e05c52164694d became follower at term 0
raft2019/09/10 14:24:00 INFO: newRaft 8e9e05c52164694d [peers: [], term: 0, commit: 0, applied: 0, lastindex: 0, lastterm: 0]
raft2019/09/10 14:24:00 INFO: 8e9e05c52164694d became follower at term 1
raft2019/09/10 14:24:00 INFO: 8e9e05c52164694d switched to configuration voters=(10276657743932975437)
2019-09-10 14:24:00.512116 W | auth: simple token is not cryptographically signed
2019-09-10 14:24:00.514290 I | etcdserver: starting server... [version: 3.4.0, cluster version: to_be_decided]
2019-09-10 14:24:00.516603 I | etcdserver: 8e9e05c52164694d as single-node; fast-forwarding 9 ticks (election ticks 10)
raft2019/09/10 14:24:00 INFO: 8e9e05c52164694d switched to configuration voters=(10276657743932975437)
2019-09-10 14:24:00.524693 I | etcdserver/membership: added member 8e9e05c52164694d [http://localhost:2380] to cluster cdf818194e3a8c32
2019-09-10 14:24:00.529322 I | embed: listening for peers on 127.0.0.1:2380
raft2019/09/10 14:24:01 INFO: 8e9e05c52164694d is starting a new election at term 1
raft2019/09/10 14:24:01 INFO: 8e9e05c52164694d became candidate at term 2
raft2019/09/10 14:24:01 INFO: 8e9e05c52164694d received MsgVoteResp from 8e9e05c52164694d at term 2
raft2019/09/10 14:24:01 INFO: 8e9e05c52164694d became leader at term 2
raft2019/09/10 14:24:01 INFO: raft.node: 8e9e05c52164694d elected leader 8e9e05c52164694d at term 2
2019-09-10 14: