V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
qq2549112
V2EX  ›  问与答

请问 mysql 数据实时复制到 postgresql 里面 如何实现最好呀

  •  
  •   qq2549112 · 2015-07-01 18:03:37 +08:00 · 5398 次点击
    这是一个创建于 3193 天前的主题,其中的信息可能已经有所发展或是发生改变。

    mysql 只读权限
    postgresql 可写可读

    mysql里面有个表
    字段如下:
    orderID<int>,itemID<int>,info<text>,lastUpdate<datetime>
    其中lastUpdate是这个记录的最后修改时间
    每个记录有可能随时被修改,随即这个记录的lastUpdate会更新

    postgresql字段如下:
    orderID<int>,itemID<int>,info<jsonb>,lastUpdate<datetime>

    postgresql 和mysql 字段都对应,只是字段类型有些不同 ,比如info这个字段,在mysql里面字段类型是text,而在postgresql里面字段类型是jsonb

    现在想让postgresql保持和mysql数据一致
    当mysql里面变化,也要让postgresql里面变化, 可接受的延迟是10秒左右

    请问大家,有什么好的方案吗

    有现成的轮子吗?如果没有的话 用python来写,这个东东的大概思路该如何弄呢 多谢

    第 1 条附言  ·  2015-07-03 14:13:01 +08:00
    结贴

    谢谢大家
    22 条回复    2018-11-22 17:40:17 +08:00
    qq2549112
        1
    qq2549112  
    OP
       2015-07-01 18:22:58 +08:00
    求大神指点一二
    hging
        2
    hging  
       2015-07-01 18:35:31 +08:00
    ...mysql只读为什么会有变化.
    qq2549112
        3
    qq2549112  
    OP
       2015-07-01 18:53:52 +08:00
    @hging 我的帐号是只读权限 没有给我写的权限,其他业务有写的权限
    choury
        4
    choury  
       2015-07-01 19:00:20 +08:00   ❤️ 1
    你可以看下mysql的主从复制协议,然后接收mysql的binlog,然后自己解析……不过我感觉这个工作量有点大,你看有没有人干过这事吧
    Septembers
        5
    Septembers  
       2015-07-01 20:34:01 +08:00
    gamexg
        6
    gamexg  
       2015-07-01 20:38:20 +08:00 via Android
    有 lastUpdate 字段,可接受10秒延时,直接定时获取最近更新的不就完了?
    jiaojing
        7
    jiaojing  
       2015-07-01 20:46:02 +08:00
    就是个etl吧
    看看Kettle之类的行不行
    cevincheung
        8
    cevincheung  
       2015-07-01 21:02:08 +08:00
    postgresql有dblink
    rming
        9
    rming  
       2015-07-01 21:54:44 +08:00
    qq2549112
        10
    qq2549112  
    OP
       2015-07-01 22:01:03 +08:00
    @choury 谢谢,mysql 我只有只读权限 所以 无法在上面 安装 binlog
    qq2549112
        11
    qq2549112  
    OP
       2015-07-01 22:02:25 +08:00
    @Septembers 谢谢 SymmetricDS 好像不太适合我,这个东西好复杂,我想让 我的数据每隔1-10秒,postgresql 就和mysql保持一次更新同步,保证2个数据库里面的信息一致
    qq2549112
        12
    qq2549112  
    OP
       2015-07-01 22:02:47 +08:00
    @gamexg 简单的说就是这个意思, 就是我太菜了,不知道如何实现细节
    qq2549112
        13
    qq2549112  
    OP
       2015-07-01 22:03:00 +08:00
    @jiaojing 不是etl 谢谢
    qq2549112
        14
    qq2549112  
    OP
       2015-07-01 22:03:22 +08:00
    @cevincheung dblink 我用的rds 无法安装软件 谢谢哦
    Septembers
        15
    Septembers  
       2015-07-01 22:28:21 +08:00   ❤️ 1
    @qq2549112
    必须要解决"数据发现"的问题

    被动发现比较难实现实时一致
    而且会给主数据库带来一定的负担

    除非主动发现、思路如下:
    可以考虑向上司申请建立个 从库
    然后写个工具分析 从库 的binlog提取数据到PostgreSQL

    (另外从库还可以作为主库的备份,存在
    qq2549112
        16
    qq2549112  
    OP
       2015-07-01 22:48:11 +08:00
    @Septembers 非常感谢您的回答

    我分别用的阿里云的 mysql rds 和 postgresql rds

    mysql rds 是别人提供给了我 一个 [只读权限] 的 帐号密码
    postgresql rds 是我自己购买的


    之前我自己写过一个python脚本,5秒同步一次 [首次很慢,因为要拉取历史数据,之后5秒一次没有问题]
    目前不用担心给主数据库带来负担,并且数据量并不是特别大,
    所以 不用担心给mysql rds [主数据库] 增加负担


    关于您说的binlog,因为是rds,所以binlog这个方案实现起来 似乎有点麻烦

    所以 可能我还是得用以前的方法

    用python 去 mysql [发现数据] 然后 再插入到 新的postgresql里面

    然后每隔 几秒 就去 [发现] 一次
    msg7086
        17
    msg7086  
       2015-07-01 23:33:45 +08:00   ❤️ 1
    如果数据修改端自己能控制的话,用mysql proxy之类的玩意插一个代理。
    不能的话当然只能不停刷了。
    「首次」其实也可以分批拉的,按照时间排序然后每次limit一下数量就好了。
    cevincheung
        18
    cevincheung  
       2015-07-02 02:01:12 +08:00   ❤️ 1
    @qq2549112 阿里云的RDS For Postgresql是支持dblink的
    qq2549112
        19
    qq2549112  
    OP
       2015-07-02 11:54:14 +08:00
    @cevincheung 谢谢, 我网上搜了下 dklink 好像这个只是 创建一个链接, 数据还是在原始的mysql里, 但这样的话 就无法使用postgresql的某写特性了 比如jsonb特性

    所以我像把数据 直接 增量同步到 postgresql里面
    cevincheung
        20
    cevincheung  
       2015-07-02 23:22:13 +08:00   ❤️ 1
    @qq2549112 那就只能试试触发器了或者自己解析binlog
    dhysum
        21
    dhysum  
       2017-03-06 10:23:40 +08:00
    Chenamy2017
        22
    Chenamy2017  
       2018-11-22 17:40:17 +08:00
    楼主问题是否解决了?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5388 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 08:36 · PVG 16:36 · LAX 01:36 · JFK 04:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.