【 使用环境 】测试环境
【 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)
表名配置为“*”号,这种场景也实践过,也无法成功,
会出现另外的问题,如下:
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了。没有办法往下面步骤进行了。
川粉
#11
logproxy 使用了 libobcdc,这个组件用的是 fnmatch,而 otter 里其他步骤的过滤用的是正则,因此这里应该是只能用精确匹配。
假如一个库中有几百张表,用精确匹配的话,不光眼睛要残,手也要残,而且容易造成遗漏疏漏。跪求大神更新一个版本,把logproxy所用到的libobcdc组件里面的“匹配模式”也升级到用“linux正则表达式”吧。拜托了。
川粉
#13
libobcdc的匹配模式短期内不会改,我看下canal的过滤规则这块能不能适配一下吧。本周内给你答复。
川粉
#15
确认了下代码是可以实现的,主要改动点还是在canal。排期上可能要晚两周开始搞,预计端午节前放出来。
zmix
#16
@victor1368 麻烦请问一下,ob数据源这块怎么配的呀