【etcd】ubuntu22安装,与redis对比的区别

安装

方法 1:通过 apt 安装(简单,但版本可能较旧)

步骤
  1. 更新软件包列表:

    bash 复制代码
    sudo apt update
  2. 安装 etcd:

    bash 复制代码
    sudo apt install etcd
  3. 启动 etcd 服务:

    bash 复制代码
    sudo systemctl start etcd
  4. 验证安装:

    bash 复制代码
    etcdctl version

    如果输出类似以下内容,表示安装成功:

    复制代码
    etcdctl version: 3.4.20
    API version: 3.4
  5. 设置开机自启(可选):

    bash 复制代码
    sudo systemctl enable etcd

方法 2:通过二进制文件安装(推荐,支持最新版本)

适用于需要最新版本或自定义配置的场景。

步骤
  1. 下载 etcd 二进制文件:

    • 访问 etcd GitHub Releases,找到最新版本的 etcd 和 etcdctl。

    • 例如,下载 v3.5.12:

      bash 复制代码
      wget https://github.com/etcd-io/etcd/releases/download/v3.5.12/etcd-v3.5.12-linux-amd64.tar.gz
  2. 解压文件:

    bash 复制代码
    tar -xvf etcd-v3.5.12-linux-amd64.tar.gz
  3. 移动文件到系统路径:

    bash 复制代码
    cd etcd-v3.5.12-linux-amd64
    sudo mv etcd etcdctl /usr/local/bin/
  4. 创建 etcd 配置和数据目录:

    bash 复制代码
    sudo mkdir -p /etc/etcd
    sudo mkdir -p /var/lib/etcd
  5. 创建 systemd 服务文件:

  • /etc/systemd/system/etcd.service 是 systemd 的服务管理文件,它用于定义 etcd 作为系统服务的启动方式。可以理解为 systemd 的"启动项配置",类似于 Windows 的服务管理 (services.msc)。

    bash 复制代码
    sudo 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
  1. 启动 etcd 服务:

    bash 复制代码
    sudo systemctl daemon-reload
    sudo systemctl start etcd
  2. 验证服务状态:

    bash 复制代码
    sudo systemctl status etcd

    输出应显示 active (running)。

  3. 测试 etcd:

    bash 复制代码
    etcdctl put mykey "Hello Ubuntu"
    etcdctl get mykey

    输出应为:

    复制代码
    mykey
    Hello Ubuntu

方法 3:通过 Docker 安装(适合容器化环境)

如果已安装 Docker,可以用容器快速启动 etcd。

步骤
  1. 拉取 etcd 镜像:

    bash 复制代码
    docker pull quay.io/coreos/etcd:v3.5.12
  2. 运行 etcd 容器:

    bash 复制代码
    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
  3. 验证容器状态:

    bash 复制代码
    docker ps -f name=etcd
  4. 测试 etcd:

    bash 复制代码
    docker 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 地址,允许外部访问 etcd API。
    • --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(最终一致性)
一致性 ✅ 强一致性(线性一致) ❌ 最终一致性(可能读旧数据)
读写速度 ❌ 写入慢 ✅ 读写快
数据可靠性 ✅ 不丢数据 ❌ 可能丢失(主从复制延迟)
适用场景 分布式系统配置、服务发现、锁 缓存、消息队列

https://github.com/0voice

相关推荐
꯭自꯭闭꯭1 小时前
达梦SQL优化相关
linux·运维·数据库·sql
福大大架构师每日一题1 小时前
ollama v0.35.0发布:决策模型正式上线,接口直接返回选择、概率与评分
golang
对空六课1 小时前
支持注意力分析的热力图工具有哪些?
前端·数据库·数据分析
zl_dfq2 小时前
Redis 之 【高可用架构】(从主从复制、哨兵到集群)
redis
南京码讯光电技术有限公司2 小时前
How to Design an Antenna System for an Industrial WiFi Module
数据库·人工智能
一条破秋裤2 小时前
Linux 共享内存通信:POSIX 共享内存与 mmap
linux·运维·服务器
贵州山魈羡民2 小时前
【玩转手机】通过 Podroid 上的 Alpine 部署 1Panel,把微型服务器装进口袋
运维·服务器
lusklusklusk3 小时前
Oracle数据库基础之2_体系结构
数据库·oracle
可乐ea3 小时前
从第一性原理构建 AI Agent:提示词、工具、技能与记忆全解剖
数据库·人工智能·工具调用·ai智能体·提示词工程·agent开发·智能体记忆
东方护航数据恢复(深圳)3 小时前
医疗案例:HIS/PACS 数据库页损坏修复,医院不停诊完成恢复【东方护航数据恢复深圳店】
数据库·数据恢复·医疗·二次开盘