ScyllaDB nodetool info 命令详解:单节点运行状态与缓存指标全解读
【免费下载链接】scylladbNoSQL data store using the Seastar framework, compatible with Apache Cassandra and Amazon DynamoDB项目地址: https://gitcode.com/GitHub_Trending/sc/scylladb
nodetool info是 ScyllaDB 运维中最常用的单节点诊断命令之一,它通过 ScyllaDB 的 REST API 聚合返回节点的运行状态快照,包括节点 ID、Gossip 状态、数据负载(Load)、运行时长(Uptime)、Off-Heap 内存占用、数据中心/机架归属以及三类缓存(Key Cache、Row Cache、Counter Cache)的命中情况。读完本文,你将掌握nodetool info的完整用法、每个输出字段的业务含义与数据来源(含底层 REST API 端点),并能将其与nodetool status、gossipinfo、statusgossip等命令组合用于日常巡检与故障排查。
命令概述:一条命令看清节点"体检报告"
nodetool info为集群中的特定节点提供详细统计信息,例如运行时长(uptime)、数据负载(load)、Key Cache 命中率、全部异常(exceptions)总数等。与面向整个集群的nodetool status(查看 token ring 信息)不同,info聚焦单个节点的运行时状态,其输出字段与 Cassandra 的nodetool info保持兼容,便于从 Cassandra 迁移的团队无缝衔接。
在 ScyllaDB 中,nodetool 本质上是 ScyllaDB 内嵌 REST API 的命令行前端:执行nodetool info时,客户端会依次向本节点的多个 HTTP 端点发起 GET 请求并汇总打印(见下文"源码级实现"一节)。入口脚本位于 bin/nodetool,实际命令解析与执行逻辑在 tools/scylla-nodetool.cc 的info_operation()函数中。
基本用法
默认情况下,nodetool info查看当前连接节点(即本机)的信息:
nodetool info如果需要查看集群中其他节点的状态,可通过--host参数指定目标节点的 IP 地址:
nodetool info --host <host_ip>结合 Nodetool 通用参数,还可以指定 REST API 端口:
nodetool -p <port> info --host <host_ip>-p <port>/--port <port>:ScyllaDB 节点 REST API 的端口(ScyllaDB 默认 API 端口为 10000,区别于 CQL 的 9042)。更多通用参数参见 Nodetool 参考文档。--:用双横线分隔命令行选项与参数列表(当某个参数可能与命令行选项混淆时使用)。
完整可用命令列表见 Nodetool Reference 及其子页面索引 nodetool-index.rst。
示例输出
在正常运行的节点上执行nodetool info,输出形如:
ID : 2110829b-47f2-4a6b-b87e-a81bc3b5cb31 Gossip active : true Thrift active : false Native Transport active: true Load : 294.44 MB Generation No : 1474434958 Uptime (seconds) : 1868 Heap Memory (MB) : 39.21 / 247.50 Off Heap Memory (MB) : 7.74 Data Center : us-east Rack : 1b Exceptions : 0 Key Cache : entries 0, size 0 bytes, capacity 0 MB, 0 hits, 0 requests, 0 recent hit rate, 0 save period in seconds Row Cache : entries 1064771, size 1.02 MB, capacity 450.8 MB, 96 hits, 120 requests, 0.800 recent hit rate, 0 save period in seconds Counter Cache : entries 0, size 0 bytes, capacity 0 bytes, 0 hits, 0 requests, 0.000 recent hit rate, 0 save period in seconds Token : (invoke with -T/--tokens to see all 256 tokens)下面逐项拆解每个字段的含义。
输出字段全解读
| 参数 | 说明 |
|---|---|
| ID | 节点 ID(Node ID) |
| Gossip active | Gossip 协议运行状态 |
| Thrift active | Thrift 服务状态(ScyllaDB 默认关闭) |
| Native Transport active | 原生传输协议(CQL)状态 |
| Load | SSTable 占用的磁盘空间(每 60 秒更新一次) |
| Generation No | 节点代次号(Generation No)——当节点发生重大变化(如重启或变更 tokens)时递增 |
| Uptime (seconds) | 节点自上次重启以来的运行时长(秒) |
| Heap Memory (MB) | ScyllaDB 中不适用 |
| Off Heap Memory (MB) | 所有表的 Memtables、Bloom filters、Indexes 和压缩元数据(Compression Metadata)所占用内存 |
| Data Center | 节点所在的数据中心 |
| Rack | 节点所在的机架 |
| Exceptions | ScyllaDB 中不适用 |
| Key Cache | ScyllaDB 中不适用 |
| Row Cache | Row Cache 使用情况 |
| Counter Cache | ScyllaDB 中不适用 |
| Token | 节点拥有的 token 列表 |
ID
节点在集群中的唯一标识(Host ID,UUID 格式),例如2110829b-47f2-4a6b-b87e-a81bc3b5cb31。该值对应 REST 端点/storage_service/hostid/local的返回值,可用于nodetool removenode <id>等需要精确指定节点的操作。
Gossip active / Thrift active / Native Transport active
三个布尔状态分别表示:
- Gossip active:Gossip 协议是否运行。Gossip 用于节点间的状态传播与故障检测,是集群自组织的基础;
- Thrift active:传统 Thrift RPC 服务是否开启。ScyllaDB 默认不启用Thrift(输出为
false),旧客户端需通过配置显式打开; - Native Transport active:CQL 原生传输协议(binary protocol,默认端口 9042)是否开启,一般应为
true。
三者分别由/storage_service/gossiping、/storage_service/rpc_server、/storage_service/native_transport三个端点提供。
Load
当前节点上所有 SSTable 占用的磁盘空间总量,示例中为294.44 MB。注意两点:
- 该值每 60 秒更新一次,不是实时刷新,因此刚写入大量数据后立刻查看可能滞后;
- 数据来源为
/storage_service/load端点,数值经 tools/scylla-nodetool.cc 中的file_size_printer格式化为人类可读的单位(字节数超过阈值时以 KiB/MiB/GiB/TiB 输出)。
Generation No
节点代次号。当节点发生重大变化时——典型如节点重启、token 集合变更——该数字会递增。代次号由 Gossip 协议维护(对应/storage_service/generation_number端点,内部实现在 api/storage_service.cc 的rest_get_current_generation_number,底层取自gossiper().get_current_generation_number())。它是判断节点是否经历过"旧状态复活"(zombie)的重要依据:若一个已下线节点带着旧的代次号重新加入集群,其他节点可通过代次号识别并忽略其过期的 Gossip 状态。若 Gossip 未运行,源码中直接输出 0。
Uptime (seconds)
节点自上次启动以来的运行秒数(示例1868秒约 31 分钟)。数据来自/system/uptime_ms端点(毫秒精度),源码中将其转换为秒后输出。
Heap Memory (MB) 与 Off Heap Memory (MB)
- Heap Memory (MB):在 ScyllaDB 中不适用。该字段是 Cassandra 的 JVM 堆内存(
used / max),而 ScyllaDB 基于 Seastar 框架、不运行在 JVM 之上,因此源码 tools/scylla-nodetool.cc 中mem_used与mem_max被硬编码为 0,仅为兼容 Cassandra 输出格式而保留; - Off Heap Memory (MB):所有表的 Memtables、Bloom Filters、Indexes 以及压缩元数据(Compression Metadata)占用的堆外内存总量。该值由源码中的
get_off_heap_memory_used()函数汇总计算:遍历所有 keyspace 与 table,累加每个表的memtable_off_heap_size、bloom_filter_off_heap_memory_used、index_summary_off_heap_memory_used、compression_metadata_off_heap_memory_used四项指标(对应/column_family/metrics/...端点),再除以 1 MiB 得到 MB 数。它比"进程总内存"更精确地反映了数据路径上的内存占用,是判断缓存与索引内存是否合理的参考指标。
Data Center / Rack
节点在拓扑中所属的数据中心与机架,由 snitch 组件决定。数据来源为/snitch/datacenter与/snitch/rack端点,配置方式可参考 conf/cassandra-rackdc.properties 等 snitch 相关配置。
Exceptions
ScyllaDB 中不适用。源码注释明确指出 "scylla always returns 0 though"——该字段是为兼容 Cassandra 而保留,ScyllaDB 不使用 Java 异常计数模型(对应/storage_service/metrics/exceptions端点恒为 0)。如需排查节点错误,应关注 ScyllaDB 日志与system.log,而非此字段。
Key Cache / Row Cache / Counter Cache
三类缓存统一以如下格式输出:
entries <条目数>, size <占用大小>, capacity <容量>, <hits> hits, <requests> requests, <命中率> recent hit rate, <N> save period in seconds- Key Cache:ScyllaDB 中不适用(无 Key Cache 概念),恒为 0;
- Row Cache:有效指标。示例中 Row Cache 有 1064771 个条目、占用 1.02 MB、容量 450.8 MB,
96 hits / 120 requests,近期命中率 0.800,save period 为 0 秒。Row Cache 用于缓存热行,命中率直接反映缓存收益; - Counter Cache:ScyllaDB 中不适用,恒为 0。
每个字段分别来自/cache_service/metrics/{key|row|counter}/entries|size|capacity|hit_rate以及/cache_service/{key|row|counter}_cache_save_period端点;命中/请求计数来自/cache_service/metrics/.../{hits|requests}_moving_avrage的移动平均值(注意源码中该端点拼写为moving_avrage,对应 API 侧的实际路由)。recent hit rate即hit_rate端点的返回值,save period为缓存周期性落盘保存的间隔秒数(0 表示未启用周期保存)。
Token
节点负责的 token 列表。示例节点拥有 256 个 token(vnode 模式),默认只打印提示信息;使用-T/--tokens参数可查看全部token:
nodetool info -T或
nodetool info --tokens数据来源为/storage_service/tokens端点。若节点尚未加入集群(join_ring 为 false),则输出(node is not joined to the cluster)提示。
从源码看实现:一条命令背后的 REST 调用链
nodetool info的完整实现位于 tools/scylla-nodetool.cc 的info_operation()(约第 1324-1380 行)。梳理其执行流程,可以更清晰地理解每个输出行的来源:
- 通过
scylla_rest_client(同文件中的 HTTP 客户端封装类)依次向本节点 REST API 发起 GET 请求; - 依次获取并打印:
/storage_service/hostid/local(ID)→/storage_service/gossiping(Gossip active)→/storage_service/rpc_server(Thrift active)→/storage_service/native_transport(Native Transport active)→/storage_service/load(Load)→/storage_service/generation_number(Generation No,Gossip 未运行时输出 0)→/system/uptime_ms(Uptime)→ 堆外内存四项指标汇总 →/snitch/datacenter、/snitch/rack→/storage_service/metrics/exceptions→ 三类缓存的 7 项指标; - 输出
Percent Repaired(固定为 0.0%,源码注释注明是 "a dummy value, to be compatible with cassandra nodetool"); - 若节点已加入集群(
/storage_service/join_ring为 true),从/storage_service/tokens获取 token 列表:token 数为 1 或指定了-T/--tokens时逐行打印,否则打印提示。
由此可以看到,ScyllaDB 的 nodetool 并不是简单翻译 Cassandra 的实现,而是把 Cassandra 的 JMX 调用替换为本地 REST API 调用,并针对 ScyllaDB 的架构(无 JVM、无 Key/Counter Cache、无异常计数)做了字段级适配。
与 Cassandra 输出对比及注意事项
| 字段 | Cassandra | ScyllaDB |
|---|---|---|
| Heap Memory | JVM 堆内存使用/上限 | 不适用(恒为 0) |
| Exceptions | Java 层异常计数 | 不适用(恒为 0) |
| Key Cache | 有 | 不适用(恒为 0) |
| Counter Cache | 有 | 不适用(恒为 0) |
| Row Cache | 有 | 有(有效指标) |
| Load | 有(实时) | 有(约 60 秒更新) |
| Percent Repaired | 修复百分比 | 固定 0.0%(dummy 值) |
日常巡检时的几个实操建议:
- 以Load与Row Cache命中率作为主要观察指标,关注节点间负载是否均衡;
- 用Uptime与Generation No判断节点是否近期重启过(重启会使两者重置/递增);
- 不要依赖 Exceptions、Heap Memory 等不适用字段判断 ScyllaDB 健康状态,异常排查请转向日志。
与其他 Nodetool 命令的配合使用
nodetool info聚焦单节点,可与以下命令组成完整的运维组合拳(全部命令见 Nodetool Reference):
nodetool status:查看整个集群的节点状态、负载与所有权分布;nodetool gossipinfo:查看 Gossip 各节点的代次号与心跳(对应/failure_detector/endpoints端点),与 info 中的 Generation No 互为印证;nodetool statusgossip/statusbinary:单独查看 Gossip / 原生传输协议开关状态;nodetool cfstats:深入某个表的诊断统计;nodetool tablestats:按表维度查看统计信息。
小结
nodetool info是 ScyllaDB 节点级健康检查的入口命令:一条命令即可获取节点身份、协议状态、磁盘负载、代次号、运行时长、堆外内存、拓扑位置与缓存命中情况。理解其字段含义、识别出哪些是"为兼容 Cassandra 保留的不适用字段",并知晓其底层 REST API 调用链(tools/scylla-nodetool.cc),能帮助你在巡检与排障时快速定位问题,避免被误导性指标带偏判断方向。需要查看完整 token 列表时,别忘了nodetool info -T。
【免费下载链接】scylladbNoSQL data store using the Seastar framework, compatible with Apache Cassandra and Amazon DynamoDB项目地址: https://gitcode.com/GitHub_Trending/sc/scylladb
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考