Skip to content
He Wang edited this page Apr 12, 2024 · 6 revisions

基础概念

oblogproxy 和 libocdc 是什么关系?liboblog 又是什么东西?

libobcdc 是 oblogproxy 的一个依赖,它是一个用于 OceanBase 数据库增量数据订阅的 C++ 依赖库,liboblog 是 libobcdc 的一个曾用名,该名称目前仍保留在一些其他项目中。

libobcdc 对于 OceanBase 数据库的社区版和企业版有不同的实现,社区版的 libobcdc 源代码位于内核仓库 src/logservice/libobcdc,对应的 rpm 安装包一般随数据库内核发版时一起发布,名称格式为 oceanbase-ce-cdc-xxx.rpm,详情可在 OceanBase 社区版的 GitHub Releases 页面查看。

oblogproxy 与 OceanBase 数据库有什么版本对应关系?

由于 oblogproxy 集成了 libobcdc,因此 oblogproxy 跟 libobcdc 一样区分企业版和社区版。同时由于 libobcdc 只能保证向前兼容,因此对于新版本的 OceanBase 数据库,如果使用旧版本的 oblogproxy,可能会出现不适配的情况。具体的版本适配信息,请参考本项目的 Releases 页面。

*注:企业版 oblogproxy 并未开源,目前仅对公有云用户开放,其他的企业版 OceanBase 客户请使用 OMS。

logreader 是什么?跟 logproxy 是什么关系?

本项目在实际运行中,主要有两部分:

  • logproxy:项目主进程,负责接收客户端请求,创建 logreader,运行日志目录为 ${logproxy_home}/log
  • logreader:项目的工作进程,负责处理实际的数据订阅和发送,每个客户端请求对应一个 logreader,客户端以请求中携带的 client id 字段进行区分,运行日志目录为 ${logproxy_home}/run/${client_id}/log

需要注意的一点是,目前 logproxy 进程只负责创建 logreader 而不负责关闭 logreader,所以 logreader 只有在客户端关闭连接时才会退出。

常见问题

oblogproxy 运行日志中出现 error Table 'oceanbase.__all_virtual_server_clog_stat' doesn't exist

oblogproxy 在接收到客户端请求后,在预检查阶段会查询对应集群的一些内部表,由于 OceanBase 从 3.x 到 4.x 有非常大的变化,其中用到的一些内部表在新版本中已经不存在了,因此才会出现这种错误。相关联的错误信息可能还有:

Failed to query observer:Table 'oceanbase.__all_virtual_server_clog_stat' doesn't exist, unexpected column count: 0
Failed to check the existence of svr_min_log_timestamp column in __all_virtual_server_clog_stat, disable clog check

oblogproxy 在发现上述查询失败后,会跳过相应的检查,因此这一类 error 的信息可以忽略,该报错也不会影响实际的数据订阅。

客户端程序启动或重启后抛出异常,内容包含 Duplication exist clientId:

上面已经提到,logproxy 在创建 logreader 时,一个客户端对应一个 logreader,而客户端以 client id 进行区分。因此,如果发现新接收到的 client id 与已有的 logreader 对应的 client id 重复,就会出现上述错误。出现这种错误的场景有以下几种:

  1. 用户指定了 client id,该 client id 与已有订阅链路的 client id 重复。这种情况下,修改 client id 重新启动客户端即可。
  2. 用户未指定 client id,但是同时启动了多个客户端程序监听同一个集群的同一个租户。由于在用户未指定 client id 时,client id 默认是时间戳和监听的租户拼接生成的,如果同一时刻在启动了多个客户端监听同一个租户,就会出现只有一个启动成功的情况,剩余客户端将会因为 client id 已存在而被 logproxy 服务拒绝。这种情况下,用户可以通过手动指定 client id 来避免两个任务的 client id 相同。
  3. 客户端原本可以正常运行,一段时间后重新启动时报错。造成这种情况的原因一般是客户端在之前退出时没有调用 close 函数关闭连接,导致 logreader 没有及时退出,重启后发起的请求被 logproxy 当作了另一个新的请求,由于此时请求中带的 client id 与之前相同,因而被logproxy 服务拒绝。这种情况下,可以使用新的 client id 重新发起请求,对于原来的 logreader 进程则可以手动终止。

客户端程序启动或重启后抛出异常,内容包含 Failed to auth

该报错说明 logproxy 在验证用户权限时出错了。 logproxy 在鉴权时会用到两组账密,一组 sys 租户账密和一组业务租户账密。

  • sys 租户账密:可以通过配置文件写入,也可以通过客户端请求设置,主要用于登陆 sys 租户、查询内部表等。
  • 业务租户账密:只能通过客户端请求设置,logproxy 将会对该用户在订阅的数据范围进行权限校验,以保证用户没有请求权限范围外的数据。

上述两组账密校验出错时都会返回 Failed to auth 的异常,用户可以在对应的 logreader 的日志查找对应的错误信息,进一步确认出错的环节。

客户端启动后报错 Failed to create oblogreader

该报错即在创建 logreader 进程时出错,可能的原因有:libobcdc 与 OceanBase 版本不适配、机器资源不足等,需要查看 logproxy 进程的日志来进一步确定。

应用程序在请求 oblogproxy 服务后卡死,应用侧也没有报错信息

出现这种情况的可能原因有:

  • OceanBase 集群内库表数量或者存储数据量比较大,获取 schema 信息比较耗时
  • oblogproxy 所集成的 libobcdc 版本与 OceanBase 集群不适配
  • oblogproxy 与 OceanBase 集群间网络不稳定

具体的原因则需要查看 logproxy 和 logreader 进程的日志来进一步确认。

环境验证

由于其他应用程序有自己的业务逻辑,为了排除应用程序本身引入的其他因素,用户可以使用 logclient 的示例程序 oblogclient-sample 来对 oblogproxy 的部署环境进行一个简单的验证,该程序会启动一个客户端订阅增量日志,并打印接收到所有数据,包括周期性的 heartbeat 和数据变动相关的 ddl、dml。