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. 【Luogu P1265】公路修建

    Luogu P1265 本来一开始我用的Kruskal--但是由于double类型8字节,所以MLE了. 很容易发现这是一道最小生成树的题目. 值得注意的是题目中给的第二个限制,只存在唯一情况即这个环 ...

  2. win上找到host文件的方法

    在运行的位置输入 C:\WINDOWS\system32\drivers\etc

  3. 如何在SQL Server 2008下轻松调试T-SQL语句和存储过程

    一.回顾早期的SQL SERVER版本:早在SQL Server 2000时代,查询分析器的功能还很简陋,远不如VS那么强大.到SQL Server 2005时代,代码高亮.SQL优化等功能逐渐加强, ...

  4. .net反编译原理

    目录 目录 前言 ILdasm ILasm 结语 推荐文献 目录 NLog日志框架使用探究-1 NLog日志框架使用探究-2 科学使用Log4View2 前言 本来没有想写反编译相关的文章,但是写着写 ...

  5. 使用WireMock进行更好的集成测试

    无论您是遵循传统的测试金字塔还是采用诸如"测试蜂窝"这样的较新方法,都应该在开发过程中的某个时候开始编写集成测试用例. 您可以编写不同类型的集成测试.从持久性测试开始,您可以检查组 ...

  6. while(cin)?

    #include<iostream> #include<utility> using namespace std; int main() { int i; do { cout& ...

  7. 处理器CPU天梯图,显卡天梯图(性能排名图)

    自己网上找的几个图,仅供参考,买电脑可以看看了~

  8. python迭代器生成器-迭代器和list区别

    迭代 生成 for循环遍历的原理 for循环遍历的原理就是迭代,in后面必须是可迭代对象 为什么要有迭代器 对于序列类型:字符串.列表.元组,我们可以使用索引的方式迭代取出其包含的元素.但对于字典.集 ...

  9. vue使用tips

    1. native修饰符可以用来绑定原生事件 2. destroyed在列表重渲染时,销毁的列表项会调用. 3. 并不是所有的数据都适合放入vuex 4. 子组件mounted先于父组件发生. 5. ...

  10. CSS3 斑马条纹.html

    hvkhujluhijo hvkhujluhijo hvkhujluhijo hvkhujluhijo hvkhujluhijo <!DOCTYPE html> <html> ...