扩展字典支持数据的在线更新,更新后无需重启服务。字典数据的更新频率由配置文件中的 lifetime
元素指定,单位为秒:
<lifetime> <min>300</min> <max>360</max> </lifetime>点击复制复制失败已复制
其中, min
与 max
分别指定了更新间隔的上下限。 ClickHouse
会在这个时间区间内随机触发更新动作,这样能够有效错开更新时间,避免所有字典在同一时间内爆发性的更新。当 min
和 max
都是 0
的时候,将禁用字典更新。对于 cache
字典而言, lifetime
还代表了它的缓存失效时间。
字典内部拥有版本的概念,在数据更新的过程中,旧版的字典将持续提供服务,只有当更新完全成功之后,新版的字典才会替代旧版本。所以更新操作或者更新时发生的异常,并不会对字典的使用产生任何影响。
不同类型的字典数据源,更新机制也稍有差异。总体来说,扩展字典目前不支持增量更新。但部分数据源能够依照标识判断,只有在源数据发生实质变化后才实施更新动作。这个判断源数据是否被修改的标识,在字典内部称为 previous
,它保存了一个用于比对的值。 ClickHouse
的后台进程每隔 5
秒便会启动一次数据刷新的判断,依次对比每个数据字典中前后两次 previous
的值是否相同。若相同,则代表无需更新数据;若不同且满足更新频率,则代表需要更新数据。而对于 previous
值的获取方式,不同的数据源有不同的实现逻辑。
文件数据源
对于文件类型的数据源,它的 previous
值来自系统文件的修改时间,这和 Linux
系统中的 stat
查询命令类似:
$ stat test_flat_dictionary.xml File: test_flat_dictionary.xml Size: 814 Blocks: 8 IO Block: 4096 regular file Device: 45h/69d Inode: 25821194 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2022-05-01 08:08:24.600907513 +0000 Modify: 2022-05-01 08:08:23.580896226 +0000 Change: 2022-05-01 08:08:23.580896226 +0000 Birth: -点击复制复制失败已复制
当前后两次 previous
的值不同时,才会触发数据更新。
MySQL(InnoDB)、ClickHouse和ODBC
对于MySQL(InnoDB引擎)、ClickHouse和ODBC数据源,他们的previous值类源于invalidate_query中定义的SQL语句。例如在下面的示例中,如果前后两次的updatetime值不同,则会判定源数据发生了变化,字典需要更新。