一、介绍
etcd(分布式键值存储)是一个开源的分布式系统工具,用于可靠地存储和提供键值对数据。etcd 通常通过 HTTP 或 gRPC 提供 API,允许应用程序通过简单的接口与其交互。由于其可靠性和稳定性,etcd 在构建可扩展、分布式、高可用的系统中发挥着重要的作用。
- Client层:Client层包括client v2和v3两个大版本API客户端库,提供了简洁易用的API,同时支持负载均衡、节点间故障自动转移,可极大降低业务使用etcd复杂度,提升开发效率、服务可用性。
- API网络层:API网络层主要包括client访问server和server节点之间的通信协议。一方面,client访问etcd server的API分为v2和v3两个大版本。v2API使用HTTP/1.x协议,v3 API使用gRPC协议。同时v3通过etcd grpc-gateway组件也支持 HTTP/1.x协议,便于各种语言的服务调用。另一方面, server之间通信协议,是指节点间通过Raft算法实现数据复制和Leader选举等功能时使用的HTTP协议。
- Raft 算法层:Raft算法层实现了Leader 选举、日志复制、ReadIndex等核心算法特性,用于保障etcd多个节点间的数据一致性、提升服务可用性等,是etcd的基石和亮点。
- 功能逻辑层:etcd核心特性实现层,如典型的KVServer模块、MVCC模块、Auth鉴权模块、Lease租约模块、Compactor压缩模块等,其中MVCC模块主要由treelndex模块和boltdb 模块组成。
- 存储层:存储层包含预写日志(WAL)模块、快照(Snapshot)模块、boltdb模块。其中WAL可保障etcd crash后数据不丢失,boltdb则保存了集群元数据和用户写入的数据。
二、下载安装
1、下载
apisix依赖etcd,所以要先保证etcd启动,下载地址:Release v3.5.10 · etcd-io/etcd · GitHub。下载完成后上传到服务器进行解压。
2、配置环境变量
将文件夹中etcd和etcdctl两个文件添加可执行文件路径到环境变量PATH中。etcd是服务端,etcdctl是运维人员操作的控制端,一般只需要装etcd,现在是学习就都装在同一台机器。
3、 编辑profile文件
编辑profile文件,在文件的末尾添加
# 在文件最后加入变量,因为etcd默认使用V2版本,我们需要V3版本的API。
export ETCDCTL_API=3
使环境变量生效,查看版本信息。
4、创建配置文件
创建数据存放目录。
创建etcd配置文件。
cat <<EOF | tee /etc/etcd.conf
#节点名称
ETCD_NAME=$(hostname -s)
#数据存放位置
ETCD_DATA_DIR=/var/lib/etcd/
EOF
5、配置etcd.service文件
内容如下:
[Unit]
Description=Etcd Server
Documentation=https://github.com/coreos/etcd
After=network.target[Service]
User=root
Type=notify
#这个文件特别关键,etcd使用的环境变量都需要通过环境变量文件读取
EnvironmentFile=-/etc/etcd.conf
ExecStart=/usr/local/bin/etcd
Restart=on-failure
RestartSec=10s
LimitNOFILE=40000[Install]
WantedBy=multi-user.target
6、启动etcd
- systemctl daemon-reload 从新加载配置
- systemctl enable etcd 设置开启启动
- systemctl start etcd 启动etcd
在启动时如果出现/usr/local/bin目录权限不足时,使用如下命令可以解决:
restorecon -rv /usr/local/bin/
使用systemctl show etcd.service命令可以查询状态,内容非常多:
三、命令使用
ETCD提供了丰富的命令行工具etcdctl
,用于与ETCD集群进行交互。以下是一些常用的etcdctl
命令示例。
- etcdctl put k v 设置键值对
- etcdctl get k 获取键值对
- etcdctl get --prefix k 递归获取键值对
- etcdctl del k 删除键值对
- etcdctl watch k 监视键的变化
ETCD没有直接列出所有键的命令,但你可以通过etcdctl endpoint status --write-out=table查看集群状态,或者使用范围查询(etcdctl get --keys-only --from-key "" --limit=0)来尝试获取所有键(注意,这可能在大型数据集中非常低效)。
四、权限管理
在 etcd 中,权限操作通常通过 Role-Based Access Control (RBAC) 来管理。以下是一些常见的 etcd 权限操作。
1、创建用户
etcdctl user add <username>:<password>
2、为用户授权
创建用户后,你可以为其授予特定的权限。这通常涉及到创建角色和将角色分配给用户。
etcdctl role add <rolename>
etcdctl role grant-permission <rolename> <permission-type> <key> <range-end>
etcdctl user grant-role <username> <rolename>
上述例子中,创建了一个名为 “readwrite” 的角色,并授予了该角色对 “/path/to/key/*” 范围内键的读写权限。然后,将该角色授予了用户 “admin”。
3、列出用户、角色和权限
etcdctl user list
etcdctl role list
etcdctl user get <username>
etcdctl role get <rolename>
4、删除用户和角色
etcdctl user remove <username>
etcdctl role remove <rolename>