etcd的部署和简单使用

一、什么是etcd

etcd 是一个高可用的分布式 KV 系统,可以用来实现各种分布式协同服务。etcd 采用的一致性算
法是 raft,基于 Go 语言实现。
etcd 最初由 CoreOS 的团队研发,目前是 Could Native 基金会的孵化项目。
为什么叫 etcd:etc来源于 UNIX 的 /etc 配置文件目录,d 代表 distributed system。

二、etcd的应用场景

典型应用场景:
• Kubernetes 使用 etcd 来做服务发现和配置信息管理。
• Openstack 使用 etcd 来做配置管理和分布式锁。
• ROOK 使用 etcd 研发编排引擎。
etcd 和 ZooKeeper 覆盖基本一样的协同服务场景。ZooKeeper 因为需要把所有的数据都要加载
到内存,一般存储几百MB的数据。etcd使用bbolt存储引擎,可以处理几个GB的数据。

三、MVCC

etcd 的数据模型是 KV模型,所有的 key 构成了一个扁平的命名空间,所有的 key 通过字典序排序。
整个 etcd 的 KV 存储维护一个递增的64位整数。etcd 使用这个整数位为每一次 KV 更新分配一个 revision。每一个
key 可以有多个 revision。每一次更新操作都会生成一个新的 revision。删除操作会生成一个 tombstone 的新的
revision。如果 etcd 进行了 compaction,etcd 会对 compaction revision 之前的 key-value 进行清理。整个
KV 上最新的一次更新操作的 revision 叫作整个 KV 的 revision。

CreateRevision 是创建 key 的 revision;

ModRevsion 是更新 key 值的 revision;

Version 是 key 的版本号,从1 开始。

四、etcd数据存储

  • etcd 使用 bbolt 进行 KV 的存储。bbolt 使用持久化的 B+-tree 保存 key-value 。三元组(major、sub、type)是 B+-tree 的 key,major 是的 revision,sub 用来区别一次更新中的各个 key,type 保存可选的特殊值(例如 type 取值为 t 代表这个三元组对应的是一个tombstone)。这样做的目的是为加速某一个 revision 上的 range 查找。
  • 另外 etcd 还维护一个 in-memory 的 B-tree 索引,这个索引中的 key 是 key-value 中的key 。

五、etcd的部署

以下列出的是linux下安装3.3.13版本的etcd

下载链接:https://github.com/etcd-io/etcd/releases/download/v3.3.13/etcd-v3.3.13-linux-amd64.tar.gz

具体操作:

# 在当前目录下创建一个本地目录 {etcd-dir} 
mkdir -p etcd/
cd etcd/
# 下载etcd
wget https://github.com/etcd-io/etcd/releases/download/v3.3.13/etcd-v3.3.13-linux-amd64.tar.gz
# 把etcd压到一个本地目录 {etcd-dir} 
tar -zxvf etcd-v3.3.13-linux-amd64.tar.gz
# 把 {etcd-dir} 加到 PATH 环境变量。
export PATH=$PATH:/root/etcd/etcd-v3.3.13-linux-amd64

# 创建一个目录 {db-dir} 用来保存 etcd 的数据文件。
mkdir -p etcd-db/
cd etcd-db/

# 使用最新的 v3 API
export ETCDCTL_API=3

# 查看etcd版本
etcd -version

etcd Version: 3.3.13
Git SHA: 98d3084
Go Version: go1.10.8
Go OS/Arch: linux/amd64
# 启动etcd,在 {db-dir} 目录运行 etcd 启动 etcd 服务
etcd

2022-05-03 22:56:08.196843 I | etcdmain: etcd Version: 3.3.13
2022-05-03 22:56:08.196884 I | etcdmain: Git SHA: 98d3084
2022-05-03 22:56:08.196888 I | etcdmain: Go Version: go1.10.8
2022-05-03 22:56:08.196892 I | etcdmain: Go OS/Arch: linux/amd64
2022-05-03 22:56:08.196896 I | etcdmain: setting maximum number of CPUs to 1, to                                                                             tal number of available CPUs is 1
2022-05-03 22:56:08.196905 W | etcdmain: no data-dir provided, using default dat                                                                             a-dir ./default.etcd
2022-05-03 22:56:08.197222 I | embed: listening for peers on http://localhost:23                                                                             80
2022-05-03 22:56:08.197291 I | embed: listening for client requests on localhost                                                                             :2379
2022-05-03 22:56:08.201559 I | etcdserver: name = default
2022-05-03 22:56:08.201570 I | etcdserver: data dir = default.etcd
2022-05-03 22:56:08.201575 I | etcdserver: member dir = default.etcd/member
2022-05-03 22:56:08.201578 I | etcdserver: heartbeat = 100ms
2022-05-03 22:56:08.201581 I | etcdserver: election = 1000ms
2022-05-03 22:56:08.201584 I | etcdserver: snapshot count = 100000
2022-05-03 22:56:08.201591 I | etcdserver: advertise client URLs = http://localh                                                                             ost:2379
2022-05-03 22:56:08.201595 I | etcdserver: initial advertise peer URLs = http://                                                                             localhost:2380
2022-05-03 22:56:08.201601 I | etcdserver: initial cluster = default=http://loca                                                                             lhost:2380
2022-05-03 22:56:08.205173 I | etcdserver: starting member 8e9e05c52164694d in c                                                                             luster cdf818194e3a8c32
2022-05-03 22:56:08.205210 I | raft: 8e9e05c52164694d became follower at term 0
2022-05-03 22:56:08.205224 I | raft: newRaft 8e9e05c52164694d [peers: [], term:                                                                              0, commit: 0, applied: 0, lastindex: 0, lastterm: 0]
2022-05-03 22:56:08.205228 I | raft: 8e9e05c52164694d became follower at term 1
2022-05-03 22:56:08.210992 W | auth: simple token is not cryptographically signe                                                                             d
2022-05-03 22:56:08.214150 I | etcdserver: starting server... [version: 3.3.13,                                                                              cluster version: to_be_decided]
2022-05-03 22:56:08.215983 I | etcdserver: 8e9e05c52164694d as single-node; fast                                                                             -forwarding 9 ticks (election ticks 10)
2022-05-03 22:56:08.216449 I | etcdserver/membership: added member 8e9e05c521646                                                                             94d [http://localhost:2380] to cluster cdf818194e3a8c32
2022-05-03 22:56:09.205424 I | raft: 8e9e05c52164694d is starting a new election                                                                              at term 1
2022-05-03 22:56:09.205458 I | raft: 8e9e05c52164694d became candidate at term 2
2022-05-03 22:56:09.205472 I | raft: 8e9e05c52164694d received MsgVoteResp from                                                                              8e9e05c52164694d at term 2
2022-05-03 22:56:09.205484 I | raft: 8e9e05c52164694d became leader at term 2
2022-05-03 22:56:09.205490 I | raft: raft.node: 8e9e05c52164694d elected leader                                                                              8e9e05c52164694d at term 2
2022-05-03 22:56:09.205918 I | etcdserver: setting up the initial cluster versio                                                                             n to 3.3
2022-05-03 22:56:09.205982 I | etcdserver: published {Name:default ClientURLs:[h                                                                             ttp://localhost:2379]} to cluster cdf818194e3a8c32
2022-05-03 22:56:09.206092 E | etcdmain: forgot to set Type=notify in systemd se                                                                             rvice file?
2022-05-03 22:56:09.206100 I | embed: ready to serve client requests
2022-05-03 22:56:09.206620 N | embed: serving insecure client requests on 127.0.                                                                             0.1:2379, this is strongly discouraged!
2022-05-03 22:56:09.207222 N | etcdserver/membership: set the initial cluster ve                                                                             rsion to 3.3
2022-05-03 22:56:09.207262 I | etcdserver/api: enabled capabilities for version                                                                              3.3
proto: no coders for int
proto: no encoder for ValueSize int [GetProperties]

六、使用etcd

新打开一个终端窗口执行:

[**@** {etcd-dir}]# ./etcdctl put foo bar
OK
[**@** {etcd-dir}]# ./etcdctl get foo
foo
bar
[**@** {etcd-dir}]# ./etcdctl del foo
1
[**@** {etcd-dir}]# ./etcdctl put one 1
OK
[**@** {etcd-dir}]# ./etcdctl put two 1
OK
[**@** {etcd-dir}]# ./etcdctl put three 3
OK
# etcdctl get“”--prefix=true 可以用来扫描 etcd 的所有数据。
# etcdctl del“”--prefix=true 可以用来删除 etcd 中的所有数据。
[**@** {etcd-dir}]# ./etcdctl get "" --prefix=true
one
1
three
3
two
1
[**@** {etcd-dir}]# ./etcdctl del "" --prefix=true
3

HTTP API
[**@** {etcd-dir}]# curl -L http://localhost:2379/v3beta/kv/put -X POST -d '{"key": "Zm9v", "value": "YmFy"}'
{"header":{"cluster_id":"14841639068965178418","member_id":"10276657743932975437","revision":"8","raft_term":"2"}}[**@** {etcd-dir}]#
[**@** {etcd-dir}]# ./etcdctl get "" --prefix=true                                                                                  
foo
bar
[**@** {etcd-dir}]# curl -L http://localhost:2379/v3beta/kv/range -X POST -d '{"key": "Zm9v", "value": "YmFy"}'
{"header":{"cluster_id":"14841639068965178418","member_id":"10276657743932975437                                                                             ","revision":"8","raft_term":"2"},"kvs":[{"key":"Zm9v","create_revision":"8","mo                                                                             d_revision":"8","version":"1","value":"YmFy"}],"count":"1"}


 

Zm9v 是 foo 的 base64 编码, YmFy 是 bar 的 base64 编码。

和 etcdctl 相比,etcd HTTP
API 返回的数据更多,可以帮助我们学习 etcd API 的行为。
 

<think>我们正在回答用户关于etcd部署方法的问题。用户引用了多个站内引用,我们需要整合这些信息,提供清晰的部署步骤。 根据引用内容,我们可以总结出几种常见的部署方式:单实例部署、单机多实例部署、生产环境集群部署使用systemd管理)以及Kubernetes中的部署。 由于用户询问的是“etcd部署方法”,我们将按照不同场景分类说明,并结合引用中的具体命令配置。 部署方法包括: 1. 单实例部署(开发测试) 2. 单机多实例部署(测试集群) 3. 多节点集群部署(生产环境) 4. 使用systemd管理etcd服务(生产环境推荐) 5. Kubernetes中的etcd部署(通常由Kubernetes安装工具处理,如kubeadm) 注意:引用[1]提供了单实例单机多实例部署的命令;引用[3]提供了使用systemd管理etcd服务的配置示例;引用[5]提到了Kubernetes中etcd部署需要证书配置,但未给出完整步骤,因此我们主要介绍前四种。 我们将按照这些类别组织回答,并在最后生成相关问题。 </think> ### etcd 部署方法指南 etcd 支持多种部署方式,可根据环境需求选择。以下是详细部署方法,整合引用内容并优化操作步骤: --- #### 1. **单实例部署(开发/测试环境)** 适用于本地快速验证,无需集群功能。 **操作步骤**: 1. 下载二进制文件(以 v3.5.13 为例): ```bash wget https://github.com/etcd-io/etcd/releases/download/v3.5.13/etcd-v3.5.13-linux-amd64.tar.gz tar -zxvf etcd-v3.5.13-linux-amd64.tar.gz cd etcd-v3.5.13-linux-amd64 ``` 2. 启动 etcd 服务: - 前台启动:`./etcd` - 后台启动(日志输出到文件): ```bash nohup ./etcd > /tmp/etcd.log 2>&1 & ``` 3. 验证安装: ```bash ./etcd --version # 输出示例:etcd Version: 3.5.13 ``` 4. (可选)添加到系统路径: ```bash cp etcd etcdctl /usr/local/bin/ # 可直接使用 etcd/etcdctl 命令 ``` **适用场景**:个人开发、功能验证[^1]。 --- #### 2. **单机多实例部署(测试集群)** 单机模拟多节点集群,测试容错性。 **操作步骤**: 1. 为每个实例创建独立配置(以 3 节点为例): - 分配不同端口(如 `2380/2381/2382` 用于节点通信,`2379/2380/2381` 用于客户端) - 指定唯一节点名数据目录: ```bash # 节点1 etcd --name node1 --listen-peer-urls http://localhost:2380 \ --listen-client-urls http://localhost:2379 \ --data-dir /tmp/etcd-node1 # 节点2(端口递增) etcd --name node2 --listen-peer-urls http://localhost:2381 \ --listen-client-urls http://localhost:2380 \ --data-dir /tmp/etcd-node2 ``` 2. 启动所有实例并验证集群状态: ```bash etcdctl --endpoints=http://localhost:2379,http://localhost:2380 endpoint status ``` **关键点**:确保端口数据目录不冲突[^1]。 --- #### 3. **生产集群部署(多节点)** 推荐奇数节点(如 3/5 台服务器),保障高可用。 **操作步骤**: 1. 所有节点安装 etcd 二进制文件(同单实例步骤 1)。 2. 创建配置文件(`/etc/etcd/etcd.conf`),示例配置: ```ini # 节点标识 ETCD_NAME="node1" # 通信地址(替换实际IP) ETCD_LISTEN_PEER_URLS="http://192.168.1.101:2380" ETCD_LISTEN_CLIENT_URLS="http://192.168.1.101:2379" # 集群节点列表 ETCD_INITIAL_CLUSTER="node1=http://192.168.1.101:2380,node2=http://192.168.1.102:2380,node3=http://192.168.1.103:2380" ETCD_INITIAL_CLUSTER_TOKEN="my-etcd-cluster" ETCD_INITIAL_CLUSTER_STATE="new" ``` 3. 使用 systemd 管理服务(所有节点): - 创建服务文件 `/usr/lib/systemd/system/etcd.service`: ```ini [Unit] Description=Etcd Server After=network.target [Service] Type=notify EnvironmentFile=-/etc/etcd/etcd.conf ExecStart=/usr/local/bin/etcd Restart=on-failure RestartSec=10s LimitNOFILE=40000 [Install] WantedBy=multi-user.target ``` - 启动服务: ```bash systemctl daemon-reload systemctl enable --now etcd ``` 4. 验证集群: ```bash etcdctl --endpoints=http://192.168.1.101:2379,http://192.168.1.102:2379 endpoint health ``` **生产建议**: - 硬件:至少 SSD 硬盘,$4$ 核 CPU + $8$ GB 内存[^2] - 安全:启用 TLS 加密(参考引用[^5]生成证书) --- #### 4. **Kubernetes 中的部署** 通常由 `kubeadm` 自动管理,若需独立部署: 1. 生成证书(CA 服务器证书): - 创建 `ca-config.json` `server-csr.json`(需替换实际 IP)[^5]。 2. 将证书配置文件挂载到 etcd 容器。 3. 通过 StatefulSet 部署(确保持久化存储)。 --- ### 部署方式对比 | **类型** | 节点数 | 适用场景 | 优势 | |------------------|--------|-------------------|--------------------------| | 单实例 | 1 | 开发测试 | 简单快捷 | | 单机多实例 | 多实例 | 本地集群测试 | 模拟集群行为 | | 多节点集群 | ≥3 | 生产环境 | 高可用、容灾 | | Kubernetes 集成 | 动态 | K8s 集群 | 自动化管理 | > **注意**:生产环境务必启用 TLS 定期备份(`etcdctl snapshot save`)[^3][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值