使用mongoshake进行oplog同步读取,解决乱码问题
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同步读取,解决乱码问题的更多相关文章
- Brophp框架开发时连接数据库读取UTF8乱码的解决(转)
Brophp框架开发时连接数据库读取UTF8乱码的解决办法 (2012-09-15 10:41:22) 转载▼ 标签: 杂谈 it php 分类: 建站技术 Brophp框架开发时连接数据库读取UTF ...
- 解决 python 读取文件乱码问题(UnicodeDecodeError)
解决 python 读取文件乱码问题(UnicodeDecodeError) 确定你的文件的编码,下面的代码将以'utf-8'为例,否则会忽略编码错误导致输出乱码 解决方案一 with open(r' ...
- element ui 上传文件,读取内容乱码解决
element ui 上传文件,读取内容乱码解决: 加第二个参数 reader.readAsText(file.raw,'gb2312'); <el-upload class="upl ...
- mongosync同步1,oplog同步会读取其他集合同步
使用mongosync同步数据 注意: 我下面的这个mongodb版本较低(3.2.16), 还可以用这个工具来同步数据.工具不支持更高版本的mongodb了. 使用方法: https://g ...
- 上传Text文档并转换为PDF(解决乱码)
前些日子,Insus.NET有分享一篇<上传Text文档并转换为PDF>http://www.cnblogs.com/insus/p/4313092.html 它是按最简单与默认方式来处理 ...
- Slave_SQL_Running: No mysql同步故障解决方法
Slave_SQL_Running: No mysql同步故障解决 今天检查数据库发现一台MySQL Slave未和主机同步,查看Slave状态:mysql> show slave s ...
- mysql 使用set names 解决乱码问题的原理
解决乱码的方法,我们经常使用“set names utf8”,那么为什么加上这句代码就可以解决了呢?下面跟着我一起来深入set names utf8的内部执行原理 先说MySQL的字符集问题.Wind ...
- StreamReader 读取文本文件乱码问题
解决读取文本文件乱码问题.我采取的是读取前先判断文本文件格式. StreamReader sr = new StreamReader(fullfileName, GetFileEncodeType(f ...
- 编译VisualVM源码解决乱码问题
编译VisualVM源码解决乱码问题 起因 今天在使用VisualVM对测试服务器进行JVM监控的时候,发现所有统计图的横纵坐标都是显示乱码(小方块),即使我的Ubuntu系统使用的是英文语言环境.奇 ...
随机推荐
- Matplotlib入门简介
Matplotlib是一个用Python实现的绘图库.现在很多机器学习,深度学习教学资料中都用它来绘制函数图形.在学习算法过程中,Matplotlib是一个非常趁手的工具. 一般概念 图形(figur ...
- Beta阶段贡献分配
此作业要求参见:http://edu.cnblogs.com/campus/nenu/2019fall/homework/10006 队名:扛把子 组长:孙晓宇 组员:宋晓丽 梁梦瑶 韩昊 刘信鹏 要 ...
- 【论文阅读】CornerNet: Detecting Objects as Paired Keypoints
以下内容将介绍ECCV2018的一篇目标检测的文章<CornerNet: Detecting Objects as Paired Keypoints>.该文章讲述了一个老子就是不用anch ...
- 基于 HTML5 + WebGL 的宇宙 3D 展示系统
前言 近年来随着引力波的发现.黑洞照片的拍摄.火星上存在水的证据发现等科学上的突破,以及文学影视作品中诸如<三体>.<流浪地球>.<星际穿越>等的传播普及,宇宙空间 ...
- 第五章 Unity中的基础光照(2)
目录 1. Unity中的环境光和自发光 2. 在UnityShader中实现漫反射光照模型 2.1 实践:逐顶点光照 2.2 实践:逐像素光照 2.3 半兰伯特模型 1. Unity中的环境光和自发 ...
- 【LiteOS】STM32F103-LiteOS移植教程(详细篇)【华为云技术分享】
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...
- PyTorch官方教程中文版
首先呈上链接:http://pytorch123.com/ PyTorch是一个基于Torch的Python开源机器学习库,用于自然语言处理等应用程序.它主要由Facebookd的人工智能小组开发,不 ...
- 补习系列(20)-大话 WebSocket 与 "尬聊"的实现
目录 一.聊聊 WebSocket 二.Stomp 是个什么鬼 三.SpringBoot 整合 WebSocket A. 引入依赖 B. WebSocket 配置 C. 控制器 D. 前端实现 四.参 ...
- vue-socket.io使用教程与踩坑记录
全手打原创,转载请标明出处:https://www.cnblogs.com/dreamsqin/p/12018866.html,多谢,=.=~ (如果对你有帮助的话请帮我点个赞啦) 请先允许我狠狠吐个 ...
- 在阿里云购买SSL证书,让网站支持HTTPS
SSL简介 引自:https://baike.baidu.com/item/ssl/320778?fr=aladdin SSL SSL(Secure Sockets Layer 安全套接层),及其继任 ...