ScyllaDB 节点数据清理指南:服务意外启动后如何安全清空数据并重建节点

【免费下载链接】scylladb NoSQL data store using the Seastar framework, compatible with Apache Cassandra and Amazon DynamoDB 【免费下载链接】scylladb 项目地址: https://gitcode.com/GitHub_Trending/sc/scylladb

本文以 ScyllaDB 官方运维文档 clear-data.rst 为核心,讲解当 ScyllaDB 服务在配置更新完成前意外启动、导致本地系统表状态错误时的标准处理流程:停止服务 → 清空数据与日志目录 → 重新启动 → 验证集群状态。读完本文,你将掌握这一"节点数据重置"场景的完整命令行操作、每一步骤涉及的目录职责与底层依据,以及操作前必须了解的影响范围。

为什么需要"清空数据":简单重启无法解决的场景

在 ScyllaDB 集群的运维中,存在一个容易被忽视的坑:如果在你有机会更新配置文件之前,ScyllaDB 服务已经因为某种原因启动起来了,那么部分系统表(system tables)可能已经记录下了错误的状态。例如节点以错误的配置注册了自己的 token、host_id、数据中心或机架信息,这些状态一旦写入本地系统表,仅靠一次简单的服务重启是无法修复的——重启只会让节点继续沿用已经错误的持久化状态。

在这种情况下,文档给出的最安全做法是:

  1. 停止服务;
  2. 清空所有数据;
  3. 重新启动服务。

这是一次"节点级数据重置",目的是让节点回到全新的状态,以便重新正确地加入集群。该场景对应的官方文档为 clear-data.rst,其操作细节分散在多个 rst_include 片段中,下文将逐一展开。

操作前必读:影响范围与前提条件

在执行下面的任何命令之前,请务必确认以下事实:

  • 该操作会永久删除当前节点上的全部业务数据/var/lib/scylla/data 目录被整体删除后,该节点上所有 keyspace 的数据、SSTable 文件将不复存在(除非集群有其他副本,数据会通过流式传输重建)。
  • 该操作只针对"单节点状态错误"的恢复场景。文档将本流程定位为"节点意外启动后"的修复手段,它不等同于常规的节点替换(replace)或下线(decommission)流程;若需要从集群中安全移除节点或更换故障节点,请参考同一目录下的 replace-dead-node.rstremove-node.rst 等文档。
  • 清空数据后,节点将以全新身份启动,需要重新加入集群并接收数据。如果节点此前已加入集群且集群已有其他副本,数据会通过正常的流式传输/修复过程补齐;如果这是集群中唯一的数据副本,数据将不可恢复,请先做好备份评估。
  • 文档中的路径 /var/lib/scylla/... 是 ScyllaDB 的默认路径,如果你的环境修改过 conf/scylla.yaml 中的目录配置,请以实际配置为准(下文会说明如何核对)。

步骤一:停止 ScyllaDB 服务

首先必须彻底停止 ScyllaDB 服务,避免在清理过程中有进程继续写入文件。根据部署方式不同,使用以下两种方式之一:

方式一:包管理器/支持的操作系统(systemd)

sudo systemctl stop scylla-server

方式二:Docker 容器(通过 supervisor 停止,不停止容器)

docker exec -it some-scylla supervisorctl stop scylla

其中 some-scylla 是你的容器名称。注意这种方式不会停止容器本身,只是停止容器内由 supervisor 托管的 Scylla 进程——这正是我们想要的:进程停住、目录可安全清理,容器环境保留。

说明:这两段命令分别来自官方 rst_include 片段 scylla-commands-stop-index.rst 的 "Supported OS" 与 "Docker" 两个标签页。如果你的系统不是 systemd 管理(例如 SysV init 或其他 init 系统),请使用与之对应的服务管理命令,核心目标是确保 scylla-server 进程完全退出。

步骤二:删除 Data 与 Commitlog 文件夹(含 hints 目录)

服务停止后,执行以下清理命令。这是整个流程的核心步骤,官方给出的标准命令来自 clean-data-code.rst

sudo rm -rf /var/lib/scylla/data
sudo find /var/lib/scylla/commitlog -type f -delete
sudo find /var/lib/scylla/hints -type f -delete
sudo find /var/lib/scylla/view_hints -type f -delete

逐条解读每条命令的作用:

命令清理对象作用
sudo rm -rf /var/lib/scylla/data数据目录删除所有 keyspace 的 SSTable 数据文件,这是"清空数据"的主体
sudo find /var/lib/scylla/commitlog -type f -deleteCommitlog(预写日志)删除未落盘的提交日志片段,避免启动时重放旧状态
sudo find /var/lib/scylla/hints -type f -deleteHinted Handoff 提示删除本节点为其他宕机节点暂存的写入提示
sudo find /var/lib/scylla/view_hints -type f -delete物化视图提示删除物化视图同步的延迟提示队列

注意两个细节:

  • data 目录用的是 rm -rf 整体删除,而 commitlog / hints / view_hints 用的是 find ... -delete 只删文件、保留目录结构。这样做的原因很实际:data 目录的内容完全可由节点重新生成,而 commitlog 等目录保留空目录骨架,可以避免服务重启时因目录缺失而额外创建,也符合"最小化改动"的清理原则。如果你希望绝对干净,也可以在确认服务停止后对这些目录执行同等力度的清理。
  • 这些路径对应 conf/scylla.yaml 中的默认配置:data_file_directories: /var/lib/scylla/data(第 32-33 行)、commitlog_directory: /var/lib/scylla/commitlog(第 37 行)、hints_directory: /var/lib/scylla/hints(第 284 行)、view_hints_directory: /var/lib/scylla/view_hints(第 287 行)。如果你的部署修改过这些配置(例如 data_file_directories 配置了多个目录,或把 commitlog 放到了独立磁盘),请把命令中的路径替换为你的实际值,并确保所有列出的数据目录都被清理

为什么还要关注 schema commitlog?

conf/scylla.yaml 中还定义了一个特殊目录 schema_commitlog_directory: /var/lib/scylla/commitlog/schema(第 43 行),它是专门用于 schema 和系统表的独立 commitlog 实例。由于本场景的问题根源恰恰是"系统表状态错误",清理时把 /var/lib/scylla/commitlog 下的文件(包括其子目录 schema 中的文件)一并删除,正是为了让系统表相关的预写日志不再被重放,从而彻底清除错误状态。从 db/config.ccsetup_directories() 实现可以看到,schema_commitlog_directory 在未显式配置时会默认落在 commitlog_directory 之下的 schema 子目录,因此上述对 commitlog 目录的清理天然覆盖了它。

步骤三:启动 ScyllaDB 服务

清理完成后,重新启动服务:

方式一:支持的操作系统(systemd)

sudo systemctl start scylla-server

方式二:Docker 容器(容器仍在运行的前提下启动)

docker exec -it some-scylla supervisorctl start scylla

(前提是 some-scylla 容器仍处于运行状态。)

这两段命令来自官方片段 scylla-commands-start-index.rst,与停止命令一一对应。启动后,ScyllaDB 会以全新的、干净的本地状态运行,不再受之前错误系统表状态的干扰。

步骤四:使用 nodetool status 验证节点状态

最后一步是验证集群是否恢复正常:

nodetool status

检查要点:

  • 本节点以及其他节点的状态列应显示 UN(Up/Normal,即在线且正常);
  • 所有预期中的节点都应出现在输出列表中并已完成加入(joined);
  • 如果集群启用了多个数据中心,确认各 DC 下的节点数量与预期一致(相关背景可参考 faq.rst 中关于 DC-aware 配置时核对 DC 名称的说明)。

nodetool status 是 ScyllaDB 集群健康检查的标准入口,其输出包含节点地址、状态、负载、token 数等信息;集群各节点的实时端点状态也可以通过 system.status 相关虚拟表查询(参见 system_keyspace.md 对虚拟表的说明)。只有当所有节点都显示为 UN 时,才说明本次清理后的节点已成功回归集群。

深入:清理流程背后的目录职责与配置逻辑

为了帮助你理解"为什么清空这四个目录就能解决问题",这里结合仓库源码做一次简要的溯源:

  1. data(数据目录):存放全部用户数据 SSTable。它在 conf/scylla.yaml 中通过 data_file_directories 配置(支持多个目录),是"清空数据"的语义主体。删除后节点以零数据状态启动,随后通过集群流式传输重新获取属于它的数据分区。
  2. commitlog(提交日志):ScyllaDB 的预写日志,保证写入在断电等异常下不丢失。启动时节点会扫描并重放 commitlog 中的片段;如果错误状态曾被写入其中,不清理就会在重启时被"复现"。文档特意选择"只删文件、保留目录"的方式,兼顾了彻底性与目录结构完整性。
  3. hints / view_hints(提示队列):分别用于 Hinted Handoff(为离线节点暂存写入)与物化视图的延迟同步。它们与本节点"重启后是否认为自己欠了别的节点的账"直接相关,属于"状态不干净"的潜在来源,因此一并清空,让节点无历史包袱地重新加入。
  4. 目录默认值从哪来:在 db/config.ccsetup_directories() 中,commitlog_directorydata_file_directorieshints_directoryview_hints_directory 等均通过 maybe_in_workdir() 在未显式配置时落到工作目录(work directory)下的固定子目录,这保证了默认安装下文档给出的路径是可靠的;同时这也意味着,一旦你在配置中自定义了这些路径,就必须同步修改清理命令

相关文档

【免费下载链接】scylladb NoSQL data store using the Seastar framework, compatible with Apache Cassandra and Amazon DynamoDB 【免费下载链接】scylladb 项目地址: https://gitcode.com/GitHub_Trending/sc/scylladb

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐