Etcd数据库应该知道的知识

2023-12-26 15:41:03 浏览数 (3)

近日见闻

  1. 看新闻看到甘肃、青海部分地区受地震影响不小,心中很是悲痛,在此默默祈祷。我们活着的人要珍惜每一天,只因世事难料。
  2. OpenSSH 9.6 已发布,是完整的 SSH 协议 2.0 实现,且包括 sftp 客户端和服务器支持。
  3. 最近 Requests(Requests 是知名的 Python HTTP 库,项目已捐赠给 Python 软件基金会。) 作者 Kenneth Reitz 在社交媒体最近自己因躁狂症而失业,且表示自己目前的财务情况不佳,所以需要寻求资金来维持基本生存。确实不容易,项目地址:https://github.com/kennethreitz

Etcd数据库应该知道这些

什么是etcd数据库

Etcd是Go语言开发的一个开源的、高可用的分布式的键值(key-value)存储系统,它被设计用于可靠地存储关键性数据,并保证快速的访问速度。我们运维之道的etcd常被用于Kubernetes集群中存储配置信息和状态数据。

etcd核心组件

  1. etcd 服务器(etcd daemon):
    • 这是etcd的主要组件,运行在集群的每个节点上。它负责处理客户端请求,存储数据,并通过Raft协议与其他节点通信以保持数据一致。
  2. Raft 协议:
    • Raft是etcd用来处理复制日志和提供一致性的算法。它确保了即使在网络分区或节点故障的情况下,etcd集群也能正确地存储数据并选择一个领导者来协调操作。
    • 在Raft中,有三种角色:Leader(领导者)、Follower(跟随者)和Candidate(候选者)。Leader负责处理所有数据复制和日志同步的任务;Follower跟随Leader的指导,复制数据;而Candidate则是在Leader宕机后参与选举的节点。
  3. etcdctl:
    • 这是etcd的命令行客户端,用于与etcd服务器交互。你可以用它来增加、删除或获取存储的数据,管理集群成员,以及进行各种运维操作。
  4. 客户端API:
    • etcd提供了gRPC协议的API,客户端可以通过这些API与etcd集群交互。这使得不同的应用程序和服务能够以编程方式读取或写入数据。
  5. 存储引擎:
    • etcd使用MVCC(多版本并发控制)存储引擎来管理数据。每个键值对都可以有多个版本,这样你可以查询历史数据,同时支持事务操作。
  6. WAL(Write-Ahead Log):
    • 为了保证数据的持久性,etcd在内部使用预写式日志。在数据被写入存储引擎前,所有变更都会先被写入WAL。这是一个重要的故障恢复机制,可以在系统崩溃后重建状态。
  7. 快照:
    • etcd定期将其状态(键值对和Raft日志)保存到快照中。这减少了重启所需的时间,因为系统可以从最近的快照开始重新播放日志,而不是从头开始。

备份、恢复、清理、空间、健康查看

备份命令:
代码语言:javascript复制
# 执行 etcdctl snapshot save 命令来创建备份
ETCDCTL_API=3 etcdctl snapshot save /path/to/backup.db 
  --endpoints=https://127.0.0.1:2379           # etcd 节点地址
  --cacert=/path/to/ca.crt                     # CA 证书
  --cert=/path/to/server.crt                   # 客户端证书
  --key=/path/to/server.key                     # 客户端密钥
  • 注意: 替换/path/to/backup.db和证书路径为你的实际文件路径。
恢复命令:
代码语言:javascript复制
# 使用 etcdctl snapshot restore 命令从备份恢复数据
ETCDCTL_API=3 etcdctl snapshot restore /path/to/backup.db 
  --data-dir=/var/lib/etcd-from-backup        # 指定新的数据目录
  --name m1                                   # 此etcd成员的名称
  --initial-cluster m1=http://host1:2380      # 整个集群的初始配置信息
  --initial-cluster-token etcd-cluster-1      # 新集群的唯一标识
  --initial-advertise-peer-urls http://host1:2380  # 此etcd成员通告给其他成员的URL
  • 注意: 恢复操作可能会导致数据丢失,应当在生产环境中谨慎使用,并确保在一个独立的环境中先行测试。
清理数据库命令:
代码语言:javascript复制
# 清理(压缩)命令可以移除所有被覆盖、删除的键值对以节省空间
ETCDCTL_API=3 etcdctl compact <revision>      # 指定要压缩的历史修订版本号
  --endpoints=https://127.0.0.1:2379          # etcd 节点地址
  --cacert=/path/to/ca.crt                    # CA 证书
  --cert=/path/to/server.crt                  # 客户端证书
  --key=/path/to/server.key                    # 客户端密钥
  • 注意: <revision> 应该替换为您希望压缩历史的具体修订版本号。您可以通过etcdctl get命令查看修订版本。
查看空间状态

要查看etcd数据库使用了多大空间,您可以使用etcdctl命令行工具来查询其存储的统计信息。以下是如何进行检查的示例命令:

代码语言:javascript复制
ETCDCTL_API=3 etcdctl --endpoints=<etcd-endpoint> 
  --cacert="/path/to/ca.crt" --cert="/path/to/cert.crt" --key="/path/to/key.key" 
  endpoint status --write-out=table

请将<etcd-endpoint>及后面的路径替换为您的etcd服务的实际访问地址和证书路径。这个命令的输出将会以表格的形式展示每个endpoint的状态信息,包括其数据库的大小。

健康状况

而对于检查etcd数据库的健康状况,可以使用如下etcdctl命令:

代码语言:javascript复制
ETCDCTL_API=3 etcdctl --endpoints=<etcd-endpoint> 
  --cacert="/path/to/ca.crt" --cert="/path/to/cert.crt" --key="/path/to/key.key" 
  endpoint health

这条命令会输出etcd成员的健康状况。如果etcd成员正常运行,您将看到<etcd-endpoint> is healthy的信息。

日常维护注意点:

在Kubernetes环境中,etcd的健康状况至关重要,因为它存储了所有Kubernetes对象的状态和配置。etcd的问题可能会影响整个集群的稳定性和性能。因此,定期检查etcd的健康状况和存储空间使用情况是Kubernetes集群维护的重要组成部分。

  • 正常操作: 定期检查集群健康状态,如成员健康和Raft状态。
  • 监控: 对etcd的性能指标进行监控,如请求延迟、读写次数和领导者变更次数。
  • 备份: 定期备份etcd数据,确保可以从系统崩溃中恢复。
  • 安全: 保护etcd的通信,使用SSL/TLS和客户端证书。
  • 软件版本: 保持etcd版本更新,以利用新特性和安全修复。

安装脚本

顺便分享一个一键安装脚本:

代码语言:javascript复制
ETCD_VER=v3.5 # 设置etcd的版本为v3.5

rm -rf tmp/etcd/${ETCD_VER} # 删除旧的etcd版本目录
mkdir -p tmp/etcd/${ETCD_VER} # 创建新的目录用于存放下载的文件
cd tmp/etcd/${ETCD_VER} # 进入新创建的目录

# 使用curl命令下载etcd压缩包
echo "下载 etcd version $ETCD_VER..."
curl -L https://github.com/coreos/etcd/releases/download/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz > etcd-${ETCD_VER}-linux-amd64.tar.gz
# 解压下载的压缩包
tar xzvf etcd-${ETCD_VER}-linux-amd64.tar.gz -C . --strip-components=1
# 将etcd和etcdctl二进制文件复制到/usr/local/bin目录

echo "复制etcdctl 到 /usr/local/bin..."

cp -rf etcd /usr/local/bin/etcd
cp -rf etcdctl /usr/local/bin/etcdctl
cd .. # 返回到上一级目录
rm -rf ${ETCD_VER} # 删除临时文件夹
etcd --version # 输出etcd版本信息
etcdctl --version # 输出etcdctl版本信息
# 设置ETCDCTL_API环境变量为3,并输出etcdctl版本信息
ETCDCTL_API=3 ./etcdctl version
# 启动etcd
echo "启动 etcd..."
/usr/local/bin/etcd

echo "etcd 安装完成!"

1 人点赞