尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

怎样在Java中搭建Canal数据库监听环境

怎样在Java中搭建Canal数据库监听环境 由于Metaspace不足Canal启动失败需要在JVM参数中设置-XX:MetaspaceSize256m -XX:MaxMetaspaceSize512m远程连接需要配置canalal.IP是服务器的真实IP由于MySQL权限不足、instance配置错误或TSDB未启用客户端无法收到数据字段null主要是由于字符集不匹配或表结构不同步造成的。Canal服务器启动失败java.lang.OutOfMemoryError: MetaspaceCanal服务端canal-server默认情况下一旦加载多个表结构或打开全库订阅使用较小的JVM元空间就会崩溃。这不是配置错误而是堆外元数据真的不够。进conf/start.sh或bin/startup.bat在JVM_OPTS里加-XX:MetaspaceSize256m -XX:MaxMetaspaceSize512m别只调-Xmx大量动态生成类(如不同表对应的Entry对象)在Canal分析binlog时Metaspace才是瓶颈如果你使用Docker你必须在那里docker run命令里透传 JVM 参数光改容器start.sh没用客户端无法连接canal-server报ConnectException: Connection refused90% 是服务端没有真正监控到指定的端口也不是网络不通。默认情况下Canal监控127.0.0.1:11111这台机器连接没有问题但Java客户端在另一台机器上运行必然会失败。检查conf/canal.properties中canal.ip是否为空-留空即绑定127.0.0.1要进行远程连接必须将其设置为服务器的真实IP(例如192.168.1.100canal.port更改后客户端CanalConnector结构参数也必须同步更新不能硬写11111记得关掉Linux上的防火墙sudo ufw disable或者放行相应的端口不要只检查netstat看端口开着就觉得通了。Java客户端无法收到binlog变更connector.subscribe()后一直阻塞Canal客户端不是“注册即收”必须先定位为合法的binlog位置。如果服务端没有配置MySQL账号权限或者position已经过期subscribe()卡住不返回也不会扔异常。MySQL账号必须有SELECT, REPLICATION SLAVE, REPLICATION CLIENT少一个权限会默默失败conf/example/instance.properties中的canal.instance.master.address必须写成ip:port格式如192.168.1.200:3306不能写localhost或域名(DNS分析失败时) Canal 不报错在首次启动之前建议手动执行canal.instance.master.timestamp0(从当前位点开始)避免因找不到历史binlog文件而停止解析出来的RowData字段值全是null或类型错乱Canal本身不读MySQL表结构而是通过分析binlog中的字段序号 客户端本地缓存列表映射填充。一旦表结构发生变化如添加字段、或者如果客户端没有触发自动刷新就会失败。确认canal.instance.tsdb.enabletrue并配备Zookeeper或数据库存储否则表结构只存在于内存中重启时丢失收到Java客户端EntryType.ROWDATA以后不要直接使用column.getName()当key取值时优先使用column.getIndex()对齐原始binlog顺序然后查看本地schema使用MySQLutf8mb4但 Canal 配置里canal.instance.connectionCharset还是UTF-8缺mb4它会导致字符串截断或乱码看起来像nulllCanal的坑不是代码怎么写的而是 MySQL 权限网络绑定字符集TSDB 这四点稍有偏差整个链路静默失效。调整时不要急着改变客户逻辑先盯着这四个配置项目。
返回列表