您的位置:首页 > 数据库 > MariaDB

canalserver1.0.22基于mariadb10.1.14的HA功能bug

2016-10-20 18:02 337 查看
测试描述:canalserver1.0.22基于mariadb10.1.14的HA功能不好用,部署两台canaserver当其中一台server挂掉后,zookeeper已经切换到新的canalserver,但新的canalserver获取的binlogname不正确导致读取mariadb的binlog错误。
mariadb中binlog名字:
(canal@127.0.0.1) [canal_test]> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 25487 |
| mysql-bin.000002 | 358 |
| mysql-bin.000003 | 1518 |
| mysql-bin.000004 | 29137967 |
+------------------+-----------+
canalserver获取的binlogname:【binlog[mysql-bin.000004$^Nk:29138083]】中后半段有乱码
解决方法:
修改canalserver1.0.22源码com.alibaba.otter.canal.protocol.CanalEntry中对获取到的binlogname进行过滤,添加如下代码:
【public String filterLogFileName(String logfileName) {
System.out.println("开始过滤logfileName:"+logfileName);
Pattern p = Pattern.compile("(mysql-bin\.[0-9]).");
Matcher m = p.matcher(logfileName);
while(m.find()){
if(m.groupCount() >= 1) {
System.out.println("过滤logfileName为:"+m.group(1));
return m.group(1);
}
}
return logfileName;
}

修改代码:
【public String getLogfileName() {
java.lang.Object ref = logfileName_;
if (ref instanceof String) {
return filterLogFileName((String) ref);
} else {
com.google.protobuf.ByteString bs = 
(com.google.protobuf.ByteString) ref;
String s = bs.toStringUtf8();
if (com.google.protobuf.Internal.isValidUtf8(bs)) {
logfileName_ = s;
}
return filterLogFileName(s);
}
}

重新打包测试验证HA功能可以自动切换,但是存在canalserver切换时client消费端重复消费的问题。
但是在mysql5.6中测试未出现此问题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  canal
相关文章推荐