Skip to content

Online Change Options

rockeet edited this page Apr 4, 2023 · 38 revisions

在线修改配置

使用 ToplingDB,可以在 json/yaml 中设置配置参数,这些配置参数在进程运行过程中是固定的,无法修改。然而,在实际应用中,在线修改配置参数是个很现实的需求。

2022-03-04,我们通过内嵌的 Web Service 实现了在线修改配置的功能。主要分两大类:

1. DBOptions & CFOptions

在 RocksDB 体系中,DBOptions & CFOptions 都分为 Mutable 和 Immutable 两类,我们当然只能在线修改 Mutable Options。理论上,我们应该使用和 json/yaml 相同的语法来修改这些配置,但是,在 RocksDB 中,可能是基于接口安全考虑,修改配置用的是 unordered_map<string, string>,而不是相应的 Option class。

所以,一方面为了简单(不简单的方案是理论上我们可以深度修改 RocksDB 代码来实现目标),另一方面软件工程有个实践信条:尽量让危险的操作复杂晦涩。修改配置是比较危险的操作,我们让他复杂晦涩一点并且与 Topling 的 json 配置语法不同,也许是好事,所以,对 DBOptions & CFOptions,我们采用 RocksDB 自己的语法:

1.1. 针对 DB_MultiCF (有多个 CF 的 DB),举例:

{
  "cfo": {
    "default": "max_write_buffer_number=10;level0_stop_writes_trigger=100"
  },
  "dbo": "max_background_compactions=17;delayed_write_rate=15M"
}

顾名思义,dbo 指 DBOptions,cfo 指 CFOptions(ColumnFamilyOptions); cfo 和 dbo 都是可选字段,将以上 json 保存为文件 mdb-cf-opt.txt,我们使用 curl 命令来修改配置:

# 使用 -d 参数时,curl 默认使用 HTTP POST 方法
curl -d @mdb-cf-opt.txt "http://somehost:port/db/strings?html=0"

还可以更简单直接地将配置 json 内容写在命令参数中:

curl -d '{"cfo": {"default": "max_write_buffer_number=5"}}' "http://somehost:port/db/strings?html=0"

1.2. 针对 DB (只有单个 CF 的 DB),举例:

注意:这个配置字符串必须加双引号,相应的 curl 命令如下:

curl -d '"delayed_write_rate=8M;max_background_compactions=40"' 'http://somehost:port/db/strings?html=0'

因为这个字符串是作为 json 来解析的,加双引号才能解析为 json string。

1.3. 未来可能的改进

以现在这种语法,CFOptions & DBOptions 使用字符串来配置,这也为将来我们使用 ToplingDB 的 json 语法来在线修改提供了扩展机会:当支持 json 语法时,目前 RocksDB 的字符串语法仍然有效,这就保持了兼容性。

2. 其它对象

其它对象使用 json 语法修改

2.1. 修改 MemTableRepFactory

修改 MemTableRepFactory 对我们(ToplingDB)有很大的价值,因为我们期望能立竿见影地看到 ToplingCSPPMemTab 相比 SkipList 的优越性。但是 MemTableRepFactory 在 RocksDB 中是 Immutable 的,不过这没关系,我们可以通过实现一个中间层 来绕过 RocksDB 这个限制,配置的时候:

"dyna": {
  "class": "Dyna",
  "params": {
    "real_fac": "${cspp}"
  }
}

在线修改的时候:

# 改为 cspp
curl -d '{"real_fac": "${cspp}"}' "http://somehost:port/memtable_factory/dyna?html=0"

# 改为 skiplist
curl -d '{"real_fac": "${skiplist}"}' "http://somehost:port/memtable_factory/dyna?html=0"

理论上,我们也可以直接修改 RocksDB 的代码,把 memtable_factory 改成 Mutable 的,但我们没选择这样干,因为这样的修改是“霰弹式”修改,需要修改很多个地方,牵涉到很多文件,并且很可能跟上游 RocksDB 的某些后续修改产生冲突,不利于我们持续跟进上游 RocksDB。

2.2. 修改 DispatcherTableFactory

DispatcherTableFactory 可以在线修改 LSM 各层使用的 TableFactory,并立即观察效果:

curl -d '{"level_writers":["fast","fast","fast","fast"]}}' "http://somehost:port/table_factory/dispatch?html=0"

以上命令将 LSM 前 4 层(L0~L3)改为 fast,后面的 L4~L6 不变。

curl -d '{"level_writers":[null,null,null,"fast"]}}' "http://somehost:port/table_factory/dispatch?html=0"

该命令与上一条命令等价,null 表示跳过,不改变原值

2.3. 操作 BlockCache

所有的 Topling SST 都不需要 BlockCache,但 BlockBasedTable 需要,可以修改 Cache 的容量,或者清除 Cache 中没有正在使用的对象,例如针对示例中的 lru_cache:

设置容量

curl -d '{"capacity":"8G","strict_capacity":true}}' "http://somehost:port/cache/lru_cache?html=0"

清除没有正在使用的对象(引用计数为 0)

# json 对象中只要有 EraseUnRefEntries 即可,其值被忽略
curl -d '{"EraseUnRefEntries":1}' "http://somehost:port/cache/lru_cache?html=0"
Clone this wiki locally