简介
etcd是CoreOS团队于2013年6月发起的开源项目,是一个分布式、可靠 key-value 存储的分布式系统。当然,它不仅仅用于存储,还提供共享配置及服务发现。
向etcd 注册 该服务(其实就是 存一个值)然后向etcd 发送心跳,当etcd 没有检测到心跳就会 把这个键值对 删了(这整个动作是etcd里的租约模式),网关那边 就只需要 watch 这个 key ,就能够知道 所有服务的所有动态了
etcd现在用于制作服务发现是比较常见的。用一篇文章记录一下如何安装、配置、使用。以及介绍一些etcd的工作原理,术语。
etcd术语
术语 | 说明 |
---|---|
Term | 选举任期,每次选举之后递增 |
Vote | 选举时一张投票 |
Entry | Raft算法的日志的一个条目 |
Candidate | 候选人,参与竞选的节点 |
Leader | 领导,负责主动处理写入请求的节点 |
Follower | 跟随着,不负责主动写入,仅仅从Leader同步数据 |
Commit | 提交,序列化数据写入到日志中 |
Propose | 提议,请求大部分节点同意数据写入 |
Consensus | 一致性 |
安装
因为etcd是go语言编写的,安装只需要下载对应的二进制文件,并放到合适的路径就行。
解压后是一些文档和两个二进制文件etcd和etcdctl。etcd是server端,etcdctl是客户端。
配置
etcd
的配置文件时使用的yaml
文件格式。
1 | name: 'single-etcd' |
启动命令行:
1 | ./etcd --config-file etcd-single.yml |
我们可以通过使用指令来查询里面的信息。
1 | PS C:\Users\abel> etcdctl --endpoints=127.0.0.1:2381 put /test/key "test kubernetes" |
/all/server
基本用法
1 | 服务发现:服务器将会往etcd中的key里面写入自己的服务器连接信息,并且将 |
raft算法
一致性算法是在复制状态机的背景中被提出来的。指的是在一组服务器中产生同样状态的副本,因此即使一些机器发生故障之后仍然能正常工作。复制状态机被用于解决分布式系统中的容错处理。zookeeper 中就使用了复制状态机。在这之前还有一种叫做Paxos
算法。复制状态机是通过复制日志来实现的。每一台服务器保存着一份日志,日志中包含一系列的命令,状态机会按顺序执行这些命令。因为每一台计算机的状态机都是确定的,所以每个状态机的状态都是相同的,执行的命令是相同的,最后的执行结果也就是一样的了。如何保证复制日志的一致就是一致性算法的工作内容。
一致性算法共性:
确保安全性(从来不会返回错误的结果)在所有的非拜占庭问题的条件下,包括网络延迟、分区、丢包、乱序等情况
可用性 只要集群中大多数节点能够彼此通信,也能和客户端保持通信、
不依赖定时去确保日志的一致性
通常情况下,只要集群中大多数节点对一轮 RPC 调用做出了相应,一条命令即可被视为已经完成。集群中少部分慢的节点不会影响整个系统的性能。
Raft和现有算法的特性:
Strong leader: raft 和其他一致性算法相比,采用了一种更强力的领导策略。比如,日志条目只允许从领导到服务器。这样简化了对于重复日志的管理,并让 raft 更加容易理解。
Leader election: raft 采用随机定时器来选举领导。 这样只需要在心跳中加入少量的随机策略,就能简单迅速的解决冲突问题
Membership changes:: raft 在调整聚群成员的时候采用了一种联合一致性( joint consensus)的机制。这样当配置改变的时候,集群可以继续运行
工作原理,先看演示动画。有时间再看别人的笔记。最后看论文。
报错信息etcdserver: mvcc: database space exceeded
- 将启动语句增加auto-compaction-retention参数。
nohup etcd --auto-compaction-retention=1 --config-file etcd1.yml >> /root/lib/etcd-v3.5.0-linux-amd64/etcd1.log &
- 重新启动etcd之后,使用命令将etcd空间清理掉
1 | #使用API3 |
尝试使用etcd制作服务发现
服务器启动的时候开启一个租赁obj
将服务器的信息捆绑租赁写入到etcd
客户端watch服务器写入的数据key,当服务器关闭或者更新数据的时候将会有通知。
在 macOS 上安装 etcd
,可以通过 Homebrew 这个包管理工具来安装。以下是详细步骤:
1. 安装 Homebrew
如果你还没有安装 Homebrew,可以先按照以下步骤进行安装:
1 | /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" |
2. 更新 Homebrew
安装好 Homebrew 后,更新 Homebrew 以确保包列表是最新的:
1 | brew update |
3. 安装 etcd
使用 Homebrew 安装 etcd
:
1 | brew install etcd |
4. 验证安装
安装完成后,你可以通过以下命令来验证 etcd
是否安装成功:
1 | etcd --version |
这将显示 etcd
的版本信息,确认安装是否成功。
5. 启动 etcd
可以使用命令行启动 etcd
,默认会在本地启动一个单节点的 etcd 服务:
1 | etcd |
如果你想让 etcd
在后台运行,可以使用:
1 | etcd &>/dev/null & |
6. 验证 etcd 运行状态
你可以使用 etcdctl
命令行工具来验证 etcd
是否正常运行:
1 | etcdctl --endpoints=localhost:2379 endpoint health |
如果 etcd
运行正常,输出会类似于:
1 | localhost:2379 is healthy: successfully committed proposal: took = x.xxxms |
7. 停止 etcd
如果你想停止 etcd
,可以使用 kill
命令杀死 etcd
进程:
1 | ps aux | grep etcd |
将 <process_id>
替换为 etcd
进程的 ID。
总结
- 使用 Homebrew 轻松安装
etcd
。 - 通过命令行启动、验证和管理
etcd
实例。 - 在后台运行
etcd
或使用etcdctl
工具与etcd
进行交互。
在 Ubuntu 上直接安装etcd
,可以通过以下步骤完成。你可以使用官方发布的二进制文件或通过包管理工具安装。
方法 1:通过二进制文件安装 etcd
这是官方推荐的安装方式。
1. 下载最新的 etcd
发行版
首先,你需要从 etcd
的 GitHub releases 页面下载最新的 etcd
二进制文件。
1 | # 前往 /tmp 目录下载文件 |
2. 解压并安装 etcd
1 | # 解压文件 |
3. 验证 etcd
是否安装成功
1 | etcd --version |
你应该会看到 etcd
和 etcdctl
的版本信息,表示安装成功。
4. 启动 etcd
可以直接在终端启动 etcd
,例如单节点模式:
1 | etcd --name my-etcd-1 \ |
如果需要后台运行,可以使用 screen
或 nohup
命令:
1 | nohup etcd --name my-etcd-1 \ |
5. 验证 etcd
运行状态
使用 etcdctl
验证 etcd
是否运行正常:
1 | etcdctl --endpoints=http://localhost:2379 member list |
你应该会看到集群成员信息,表示 etcd
正常运行。
方法 2:通过 APT 包管理器安装 etcd
虽然官方没有提供 etcd
的 APT 软件包,但有一些非官方软件源提供 etcd
的安装包。你可以尝试从这些源安装,不过版本可能不会是最新的。
1. 添加软件源
你可以尝试直接从 Ubuntu 的默认仓库或其他第三方软件源安装 etcd
。
首先,确保你的系统软件源是最新的:
1 | sudo apt update |
2. 安装 etcd
在 Ubuntu 20.04 或以上版本,你可以直接使用 APT 安装 etcd
:
1 | sudo apt install etcd-server |
3. 启动 etcd
安装完成后,你可以使用以下命令启动 etcd
:
1 | sudo systemctl start etcd |
并设置开机自启动:
1 | sudo systemctl enable etcd |
4. 检查服务状态
你可以使用 systemctl
命令查看 etcd
的运行状态:
1 | sudo systemctl status etcd |
5. 配置 etcd
默认情况下,etcd
的配置文件位于 /etc/default/etcd
,你可以根据需求修改该文件。
例如,你可以设置 listen-client-urls
和 advertise-client-urls
:
1 | ETCD_LISTEN_CLIENT_URLS="http://localhost:2379" |
修改完成后,重新启动 etcd
:
1 | sudo systemctl restart etcd |
6. 使用 etcdctl
验证
同样可以使用 etcdctl
验证 etcd
是否正常运行:
1 | etcdctl --endpoints=http://localhost:2379 member list |
总结
- 通过二进制文件安装:这是官方推荐的方法,保证了使用最新版本的
etcd
。 - 通过 APT 安装:虽然更方便,但软件源中的
etcd
版本可能较旧,适合不追求最新功能的场景。
根据需要选择合适的安装方式。
引用
- [1] etcd
- [2] Etcd 使用入门
- [3] 实战etcd的服务发现
- [4] etcd服务发现
- [5] raft算法
- [5] raft-algorithm-paper
- [6] raft-演示动画
- [7] 通过etcd制作服务发现
- [8] etcd-常用的方法