mongoshake 是个开源的用户mongo数据迁移和同步的工具,支持往各种目标源头写数据

具体:https://github.com/alibaba/MongoShake

有业务场景想把oplog 写入到kafka 中,如果直接在collector.conf 设置kafka 信息会导致写入kafka 中数据是乱码

官方解释是直接从collector 采集到的oplog是带有控制信息的。直接写入kafka 的内容使用时要进行剥离。

在下载mongoshake 包时他会提供receiver 进行控制信息剥离

mongo --> collector --> kafka --> receiver --> 业务

mongo --> collector --> receiver --> kafka --> 业务

这里更倾向于第二种

collector --> receiver 我采用的是tcp

配置:

collector.conf

tunnel = tcp
tunnel.address = 127.0.0.1:9300

receiver.conf

tunnel = tcp
tunnel.address = 127.0.0.1:9300

这里会很奇怪,也没有设置kafka 的地方啊,这样所有oplog剥离信息都会放在receiver 的log下

这里官方解释是要求我们对源码进行修改、编译,源码是GO 写的,改起来也比较熟悉

下载官方源码

src/mongoshake/receiver/replayer.go

在handler()

/*
* Users should modify this function according to different demands.
*/
func (er *ExampleReplayer) handler() {
config := sarama.NewConfig()//kafka配置
config.Producer.RequiredAcks = sarama.WaitForAll
config.Producer.Return.Successes = true
kafkaClient, err := sarama.NewSyncProducer([]string{conf.Options.KafkaHost}, config)
if err != nil {
LOG.Info("producer close,err:", err)
return
} defer kafkaClient.Close() for msg := range er.pendingQueue {
count := uint64(len(msg.message.RawLogs))
if count == 0 {
// probe request
continue
} // parse batched message
oplogs := make([]*oplog.PartialLog, len(msg.message.RawLogs))
for i, raw := range msg.message.RawLogs {
oplogs[i] = new(oplog.PartialLog)
if err := bson.Unmarshal(raw, oplogs[i]); err != nil {
// impossible switch, need panic and exit
LOG.Crashf("unmarshal oplog[%v] failed[%v]", raw, err)
return
}
oplogs[i].RawSize = len(raw)
//这里是对oplog 做了一些定制化内容
kafkaOpLog := KafkaOpLog{}
kafkaOpLog.Namespace = oplogs[i].Namespace
kafkaOpLog.Query = oplogs[i].Query
kafkaOpLog.Object = oplogs[i].Object.Map()
kafkaOpLog.Operation = oplogs[i].Operation
kafkaOpLog.Timestamp = oplogs[i].Timestamp msg := &sarama.ProducerMessage{}
msg.Topic = conf.Options.KafkaTopic
encode ,err := json.Marshal(kafkaOpLog)
if err != nil {
_ = LOG.Error("oplogs bson.MarshalJSON err",err)
continue
}
msg.Value = sarama.StringEncoder(encode)
msg.Key = sarama.StringEncoder(kafkaOpLog.Namespace)
_, _, err = kafkaClient.SendMessage(msg)
if err != nil {
_ = LOG.Error("send message failed,", err)
return
}
//原来源码中只是打印了log
//LOG.Info(oplogs[i]) // just print for test, users can modify to fulfill different needs
} if callback := msg.completion; callback != nil {
callback() // exec callback
} // get the newest timestamp
n := len(oplogs)
lastTs := utils.TimestampToInt64(oplogs[n-1].Timestamp)
er.Ack = lastTs LOG.Debug("handle ack[%v]", er.Ack) // add logical code below
}
}

然后go build   使用

使用mongoshake进行oplog同步读取,解决乱码问题的更多相关文章

  1. Brophp框架开发时连接数据库读取UTF8乱码的解决(转)

    Brophp框架开发时连接数据库读取UTF8乱码的解决办法 (2012-09-15 10:41:22) 转载▼ 标签: 杂谈 it php 分类: 建站技术 Brophp框架开发时连接数据库读取UTF ...

  2. 解决 python 读取文件乱码问题(UnicodeDecodeError)

    解决 python 读取文件乱码问题(UnicodeDecodeError) 确定你的文件的编码,下面的代码将以'utf-8'为例,否则会忽略编码错误导致输出乱码 解决方案一 with open(r' ...

  3. element ui 上传文件,读取内容乱码解决

    element ui 上传文件,读取内容乱码解决: 加第二个参数 reader.readAsText(file.raw,'gb2312'); <el-upload class="upl ...

  4. mongosync同步1,oplog同步会读取其他集合同步

    使用mongosync同步数据     注意: 我下面的这个mongodb版本较低(3.2.16), 还可以用这个工具来同步数据.工具不支持更高版本的mongodb了. 使用方法: https://g ...

  5. 上传Text文档并转换为PDF(解决乱码)

    前些日子,Insus.NET有分享一篇<上传Text文档并转换为PDF>http://www.cnblogs.com/insus/p/4313092.html 它是按最简单与默认方式来处理 ...

  6. Slave_SQL_Running: No mysql同步故障解决方法

    Slave_SQL_Running: No mysql同步故障解决      今天检查数据库发现一台MySQL Slave未和主机同步,查看Slave状态:mysql> show slave s ...

  7. mysql 使用set names 解决乱码问题的原理

    解决乱码的方法,我们经常使用“set names utf8”,那么为什么加上这句代码就可以解决了呢?下面跟着我一起来深入set names utf8的内部执行原理 先说MySQL的字符集问题.Wind ...

  8. StreamReader 读取文本文件乱码问题

    解决读取文本文件乱码问题.我采取的是读取前先判断文本文件格式. StreamReader sr = new StreamReader(fullfileName, GetFileEncodeType(f ...

  9. 编译VisualVM源码解决乱码问题

    编译VisualVM源码解决乱码问题 起因 今天在使用VisualVM对测试服务器进行JVM监控的时候,发现所有统计图的横纵坐标都是显示乱码(小方块),即使我的Ubuntu系统使用的是英文语言环境.奇 ...

随机推荐

  1. 20191107-3 beta week 2/2 Scrum立会报告+燃尽图 02

    此作业要求参见[https://edu.cnblogs.com/campus/nenu/2019fall/homework/9955] 一.小组情况 队名:扛把子 组长:孙晓宇 组员:宋晓丽 梁梦瑶 ...

  2. 《master the game of GO wtth deep neural networks and tree search》研究解读

    现在”人工智能“如此火爆的一大直接原因便是deepmind做出的阿尔法狗打败李世石,从那时开始计算机科学/人工智能成为了吹逼的主流.记得当时还是在学校晚新闻的时候看到的李世石输的消息,这个新闻都是我给 ...

  3. postgresql修改最大连接数配置

    1.查看配置文件位置等信息,用来确定配置对应的配置文件. select setting,boot_val,reset_val,sourcefile,*from pg_settings  where n ...

  4. 01_Numpy基本使用

    1.Numpy读取txt/csv文件 读取数据 import numpy as np # numpy打开本地txt文件 world_alcohol = np.genfromtxt("D:\\ ...

  5. WPF 因设置不期望的DataContext,导致的绑定异常

    在MainWindow中,创建一个背景属性BrushTest,并将其绑定至界面 <Window x:Class="WpfApp8.MainWindow" xmlns=&quo ...

  6. matlab 降维工具 转载【https://blog.csdn.net/tarim/article/details/51253536】

    降维工具箱drtool   这个工具箱的主页如下,现在的最新版本是2013.3.21更新,版本v0.8.1b http://homepage.tudelft.nl/19j49/Matlab_Toolb ...

  7. WebGL简易教程(十四):阴影

    目录 1. 概述 2. 示例 2.1. 着色器部分 2.1.1. 帧缓存着色器 2.1.2. 颜色缓存着色器 2.2. 绘制部分 2.2.1. 整体结构 2.2.2. 具体改动 3. 结果 4. 参考 ...

  8. Sql like模糊查询 区分大小写

    Sql模糊查询,Like默认是不区分大小写的 使用Like时,怎么支持大小写呢? upper.lower,只能模糊所有的内容,不能区分内容中的大小写. sqlite数据库对text字段默认是大小写敏感 ...

  9. 你的SpringBoot应用真的部署更新成功了吗

    前提 当我们在生产环境部署了SpringBoot应用的时候,虽然可以通过Jenkins的构建状态和Linux的ps命令去感知应用是否在新的一次发布中部署和启动成功,但是这种监控手段是运维层面的.那么, ...

  10. 解惑Python模块学习,该如何着手操作...

    Python模块 晚上和朋友聊天,说到公司要求精兵计划,全员都要有编程能力.然后C.Java.Python-对于零基础入门的,当然是选择Python的人较多了.可朋友说他只是看了简单的语法,可pyth ...