YugabyteDB集群节点重启后T-server启动报版本密钥不存在错误
YugabyteDB节点重启后T-server启动失败故障处理
问题背景
[问题来自YugabyteDB社区Slack用户提问]
在3节点YugabyteDB集群(单节点同时运行master、T-server进程)负向测试过程中,停止单个节点后重启时T-server无法正常拉起,删除节点旧数据是当时唯一可临时恢复的手段。
核心报错日志
F20220506 06:50:49 ../../src/yb/tserver/tablet_server_main.cc:220] Invalid argument (yb/util/universe_key_manager.cc:73): Could not init Tablet Manager: Failed to open tablet metadata for tablet: eb1e5457022f42c084148ca8fa4ba5c6: Failed to load tablet metadata for tablet id eb1e5457022f42c084148ca8fa4ba5c6: Could not load Raft group metadata from /data/yugabyte/data/yb-data/tserver/tablet-meta/eb1e5457022f42c084148ca8fa4ba5c6: Key with version number c7b91fad-dd60-404f-8846-cab568e52468 does not exist. @ 0x7fcdace5ee4c yb::LogFatalHandlerSink::send() @ 0x7fcdaa5e28ee google::LogMessage::SendToLog() @ 0x7fcdaa5dfa7a google::LogMessage::Flush() @ 0x7fcdaa5e3169 google::LogMessageFatal::~LogMessageFatal() @ 0x4124ea yb::tserver::(anonymous namespace)::TabletServerMain() @ 0x7fcda6811825 __libc_start_main @ 0x410f99 _start @ (nil) (unknown)
故障复现步骤
- 启动3节点集群
- 创建包含3个分区的表,通过UI确认各分区分布在不同tablet上
- 向3个不同分区分别插入测试数据,执行
SELECT *查询正常 - 关停其中一个T-server,再次执行
SELECT *查询正常 - 重启被关停的T-server即触发上述报错
现有环境配置
T-server启动命令
/usr/local/yugabyte/src/yugabyte-2.11.0.1/bin/./yb-tserver --flagfile /data/yugabyte/etc/tserver.conf
T-server配置文件内容
--tserver_master_addrs=ip1:7100,ip2:7100,ip3:7100 --rpc_bind_addresses=fqdn --server_broadcast_addresses=ip1 --enable_ysql --pgsql_proxy_bind_address=ip1:5433 --cql_proxy_bind_address=ip1:9042 --fs_data_dirs=/data/yugabyte/data --placement_cloud=cloud --placement_region=reg --placement_zone=zone --use_client_to_server_encryption=true --certs_for_client_dir=/data/yugabyte/ssl --certs_dir=/data/yugabyte/ssl --use_node_to_node_encryption=true --ysql_enable_auth=true --log_dir=/data/yugabyte/logs --ssl_protocols=tls12,tls13 --ysql_pg_conf=pgaudit.log='DDL',pgaudit.log_level=notice,pgaudit.log_client=ON,log_min_messages=notice,log_line_prefix='\%m \%r \%u \%d [\%p]'
前期排查结果
集群已开启静态加密,密钥文件存放在指定路径,但全域密钥未加载到内存:
- 执行集群配置查询命令:
/usr/local/yugabyte/src/yugabyte-2.11.0.1/bin/yb-admin -master_addresses $master get_universe_config
返回结果显示keyInMemory为false:
{"version":2,"replicationInfo":{"liveReplicas":{"numReplicas":3,"placementBlocks":[{"cloudInfo":{"placementCloud":"cloud","placementRegion":"region","placementZone":"zone"},"minNumReplicas":1}]}},"clusterUuid":"dccea8cb-9790-48ba-8a05-6218a8e875a4","encryptionInfo":{"encryptionEnabled":true,"universeKeyRegistryEncoded":"sZTzNciYu6b1KxZonpJx6v7CDDvexiv1jh/HIEAOkpV4YRrIZbIK9jtajdEMmVEUy706+dmz8bmnZvy6/n33u+qS7fzRSOTPOlpxYI6+k1lSM6bu2DRTTffhZtaiKN15gy8a3ifaZV7xJ9QJ3z9SvFYzb96+KDWw","keyPath":"/data/yugabyte/rest/universe_key","latestVersionId":"c7b91fad-dd60-404f-8846-cab568e52468","keyInMemory":false}} KeyInMemory: False
- 执行全域密钥内存加载状态检查命令:
usr/local/yugabyte/src/yugabyte-2.11.0.1/bin/yb-admin -master_addresses fqdn:7100 all_masters_have_universe_key_in_memory 7e13c99e-5278-4abd-ab78-79f70d6c2679
返回报错:
Error running all_masters_have_universe_key_in_memory: Operation failed. Try again. (yb/tools/yb-admin_client_ent.cc:1027): Unable to check whether master has universe key in memory.: Node fqdn:7100 does not have universe key in memory
故障根因
该故障由三个问题共同导致,不属于复杂配置错误:
- 静态加密机制逻辑要求:T-server启动时必须从master拉取对应版本的全域密钥,才能解密本地存储的tablet元数据完成初始化。当前集群master节点未将最新版本的加密密钥加载到内存,T-server拉取密钥失败,无法解密本地Raft组元数据,最终启动崩溃。
- 拓扑配置不一致:T-server配置中
placement_region参数填写为reg,但集群元数据中记录的placementRegion为region,拓扑信息不匹配会导致master间密钥同步流程异常,密钥无法自动加载到内存。 - 排查操作参数错误:执行密钥内存状态检查时,命令后传入的是集群UUID,实际该位置需要传入密钥版本ID,是前期检查返回失败的原因之一。
修复步骤
不需要删除节点本地数据,按以下步骤操作即可恢复:
- 修正所有节点master、T-server配置中的拓扑信息,保证
placement_cloud/placement_region/placement_zone三个参数和集群元数据记录的拓扑完全一致,修正后滚动重启所有master进程。 - 所有master启动完成后,手动将全域密钥加载到所有master内存,执行命令:
/usr/local/yugabyte/src/yugabyte-2.11.0.1/bin/yb-admin -master_addresses ip1:7100,ip2:7100,ip3:7100 add_universe_keys_to_all_masters /data/yugabyte/rest/universe_key
- 执行检查命令确认所有master都已加载对应版本的密钥,注意命令最后传入的是报错中提到的最新密钥版本ID
c7b91fad-dd60-404f-8846-cab568e52468,不要传集群UUID:
/usr/local/yugabyte/src/yugabyte-2.11.0.1/bin/yb-admin -master_addresses ip1:7100,ip2:7100,ip3:7100 all_masters_have_universe_key_in_memory c7b91fad-dd60-404f-8846-cab568e52468
- 确认命令返回所有master密钥加载成功后,直接启动之前启动失败的T-server即可正常拉起。
注意事项
- 开启静态加密的集群,所有节点的placement配置必须和集群拓扑配置完全一致,否则会出现密钥同步异常
- 节点重启前,先确认所有master节点已加载当前最新版本的全域密钥,避免T-server启动时拉取不到密钥
- 2.11.0.1属于开发预览版本,存在多个静态加密相关的已知bug,开展稳定性测试建议使用官方正式发布的稳定版本。
内容的提问来源于stack exchange,提问作者dh YB
相关产品推荐
相关产品推荐

