安装
方法 1:通过 apt 安装(简单,但版本可能较旧)
步骤
-
更新软件包列表:
bashsudo apt update -
安装 etcd:
bashsudo apt install etcd -
启动 etcd 服务:
bashsudo systemctl start etcd -
验证安装:
bashetcdctl version如果输出类似以下内容,表示安装成功:
etcdctl version: 3.4.20 API version: 3.4 -
设置开机自启(可选):
bashsudo systemctl enable etcd
方法 2:通过二进制文件安装(推荐,支持最新版本)
适用于需要最新版本或自定义配置的场景。
步骤
-
下载 etcd 二进制文件:
-
访问 etcd GitHub Releases,找到最新版本的
etcd和etcdctl。 -
例如,下载
v3.5.12:bashwget https://github.com/etcd-io/etcd/releases/download/v3.5.12/etcd-v3.5.12-linux-amd64.tar.gz
-
-
解压文件:
bashtar -xvf etcd-v3.5.12-linux-amd64.tar.gz -
移动文件到系统路径:
bashcd etcd-v3.5.12-linux-amd64 sudo mv etcd etcdctl /usr/local/bin/ -
创建 etcd 配置和数据目录:
bashsudo mkdir -p /etc/etcd sudo mkdir -p /var/lib/etcd -
创建 systemd 服务文件:
-
/etc/systemd/system/etcd.service是 systemd 的服务管理文件,它用于定义 etcd 作为系统服务的启动方式。可以理解为 systemd 的"启动项配置",类似于 Windows 的服务管理 (services.msc)。bashsudo nano /etc/systemd/system/etcd.service写入以下内容(按需修改配置):
ini[Unit] Description=etcd key-value store Documentation=https://github.com/etcd-io/etcd [Service] ExecStart=/usr/local/bin/etcd \ --name=node1 \ --data-dir=/var/lib/etcd \ --listen-client-urls=http://0.0.0.0:2379 \ --advertise-client-urls=http://localhost:2379 Restart=always RestartSec=5 User=root [Install] WantedBy=multi-user.target
-
启动 etcd 服务:
bashsudo systemctl daemon-reload sudo systemctl start etcd -
验证服务状态:
bashsudo systemctl status etcd输出应显示
active (running)。 -
测试 etcd:
bashetcdctl put mykey "Hello Ubuntu" etcdctl get mykey输出应为:
mykey Hello Ubuntu
方法 3:通过 Docker 安装(适合容器化环境)
如果已安装 Docker,可以用容器快速启动 etcd。
步骤
-
拉取 etcd 镜像:
bashdocker pull quay.io/coreos/etcd:v3.5.12 -
运行 etcd 容器:
bashdocker run -d \ --name etcd \ -p 2379:2379 \ -p 2380:2380 \ quay.io/coreos/etcd:v3.5.12 \ etcd --advertise-client-urls http://0.0.0.0:2379 --listen-client-urls http://0.0.0.0:2379 -
验证容器状态:
bashdocker ps -f name=etcd -
测试 etcd:
bashdocker exec etcd etcdctl put mykey "Hello Docker" docker exec etcd etcdctl get mykey
拓展理解systemd启动和etcd.yaml配置文件启动的区别
1. /etc/systemd/system/etcd.service 详解
/etc/systemd/system/etcd.service 是 systemd 的服务管理文件 ,它用于定义 etcd 作为系统服务的启动方式。
etcd.service内容解析:
ini
[Unit]
Description=etcd key-value store
Documentation=https://github.com/etcd-io/etcd
[Unit]部分用于描述服务的基本信息。Description:服务的简单描述。Documentation:相关文档的链接。
ini
[Service]
ExecStart=/usr/local/bin/etcd \
--name=node1 \
--data-dir=/var/lib/etcd \
--listen-client-urls=http://0.0.0.0:2379 \
--advertise-client-urls=http://localhost:2379
Restart=always
RestartSec=5
User=root
[Service]部分定义如何启动etcd进程。ExecStart:指定etcd的启动命令。这里也可以避免写参数,直接引入一个.yaml--name=node1:指定节点名称为node1。--data-dir=/var/lib/etcd:存储etcd数据的目录。--listen-client-urls=http://0.0.0.0:2379:监听所有 IP 地址,允许外部访问etcdAPI。--advertise-client-urls=http://localhost:2379:向其他etcd节点通告localhost:2379为可用地址。
Restart=always:进程意外退出时自动重启。RestartSec=5:重启前等待 5 秒。User=root:指定etcd以root用户运行。
ini
[Install]
WantedBy=multi-user.target
[Install]部分用于定义服务在何时启动。WantedBy=multi-user.target:表示etcd进程会在 multi-user 运行级别启动(即正常的 Linux 服务器模式)。
2. /etc/etcd/etcd.yaml 配置文件
/etc/etcd/etcd.yaml 是 etcd 的配置文件 ,它和 systemd 服务的 ExecStart 参数类似,但更结构化,适用于使用配置文件管理 etcd 的情况。
你的 etcd.yaml 内容解析:
yaml
name: my-etcd
data-dir: /var/lib/etcd
listen-peer-urls: http://localhost:2380
listen-client-urls: http://localhost:2379
advertise-client-urls: http://localhost:2379
initial-cluster-state: new
initial-cluster: my-etcd=http://localhost:2380
initial-cluster-token: etcd-cluster-1
name: my-etcd:设置etcd的节点名称为my-etcd。data-dir: /var/lib/etcd:存储etcd数据的位置。listen-peer-urls: http://localhost:2380:用于etcd节点之间通信的 URL(peer端口)。listen-client-urls: http://localhost:2379:用于客户端连接etcd的 URL。advertise-client-urls: http://localhost:2379:通知其他etcd节点此节点的 API 访问地址。initial-cluster-state: new:新建集群(如果已有集群,值应为existing)。initial-cluster: my-etcd=http://localhost:2380:指定初始集群成员。initial-cluster-token: etcd-cluster-1:用于唯一标识该集群。
3. etcd.service 和 etcd.yaml 的区别
| 区别 | etcd.service(systemd 启动项) |
etcd.yaml(配置文件) |
|---|---|---|
| 作用 | 定义 etcd 如何作为 systemd 服务启动 |
配置 etcd 本身的参数 |
| 启动方式 | systemctl start etcd |
etcd --config-file=/etc/etcd/etcd.yaml |
| 配置管理 | 通过 ExecStart 直接指定参数 |
以 YAML 结构化存储参数 |
| 灵活性 | 适用于 systemd 统一管理 |
适用于手动运行或非 systemd 环境 |
| 适用场景 | 服务器自动管理启动 | 需要额外配置时使用 |
4. 如何让 systemd 使用 etcd.yaml
如果你想让 systemd 使用 etcd.yaml 配置文件,而不是手动传递命令行参数,可以修改 /etc/systemd/system/etcd.service:
ini
[Service]
ExecStart=/usr/local/bin/etcd --config-file=/etc/etcd/etcd.yaml
Restart=always
RestartSec=5
User=root
然后执行:
sh
sudo systemctl daemon-reload # 重新加载 systemd 配置
sudo systemctl restart etcd # 重新启动 etcd
sudo systemctl enable etcd # 开机自动启动
-
推荐做法:
-
如果
etcd只是单节点,可以直接用systemd管理并在ExecStart传递参数。 -
如果
etcd是集群模式,建议使用etcd.yaml统一管理配置,并修改etcd.service让systemd使用etcd.yaml。
-
对比redis理解etcd
etcd vs 其他存储
| 特性 | etcd | Redis | MySQL/PostgreSQL |
|---|---|---|---|
| 数据结构 | 键值存储 | 键值存储 | 关系型数据库 |
| 强一致性 | ✅ 是 | ❌ 否 | ✅ 是 |
| 分布式存储 | ✅ 是 | ✅ 是(主从复制) | ❌ 否(需手动搭建) |
| 数据持久化 | ✅ 是 | ✅ 是 | ✅ 是 |
| 适用场景 | 服务发现、配置管理 | 缓存、消息队列 | 事务处理、数据存储 |
etcd 的特点
✅ 分布式存储 :多台 etcd 节点组成集群,确保高可用性。
✅ 强一致性 :基于 Raft 算法,保证数据在多个节点间同步且一致。
✅ 键值存储 :使用简单的 key-value 结构 ,存取数据类似 Redis,但更可靠。
✅ 支持 Watch 机制 :可以 监听数据变化 ,常用于 配置热更新和服务发现 。
✅ 高性能 & 低延迟 :适用于大规模集群环境,如 Kubernetes。
etcd 适用于哪些场景?
📌 配置管理 :存储应用配置,支持热更新(类似 Viper + etcd)。
📌 服务发现 :动态注册和发现微服务(类似 Consul)。
📌 分布式锁 :确保多实例下的互斥操作(类似 Redis 分布式锁)。
📌 Kubernetes :etcd 作为 Kubernetes 的核心存储引擎,保存所有集群数据。
1. 什么是「强一致性」?
强一致性(Strong Consistency) 指的是:
无论从哪个节点读取数据,始终能得到最新提交的数据。
即使有多个副本,也保证数据是最新的,而不会读到旧数据。
示例:
- 假设你在节点 A 写入数据
X=10,然后立即在节点 B 读取X,如果 B 也返回X=10,说明系统是「强一致性」的。 - 如果 B 可能返回旧值
X=5,说明系统不具备「强一致性」,可能是最终一致性。
2. etcd 的「强一致性」
🔹 etcd 如何保证强一致性?
✅ Raft 一致性算法:
etcd采用 Raft 共识算法 ,确保所有副本节点的数据是严格一致的。- 数据必须提交到 Raft 主节点,并同步到大多数节点(Quorum),然后才返回成功。
✅ 线性一致性(Linearizability):
etcd保证 每次读取到的数据都是最新的,绝不会读到旧数据。- 无论从哪个副本读取,都会通过 Raft 选举的 Leader 确保一致性。
3. Redis 的「最终一致性」
🔹 Redis 主从复制机制
Redis 主要使用 主从复制(Master-Slave Replication) 来同步数据,但:
- 主节点(Master) 处理写请求,数据再异步同步到 从节点(Replica)。
- 从节点的同步是异步的,可能会延迟,所以读操作可能会读到旧数据。
🔹 Redis 为什么不是强一致性?
✅ 数据更新存在时间差
- 如果你在主节点写入
X=10,但从节点的数据还没同步过去,读操作可能返回X=5(旧数据)。 - 这就是「最终一致性」,即数据最终 会同步到一致,但不是实时一致的。
✅ Redis 主从切换可能导致数据丢失
- 如果 主节点宕机 ,Redis 可能会选举新的主节点,但部分未同步的数据可能丢失。
4. 什么时候用 etcd?什么时候用 Redis?
✅ 使用 etcd(强一致性场景)
- Kubernetes 配置存储:需要保证配置和服务发现的一致性。
- 分布式锁:不能容忍锁数据丢失或读取旧锁状态。
- 高可用数据库的协调组件:如 TiDB、CockroachDB。
✅ 使用 Redis(高性能缓存)
- 数据一致性要求不高 ,但需要高性能(如网页缓存)。
- 任务队列(Pub/Sub),即使有少量丢失也不会影响整体业务。
- 排行榜、计数器,如网站访问量统计、点赞数等。
6. 总结
| 特性 | etcd(Raft 强一致性) | Redis(最终一致性) |
|---|---|---|
| 一致性 | ✅ 强一致性(线性一致) | ❌ 最终一致性(可能读旧数据) |
| 读写速度 | ❌ 写入慢 | ✅ 读写快 |
| 数据可靠性 | ✅ 不丢数据 | ❌ 可能丢失(主从复制延迟) |
| 适用场景 | 分布式系统配置、服务发现、锁 | 缓存、消息队列 |