mbinlogmq

基于MySQL binlog的数据同步中间件
授权协议 BSD
开发语言 C/C++
所属分类 数据库相关、 数据库管理工具
软件类型 开源软件
地区 国产
投 递 者 齐承泽
操作系统 Linux
开源组织
适用人群 未知
 软件概览

mbinlogmq 一个基于MySQL binlog协议的数据同步中间件

什么是mbinlogmq?

mbinlogmq 是一个使用C语言开发的基于 MySQL binlog 协议的一个中间件,通过模拟Slave 来实时获取 MySQL binlog日志,并将数据变更信息以及 DB 语句发送到 RabbitMQ,中间通过监听机制与校验机制来确保不宕机的情况下的100%抵达 RMQ

设计架构

安装&编译

  • mbinlog依赖于一些第三方库:

请先安装依赖软件: cURL 、mysqlrabbitmq,安装完成后记住其安装的路径,进入下面的步骤

  • 下载mbinlogmq源码
git clone https://gitee.com/josinli/mbinlogmq.git
  • 修改 CMakeLists.txt,将如下的几行变为您上面安装的路径:
set(MYSQL_INCLUDE     /usr/local/mysql/include)      # 您系统的MySQL头文件路径
set(MYSQL_LIBRARY_DIR /usr/local/mysql/lib)          # 您系统的MySQL库文件路径
set(CURL_DIR          /usr/local/Cellar/curl/7.58.0) # 您系统的curl安装路径
  • 执行编译安装命令
mkdir build
cd build
cmake .. && make && sudo make install
  • 修改 /etc/mbinlogmq/binlog.xml 您的配置信息
<?xml version="1.0" encoding="UTF-8" author="Josin" date="2019-07-22"?>
<!--本配置文件安装位置:/etc/mbinlogmq/binlog.xml-->
<!--连接主库进行salve复制的信息-->
<!--请不要增加节点信息,系统会校验-->
<system for="slave">
    <mode>rabbitmq</mode> <!-- 目前仅支持rabbitmq -->
    <host>127.0.0.1</host>
    <user>root</user>
    <password>3333</password>
    <port>3306</port>
    <server_id>6</server_id>
    <daemon>1</daemon>
</system>

<!--用户需要配置好下方的rabbitmq的配置选项-->
<rabbitmq>
    <host>127.0.0.1</host>
    <user>guest</user>
    <password>guest</password>
    <port>15672</port>
    <delivery_mode>1</delivery_mode>
    <name>amq.default</name>
    <payload>Invalid</payload>
    <routing_key>fanout</routing_key>
    <vhost>/</vhost>
</rabbitmq>
  • 启动您的 minblogmq
mbinlogmq -k start

此时进入 MySQL 操作,同时登录 RabbitMQ 查看消息是否成功抵达,目前的版本存在一些或多或少的问题,切勿生产环境使用。

mbinlogmq会针对不同的binlog日志生成四种类型的消息,消息类型如下

  • 消息全部为 JSON 格式
  • 格式如下

1、UPDATE 语句,etype等于 1,包含一个pre对象 和 new对象,分别对应修改之前的数据和新的数据

{
    "etype": 1,
    "data" : {
        "pre": {
            "id":1,
            "ad":2
        },
        "new": {
            "id":1,
            "ad":3
        }
    }
}

2、INSERT 消息, etype 等于 2

{
    "etype": 1,
    "data" : {
        "id":1,
        "ad":3
    }
}

3、DELETE 消息, etype 等于 3

{
    "etype": 3,
    "data" : {
        "id":1,
        "ad":3
    }
}

4、SQL 语句 消息, etype 等于 4

{
    etype: 4,
    data: "ALTER TABLE `books`.`test_at` MODIFY COLUMN `cc` datetime(0) NULL DEFAULT NULL AFTER `bb`"
}

示例消息如下:

[x] Received {"etype":4,"data":"ALTER TABLE `books`.`test_at` \nMODIFY COLUMN `bb` date NULL DEFAULT NULL AFTER `aa`"}
 [x] Received {"etype":4,"data":"ALTER TABLE `books`.`test_at` \nMODIFY COLUMN `bb` date NOT NULL AFTER `aa`"}
 [x] Received {"etype":4,"data":"BEGIN"}
 [x] Received {"etype":1,"data":{"pre":{"id":1,"book_name":"傲世丹神1","book_cover":"http://img.c0m.io/quanben.io/upload/thumbnail/book_0_999/book_1.jpg","add_time":"2019-7-23 14:28:43","author_name":"寂小贼111","introduction":"废柴少年得无上传承,获逆天神脉,学绝世神功,掌握超绝丹术,这使他...","test_date":"2019-7-29"},"new":{"id":1,"book_name":"傲世丹神1","book_cover":"http://img.c0m.io/quanben.io/upload/thumbnail/book_0_999/book_1.jpg","add_time":"2019-7-23 21:47:36","author_name":"寂小贼","introduction":"废柴少年得无上传承,获逆天神脉,学绝世神功,掌握超绝丹术,这使他...","test_date":"2019-7-29"}}}
 [x] Received {"etype":4,"data":"COMMIT"}
 [x] Received {"etype":4,"data":"BEGIN"}
 [x] Received {"etype":1,"data":{"pre":{"id":1,"book_name":"傲世丹神1","book_cover":"http://img.c0m.io/quanben.io/upload/thumbnail/book_0_999/book_1.jpg","add_time":"2019-7-23 21:47:36","author_name":"寂小贼","introduction":"废柴少年得无上传承,获逆天神脉,学绝世神功,掌握超绝丹术,这使他...","test_date":"2019-7-29"},"new":{"id":1,"book_name":"傲世丹神","book_cover":"http://img.c0m.io/quanben.io/upload/thumbnail/book_0_999/book_1.jpg","add_time":"2019-7-23 21:47:54","author_name":"寂小贼","introduction":"废柴少年得无上传承,获逆天神脉,学绝世神功,掌握超绝丹术,这使他...","test_date":"2019-7-29"}}}
 [x] Received {"etype":4,"data":"COMMIT"}

有问题可以及时通过 ISSUE 反馈,反馈地址:GITEE Go Go Go!!!

 相关资料
  • Porter 始于 2017 年,提供数据同步功能,但并不仅仅局限于数据同步,在随行付内部广泛使用。

  • 本文向大家介绍基于C# 写一个 Redis 数据同步小工具,包括了基于C# 写一个 Redis 数据同步小工具的使用技巧和注意事项,需要的朋友参考一下 概念   Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、

  • 我正在寻找一种基于方法接收到的参数来同步方法的方法,如下所示: 我希望基于参数同步方法,如下所示: 线程1:做某事(“A”); 线程2:doSomething(“B”); 线程3:doSomething(“C”); 线程4:做某事(“A”); 线程1、线程2和线程3将在没有同步的情况下执行代码,但是线程4将等待线程1完成代码,因为它具有相同的“a”值。 谢谢 更新 基于Tudor的解释,我认为我面

  • 我想基于输入参数同步一个方法或一个块。 因此,我有一个API,它在post有效负载中有两个长类型的输入(比如id1和id2),可以是原始的,也可以是包装的),可以是JSON。这个API将被多个线程同时或随机地在不同时间调用。 现在如果第一个API调用有ID1=1和ID2=1,同时另一个API调用有ID1=1和ID2=1,它应该等待第一个API调用处理完毕后再执行第二个调用。如果第二个API调用具有

  • 问题内容: 我知道有三种不同的,流行的非SQL数据库类型。 键/值:Redis,Tokyo Cabinet,Memcached ColumnFamily:Cassandra,HBase 文件:MongoDB,CouchDB 我已经读了很长的博客,但对它的了解却很少。 我知道关系数据库,并且在MongoDB / CouchDB等基于文档的数据库中徘徊。 谁能告诉我这些和清单上的两个前者之间的主要区别

  • 本文向大家介绍基于String实现同步锁的方法步骤,包括了基于String实现同步锁的方法步骤的使用技巧和注意事项,需要的朋友参考一下 在某些时候,我们可能想基于字符串做一些事情,比如:针对同一用户的并发同步操作,使用锁字符串的方式实现比较合理。因为只有在相同字符串的情况下,并发操作才是不被允许的。而如果我们不分青红皂白直接全部加锁,那么整体性能就下降得厉害了。 因为string的多样性,看起来s