近日见闻
- 看新闻看到甘肃、青海部分地区受地震影响不小,心中很是悲痛,在此默默祈祷。我们活着的人要珍惜每一天,只因世事难料。
- OpenSSH 9.6 已发布,是完整的 SSH 协议 2.0 实现,且包括 sftp 客户端和服务器支持。
- 最近 Requests(Requests 是知名的 Python HTTP 库,项目已捐赠给 Python 软件基金会。) 作者 Kenneth Reitz 在社交媒体最近自己因躁狂症而失业,且表示自己目前的财务情况不佳,所以需要寻求资金来维持基本生存。确实不容易,项目地址:
https://github.com/kennethreitz
Etcd数据库应该知道这些
什么是etcd数据库
Etcd是Go语言开发的一个开源的、高可用的分布式的键值(key-value)存储系统,它被设计用于可靠地存储关键性数据,并保证快速的访问速度。我们运维之道的etcd常被用于Kubernetes集群中存储配置信息和状态数据。
etcd核心组件
- etcd 服务器(etcd daemon):
- 这是etcd的主要组件,运行在集群的每个节点上。它负责处理客户端请求,存储数据,并通过Raft协议与其他节点通信以保持数据一致。
- Raft 协议:
- Raft是etcd用来处理复制日志和提供一致性的算法。它确保了即使在网络分区或节点故障的情况下,etcd集群也能正确地存储数据并选择一个领导者来协调操作。
- 在Raft中,有三种角色:Leader(领导者)、Follower(跟随者)和Candidate(候选者)。Leader负责处理所有数据复制和日志同步的任务;Follower跟随Leader的指导,复制数据;而Candidate则是在Leader宕机后参与选举的节点。
- etcdctl:
- 这是etcd的命令行客户端,用于与etcd服务器交互。你可以用它来增加、删除或获取存储的数据,管理集群成员,以及进行各种运维操作。
- 客户端API:
- etcd提供了gRPC协议的API,客户端可以通过这些API与etcd集群交互。这使得不同的应用程序和服务能够以编程方式读取或写入数据。
- 存储引擎:
- etcd使用MVCC(多版本并发控制)存储引擎来管理数据。每个键值对都可以有多个版本,这样你可以查询历史数据,同时支持事务操作。
- WAL(Write-Ahead Log):
- 为了保证数据的持久性,etcd在内部使用预写式日志。在数据被写入存储引擎前,所有变更都会先被写入WAL。这是一个重要的故障恢复机制,可以在系统崩溃后重建状态。
- 快照:
- 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
命令行工具来查询其存储的统计信息。以下是如何进行检查的示例命令:
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
命令:
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 安装完成!"