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中测试未出现此问题
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-Server的HA功能验证
- 一些功能不错的开源工具(DNSPod、MailServer、Bug跟踪系统、VS代码检查、VS反翻译)
- Linux-HA实战(3)— 基于Pacemaker搭建TFS Nameserver HA
- 基于haproxy 实现spark hiveserver2 ha
- [更新设计]跨平台物联网通讯框架ServerSuperIO 2.0 ,功能、BUG、细节说明,以及升级思考过程!
- 基于Corosync+Pacemaker+DRBD 实现高可用(HA)的MariaDB集群
- MariaDB数据库主从复制、双主复制、半同步复制、基于SSL的安全复制实现及其功能特性介绍(二)
- MariaDB数据库主从复制、双主复制、半同步复制、基于SSL的安全复制实现及其功能特性介绍 推荐
- canal-client的HA功能验证
- 基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍。最后我们将会实现一个基于Server-Sent Event和Flask简单的在线聊天室。
- 基于PowerShell的Lync Server管理 使用C# 之 Telephony 功能 查看 /修改
- 搭建并运行基于HA模式的canal
- 基于MariaDB Galera Cluster的数据库HA方案
- Percona 开始尝试基于Ceph做上层感知的分布式 MySQL 集群,使用 Ceph 提供的快照,备份和 HA 功能来解决分布式数据库的底层存储问题
- [更新设计]跨平台物联网通讯框架ServerSuperIO 2.0 ,功能、BUG、细节说明,以及升级思考过程!
- MariaDB数据库主从复制、双主复制、半同步复制、基于SSL的安全复制实现及其功能特性介绍(三)
- RTMFP---基于CumulusServer的P2P功能实现
- 基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍。最后我们将会实现一个基于Server-Sent Event和Flask简单的在线聊天室。