更新软件包列表:
sudo apt update
安装 etcd:
sudo apt install etcd
启动 etcd 服务:
sudo systemctl start etcd
验证安装:
etcdctl version
如果输出类似以下内容,表示安装成功:
etcdctl version: 3.4.20
API version: 3.4
设置开机自启(可选):
sudo systemctl enable etcd
适用于需要最新版本或自定义配置的场景。
下载 etcd 二进制文件:
etcd
和 etcdctl
。v3.5.12
:wget https://github.com/etcd-io/etcd/releases/download/v3.5.12/etcd-v3.5.12-linux-amd64.tar.gz
解压文件:
tar -xvf etcd-v3.5.12-linux-amd64.tar.gz
移动文件到系统路径:
cd etcd-v3.5.12-linux-amd64
sudo mv etcd etcdctl /usr/local/bin/
创建 etcd 配置和数据目录:
sudo mkdir -p /etc/etcd
sudo mkdir -p /var/lib/etcd
创建 systemd 服务文件:
/etc/systemd/system/etcd.service
是 systemd 的服务管理文件,它用于定义 etcd 作为系统服务的启动方式
。可以理解为 systemd 的"启动项配置"
,类似于 Windows 的服务管理 (services.msc)。sudo nano /etc/systemd/system/etcd.service
写入以下内容(按需修改配置):[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 服务:
sudo systemctl daemon-reload
sudo systemctl start etcd
验证服务状态:
sudo systemctl status etcd
输出应显示 active (running)
。
测试 etcd:
etcdctl put mykey "Hello Ubuntu"
etcdctl get mykey
输出应为:
mykey
Hello Ubuntu
如果已安装 Docker,可以用容器快速启动 etcd。
拉取 etcd 镜像:
docker pull quay.io/coreos/etcd:v3.5.12
运行 etcd 容器:
docker 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
验证容器状态:
docker ps -f name=etcd
测试 etcd:
docker exec etcd etcdctl put mykey "Hello Docker"
docker exec etcd etcdctl get mykey
/etc/systemd/system/etcd.service
详解/etc/systemd/system/etcd.service
是 systemd
的服务管理文件,它用于定义 etcd
作为系统服务的启动方式。
etcd.service内容解析:
[Unit]
Description=etcd key-value store
Documentation=https://github.com/etcd-io/etcd
[Unit]
部分用于描述服务的基本信息。Description
:服务的简单描述。Documentation
:相关文档的链接。[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 地址,允许外部访问 etcd
API。--advertise-client-urls=http://localhost:2379
:向其他 etcd
节点通告 localhost:2379
为可用地址。Restart=always
:进程意外退出时自动重启。RestartSec=5
:重启前等待 5 秒。User=root
:指定 etcd
以 root
用户运行。[Install]
WantedBy=multi-user.target
[Install]
部分用于定义服务在何时启动。WantedBy=multi-user.target
:表示 etcd
进程会在 multi-user 运行级别启动(即正常的 Linux 服务器模式)。/etc/etcd/etcd.yaml
配置文件/etc/etcd/etcd.yaml
是 etcd
的配置文件,它和 systemd
服务的 ExecStart
参数类似,但更结构化,适用于使用配置文件管理 etcd
的情况。
你的 etcd.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
:用于唯一标识该集群。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 环境 |
适用场景 | 服务器自动管理启动 | 需要额外配置时使用 |
systemd
使用 etcd.yaml
如果你想让 systemd
使用 etcd.yaml
配置文件,而不是手动传递命令行参数,可以修改 /etc/systemd/system/etcd.service
:
[Service]
ExecStart=/usr/local/bin/etcd --config-file=/etc/etcd/etcd.yaml
Restart=always
RestartSec=5
User=root
然后执行:
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
。
特性 | etcd | Redis | MySQL/PostgreSQL |
---|---|---|---|
数据结构 | 键值存储 | 键值存储 | 关系型数据库 |
强一致性 | ✅ 是 | ❌ 否 | ✅ 是 |
分布式存储 | ✅ 是 | ✅ 是(主从复制) | ❌ 否(需手动搭建) |
数据持久化 | ✅ 是 | ✅ 是 | ✅ 是 |
适用场景 | 服务发现、配置管理 | 缓存、消息队列 | 事务处理、数据存储 |
✅ 分布式存储:多台 etcd
节点组成集群,确保高可用性。
✅ 强一致性:基于 Raft
算法,保证数据在多个节点间同步且一致。
✅ 键值存储:使用简单的 key-value
结构,存取数据类似 Redis,但更可靠。
✅ 支持 Watch 机制:可以 监听数据变化,常用于 配置热更新和服务发现。
✅ 高性能 & 低延迟:适用于大规模集群环境,如 Kubernetes
。
配置管理:存储应用配置,支持热更新(类似 Viper + etcd
)。
服务发现:动态注册和发现微服务(类似 Consul
)。
分布式锁:确保多实例下的互斥操作(类似 Redis 分布式锁
)。
Kubernetes:etcd
作为 Kubernetes
的核心存储引擎,保存所有集群数据。
强一致性(Strong Consistency) 指的是:
无论从哪个节点读取数据,始终能得到最新提交的数据。
即使有多个副本,也保证数据是最新的,而不会读到旧数据。
示例:
X=10
,然后立即在节点 B 读取 X
,如果 B 也返回 X=10
,说明系统是「强一致性」的。X=5
,说明系统不具备「强一致性」,可能是最终一致性。✅ Raft 一致性算法:
etcd
采用 Raft 共识算法,确保所有副本节点的数据是严格一致的。✅ 线性一致性(Linearizability):
etcd
保证 每次读取到的数据都是最新的,绝不会读到旧数据。Redis
主要使用 主从复制(Master-Slave Replication) 来同步数据,但:
✅ 数据更新存在时间差
X=10
,但从节点的数据还没同步过去,读操作可能返回 X=5
(旧数据)。✅ Redis 主从切换可能导致数据丢失
✅ 使用 etcd(强一致性场景)
✅ 使用 Redis(高性能缓存)
特性 | etcd(Raft 强一致性) | Redis(最终一致性) |
---|---|---|
一致性 | ✅ 强一致性(线性一致) | ❌ 最终一致性(可能读旧数据) |
读写速度 | ❌ 写入慢 | ✅ 读写快 |
数据可靠性 | ✅ 不丢数据 | ❌ 可能丢失(主从复制延迟) |
适用场景 | 分布式系统配置、服务发现、锁 | 缓存、消息队列 |
https://github.com/0voice