Ozone Debug

Ozone Debug 命令 (ozone debug) 是开发人员工具的集合,旨在帮助调试并获取 Ozone 各个组件的更多信息。

Usage: ozone debug [-hV] [--verbose] [-conf=<configurationPath>]
                   [-D=<String=String>]... [COMMAND]
Developer tools for Ozone Debug operations
      -conf=<configurationPath>
                  path to the ozone configuration file
  -D, --set=<String=String>
                  a map of (configuration_key,configuration_value) for any overrides
  -h, --help      Show this help message and exit.
  -V, --version   Print version information and exit.
      --verbose   More verbose output. Show the stack trace of the errors.

子命令: chunkinfo 返回指定文件/对象的块位置信息。 print-log-dag, pld 在 OM 中创建当前压缩日志 DAG 的镜像。 find-missing-padding, fmp 列出所有缺少填充的文件/对象,可以选择指定卷/存储桶/键 URI。 recover 恢复指定文件的租约。如果默认值不是 ofs:// ,请确保指定文件系统schema。 prefix 解析前缀内容。 ldb 解析 rocksdb 文件内容。 read-replicas 读取给定路径文件/对象所有块的每个副本。 container 容器副本特定操作,仅在数据节点上执行。 ratislogparser 解析Ratis Log 成用户可理解的文字形式。

有关更详细的用法,请参阅每个子命令的“–help”输出。

ozone debug ldb

Ozone 大量使用 RocksDB 来存储元数据。该工具帮助解析各个Ozone Roles 的 RocksDB 数据内容。 支持的数据库:Ozone Manager (om.db)、StorageContainerManager (scm.db)、Datanode/Container (container.db) 下面是用法:

Usage: ozone debug ldb --db=<dbPath> [COMMAND]
Parse rocksdb file content
      --db=<dbPath>   Database File Path
Commands:
  scan                      Parse specified metadataTable
  list_column_families, ls  list all column families in db.
  value-schema              Schema of value in metadataTable

list_column_families command

list_column_families 命令列出指定数据库中的所有列族。

$ ozone debug ldb --db=/path/to/scm.db ls
default
sequenceId
revokedCertsV2
pipelines
crls
crlSequenceId
meta
containers
validCerts
validSCMCerts
scmTransactionInfos
deletedBlocks
statefulServiceConfig
revokedCerts
move

scan command

scan 命令解析提供的 rocksdb 的特定列族并打印记录。

Usage: ozone debug ldb scan [--compact] [--count] [--with-keys]
                            [--batch-size=<batchSize>] --cf=<tableName>
                            [--cid=<containerId>] [-d=<dnDBSchemaVersion>]
                            [-e=<endKey>] [--fields=<fieldsFilter>]
                            [--filter=<filter>] [-l=<limit>] [-o=<fileName>]
                            [-s=<startKey>] [--thread-count=<threadCount>]
Parse specified metadataTable
      --batch-size=<batchSize>
                          Batch size for processing DB data.
      --cf, --column_family, --column-family=<tableName>
                          Table name
      --cid, --container-id=<containerId>
                          Container ID. Applicable if datanode DB Schema is V3
      --compact           disable the pretty print the output
      --count, --show-count
                          Get estimated key count for the given DB column family
                            Default: false
  -d, --dnSchema, --dn-schema=<dnDBSchemaVersion>
                          Datanode DB Schema Version: V1/V2/V3
  -e, --ek, --endkey=<endKey>
                          Key at which iteration of the DB ends
      --fields=<fieldsFilter>
                          Comma-separated list of fields needed for each value.
                            eg.) "name,acls.type" for showing name and type
                            under acls.
      --filter=<filter>   Comma-separated list of "<field>:<operator>:<value>"
                            where <field> is any valid field of the record,
                            <operator> is [EQUALS,LESSER, GREATER or REGEX].
                            (EQUALS compares the exact string, REGEX compares
                            with a valid regular expression passed, and
                            LESSER/GREATER works with numeric values), <value>
                            is the value of the field.
                          eg.) "dataSize:equals:1000" for showing records
                            having the value 1000 for dataSize,
                               "keyName:regex:^key.*$" for showing records
                            having keyName that matches the given regex.
  -l, --limit, --length=<limit>
                          Maximum number of items to list.
  -o, --out=<fileName>    File to dump table scan data
  -s, --sk, --startkey=<startKey>
                          Key from which to iterate the DB
      --thread-count=<threadCount>
                          Thread count for concurrent processing.
      --with-keys         Print a JSON object of key->value pairs (default)
                            instead of a JSON array of only values.

默认情况下,内容打印在控制台上,但可以使用 --out 选项将其重定向到文件。
--length 可用于限制打印的记录数。
--count 不打印记录,它显示大概的,并不是完全精确的记录数。
ozone debug ldb scan 命令提供了许多过滤选项以使调试更容易,详细说明如下:

–startkey and –endkey

顾名思义,这些选项指定迭代需要发生的键。
--startkey 指定从哪个键开始迭代,包含该键。 --endkey 指定停止迭代的键,不包含该键。

$ ozone debug ldb --db=/path/to/om.db scan --cf=volumeTable --startkey=vol3 --endkey=vol5
{ "/vol3": {
  "metadata" : { },
  "objectID" : -9999,
  "updateID" : 4000,
  "adminName" : "om",
  "ownerName" : "om",
  "volume" : "vol3",
  "creationTime" : 1707192335309,
  "modificationTime" : 1714057412205,
  "quotaInBytes" : 22854448694951936,
  "quotaInNamespace" : 100000000,
  "usedNamespace" : 1,
  "acls" : [ {
    "type" : "USER",
    "name" : "om",
    "aclScope" : "ACCESS"
  } ],
  "refCount" : 0
}
, "/vol4": {
    "metadata" : { },
    "objectID" : -888,
    "updateID" : 5000,
    "adminName" : "om",
    "ownerName" : "om",
    "volume" : "vol4",
    "creationTime" : 1696280979907,
    "modificationTime" : 1696280979907,
    "quotaInBytes" : 2251799813685250,
    "quotaInNamespace" : 100000000,
    "usedNamespace" : 2,
    "acls" : [ {
      "type" : "USER",
      "name" : "om",
      "aclScope" : "ACCESS"
    } ],
    "refCount" : 0
}
  }

–fields

每条记录中有多个字段。 --fields 选项允许我们选择要显示的特定字段。

$ ozone debug ldb --db=/path/to/om.db scan --cf=keyTable -l=1 --fields="volumeName,bucketName,keyName,keyLocationVersions.version,acls.name"
{ "/vol1/ozone-legacy-bucket/10T-1-terasort-input/": {
  "keyLocationVersions" : [ {
    "version" : 0
  } ],
  "keyName" : "10T-1-terasort-input/",
  "bucketName" : "ozone-legacy-bucket",
  "acls" : [ {
    "name" : "om"
  }, {
    "name" : "scm"
  }, {
    "name" : "testuser"
  } ],
  "volumeName" : "vol1"
}
}

–filter

--filter 可用于选择值与给定条件匹配的记录。过滤器按以下格式给出:<field>:<operator>:<value>, 其中“”是记录值中的任何有效字段,“”是 4 个支持的操作 [equals, regex, lesser, greater] 之一,“”是使用的值用于比较。
Equalsregex 适用于字符串、布尔值和数字字段,lessergreater 仅适用于数字值。
也可以在一个命令中给出多个过滤器,它们需要用逗号分隔。
使用 equals (等于) 运算符:

$ ozone debug ldb --db=/path/to/om.db scan --cf=volumeTable --filter="usedNamespace:equals:2"
{
  "/vol4": {
    "metadata": {},
    "objectID": -888,
    "updateID": 5000,
    "adminName": "om",
    "ownerName": "om",
    "volume": "vol4",
    "creationTime": 1696280979907,
    "modificationTime": 1696280979907,
    "quotaInBytes": 2251799813685250,
    "quotaInNamespace": 100000000,
    "usedNamespace": 2,
    "acls": [
      {
        "type": "USER",
        "name": "om",
        "aclScope": "ACCESS"
      }
    ],
    "refCount": 0
  }
, "/vol5": {
  "metadata" : { },
  "objectID" : -956599,
  "updateID" : 45600,
  "adminName" : "om",
  "ownerName" : "om",
  "volume" : "vol5",
  "creationTime" : 1807192332309,
  "modificationTime" : 1914057410005,
  "quotaInBytes" : 7785494951936,
  "quotaInNamespace" : 100000000,
  "usedNamespace" : 2,
  "acls" : [ {
    "type" : "USER",
    "name" : "om",
    "aclScope" : "ACCESS"
  } ],
  "refCount" : 0
}
 }

使用 lesser (较小) 运算符(greater(较大) 运算符也可以以相同的方式使用):

$ ozone debug ldb --db=/path/to/om.db scan --cf=volumeTable --filter="usedNamespace:lesser:2"
{
  "/vol2": {
    "metadata": {},
    "objectID": -73548,
    "updateID": 2384,
    "adminName": "om",
    "ownerName": "om",
    "volume": "vol2",
    "creationTime": 11980979907,
    "modificationTime": 1296280979900,
    "quotaInBytes": 417913685250,
    "quotaInNamespace": 100000000,
    "usedNamespace": 1,
    "acls": [
      {
        "type": "USER",
        "name": "om",
        "aclScope": "ACCESS"
      }
    ],
    "refCount": 0
  }
 }

使用 regex 运算符:

$ ozone debug ldb --db=/path/to/om.db scan --cf=volumeTable --filter="volume:regex:^v.*2$"
{
  "/vol2": {
    "metadata": {},
    "objectID": -73548,
    "updateID": 2384,
    "adminName": "om",
    "ownerName": "om",
    "volume": "vol2",
    "creationTime": 11980979907,
    "modificationTime": 1296280979900,
    "quotaInBytes": 417913685250,
    "quotaInNamespace": 100000000,
    "usedNamespace": 1,
    "acls": [
      {
        "type": "USER",
        "name": "om",
        "aclScope": "ACCESS"
      }
    ],
    "refCount": 0
  }
 }

使用多个过滤器:

$ ozone debug ldb --db=/path/to/om.db scan --cf=volumeTable --filter="usedNamespace:equals:2,volume:regex:^.*4$"
{
  "/vol4": {
    "metadata": {},
    "objectID": -888,
    "updateID": 5000,
    "adminName": "om",
    "ownerName": "om",
    "volume": "vol4",
    "creationTime": 1696280979907,
    "modificationTime": 1696280979907,
    "quotaInBytes": 2251799813685250,
    "quotaInNamespace": 100000000,
    "usedNamespace": 2,
    "acls": [
      {
        "type": "USER",
        "name": "om",
        "aclScope": "ACCESS"
      }
    ],
    "refCount": 0
  }
 }

value-schema command

“value-schema”命令显示存储在rocksdb的列族中的值的模式,即,它显示存储在值中的字段及其数据类型。 可以选择使用--depth来限制获取字段的级别。

$ ozone debug ldb --db=/data/metadata/om.db value-schema --cf=keyTable --depth=1
{
  "OmKeyInfo" : {
    "bucketName" : "String", 
    "metadata" : "struct", 
    "fileName" : "String", 
    "creationTime" : "long",
    "isFile" : "boolean", 
    "acls" : "struct", 
    "keyName" : "String",
    "replicationConfig" : "struct", 
    "encInfo" : "struct", 
    "dataSize" : "long", 
    "tags" : "struct", 
    "keyLocationVersions" : "struct", 
    "updateID" : "long", 
    "ownerName" : "String", 
    "modificationTime" : "long", 
    "parentObjectID" : "long", 
    "volumeName" : "String", 
    "fileChecksum" : "struct", 
    "objectID" : "long"
}
 }
$ ozone debug ldb --db=/data/metadata/om.db value-schema --cf=keyTable
{
  "OmKeyInfo" : {
    "bucketName" : "String",
    "metadata" : { },
    "fileName" : "String",
    "creationTime" : "long",
    "isFile" : "boolean",
    "acls" : {
      "toStringMethod" : { },
      "hashCodeMethod" : { },
      "name" : "String",
      "type" : {
        "name" : "String",
        "value" : "String",
        "ordinal" : "int"
      },
      "aclScope" : {
        "name" : "String",
        "ordinal" : "int"
      },
      "aclBits" : "int"
    },
    "keyName" : "String",
    "replicationConfig" : { },
    "encInfo" : {
      "ezKeyVersionName" : "String",
      "keyName" : "String",
      "edek" : { },
      "cipherSuite" : {
        "unknownValue" : {
          "value" : "int"
        },
        "name" : "String",
        "algoBlockSize" : "int",
        "ordinal" : "int"
      },
      "version" : {
        "unknownValue" : {
          "value" : "int"
        },
        "name" : "String",
        "description" : "String",
        "version" : "int",
        "ordinal" : "int"
      },
      "iv" : { }
    },
    "dataSize" : "long",
    "tags" : { },
    "keyLocationVersions" : {
      "isMultipartKey" : "boolean",
      "locationVersionMap" : { },
      "version" : "long"
    },
    "updateID" : "long",
    "ownerName" : "String",
    "modificationTime" : "long",
    "parentObjectID" : "long",
    "volumeName" : "String",
    "fileChecksum" : { },
    "objectID" : "long"
  }
}
Next >>