V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
flikecn
V2EX  ›  MySQL

一个用 Go 语言开发的分布式 MySQL Binlog 存储系统

  •  
  •   flikecn ·
    flike · 2019-01-02 09:56:58 +08:00 · 8101 次点击
    这是一个创建于 2186 天前的主题,其中的信息可能已经有所发展或是发生改变。

    近期开源了一个自己的项目:kingbus,感兴趣的可以看看。:)

    https://github.com/flike/kingbus

    kingbus 简介

    kingbus 是一个基于 raft 强一致协议实现的分布式 MySQL binlog 存储系统。它能够充当一个 MySQL Slave 从真正的 Master 上同步 binglog,并存储在分布式集群中;同时又充当一个 MySQL Master 将集群中的 binlog 同步给其他 Slave。kingbus 具有如下特性:

    • 兼容 MySQL 复制协议,通过 Gtid 方式同步Master 上的 binlog,同时支持 slave 通过 Gtid 方式从 kingbus 拉取 binlog。

    • 跨地域数据复制,kingbus 通过 raft 协议支出跨地域间的数据复制。写入到集群的 binlog 数据在多个节点间保证强一致,并保证 binlog 顺序与 master 上完全一致。

    • 高可用,由于 kingbus 是构建在 Raft 强一致协议之上,能够实现集群中过半数节点存活的情况下,整个 binlog 拉取和推送服务高可用。

    为什么需要 kingbus ?

    1. 降低 Master 的负载和网络传输流量。在一主多从的复制拓扑中,Master 需要发送 binlog 到各个 slave,如果 slave 过多的话,网络流量很有可能达到 Master 的网卡上限,同时 Master 上负载也会过高。
    2. 简化主从复制拓扑,不再需要多级复制。
    3. 简化 Master Failover 流程,只需将其中的一个 Slave 提升为 Master,并将 kingbus 指向新的 Master,其他 slave 复制拓扑保持不变。
    4. 减少 Master 上的 binlog 存储空间,将 binlog 都存储到 kingbus 中。
    5. 支持异构复制。其他异构复制组件可以连接在 kingbus 上。
    44 条回复    2019-01-04 17:00:04 +08:00
    tabris17
        1
    tabris17  
       2019-01-02 10:10:06 +08:00
    谁用到生产环境了记得说一声啊
    xnode
        2
    xnode  
       2019-01-02 10:10:40 +08:00
    mark 有时间看看
    flikecn
        3
    flikecn  
    OP
       2019-01-02 10:44:53 +08:00
    @tabris17 测试环境稳定运行了几天,raft Lead 随意切换也没问题。
    flikecn
        4
    flikecn  
    OP
       2019-01-02 10:45:08 +08:00
    @xnode 欢迎交流
    lincanbin
        5
    lincanbin  
       2019-01-02 11:03:41 +08:00 via Android
    这种项目,把自己的测试方法和测试数据也放上来比较好吧。
    这样感觉才会有人拿到生产用。
    swulling
        6
    swulling  
       2019-01-02 11:16:16 +08:00
    思路很不错,现在基本上做跨地域数据同步的方案都是通过 在主从复制之间加一层管道或者其他的东西
    pythondean
        7
    pythondean  
       2019-01-02 11:19:51 +08:00
    @swulling 老哥 加一层管道或者其他东西 应该怎么理解? 我现在用的主从,但是老是容易断. 想找个解决方案,能给个关键词让我去搜索了解下吗
    swulling
        8
    swulling  
       2019-01-02 11:42:59 +08:00
    @pythondean 就用 lz 的方案就好了啊

    就是原来 MySQL 的主从是 主->从,现在大家的解决方案基本是 主-> some thing -> 从

    把这个 some thing 做的跨地域高可用高性能,就可以了,你可以把这个 some thing 理解为分布式强一致的消息队列
    swulling
        9
    swulling  
       2019-01-02 11:43:49 +08:00   ❤️ 1
    架构设计一大方法,实在搞不定就加一层 -_-
    tanszhe
        10
    tanszhe  
       2019-01-02 11:45:39 +08:00
    mysql 的 slave 也应该可以从 slave 同步吧,难道非要 从 master ?
    abmin521
        11
    abmin521  
       2019-01-02 11:52:57 +08:00 via Android
    国内似乎有个 tidb 的东西
    flikecn
        12
    flikecn  
    OP
       2019-01-02 12:33:13 +08:00
    @lincanbin 目前只做了稳定性测试,测试方法就是 Quick start 提到的。不建议直接上生产环境,后续我会进一步做异常测试,待稳定后再推荐上生产环境。
    flikecn
        13
    flikecn  
    OP
       2019-01-02 12:33:44 +08:00
    @swulling 是的。分布式里面有个理念就是:the log is the database
    flikecn
        14
    flikecn  
    OP
       2019-01-02 12:35:11 +08:00
    @tanszhe 可用从任何有个 kingbus 节点同步,只需要在该节点上启动一个 binlog server 服务。你可以理解为 binlog server 就是一个伪 master,它会从本地存储引擎中读取 binlog 发送给 slave
    flikecn
        15
    flikecn  
    OP
       2019-01-02 12:36:20 +08:00
    @abmin521 tidb 是 NewSQL,kingbus 是一个分布式的 MySQL 日志存储系统,支持同构复制,后续有空会支持异构复制( mysql-->es ),不是一类产品。:)
    donyee
        16
    donyee  
       2019-01-02 12:43:26 +08:00
    阿里开源的 canal,和你这个类似,Java 实现的
    flikecn
        17
    flikecn  
    OP
       2019-01-02 14:04:48 +08:00
    @donyee cannal 不支持 MySQL-->MySQL 复制方式,它存储需要依赖于 kafka,kingbus 是通过 raft 协议实现强一致存储的。
    janxin
        18
    janxin  
       2019-01-02 14:37:10 +08:00
    kingshard 还有什么新 Feautre 规划吗?
    flikecn
        19
    flikecn  
    OP
       2019-01-02 15:07:45 +08:00
    @janxin 打算重构一下连接池 :)
    Mirana
        20
    Mirana  
       2019-01-02 15:10:32 +08:00
    个人的产品?
    n329291362
        21
    n329291362  
       2019-01-02 15:19:07 +08:00
    mark 一下 晚上看看
    flikecn
        22
    flikecn  
    OP
       2019-01-02 15:37:04 +08:00 via Android
    @Mirana 是的
    flikecn
        23
    flikecn  
    OP
       2019-01-02 15:37:22 +08:00 via Android
    @n329291362 欢迎关注和交流
    rrfeng
        24
    rrfeng  
       2019-01-02 15:42:40 +08:00
    binlog 存到哪里去了? raft 中?量大了怎么办?跨集群的话 raft 协议交互也要带宽的,怎么就比 master -slave 就好了?
    flikecn
        25
    flikecn  
    OP
       2019-01-02 17:55:47 +08:00 via Android
    @rrfeng binlog 存各个节点的本地磁盘,只是通过 raft 协议保证多节点数据强一致。不是比 ms 复制方式好,而是拓展了复制模式。具体场景参考 github 主页。
    auxox
        26
    auxox  
       2019-01-02 18:34:07 +08:00
    和阿里的 canal 是同一类应用吗?
    flikecn
        27
    flikecn  
    OP
       2019-01-02 18:46:11 +08:00 via Android
    @auxox 不是,canal 主要用于异构复制。kingbus 用于同构复制。
    dezhou9
        28
    dezhou9  
       2019-01-02 19:10:52 +08:00 via Android
    名字建议改成真正的特点或者特性,什么 kingxx 就跟叫自己是 db 大王一样傻。东西是不错
    hackerwin7
        29
    hackerwin7  
       2019-01-02 19:25:38 +08:00 via iPhone
    但你拉起 binlog 的形式应该跟 canal 差不多吧,同样是 slave fetch master
    davidli888
        30
    davidli888  
       2019-01-02 19:32:59 +08:00
    出现异常情况 同步数据会不会有丢失? 数据丢失后有没有机制来恢复数据呢?
    davidli888
        31
    davidli888  
       2019-01-02 19:35:34 +08:00
    原来 kingshared 是楼主写的
    flikecn
        32
    flikecn  
    OP
       2019-01-02 20:53:09 +08:00 via Android
    @davidli888 异常情况,例如 master 挂了,如果 master 与 kingbus 是半同步,则不会丢失数据。其他例如 Lead 切换都考虑到了。
    davidli888
        33
    davidli888  
       2019-01-02 21:16:30 +08:00
    @flikecn 如果 Master 挂了后 重启服务 kingbus 会从 Master 最新的 log 日志位置去同步吧? 那挂了后 kingbus 会把内存中的日志同步出去后再等待 Master 重启?
    flikecn
        34
    flikecn  
    OP
       2019-01-03 07:39:07 +08:00 via Android
    @davidli888 会的。基于 gtid 方式同步,保证数据不对不乱。完全按照 mysql 复制协议实现日志同步。
    zeraba
        35
    zeraba  
       2019-01-03 08:33:03 +08:00 via Android
    需要 5.6 以上 开启 gtid 吧
    flikecn
        36
    flikecn  
    OP
       2019-01-03 09:50:30 +08:00
    @zeraba 是的。只支持 gtid 方式复制。这样能保证数据不丢。file+position 同步方式在切换 Master 时有可能丢失数据。
    LukeChien
        37
    LukeChien  
       2019-01-03 10:10:27 +08:00 via Android
    楼主的 kingshared 不错!
    sryanyuan
        38
    sryanyuan  
       2019-01-03 10:16:02 +08:00
    不错的东西 本来 19 年打算做这个的 思路也差不多
    davidli888
        39
    davidli888  
       2019-01-03 10:29:17 +08:00
    @flikecn 有机会尝试下 现在数据量比较大 挺头疼
    fuyufjh
        40
    fuyufjh  
       2019-01-03 12:37:29 +08:00
    赞一个
    vinsoncou
        41
    vinsoncou  
       2019-01-03 15:09:13 +08:00
    @flikecn 支持多主同步么?
    flikecn
        42
    flikecn  
    OP
       2019-01-03 17:01:59 +08:00
    @vinsoncou 不支持,单个 kingbus 只能有一个主。
    vinsoncou
        43
    vinsoncou  
       2019-01-04 11:14:07 +08:00
    @flikecn 后期会支持么?
    flikecn
        44
    flikecn  
    OP
       2019-01-04 17:00:04 +08:00
    @vinsoncou 暂时不考虑支持多源复制,建议搭建多套 kingbus 支持。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5777 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 06:08 · PVG 14:08 · LAX 22:08 · JFK 01:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.