-
Notifications
You must be signed in to change notification settings - Fork 21
FAQ_ZH
libobcdc 是 oblogproxy 的一个依赖,它是一个用于 OceanBase 数据库增量数据订阅的 C++ 依赖库,liboblog 是 libobcdc 的一个曾用名,该名称目前仍保留在一些其他项目中。
libobcdc 对于 OceanBase 数据库的社区版和企业版有不同的实现,社区版的 libobcdc 源代码位于内核仓库 src/logservice/libobcdc,对应的 rpm 安装包一般随数据库内核发版时一起发布,名称格式为 oceanbase-ce-cdc-xxx.rpm,详情可在 OceanBase 社区版的 GitHub Releases 页面查看。
由于 oblogproxy 集成了 libobcdc,因此 oblogproxy 跟 libobcdc 一样区分企业版和社区版。同时由于 libobcdc 只能保证向前兼容,因此对于新版本的 OceanBase 数据库,如果使用旧版本的 oblogproxy,可能会出现不适配的情况。具体的版本适配信息,请参考本项目的 Releases 页面。
*注:企业版 oblogproxy 并未开源,目前仅对公有云用户开放,其他的企业版 OceanBase 客户请使用 OMS。
本项目在实际运行中,主要有两部分:
- logproxy:项目主进程,负责接收客户端请求,创建 logreader,运行日志目录为 ${logproxy_home}/log
- logreader:项目的工作进程,负责处理实际的数据订阅和发送,每个客户端请求对应一个 logreader,客户端以请求中携带的 client id 字段进行区分,运行日志目录为 ${logproxy_home}/run/${client_id}/log
需要注意的一点是,目前 logproxy 进程只负责创建 logreader 而不负责关闭 logreader,所以 logreader 只有在客户端关闭连接时才会退出。
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 的信息可以忽略,该报错也不会影响实际的数据订阅。
上面已经提到,logproxy 在创建 logreader 时,一个客户端对应一个 logreader,而客户端以 client id 进行区分。因此,如果发现新接收到的 client id 与已有的 logreader 对应的 client id 重复,就会出现上述错误。出现这种错误的场景有以下几种:
- 用户指定了 client id,该 client id 与已有订阅链路的 client id 重复。这种情况下,修改 client id 重新启动客户端即可。
- 用户未指定 client id,但是同时启动了多个客户端程序监听同一个集群的同一个租户。由于在用户未指定 client id 时,client id 默认是时间戳和监听的租户拼接生成的,如果同一时刻在启动了多个客户端监听同一个租户,就会出现只有一个启动成功的情况,剩余客户端将会因为 client id 已存在而被 logproxy 服务拒绝。这种情况下,用户可以通过手动指定 client id 来避免两个任务的 client id 相同。
- 客户端原本可以正常运行,一段时间后重新启动时报错。造成这种情况的原因一般是客户端在之前退出时没有调用 close 函数关闭连接,导致 logreader 没有及时退出,重启后发起的请求被 logproxy 当作了另一个新的请求,由于此时请求中带的 client id 与之前相同,因而被logproxy 服务拒绝。这种情况下,可以使用新的 client id 重新发起请求,对于原来的 logreader 进程则可以手动终止。
该报错说明 logproxy 在验证用户权限时出错了。 logproxy 在鉴权时会用到两组账密,一组 sys 租户账密和一组业务租户账密。
- sys 租户账密:可以通过配置文件写入,也可以通过客户端请求设置,主要用于登陆 sys 租户、查询内部表等。
- 业务租户账密:只能通过客户端请求设置,logproxy 将会对该用户在订阅的数据范围进行权限校验,以保证用户没有请求权限范围外的数据。
上述两组账密校验出错时都会返回 Failed to auth
的异常,用户可以在对应的 logreader 的日志查找对应的错误信息,进一步确认出错的环节。
该报错即在创建 logreader 进程时出错,可能的原因有:libobcdc 与 OceanBase 版本不适配、机器资源不足等,需要查看 logproxy 进程的日志来进一步确定。
出现这种情况的可能原因有:
- OceanBase 集群内库表数量或者存储数据量比较大,获取 schema 信息比较耗时
- oblogproxy 所集成的 libobcdc 版本与 OceanBase 集群不适配
- oblogproxy 与 OceanBase 集群间网络不稳定
具体的原因则需要查看 logproxy 和 logreader 进程的日志来进一步确认。
由于其他应用程序有自己的业务逻辑,为了排除应用程序本身引入的其他因素,用户可以使用 logclient 的示例程序 oblogclient-sample 来对 oblogproxy 的部署环境进行一个简单的验证,该程序会启动一个客户端订阅增量日志,并打印接收到所有数据,包括周期性的 heartbeat 和数据变动相关的 ddl、dml。