Etcd分布式键值数据库安装和使用
一、ectd数据库介绍
etcd 是 CoreOS 团队于2013年6月发起的开源项目, 是一种开源的分布式键值存储库,用于保存和管理分布式系统保持运行所需的关键信息。 etcd 基于 Raft 共识算法而构建,可确保集群中所有节点之间的数据存储一致性。
etcd 采用全新的设计,具有以下特性:
- 完全复制:etcd 集群中的每个节点都可以访问完整的数据存储库。
- 高度可用:etcd 被设计为没有单点故障,并且可以稳定地容忍硬件故障和网络分区。
- 完全一致:每次数据“读取”都会返回所有集群中最新的“写入”数据。
- 运行迅速:etcd 的基准测试速度为每秒 10,000 次写入。
- 安全可靠:etcd 支持自动传输层安全性 (TLS) 和可选的安全套接字层 (SSL) 客户机证书认证。 由于 etcd 存储重要且高度敏感的配置数据,因此管理员应在部署中实施基于角色的访问控制,并确保与 etcd 交互的团队成员只具有执行其工作所需的最低级别的访问权限。
- 操作简单:任何应用(从简单的 Web 应用到 Kubernetes 等高度复杂的容器编排引擎)都可以使用标准的 HTTP/JSON 工具在 etcd 中读写数据。
由于 etcd 的性能在很大程度上取决于存储磁盘的速度,因此强烈建议在 etcd 环境中使用 SSD。
etcd 是 Kubernetes 的核心组件之一,充当主要键值存储库,用于创建可正常运行且具有容错能力的 Kubernetes 集群。 Kubernetes API 服务器会将每个集群的状态数据都存储在 etcd 中。 Kubernetes 使用 etcd 的“观察”功能来监控这些数据,并在发生变化时自行重新配置。 “观察”功能会存储代表集群实际状态和理想状态的值,并且可以在这两种状态不同时作出响应。
etcd数据库架构分为4个部分:
- HTTP Server: 处理用户API请求以及其它etcd节点的同步与心跳请求。
- Store:处理etcd事务,包括数据索引、节点状态变更、监控与反馈、事件处理与执行等等,是etcd对用户提供的大多数API功能的具体实现。
- Raft:Raft强一致性算法的具体实现,是etcd的核心。
- WAL:是etcd的数据存储方式。除了在内存中存有所有数据的状态以及节点的索引以外,etcd就通过WAL进行持久化存储。
二、etcd数据库安装和使用
安装方式有多种,本次采用二进制方式进行集群安装,安装机器为三台Ubuntu虚拟机10.10.1.3、10.10.1.4、10.10.1.5。在服务器上安装Etcd注意的事项:
- 关闭selinux子系统;
- 关闭firewalld或开放需要使用的端口;
- 关闭swap内存交换;
1.从官网查找相应系统的二进制版本,并进行下载:
curl -L https://github.com/etcd-io/etcd/releases/download/v3.5.4/etcd-v3.5.4-linux-amd64.tar.gz -o etcd-v3.5.4-linux-amd64.tar.gz
2.解压文件:
tar xzvf etcd-v3.5.4-linux-amd64.tar.gz
3.将解压的etcd和etcdctl可执行文件复制到/usr/local/bin目录下:
sudo mv etcd-v3.5.4-linux-amd64/{etcd,etcdctl} /usr/local/bin/
4.验证安装是成功:
etcd --version
5.创建配置文件,不同版本的配置文件格式可能不同,以3.5.4版本为例,配置文件为yaml格式,参考etcd.yaml简单配置,默认路径/etc/etcd/etcd.yaml,参数信息举例如下:
name: etcd01
data-dir: /var/lib/etcd/data/
wal-dir: /var/lib/etcd/wal/
listen-peer-urls: http://10.10.1.3:2380
listen-client-urls: http://10.10.1.3:2379
initial-advertise-peer-urls: http://10.10.1.3:2380
advertise-client-urls: http://10.10.1.3:2379
initial-cluster: etcd01=http://10.10.1.3:2380,etcd02=http://10.10.1.4:2380,etcd03=http://10.10.1.5:2380
initial-cluster-token: etcd-cluster
6.创建etcd的systemd服务文件,用于开机启动:
[Unit]
Description=etcd key-value store
Documentation=https://github.com/coreos/etcd
After=network.target
[Service]
Type=notify
ExecStart=/usr/local/bin/etcd --config-file /etc/etcd/etcd.yaml
[Install]
WantedBy=multi-user.target
7.设置开机启动,查看状态:
systemctl daemon-reload
systemctl enable etcd
systemctl start etcd
systemctl status etcd
8.进行一个简单的数据存取测试:
#存一个值 etcdctl put id 001 #获取一个值 etcdctl get id #存一个值 etcdctl --endpoints http://10.10.1.3:2379 put id 002 #获取一个值 etcdctl --endpoints http://10.10.1.3:2379 get id
9.查看集群节点信息:
etcdctl --endpoints http://10.10.1.3:2379,10.10.1.4:2379,10.10.1.5:2379 endpoint status --write-out=table
三、etcd配置参数说明
etcd 服务可以通过命令行标记和环境变量来配置其行为功能,当命令行启动参数和环境变量同时存在时,命令行上设置的选项优先于环境变量。具体的参数使用方式参考 "etcd --help "帮助器。
命令行参数对应的环境变量的基本规则:
- 环境变量全部是大写标记;
- 环境变量都是以 ETCD_ 为前缀;
- 参数名称不变,并将其中的短横线-更换为下划线_。
例如:命令行参数格式--initial-cluster ,其对应的环境变量参数就是 ETCD_INITIAL_CLUSTER,其他参数类似,一些参数的参考说明如下:
# [Member] #节点名称 ETCD_NAME="etcd01" #数据存放目录 ETCD_DATA_DIR="/var/lib/etcd" #WAL目录 ETCD_WAL_DIR="/var/lib/etcd/WAL" #触发快照到硬盘的已提交事务的数量 ETCD_SNAPSHOT_COUNT=10000 #心跳间隔时间 (单位 毫秒) ETCD_HEARTBEAT_INTERVAL=100 #选举的超时时间(单位 毫秒) ETCD_ELECTION_TIMEOUT=1000 #用于监听伙伴通讯的URL列表,不能为域名 ETCD_LISTEN_PEER_URLS="http://10.10.1.3:2380" #用于监听客户端通讯的URL列表,不能为域名 ETCD_LISTEN_CLIENT_URLS="http://10.10.1.3:2379,http://127.0.0.1:2379" #保存的快照文件的最大数量 (0 表示不限制) ETCD_MAX_SNAPSHOTS=5 #保存的 wal 文件的最大数量 (0 表示不限制) ETCD_MAX_WALS=5 #逗号分割的 origin 白名单,用于 CORS资源共享 ETCD_CORS="none" # [Clustering] #列出这个成员的客户端URL,通告给集群中的其他成员。这些 URL 可以包含域名 ETCD_ADVERTISE_CLIENT_URLS="http://10.10.1.3:2379" #列出这个成员的伙伴 URL 以便通告给集群的其他成员 ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.10.1.4:2380,http://10.10.1.5:2380" #初始化集群配置 ETCD_INITIAL_CLUSTER="etcd01=http://10.10.1.3:2380,etcd02=http://10.10.1.4:2380,etcd03=http://10.10.1.5:2380" #在启动期间用于 etcd 集群的初始化集群记号 ETCD_INITIAL_CLUSTER_TOKEN="etcd-token-aaabbbccc" #初始化集群状态("new" or "existing") ETCD_INITIAL_CLUSTER_STATE="new" #用于启动集群的发现URL ETCD_DISCOVERY="none" #用于启动集群的 DNS srv 域名 ETCD_DISCOVERY_SRV="none" #当发现服务失败时的期待行为("exit" 或 "proxy") ETCD_DISCOVERY_FALLBACK="proxy" #用于请求到发现服务的 HTTP 代理 ETCD_DISCOVERY_PROXY="none" #拒绝将导致法定人数丢失的重配置请求 ETCD_STRICT_RECONFIG_CHECK=false #自动压缩用于 mvcc 键值存储的保持力,单位小时, 0 表示关闭自动压缩。 ETCD_AUTO_COMPACTION_RETENTION=0 # [Proxy flags] #代理模式设置("off", "readonly" or "on"). ETCD_PROXY="off" #在被重新考虑之前,终端将被视为失败状态的时间(单位 毫秒),用于被代理的请求 ETCD_PROXY_FAILURE_WAIT=5000 #终端刷新间隔时间(单位 毫秒) ETCD_PROXY_REFRESH_INTERVAL=30000 #请求的拨号(dial)超时时间(单位 毫秒),或者 0 禁用超时 ETCD_PROXY_DIAL_TIMEOUT=1000 #写操作的超时时间(单位 毫秒),或者 0 禁用超时 ETCD_PROXY_WRITE_TIMEOUT=5000 #读操作的超时时间(单位 毫秒),或者 0 禁用超时 ETCD_PROXY_READ_TIMEOUT=0 # [Security] #客户端服务器 TLS 证书文件的路径 ETCD_CERT_FILE="none" #客户端服务器 TLS key 文件的路径 ETCD_KEY_FILE="none" #开启客户端证书认证 ETCD_CLIENT_CERT_AUTH=false #客户端服务器 TLS 信任证书文件的路径 ETCD_TRUSTED_CA_FILE="none" #使用生成证书的客户端 TLS ETCD_AUTO_TLS=false #peer server TLS 证书文件的路径 ETCD_PEER_CERT_FILE="none" #peer server TLS key 文件的路径 ETCD_PEER_KEY_FILE="none" #开启 peer client 证书验证 ETCD_PEER_CLIENT_CERT_AUTH=false #peer server TLS 信任证书文件路径 ETCD_PEER_TRUSTED_CA_FILE="none" #使用生成证书的peer TLS ETCD_PEER_AUTO_TLS=false #请谨慎使用不安全标记,因为它将打破一致性协议提供的保证。 #强制创建新的单一成员的集群。它提交配置修改来强制移除集群中的所有现有成员然后添加自身 ETCD_FORCE_NEW_CLUSTER=false # [debug] #设置所有子包的默认日志级别为 DEBUG ETCD_DEBUG=false #设置个人 etcd 子包为指定日志级别。例如 etcdserver=WARNING,security=DEBUG ETCD_LOG_PACKAGE_LEVELS="none"
四、etcdctl命令行工具
该工具在安装etcd时默认安装,可用于操作etcd数据库,etcdctl常见的 语法命令如下:
etcdctl get 获取键或一组键
etcdctl put 将给定的密钥放入存储
etcdctl del 删除指定的键或键范围[key,range_end]
etcdctl txn Txn在一个事务中处理所有请求
etcdctl compaction 压缩etcd中的事件历史记录
etcdctl alarm disarm 解除所有警报
etcdctl alarm list 列出所有报警
etcdctl defrag 对具有给定端点的etcd成员的存储进行碎片整理
etcdctl endpoint health 检查“--endpoints”标志中指定的终结点的运行状况
etcdctl endpoint status 打印“--endpoints”标志中指定的终结点的状态
etcdctl endpoint hashkv 打印--endpoint中每个终结点的KV历史散列
etcdctl move-leader 将领导权移交给另一个etcd集群成员。
etcdctl watch 监视密钥或前缀上的事件流
etcdctl version 打印etcdctl的版本
etcdctl lease grant 创建租赁
etcdctl lease revoke 撤销租约
etcdctl lease timetolive 获取租赁信息
etcdctl lease list 列出所有活动租约
etcdctl lease keep-alive 保持租约有效(续订)
etcdctl member add 将成员添加到群集中
etcdctl member remove 从群集中删除成员
etcdctl member update 更新群集中的成员
etcdctl member list 列出群集中的所有成员
etcdctl snapshot save 将etcd节点后端快照存储到给定文件
etcdctl snapshot restore 将etcd成员快照恢复到etcd目录
etcdctl snapshot status 获取给定文件的后端快照状态
etcdctl make-mirror 在目标etcd集群上制作镜像
etcdctl migrate 将v2存储中的密钥迁移到mvcc存储
etcdctl lock 获取命名锁
etcdctl elect 观察并参与领导人选举
etcdctl auth enable 启用身份验证
etcdctl auth disable 禁用身份验证
etcdctl user add 添加新用户
etcdctl user delete 删除用户
etcdctl user get 获取用户的详细信息
etcdctl user list 列出所有用户
etcdctl user passwd 更改用户的密码
etcdctl user grant-role 将角色授予用户
etcdctl user revoke-role 吊销用户的角色
etcdctl role add 添加新角色
etcdctl role delete 删除角色
etcdctl role get 获取角色的详细信息
etcdctl role list 列出所有角色
etcdctl role grant-permission 授予角色密钥
etcdctl role revoke-permission 从角色中吊销密钥
etcdctl check perf 检查etcd集群的性能
etcdctl help 有关任何命令的帮助
五、配置ETCD自签证书
自签证书可以通过CFSSL等工具创建,详见cfssl自签证书工具使用,这里仅提供创建etcd集群证书的两个json文件:
- 配置文件ca-config.json:
cat > ca-config.json <<EOF { "signing": { "default": { "expiry": "87600h" }, "profiles": { "etcd": { "expiry": "87600h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] } } } } EOF
- etcd 服务器证书签名请求描述文件server-csr.json:
cat > server-csr.json <<EOF { "CN": "etcd", "hosts": [ "127.0.0.1", "10.10.1.3", "10.10.1.4", "10.10.1.5" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "BeiJing", "ST": "BeiJing" } ] } EOF
- 生成证书的命令: 以下命令最终得到如下三个文件:etcdserver.pem、etcdserver-key.pem、etcdserver.csr。
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=etcd server-csr.json | cfssljson -bare etcdserver
- 配置证书:移动证书到etcd.yaml相同的目录,然后在/etc/etcd/etcd.yaml文件中指定证书。
name: etcd02
data-dir: /var/lib/etcd/data/
wal-dir: /var/lib/etcd/wal/
listen-peer-urls: https://10.10.1.4:2380
listen-client-urls: https://10.10.1.4:2379
initial-advertise-peer-urls: https://10.10.1.4:2380
advertise-client-urls: https://10.10.1.4:2379
initial-cluster: etcd01=https://10.10.1.3:2380,etcd02=https://10.10.1.4:2380,etcd03=https://10.10.1.5:2380
initial-cluster-token: etcd-cluster
client-transport-security:
cert-file: /etc/etcd/etcdserver.pem
key-file: /etc/etcd/etcdserver-key.pem
trusted-ca-file: /etc/etcd/ca.pem
client-cert-auth: true
peer-transport-security:
cert-file: /etc/etcd/etcdserver.pem
key-file: /etc/etcd/etcdserver-key.pem
trusted-ca-file: /etc/etcd/ca.pem
client-cert-auth: true
六、Etcd不同部署模式的访问区别
1.单机访问,无需指定端点和证书,例如:
etcdctl put key value
2.集群方式的访问,需要--endpoints参数指定etcd的endpoint,例如:
etcdctl --endpoints http://10.10.1.3:2379 put key value
3.如果配置了tls证书,需要使用--cert、--key、--cacert参数指定证书和私钥,例如:
etcdctl --endpoints=https://10.10.1.3:2379 \
--cacert=/etc/etcd/ca.pem \
--cert=/etc/etcd/etcdserver.pem \
--key=/etc/etcd/etcdserver-key.pem \
put key value
七、常用命令
- 查看集群状态:
etcdctl --endpoints=https://10.10.1.3:2379 \
--cacert=/etc/etcd/ca.pem \
--cert=/etc/etcd/etcdserver.pem \
--key=/etc/etcd/etcdserver-key.pem \
--write-out=table \
member list
- 添加一个键值对:
etcdctl --endpoints=https://10.10.1.3:2379 \
--cacert=/etc/etcd/ca.pem \
--cert=/etc/etcd/etcdserver.pem \
--key=/etc/etcd/etcdserver-key.pem \
put id 001
- 根据key获取一个值:
etcdctl --endpoints=https://10.10.1.3:2379 \
--cacert=/etc/etcd/ca.pem \
--cert=/etc/etcd/etcdserver.pem \
--key=/etc/etcd/etcdserver-key.pem \
get id