[求助]按照oceanbase4.1.0社区版之“通过Otter实现数据库异地双活”操作,全表同步(数据表配置为:“库名.(.*)”),发现mysql到OceanBase同步能成功,但是OceanBase到mysql同步失败,看日志是logproxy无法解析otter之node提供的正则表达式“(.*)”帮忙看看啥问题。

【 使用环境 】测试环境

【 OB or 其他组件 】 其他组件

【 使用版本 】otter版本如下:

otter-manager-4.2.19    (用的是:manager.deployer-4.2.19-SNAPSHOT.tar.gz)
otter-node-4.2.19       (用的是:node.deployer-4.2.19-SNAPSHOT.tar.gz)
oblogproxy-ce-4x-1.1.1  (用的是:oblogproxy-ce-for-4x-1.1.1-20230418115957.tar.gz)

其他的软件的版本如下:

oceanbase-ce-4.1.0.0
obproxy-ce-4.1.0.0
obagent-1.3.0
ocp-express-1.0.0

【问题描述】logproxy无法解析otter之node提供的正则表达式“(.*)”,导致报错。

【复现路径】复现路径:
⑴.A机房机器上面有MYSQL库正常运行中,MYSQL库名是:“dbname_mysql”
⑵.B机房机器上面有OceanBase库正常运行中,有租户“wmk20230504”,租户下有库名是:“dbname_OceanBase”
⑶.按照“通过Otter实现数据库异地双活”(https://www.oceanbase.com/docs/common-oceanbase-database-cn-10000000001692939)搭建Otter平台。
⑷.在Otter平台上,在manager界面上在“数据表配置”菜单中,“Table Name”填写:(.*)(linux的正则表达式,代表着匹配所有(任意)多个字符,也就是所有表)
⑸.在Otter要求的步骤下,启动Channel,从MYSQL同步到OceanBase,能成功。日志略。
⑹.在Otter要求的步骤下,启动Channel, 尝试数据从OceanBase同步到MYSQL。失败。查看日志,发现是logproxy无法解析node提供的正则表达式(.*),导致报错。日志细节如下:
①.logproxy报错: Failed to parse table_white_list, invalid syntax:wmk20230504.dbname_OceanBase\.(.*)

【问题现象及影响】在Otter要求的步骤下,启动Channel, 尝试数据从OceanBase同步到MYSQL。失败。查看日志,发现是logproxy无法解析node提供的正则表达式(.*),导致报错。日志细节如下:
①.logproxy报错: Failed to parse table_white_list, invalid syntax:wmk20230504.dbname_OceanBase\.(.*)
导致Node被logproxy拒绝服务了:2023-05-12 14:56:39.232 [log-proxy-client-worker-1-thread-1] ERROR com.oceanbase.clogproxy.client.connection.ClientHandler - LogProxy refused handshake request: code: 502
所以就导致Node无法正常服务,所以“尝试数据从OceanBase同步到MYSQL”的同步过程就无法开展。

【附件】











log-of-oblogproxy-ce-for-4x-1.1.1-log.tar.gz (4.0 KB)
logs-of-node.deployer-4.2.19-log.tar.gz (1.6 KB)

请开发同学帮忙看看哪,在线等待解决,求助中 :joy:

表名配置成星号*试试看?

表名配置为“*”号,这种场景也实践过,也无法成功,
会出现另外的问题,如下:
1.首先是界面上就不认可,效验不通过,node找不到表。如图;


2.然后,强行保存后,运行后,日志里面也显示Node也报错:
node日志里面是:
init table filter :\^tongbushiyan\.*$
node直接就报错:org.apache.oro.text.regex.MalformedPatternException: ?+* follows nothing in expression
意思就是:node的四个步骤:S.E.T.L
就会直接止步于S步骤。
细节如下:




![4node日志1|690x371]
2023-05-10 12:28:01.202 [pipelineId = 10,taskName = SelectTask] WARN c.alibaba.otter.canal.parse.inbound.AbstractBinlogParser - --> init table filter : ^retl.retl_buffer$|^tongbushiyan\.*$|^retl.retl_mark$|^retl.xdual$

2023-05-10 12:21:21.578 [pipelineId = 11,taskName = SelectTask] WARN c.alibaba.otter.canal.parse.inbound.AbstractBinlogParser - --> init table filter : ^retl.retl_buffer$|^tongbushiyan\.*$|^retl.retl_mark$|^retl.xdual$

2023-05-10 12:21:48.174 [pipelineId = 11,taskName = ProcessSelect] ERROR com.alibaba.otter.node.etl.select.SelectTask - [11] selectTask is error!

com.alibaba.otter.node.etl.select.exceptions.SelectException: [com.google.common.collect.ComputationException](http://com.google.common.collect.computationexception/): [com.alibaba.otter.shared.common.model.config.ConfigException](http://com.alibaba.otter.shared.common.model.config.configexception/): org.apache.oro.text.regex.MalformedPatternException: ?+* follows nothing in expression

括号去掉直接使用.*这样试过吗?

括号去掉直接使用.*这样也试过,已经试过了,是最开始实验的,结果与带有括号是一样的效果,logproxy无法解析。

通过多次实践,通过观察到的日志,发现了如下一些规律(个人观察之后的浅见),希望提供给开发,能够快速定位,如下:

⑴表名确定的时候,比如表名是table_abc,实验发现规律1:
node日志里面是:
init table filter :^dbname_OceanBase.table_abc$
会以^开头,以$结尾

然后logProxy处理来自于node的消息时,会如下拆解:
干掉前面的^
干掉后面的$
然后以.为分隔符拆分,获得单表名: table_abc
logproxy日志里面是(logproxy能解析):
configuration:tb_white_list=wmk20230504.dbname_OceanBase.table_abc

⑵表名是*号通配符的时候,实验发现的规律2:
①数据表配置表名填写.*的日志中场景一:
node日志里面是:
init table filter :^dbname_OceanBase\..*$
logproxy日志里面是:
logproxy识别失败,报错如下:

configuration:tb_white_list=wmk20230504.dbname_OceanBase\..*
Failed to parse table_white_list, invalid syntax:wmk20230504.dbname_OceanBase\..*

②数据表配置表名填写带有小括号的(.*)日志中场景二:
node日志里面是:
init table filter :^dbname_OceanBase\.(.*)$
logproxy日志里面是:
logproxy识别失败,报错:

configuration:tb_white_list=wmk20230504.dbname_OceanBase\.(.*)    
    Failed to parse table_white_list, invalid syntax:wmk20230504.dbname_OceanBase\.(.*)

③数据表配置表名直接填写*的日志中场景三:
node日志里面是:init table filter :^dbname_OceanBase\.*$
node直接会报错 如下:

org.apache.oro.text.regex.MalformedPatternException: ?+* follows nothing in expression

node四个步骤:S.E.T.L就直接止步于S了。没有办法往下面步骤进行了。

在线等待解决方案ing…
求助中。。。。 :sweat_smile:

logproxy 使用了 libobcdc,这个组件用的是 fnmatch,而 otter 里其他步骤的过滤用的是正则,因此这里应该是只能用精确匹配。

假如一个库中有几百张表,用精确匹配的话,不光眼睛要残,手也要残,而且容易造成遗漏疏漏。跪求大神更新一个版本,把logproxy所用到的libobcdc组件里面的“匹配模式”也升级到用“linux正则表达式”吧。拜托了。

libobcdc的匹配模式短期内不会改,我看下canal的过滤规则这块能不能适配一下吧。本周内给你答复。

等着开发同学的答复呢,在线等ing。。。

确认了下代码是可以实现的,主要改动点还是在canal。排期上可能要晚两周开始搞,预计端午节前放出来。

@victor1368 麻烦请问一下,ob数据源这块怎么配的呀