ETCD数据库崩溃的处理

在一次停电事故后,K8S集群中的ETCD服务无法启动,显示数据库文件损坏。通过对错误日志的分析,发现第2节点的数据库文件是最新的且无错误。通过将2节点的文件复制到其他节点,成功恢复ETCD集群正常运行。该事件强调了在处理问题时谨慎操作以及数据库备份的重要性。

故障描述

下午家里停电,恢复供电之后发现K8S集群不能自动启动了,检查发现3个ETCD节点服务不能启动,报错日志如下:

Jun 24 19:45:05 etcd1 systemd[1]: Starting Etcd Server...
-- Subject: Unit etcd.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit etcd.service has begun starting up.
Jun 24 19:45:05 etcd1 etcd[1453]: recognized and used environment variable ETCD_ADVERTISE_CLIENT_URLS=https://192.168.50.60:2379
Jun 24 19:45:05 etcd1 etcd[1453]: recognized and used environment variable ETCD_CERT_FILE=/etc/etcd/ssl/etcd.pem
Jun 24 19:45:05 etcd1 etcd[1453]: recognized and used environment variable ETCD_INITIAL_ADVERTISE_PEER_URLS=https://192.168.50.60:2380
Jun 24 19:45:05 etcd1 etcd[1453]: recognized and used environment variable ETCD_INITIAL_CLUSTER=etcd1=https://192.168.50.60:2380,etcd2=https://192.168.50.61:2380,etcd3=https://192.168.50.62:2380
Jun 24 19:45:05 etcd1 etcd[1453]: recognized and used environment variable
### etcd 作为内存型数据库的特点 etcd 是一个分布式的、可靠的键值存储系统,其设计目标是为了配置共享和服务发现。作为一个内存型数据库etcd 的特点如下: - **高性能读取**:由于大部分操作都在内存中完成,因此能够提供非常高的读性能[^1]。 - **强一致性模型**:通过 Raft 算法实现了一致性协议,确保所有节点上的数据保持一致[^3]。 - **多版本并发控制 (MVCC)**:每次更新都会创建一个新的版本,并保留旧版本的历史记录,这有助于支持时间旅行查询和其他高级功能。 - **持久化能力**:尽管主要工作是在内存中进行,但是为了防止崩溃后的数据丢失,所有的变更也会被写入磁盘中的 WAL 文件以及定期生成的快照(snapshot)。 ### 使用场景 考虑到上述特性,etcd 主要适用于以下几种使用场景: - **服务发现与注册**:应用程序可以在启动时向 etcd 注册自己,并允许其他应用查找它们的位置和状态信息。 - **分布式锁管理**:利用 etcd 提供的原子 CAS(Compare And Swap)指令来构建跨多个进程或机器间的互斥锁定机制。 - **动态配置管理**:可以将系统的全局设置保存在 etcd 中,当需要调整参数时只需修改一处即可生效于整个集群内。 - **选举领导者**:在一个分布式环境中选出唯一的协调者负责特定的任务分配或其他决策过程。 ### 架构概述 etcd 的整体架构围绕着几个关键组件展开: #### gRPC Server 这是 etcd 对外暴露的主要接口之一,用来接收来自客户端的各种请求并返回响应结果。它还承担着与其他 etcd 成员之间相互通信的角色,从而维持集群内部的一致性和健康状况。 #### MVCC 存储引擎 该模块实现了多版本并发控制逻辑,使得每一个键都可以拥有不同的历史版本。每当有新的写入发生时,不会覆盖现有的条目而是新增一条带有不同版本号的数据项。这种做法不仅提高了并发度同时也简化了事务处理流程。 #### BoltDB 数据库 作为底层的实际物理存储介质,BoltDB 负责承载由上层产生的实际键值对及其元数据。值得注意的是,在正常运行期间大多数交互都是针对内存缓存来进行优化过的;只有涉及到持久化的部分才会触及到底层文件系统层面的操作。 #### Write-Ahead Log (WAL) 预写式日志用于保障即使遇到意外断电等情况也能安全恢复之前未完全提交的变化。每笔交易先记入此日记账本然后再正式应用于内存结构之中。 #### Snapshot 快照 为了避免 WAL 日志无限增长占用过多空间,会周期性的制作全量备份即所谓的“快照”。一旦有了最新的快照之后就可以清理掉那些过期的日志片段以释放资源。 ```go // 示例 Go 客户端连接至 Etcd 并执行简单 Key/Value 操作 package main import ( "context" "fmt" clientv3 "go.etcd.io/etcd/client/v3" ) func main() { cli, err := clientv3.New(clientv3.Config{ Endpoints: []string{"localhost:2379"}, }) if err != nil { panic(err) } defer cli.Close() ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) _, err = cli.Put(ctx, "key", "value") cancel() if err != nil { fmt.Println("Put failed:", err) return } resp, _ := cli.Get(ctx, "key") for _, ev := range resp.Kvs { fmt.Printf("%s : %s\n", ev.Key, ev.Value) } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值