【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,找到最新版本的 etcdetcdctl

    • 例如,下载 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.servicesystemd服务管理文件 ,它用于定义 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:指定 etcdroot 用户运行。
ini 复制代码
[Install]
WantedBy=multi-user.target
  • [Install] 部分用于定义服务在何时启动。
  • WantedBy=multi-user.target:表示 etcd 进程会在 multi-user 运行级别启动(即正常的 Linux 服务器模式)。

2. /etc/etcd/etcd.yaml 配置文件

/etc/etcd/etcd.yamletcd配置文件 ,它和 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.serviceetcd.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.servicesystemd 使用 etcd.yaml


对比redis理解etcd

etcd vs 其他存储

特性 etcd Redis MySQL/PostgreSQL
数据结构 键值存储 键值存储 关系型数据库
强一致性 ✅ 是 ❌ 否 ✅ 是
分布式存储 ✅ 是 ✅ 是(主从复制) ❌ 否(需手动搭建)
数据持久化 ✅ 是 ✅ 是 ✅ 是
适用场景 服务发现、配置管理 缓存、消息队列 事务处理、数据存储

etcd 的特点

分布式存储 :多台 etcd 节点组成集群,确保高可用性。

强一致性 :基于 Raft 算法,保证数据在多个节点间同步且一致。

键值存储 :使用简单的 key-value 结构 ,存取数据类似 Redis,但更可靠。

支持 Watch 机制 :可以 监听数据变化 ,常用于 配置热更新和服务发现

高性能 & 低延迟 :适用于大规模集群环境,如 Kubernetes


etcd 适用于哪些场景?

📌 配置管理 :存储应用配置,支持热更新(类似 Viper + etcd)。

📌 服务发现 :动态注册和发现微服务(类似 Consul)。

📌 分布式锁 :确保多实例下的互斥操作(类似 Redis 分布式锁)。

📌 Kubernetesetcd 作为 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

相关推荐
sekaii3 分钟前
ReDistribution plan细节
linux·服务器·数据库
qq_4592384929 分钟前
SpringBoot整合Redis和Redision锁
spring boot·redis·后端
焱焱枫39 分钟前
自适应SQL计划管理(Adaptive SQL Plan Management)在Oracle 12c中的应用
数据库·sql·oracle
2301_7930698243 分钟前
Spring Boot +SQL项目优化策略,GraphQL和SQL 区别,Spring JDBC 等原理辨析(万字长文+代码)
java·数据库·spring boot·sql·jdbc·orm
是姜姜啊!1 小时前
java连接redis
java·redis
hhw1991121 小时前
spring boot知识点5
java·数据库·spring boot
19岁开始学习1 小时前
Go学习-入门
开发语言·学习·golang
一小路一1 小时前
Go Web 开发基础:从入门到实战
服务器·前端·后端·面试·golang
ITPUB-微风1 小时前
功能开关聚合对象实践:提升金融领域的高可用性
网络·数据库·金融
去看日出2 小时前
Linux(centos)系统安装部署MySQL8.0数据库(GLIBC版本)
linux·数据库·centos