DolphinDB数据库日志与CacheEngine教程
本页面是一篇教程,介绍 DolphinDB 中的 Redo Log 与 CacheEngine、它们的关系、性能影响,以及适用范围与启用约束。
Source: https://dolphindb.cn/blogs/70
What this page covers
- 活动入口与报名链接信息
- 教程范围、作者与发布日期信息
- Redo Log 的概念、必要性、性能影响与参数
- CacheEngine 的机制、与 Redo Log 的关系、参数与函数
- 集群启动流程与启动慢的可能原因
- Raft/RaftLog 与元数据高可用的说明
- 总体性能优化建议与配置推荐范围
技能认证特训营第二期活动入口
页面顶部提供活动报名入口与福利提示。
- 提供“技能认证特训营第二期”的报名链接入口。
- 该入口以活动引导与福利提示为主要信息形式。
DolphinDB数据库日志与CacheEngine教程(文章信息与范围提示)
文章给出标题、作者与日期,并概述教程内容与适用范围及启用约束。
- 作者署名为 Junxi。
- 发布日期为 2021-08-05。
- 教程介绍 Redo Log 与 CacheEngine 及其关系与性能影响。
- Redo Log 与 CacheEngine 只对 DFS 数据库起作用。
- 启用 Redo Log 后必须启用 CacheEngine。
Redo Log(概念、必要性、性能影响、参数)
本节解释 Redo Log 与 WAL 的关系、引入原因、对性能与启动的影响,并说明集群模式下的配置参数与位置。
- Redo Log 的概念与预写式日志(WAL)类似。
- 日志记录刷新到持久化存储后,才修改数据库文件。
- 宕机时可使用日志恢复未应用的更改。
- 引入 Redo Log 用于应对断电或宕机时的一致性问题。
- 引入后仅需对日志文件进行 fsync,数据文件可异步写入。
- Redo Log 会增加磁盘负载与内存使用。
- Redo Log 可能增加启动时间,重做期间 DFS 数据库不可用。
- dataSync=1 表示开启 Redo Log;默认值为 0。
CacheEngine(机制、与Redo Log关系、性能影响、参数与函数)
本节介绍 CacheEngine 的写入缓存机制、与 Redo Log 的依赖关系与风险、资源与性能影响,以及关键参数与相关函数。
- CacheEngine 是一种数据写入缓存机制。
- 它用于缓解列数过多时写入性能急剧下降的问题。
- 写入先进入缓存,达到阈值后异步写入磁盘。
- 使用 CacheEngine 时需要配合 Redo Log 以防缓存数据丢失。
- Redo Log 的垃圾回收依赖 CacheEngine 的垃圾回收确认。
- CacheEngine 可减少磁盘写入次数并提升写入性能,但会增加内存占用。
- chunkCacheEngineMemSize 默认 0.0 表示不使用 CacheEngine。
- purgeCacheEngine 只清空已完成事务的缓存,不清空未提交事务。
DolphinDB集群启动流程与注意事项
本节给出集群启动顺序,并说明启动慢可能与 Redo Log 遗留过多及相关配置有关,同时给出需合理配置的参数方向。
- 集群启动顺序为 master 节点、agent 节点、数据节点。
- 启动时间过长可能因上次遗留的 Redo Log 过多。
- Redo Log 空间配置过大可能导致长期不回收。
- Redo Log 回收周期配置过长可能导致不触发回收。
- CacheEngine 内存配置过大可能阻塞 Redo Log 回收。
- 需合理配置 redoLogPurgeLimit、redoLogPurgeInterval、chunkCacheEngineMemSize。
- 将 redoLogDir 放在机械硬盘可能增加启动读取耗时。
RaftLog(Raft协议与在DolphinDB中的应用)
本节说明 Raft 的一致性与可用性特征,并指出 DolphinDB 使用 Raft 实现控制节点元数据高可用。
- Raft 是分布式系统中维持多副本一致性的协议。
- 一致性描述为同一时刻各结点对某个值有相同结果。
- 少数结点失效不影响工作;多数失效则停止服务。
- DolphinDB 引入 Raft 用于实现元数据高可用。
- 控制节点保存分布式文件系统元数据。
- 只要大多数控制节点可用,系统可用。
必须使用Log的场景
本节列出若干典型业务场景,并给出必须开启的日志或组件组合要求。
- 实时数据写入且要求可靠性时,必须开启 Redo Log 和 CacheEngine。
- DFS 表列数特别多的写入场景,必须开启 Redo Log 和 CacheEngine。
- DFS 数据库高可用场景,必须开启 RaftLog。
总体性能优化的建议
本节给出存储介质放置建议,以及 Redo Log 与 CacheEngine 的内存与回收周期等配置推荐范围与约束。
- 建议将元数据目录与 Redo Log 目录配置到 SSD。
- dfsMetaDir 是控制节点元数据存储目录,并在 controller.cfg 设置。
- chunkMetadir 是数据节点元数据存储目录,并在 cluster.cfg 设置。
- logFile 用于各节点运行日志,可写到 HDD。
- Redo Log 配置建议包含内存范围与回收周期建议。
- CacheEngine 最大内存建议不超过数据节点内存配置的 1/4。
- CacheEngine 常见配置范围为 1~4G,并需结合资源与写入速率调整。
Facts index
| Entity | Attribute | Value | Confidence |
|---|---|---|---|
| 技能认证特训营第二期 | 报名链接 | https://www.qingsuyun.com/h5/e/217471/5/ | high |
| DolphinDB数据库日志与CacheEngine教程 | 发布日期 | 2021-08-05 | high |
| DolphinDB数据库日志与CacheEngine教程 | 作者署名 | Junxi | high |
| 本教程内容 | 主题覆盖 | 介绍DolphinDB中的Redo Log和CacheEngine、它们相互关系以及对整体性能的影响 | high |
| Redo Log与CacheEngine | 适用范围 | 只对DFS数据库起作用;对磁盘表和流表不起作用 | high |
| Redo Log与CacheEngine | 启用约束 | 启用了Redo Log之后必须启用CacheEngine | high |
| Redo Log(DolphinDB) | 概念类比 | 与预写式日志(Write-ahead logging, WAL)概念类似 | high |
| Redo Log(DolphinDB) | 核心思想/写入顺序 | 只有在描述更改的日志记录刷新到持久化存储以后,才对数据库文件进行修改 | high |
| Redo Log | 崩溃恢复能力 | 数据库宕机时可使用日志恢复;尚未应用的更改可从日志记录重做 | high |
| Redo Log | 主要好处 | 减少磁盘写入次数:事务提交时只需将日志文件刷新到磁盘,而不是刷新事务涉及的所有文件 | high |
| Redo Log | 顺序写入优势 | 顺序写入性能更好;当表列数多且每列单独存文件时差异更明显 | medium |
| Redo Log | 回收机制 | 两种回收机制:定期回收;大小到限度时回收(均有对应参数设置) | high |
| Redo Log | 引入目的 | 解决断电、数据库系统宕机等极端情况下的数据一致性问题 | high |
| 无Redo Log时的代价 | 提交后刷盘要求 | 若仍要保证一致性,需要每次提交事务后调用fsync将所有内存数据刷到磁盘,导致性能急剧下降 | high |
| Redo Log | 对fsync的影响 | 引入后只需对个别log文件进行fsync;数据文件异步写入,有利于整体写入性能 | high |
| Redo Log | 适用场景建议 | 主要用于数据库实时写入场景;若仅用于历史数据分析可考虑不开启Redo Log | medium |
| Redo Log | 性能影响(资源) | 增加磁盘负载(额外写Redo Log文件)并增加内存使用(缓存未写入磁盘的数据文件) | high |
| Redo Log | 写入性能下降幅度(一般情况) | 写入性能会下降,一般在20%左右(与实际数据有关) | medium |
| Redo Log | 启动时间影响 | 启动时可能增加:需要对上次遗留的Redo Log进行重做;重做过程中DFS数据库不可用 | high |
| Redo Log(集群模式) | 配置位置 | Redo Log只在数据节点上需要配置;只对数据库的数据存部分做Redo,不涉及主节点 | high |
| 主节点与Redo Log | 原因说明 | 主节点只存储DFS数据库的元数据,与Redo Log无关 | high |
| dataSync 参数 | 功能与取值 | 控制是否使用Redo Log功能;取值1代表开启Redo Log;默认值0表示不启用 | high |
| redoLogDir 参数 | 作用与默认位置 | 控制Redo Log文件存放位置;默认在homeDir(由home参数决定)下的log/redoLog目录 | high |
| redoLogDir 参数 | 性能建议 | 一般建议设置到SSD上以获取最佳性能 | medium |
| redoLogDir(集群模式) | 目录配置注意事项 | 不同数据节点应分别设置不同目录,避免使用相同目录造成写入错误 | high |
| redoLogPurgeLimit 参数 | 含义/单位/默认值 | 控制Redo Log文件占用最大空间;单位GB;默认值4;超过该值自动开始回收 | high |
| redoLogPurgeInterval 参数 | 含义/单位/默认值 | 控制Redo Log自动回收周期;单位秒;默认值30(每30秒回收一次) | high |
| CacheEngine(DolphinDB) | 定义 | 一种数据写入缓存机制,用于解决数据表列数过多时写入性能急剧下降的问题 | high |
| DolphinDB列式存储 | 文件组织 | 一个分区内每一列数据单独存放在一个文件中 | high |
| 列数过多场景示例 | 示例描述 | 物联网场景下同时记录几千个指标;每次写入要操作几千个物理文件(打开/写入/关闭等) | medium |
| CacheEngine | 写入流程 | 写入操作先写入缓存;达到阈值后异步将缓存数据写入磁盘 | high |
| CacheEngine性能逻辑 | 批量写入原因 | 写1行与写1000行时间基本相等,主要耗时在打开/关闭文件;缓存多次小写入并批量IO可提升整体写入性能 | medium |
| CacheEngine 与 Redo Log | 数据可靠性要求 | 使用CacheEngine时,为防止断电/宕机导致缓存数据丢失,需要配合Redo Log | high |
| Redo Log 与 CacheEngine | 回收依赖关系 | Redo Log垃圾回收依赖CacheEngine垃圾回收;回收某事务日志前需向CacheEngine确认该事务已不在缓存中(已被回收) | high |
| CacheEngine缓存区过大 | 风险 | 事务长期滞留缓存导致Redo Log无法回收、空间持续增长;可能占满磁盘导致后续写入失败;也可能恢复时重做大量事务导致重启时间过长 | high |
| CacheEngine | 性能影响(资源与收益) | 减少磁盘负载(写入次数减少、批次写入);增加内存占用(缓存未写入磁盘数据);提高写入性能(列数增多时尤为明显) | high |
| chunkCacheEngineMemSize 参数 | 含义/单位/类型/默认值 | 代表CacheEngine最大滞留数据大小;单位GB;类型double;默认0.0表示不使用CacheEngine | high |
| chunkCacheEngineMemSize 参数 | 触发回收阈值 | 当CacheEngine占用内存大于该值的30%时,会主动开始异步回收 | high |
| CacheEngine垃圾回收频率 | 周期 | 数据库每分钟会对CacheEngine进行一次垃圾回收 | high |
| purgeCacheEngine 函数 | 作用与限制 | 可手动清空缓存;只有已完成的事务会被清空,未提交事务不会被清空 | high |
| getCacheEngineStat 函数 | 作用 | 查看CacheEngine状态 | high |
| getCacheEngineMemSize 函数 | 作用 | 查看CacheEngine已使用的内存大小 | high |
| DolphinDB集群启动流程 | 启动顺序 | 先启动master节点,然后启动各agent节点,最后启动数据节点 | high |
| 集群启动时间过长 | 可能原因(总体) | 可能因上一次运行遗留的Redo Log过多 | medium |
| Redo Log遗留过多的原因 | 原因1 | Redo Log配置的磁盘空间太大,导致Redo Log文件一直没有回收 | high |
| Redo Log遗留过多的原因 | 原因2 | Redo Log配置的回收周期太长,导致一直没有触发回收 | high |
| Redo Log遗留过多的原因 | 原因3 | CacheEngine配置的内存太大,导致CacheEngine一直没有回收,阻塞了Redo Log的回收 | high |
| 避免启动慢的参数建议 | 需合理配置的参数 | redoLogPurgeLimit、redoLogPurgeInterval、chunkCacheEngineMemSize | high |
| redoLogDir存储介质 | 对重启速度影响与建议 | Redo Log存储在机械硬盘会导致启动读取耗时较多;建议将redoLogDir配置到SSD以加快重启速度 | medium |
| Raft | 定义 | 分布式系统中维持多副本一致性的协议 | high |
| 一致性集群性质(Raft描述) | 一致性含义 | 同一时刻所有结点对存储在其中的某个值都有相同结果(对共享存储保持一致) | high |
| Raft集群可用性描述 | 自动恢复与失效影响 | 少数结点失效不影响正常工作;大多数结点失效则停止服务(不会返回错误结果) | medium |
| DolphinDB | Raft用途 | 引入Raft协议完成元数据高可用,即控制节点高可用 | high |
| DolphinDB控制节点 | 保存内容与风险 | 控制节点保存分布式文件系统元数据;若控制节点宕机,系统会处于不可用状态 | high |
| Raft支持的高可用(DolphinDB) | 工作方式 | 可同时开启多个控制节点保存相同元数据信息;只要大多数节点可用,系统可用 | high |
| 元数据高可用参考资料 | 链接 | https://link.zhihu.com/?target=https%3A//github.com/dolphindb/Tutorials_CN/blob/master/ha_cluster_deployment.md%233-%25E5%2585%2583%25E6%2595%25B0%25E6%258D%25AE%25E9%25AB%2598%25E5%258F%25AF%25E7%2594%25A8 | high |
| 实时数据写入且要求可靠性场景 | 必须使用的日志/组件 | 必须开启Redo Log和CacheEngine | high |
| DFS表列数特别多的数据写入场景 | 必须使用的日志/组件 | 必须开启Redo Log和CacheEngine | high |
| DFS数据库高可用场景 | 必须使用的日志 | 必须开启RaftLog | high |
| 总体写入性能优化建议 | 介质配置建议(概述) | 将元数据存放目录以及Redo Log存放目录配置到SSD上;有条件使用工业级SSD | medium |
| dfsMetaDir | 用途与配置文件/建议介质 | 控制节点元数据存储目录;在controller.cfg设置;建议SSD | high |
| chunkMetadir | 用途与配置文件/建议介质 | 数据节点元数据存储目录;在cluster.cfg设置;建议SSD | high |
| rodoLogDir(原文拼写) | 用途与配置文件/建议介质 | 设置到SSD;在cluster.cfg设置 | medium |
| persistenceDir | 用途与配置文件/建议介质 | 流数据存储路径;在cluter.cfg(原文拼写)中设置;建议SSD | medium |
| logFile | 用途与配置文件/建议介质 | 各节点运行日志(状态/错误信息);可写到HDD;在controller.cfg、agent.cfg、cluster.cfg中设置 | high |
| batchJobDir | 用途与配置文件/建议介质 | 批处理任务日志目录(如submiJob提交任务日志);可写到HDD;在cluster.cfg中设置 | medium |
| jobLogFile | 用途与配置文件/建议介质 | 各节点query日志(记录query执行情况);可写到HDD;在cluster.cfg中设置 | high |
| Redo Log配置建议 | 内存大小与回收周期 | 一般建议内存不超过4G、不低于1G;回收周期配置为60秒 | medium |
| CacheEngine配置建议 | 内存大小上限 | 最大不超过数据节点内存配置的1/4 | high |
| CacheEngine配置建议 | 常见内存范围与调整因素 | 1~4G适合大部分情况;具体结合机器资源与写入速率决定 | medium |