配置项的 bool 类型配置均以 0 代表 False,1 代表 True。
集群配置
元信息配置
| 配置项 |
含义 |
默认值 |
可否动态变更 |
备注 |
| init_log_level |
启动时日志级别 |
ALL.*:INFO;SHARE.SCHEMA:INFO |
否 |
启动时的日志级别,主要为了输出更详细的日志,启动后将调整为 log_level 的配置。 |
| log_level |
启动后日志级别 |
ALL.*:INFO;SHARE.SCHEMA:WARN |
是 |
|
| rootserver_list |
启动时指定 rootservice 所在机器信息 |
|(英文半角) |
是 |
格式:server_ip:server_rpc_port:server_sql_port。 |
| cluster_url |
启动时指定的 cluster url |
|(英文半角) |
否 |
当 OceanBase 具有 cluster url;obcdc 用于获取 rootserver 信息,支持 server 高可用。 |
| cluster_user |
sys 租户下用户名 |
空(用户指定,必填) |
否 |
需配置 sys 租户下的用户,具有内部表(oceanbase 库)的读权限。 |
| cluster_password |
上述用户的密码 |
空(用户指定,必填) |
否 |
|
| config_fpath |
配置文件 dump 路径 |
etc/liboblog.conf |
否 |
obcdc 所有配置信息会 dump 到该文件。 |
| timezone |
obcdc 所属时区 |
+8:00 |
否 |
影响数据格式化输出的时区,需和数据源配置保持一致, 默认东 8 区。 |
| skip_ob_version_compat_check |
是否跳过 OceanBase 版本兼容性检查 |
否 |
否 |
3.x 版本 obcdc 仅支持同步 2.x/3.x 版本 OceanBase 数据,且 obcdc 版本号需大于 OceanBase 版本号(比较时考虑大版本号和小版本号)。 |
| cluster_version_refresh_interval_sec |
查询 OceanBase 集群 OBServer 最小版本号的周期 |
600 |
否 |
指定刷新 OceanBase 集群版本的间隔,单位为秒。 |
工作模式相关
| 配置项 |
含义 |
默认值 |
可否动态变更 |
备注 |
| working_mode |
工作模式 |
storage(商业版) |
否 |
业务请尽量控制事务大小。如果业务场景存在大事务,推荐使用持久化模式。持久化模式下,推荐将 obcdc 部署在 SSD 盘。 |
| store_service_path |
obcdc 持久化模式下存储数据的路径 |
./storage |
否 |
仅持久化模式下生效。 相对路径:存储在调用 obcdc 的进程所在路径下的相对路径。 绝对路径:存储在指定的绝对路径下,比如 store_service_path=/data/1。 |
同步粒度
obcdc 支持同步多个维度数据,单个 obcdc 实例支持同步一个集群,1 个/多个租户,若干 database,若干表等。
| 同步粒度 |
单个 obcdc |
多个 obcdc |
| 集群 |
支持(不支持单 obcdc 同步多集群) |
支持 |
| 租户 |
支持 |
支持 |
| database |
支持 |
支持 |
| table |
支持 |
支持(参考下面的多实例配置项) |
如果租户流量非常大,单实例 obcdc 同步整个集群很难做到数据实时的情况下,可以使用多个 obcdc 实例同步同一个集群来分担压力:
多个 obcdc 实例,每个实例同步不同租户的数据。
如果同步单个租户仍有压力过大的情况,可以将这个租户的数据按库表拆分到不同 obcdc 实例做数据同步。
注意
1,2 两个功能需要配置黑白名单。
如果同步单个表仍有压力过大的情况,可以配置多个 obcdc 实例同步一个表,即将不同的分区 hash 到不同的 obcdc 实例进行同步。
注意
这种情况下需要配置多实例。
黑白名单相关配置
| 配置项 |
含义 |
默认值 |
可否动态变更 |
备注 |
| tb_white_list |
同步的表的白名单 |
*.*.* |
否 |
格式:租户名.库名.表名(例如:mytenant1.db1.tb1|mytenant2.db2.*)。 |
| tb_black_list |
同步的表的黑名单 |
| |
否 |
格式同上。 |
| tablegroup_white_list |
同步的 tablegroup 白名单 |
*.* |
否 |
格式:租户名.tablegroup名,例如(mytenant1.*|or_tenant*.tg*)。 |
| tablegroup_black_list |
同步的 tablegroup 黑名单 |
| |
否 |
格式同上。 |
说明
obcdc 提供了基于表和 tablegroup 黑白名单的数据过滤能力:
- 只有在白名单且不再黑名单中的表 /tablegroup 才会同步下去,白名单默认为所有租户下的所有表 /tablegroup,黑名单默认为空;推荐生产环境使用白名单同步指定租户的数据,不要使用默认值(会拉取冗余数据)。
- 配置方式是通过 fnmatch 进行正则匹配,默认匹配规则为大小写不敏感,如果配置了 enable_oracle_mode_match_case_sensitive=1,则对 ORACLE 模式的租户进行大小写敏感对名称匹配。
多实例相关配置
| 配置项 |
含义 |
默认值 |
可否动态变更 |
备注 |
| instance_num |
分担流量的 obcdc 总数 |
1 |
否 |
|
| instance_index |
当前 obcdc 占总数量的 index(可以理解为 hash 桶 ID) |
0 |
否 |
取值为 [0,instance_num),每个 obcdc 只处理 hash(tenant_id, ls_id) % instance_num = instance_idx 的日志流的数据。 |
| enable_global_unique_index_belong_to_multi_instance |
是否允许多实例场景下同步全局唯一索引表 |
否 |
是 |
|
监控相关配置
流量控制
obcdc 为了防止异常情况下导致内存中数据堆积触发 OOM 的问题,提供了流量控制的能力。根据 obcdc 内部状态触发流量控制,暂停拉取新的数据,待 obcdc 状态恢复后继续拉取数据。流量控制功能由如下参数控制,必要时调整相应参数调整限流程度。
| 配置项 |
含义 |
默认值 |
可否动态变更 |
备注 |
| memory_limit |
obcdc 触发流控时使用的内存限额 |
20G |
是 |
流控参考参数之一(下同),并不意味着 obcdc 最多只用 memory_limit 大小的内存,最小配置为 2G。 |
| system_memory_avail_percentage_lower_bound, |
系统可用内存下限阈值(百分比) |
10 |
是 |
取值范围:[10, 80]。 |
| part_trans_task_active_count_upper_bound |
活跃的分区事务数量上限 |
200000 |
是 |
内存中活跃的分区事务结构体数量(分配出来且未被回收)。 |
| storager_task_count_upper_bound |
待 storager 模块持久化的任务数量的流控阈值 |
1000 |
是 |
最小值为 1。 |
| part_trans_task_reusable_count_upper_bound |
待重用的分区事务上限 |
10240 |
是 |
待输出到用户队列+待用户输出+待用户归还+未被 GC 的任务数量。 |
| ready_to_seq_task_upper_bound |
待定序的任务数量上限 |
2000 |
是 |
待定序任务数量上限为:待解析任务+待格式化任务+待持久化任务数量。 |
| pause_fetcher |
强制暂停拉日志 |
否(0) |
是 |
不管流控计算逻辑的结果,强制暂停拉日志。 |
流控参考条件:
- 条件 1:活跃分区数量超过上限阈值(part_trans_task_active_count_upper_bound)|| obcdc 持有内存超过上限阈值(memory_limit) || 系统可用内存低于下限阈值(system_memory_avail_percentage_lower_bound)。
- 条件 2:待重用分区事务结构数量超过上限阈值(part_trans_task_reusable_count_upper_bound)) || 待定序任务数量超过上限阈值(ready_to_seq_task_upper_bound)。
- 条件 3(since 3.x):待持久化的任务数量超过阈值(storager_task_count_upper_bound) && obcdc 持有内存超过流控触发内存(memory_limit) * 持久化模块占用相对流控内存的比值(storager_mem_percentage)。
触发流控的条件:((条件 1 && 条件 2)|| 条件 3) || (pause_fetcher != 0)。
监控信息输出
| 配置项 |
含义 |
默认值 |
可否动态变更 |
备注 |
| enable_dump_pending_trans_info |
是否定期统计 & 打印 obcdc 中持有的分布式事务的状态 |
否 |
是 |
如果配置为 1 则 10s 打印一次。 |
| print_fetcher_slowest_part_num |
打印拉日志最慢的分区的数量 |
10 |
是 |
|
| print_rpc_handle_info |
是否打印 RPC 相关信息 |
否 |
是 |
|
| print_stream_dispatch_info |
是否打印拉日志流信息 |
否 |
是 |
|
| print_partition_heartbeat_info |
是否打印分区心跳信息 |
否 |
是 |
|
| print_partition_serve_info |
是否打印分区服务信息(分区状态,分区事务数量) |
否 |
是 |
|
| print_participant_not_serve_info |
是否打印所有分布式事务的不服务(不输出数据)的分区事务信息 |
否 |
是 |
|
| print_partition_server_list_update_info |
是否在更新分区 server 列表时打印 server 列表详细信息 |
否 |
是 |
|
| output_inner_heartbeat_interval_msec |
获取全局分区心跳的周期 |
100(毫秒) |
是 |
不建议修改。 |
| enable_formatter_print_log |
是否允许 formatter 输出部分忽略格式化数据时的日志 |
否 |
是 |
|
元数据管理
租户管理
| 配置项 |
含义 |
默认值 |
可否动态变更 |
备注 |
| skip_rename_tenant_ddl |
是否忽略 rename 租户的 DDL |
否 |
是 |
如果遇到重命名的租户不在 obcdc 同步白名单范围内,则无影响。否则正常会报错退出进程(因为此时 rename 操作会打破白名单限制,遇到这个情况建议修改白名单使之同时支持 rename 前后的租户)。 该配置项设置为 true 时会跳过 rename 租户的 DDL 继续同步数据。 |
| enable_oracle_mode_match_case_sensitive |
OceanBase-Oracle 模式租户黑白名单匹配时大小写敏感 |
否 |
否 |
|
Fetcher 模块相关配置
| 配置项 |
含义 |
默认值 |
可否动态变更 |
备注 |
| partition_count_upper_limit |
分区进度的数量 |
2000000 |
否 |
最多支持 200 百万分区。 |
| check_switch_server_interval_min |
周期性检查分区是否需要切换拉日志机器 |
30 |
是 |
|
SQL 查询相关配置
| 配置项 |
含义 |
默认值 |
可否动态变更 |
备注 |
| access_systable_helper_thread_num |
执行 SQL 的连接池的连接数目上界 |
64 |
否 |
取值范围 [48, 1024]。 |
| mysql_connect_timeout_sec |
obcdc 和 OceanBase 建立的 SQL 连接的超时时间 |
40 |
是 |
|
| mysql_query_timeout_sec |
SQL 查询超时时间 |
30 |
是 |
|
| sql_server_change_interval_sec |
SQL 请求切换执行机器的周期 |
60 |
是 |
|
基于 cluster_id 过滤数据
obcdc 提供了基于 cluster_id 黑名单的数据过滤能力:OceanBase 规定了有效的 cluster_id 范围,但为了防止同步到不想要的数据,用户写数据时可以指定 cluster_id。配置同步源端写入数据的 cluster_id,请参考 ob_org_cluster_id 说明。
- 不同步不符合 OceanBase 和 OMS 规定的合法的 cluster_id 范围的数据(合法范围是[1, 4294901759] U [4294901760, 4294967295])。
- 不同步 cluster_id 在 cluster_id_black_list 中的数据。
- cluster_id_black_list 中的每一个 cluster_id 需取值在 cluster_id_value_min 和 cluster_id_value_max 之间。
| 配置项 |
含义 |
默认值 |
可否动态变更 |
备注 |
| cluster_id_black_list |
同步的 cluster_id 的黑名单 |
2147473648 |
否 |
多个 cluster_id 间用半角字符 | 分隔,每个 cluster_id 取值在 cluster_id_value_min 和 cluster_id_value_max 之间。 |
| cluster_id_black_value_min |
同步的 cluster_id 黑名单下限 |
2147473648 |
否 |
|
| cluster_id_black_value_max |
同步的 cluster_id 黑名单上限 |
2147483647 |
否 |
|
Server 级黑名单
obcdc 会向 OBServer 发起 SQL 和 RPC,我们分别提供了配置项目屏蔽部分 SQL 执行机器和 RPC 执行机器(对所有请求有效)。
此外,obcdc 拉日志是分区级别,因此内置实现了分区级别对拉日志黑名单,对于拉取分区日志超时/报错的机器都加入这个分区拉日志机器黑名单,机器加入黑名单和从黑名单中洗白的过程是自动的。
| 配置项 |
含义 |
默认值 |
可否动态变更 |
备注 |
| server_blacklist |
obcdc 不向此黑名单中的机器发送 RPC 请求 |
| |
是 |
多个 server 间用 | 分隔; 不会从这个 server 列表中的机器拉日志,当 server 不能正常提供日志服务(比如网络分区/延迟过高等)时人工配置到这个列表中。 |
| sql_server_blacklist |
obcdc 不向此黑名单中的机器发送 SQL 请求 |
| |
是 |
多个server 间用 | 分隔; 不会向列表中的 server 发起 SQL 查询请求。 |
分区级拉日志 server 黑名单调控(一般不修改)
| 配置项 |
含义 |
默认值 |
可否动态变更 |
备注 |
| blacklist_survival_time_sec |
机器在黑名单中的等待时间 |
30 |
否 |
|
| blacklist_survival_time_upper_limit_min |
机器在黑名单中的时间上限 |
4 |
是 |
|
| blacklist_survival_time_penalty_period_min |
机器重复加入黑名单时,黑名单时间翻倍的间隔阈值 |
1 |
是 |
|
| blacklist_history_overdue_time_min |
机器在黑名单历史待多久后删除 |
30 |
是 |
最小值为 10 |
| blacklist_history_clear_interval_min |
清理黑名单中机器信息的周期 |
20 |
是 |
最小值为 10 |
server 缓存信息相关配置
| 配置项 |
含义 |
默认值 |
可否动态变更 |
备注 |
| all_server_cache_update_interval_sec |
机器列表信息缓存更新周期 |
5 |
是 |
|
| all_zone_cache_update_interval_sec |
zone 信息缓存更新周期 |
5 |
是 |
|
拉日志相关配置
| 配置项 |
含义 |
默认值 |
可否动态变更 |
备注 |
| svr_finder_thread_num |
查找分区日志 server 列表的线程数 |
4 |
否 |
取值范围 [1,32]。 |
| fetcher_heartbeat_thread_num |
向分区 leader 发起心跳 RPC 请求的线程数目 |
4 |
否 |
取值范围 [1,32]。 |
| idle_pool_thread_num |
处理待发起分区拉日志任务的线程数目 |
4 |
否 |
取值范围 [1,32]。 |
| dead_pool_thread_num |
处理回收分区拉日志任务的线程数目 |
1 |
否 |
取值范围 [1,32]。 |
| stream_worker_thread_num |
分派分区拉日志任务的线程数 |
8 |
否 |
取值范围 [1,64]。 |
| start_log_id_locator_thread_num |
定位分区日志起点的线程数 |
4 |
否 |
取值范围 [1,32]。 |
| start_log_id_locator_locate_count |
完成定位日志起点任务的请求数目 |
3 |
否 |
最小值为 1。 定位分区起始日志 ID 需要指定数目的分区副本返回相同的起始日志 ID。 |
| skip_start_log_id_locator_result_consistent_check |
跳过起始日志 ID 一致性检查 |
否 |
否 |
|
| svr_stream_cached_count |
机器日志流对象池初始化大小 |
16 |
否 |
最小值为 1。 |
| fetch_stream_cached_count |
分区日志流对象池初始化大小 |
16 |
否 |
最小值为 1。 |
| start_log_id_locator_rpc_timeout_sec |
定位分区起始日志 ID 的 RPC 超时时间 |
60 |
是 |
最小值为 1。 |
| start_log_id_locator_batch_count |
定位分区起始日志 ID 的 RPC 批量大小 |
2000 |
是 |
最小值为 1。 |
| svr_finder_sql_batch_count |
获取分区机器列表的 SQL 批量大小 |
1 |
是 |
取值范围 [1,200]。 |
| stream_life_time_sec |
和 server 保持的日志流存活时间(拉日志过程会在 server 端持续维护日志流结束时间) |
60 |
是 |
最小值为 1。 |
| stream_max_partition_count |
一个日志流最多允许服务的分区数目 |
5000 |
是 |
最小值为 1。 |
| stream_feedback_interval_sec |
需要 server 提供 feedback 的周期 |
3 |
是 |
最小值为 0,定时向 server 请求一些分区状态的反馈信息:当前机器上的分区副本是落后副本/本机不服务指定日志/分区已下线。 |
| heartbeat_interval_sec |
分区心跳 RPC 周期 |
1 |
是 |
最小值为 1。 |
| heartbeater_rpc_timeout_sec |
分区心跳 RPC 超时时间 |
60 |
是 |
最小值为 1。 |
| heartbeater_batch_count |
分区心跳 RPC 批量大小 |
2000 |
是 |
最小值为 1。 |
| svr_list_update_interval_sec |
更新分区机器列表的周期 |
600 |
是 |
最小值为 1。 |
| leader_info_update_interval_sec |
更新分区 leader 信息的周期 |
600 |
是 |
最小值为 1。 |
| fetch_log_rpc_timeout_sec |
拉分区日志 RPC 超时时间 |
15 |
是 |
最小值为 1。 |
| fetch_log_cnt_per_part_per_round |
每次 RPC 最多返回的日志数量(每个分区) |
8000 |
是 |
最小值为 1。 |
| progress_limit_sec_for_dml |
dml 日志允许 upper limit |
3 |
是 |
最小值为 1。 为了保证各分区进度基本一致(防止某些分区拉日志过快),限制 server 提供该的日志上限为所有分区进度最小值+progress_limit_sec_for_dml。 |
| partition_timeout_sec |
判断分区拉日志 RPC 超时的阈值 |
3 |
是 |
最小值为 1。 |
| partition_timeout_sec_for_lagged_replica |
落后副本上拉日志超时的阈值 |
15 |
是 |
最小值为 1。 |
拉日志优先级相关
| 配置项 |
含义 |
默认值 |
可否动态变更 |
备注 |
| region |
obcdc 所属 region |
default_region |
否 |
obcdc 机器所属 region,优先拉取本 region 的 OBServer 的日志。 |
RPC 模块配置(不建议修改)
| 配置项 |
含义 |
默认值 |
可否动态变更 |
备注 |
| io_thread_num |
rpc io 线程数目 |
4 |
否 |
最小值为 1。 |
| rpc_tenant_id |
RPC 线程归属的租户 |
1 |
否 |
最小值为 1。 |
| rpc_result_cached_count |
拉日志 RPC 结果对象池初始大小 |
16 |
否 |
最小值为 1。 |
| rpc_process_handler_time_upper_limit_msec |
RPC 处理最长时间 |
200 |
是 |
最小值为 1。 |
| rpc_result_count_per_rpc_upper_limit |
一个拉日志流中未处理的拉日志 RPC 结果数量上限 |
16 |
是 |
最小值为 1。单个拉日志流中的拉日志结果数量达到这个值后暂停拉日志 RPC。 |
安全通信相关
| 配置项 |
含义 |
默认值 |
可否动态变更 |
备注 |
| ssl_client_authentication |
是否开启安全通信 |
否 |
否 |
默认不开启安全通信。 |
| ssl_external_kms_info |
安全通信方法 |
file |
否 |
外部使用仅支持文件模式,密钥文件放置在 obcdc 启动目录下的 wallet 目录下(请自建 wallet 目录),其下放置如下密钥文件: ca.pem/client-cert.pem/client-key.pem。 |
Parser 模块相关配置
| 配置项 |
含义 |
默认值 |
可否动态变更 |
备注 |
| dml_parser_thread_num |
解析 DML 的语句的线程池大小 |
5 |
否 |
最小值为 1。 |
| ddl_parser_thread_num |
解析 DDL 的语句的线程池大小 |
1 |
否 |
最小值为 1。 |
| skip_reversed_schema_version |
忽略 schema 版本回跳的异常 |
否 |
否 |
DDL 处理过程一般是 schema 单调推高的过程,如果 schema version 回跳说明有异常,提供配置跳过该异常。 |
Sequencer 模块相关配置
| 配置项 |
含义 |
默认值 |
可否动态变更 |
备注 |
| sequencer_thread_num |
分布式事务定序线程池大小 |
5 |
否 |
最小值为 1。 |
| sequencer_queue_length |
待定序的分区事务队列 |
102400 |
否 |
最小值为 1。 |
| 配置项 |
含义 |
默认值 |
可否动态变更 |
备注 |
| formatter_thread_num |
数据格式化线程池大小 |
10 |
否 |
最小值为 1。 |
| skip_dirty_data |
跳过异常数据 |
否 |
是 |
当前异常情况: 1. 非全列日志(指 CLOG 中只记录有变更的列的信息,配置项:binlog_row_image)。 2. 异常的物理备份恢复租户的 DDL。 |
Storager 模块相关配置
| 配置项 |
含义 |
默认值 |
可否动态变更 |
备注 |
| storager_thread_num |
持久化模块的线程池大小 |
10 |
否 |
|
| storager_queue_length |
待持久化的任务数量 |
102400 |
否 |
|
Data Processor 模块相关配置
| 配置项 |
含义 |
默认值 |
可否动态变更 |
备注 |
| data_processor_thread_num |
从持久化模块读数据的线程池大小 |
10 |
否 |
|
| data_processor_queue_length |
等待反序列化数据的任务数量 |
102400 |
否 |
|
输出 binlog record 相关配置
| 配置项 |
含义 |
默认值 |
可否动态变更 |
备注 |
| enable_output_trans_order_by_sql_operation |
是否将事务内行数据按 SQL 执行顺序输出 |
否 |
否 |
是指 OceanBase 内部变更数据的顺序,可能和客户端发送的 SQL 顺序不完全以˙一致。 |
| sort_trans_participants |
按分布式事务参与者进行排序 |
否 |
否 |
是指按分区键排序,配合 enable_output_trans_order_by_sql_operation 可以得到稳定的语句输出顺序。 |
| enable_output_hidden_primary_key |
是否输出无主键表的隐藏主键 |
否 |
否 |
无主键表支持输出隐藏主键 enable_output_hidden_primary_key=1,输出无主键表隐藏主键。 |
| enable_convert_timestamp_to_unix_timestamp |
是否将 timestamp 时间戳转换为 UNIX 整型时间 |
否 |
否 |
|
| enable_output_invisible_column |
是否输出隐藏列 |
否 |
否 |
|
| output_heartbeat_interval_sec |
输出安全位点信息的间隔 |
3 |
是 |
|
资源回收相关配置(不建议修改)
| 配置项 |
含义 |
默认值 |
可否动态变更 |
备注 |
| resource_collector_thread_num |
资源回收线程池大小 |
10 |
否 |
最小值为 1。 |
| resource_collector_thread_num_for_br |
用于回收 binlog record 线程池大小 |
7 |
否 |
需要大于 resource_collector_thread_num。 |
注意
不在本配置项说明文档里的配置不建议修改。