V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ray1888
V2EX  ›  程序员

数据库读写分离的问题

  •  
  •   ray1888 ·
    ray1888 · 2017-09-26 09:22:32 +08:00 · 3200 次点击
    这是一个创建于 2608 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想请问一下,数据库读写分离在程序里面是怎样做到的?是在程序里面写死,读的时候用短连接一个数据库,写的时候又短连接另一个数据库?还是同时在全局保持两个数据库的长连接,然后分别在函数里面调用不同的 cursor 吗?因为公司业务还没到要读写分离的情况,对这个比较好奇,希望有人能解答一下我的问题

    12 条回复    2017-09-26 17:16:42 +08:00
    iyaozhen
        1
    iyaozhen  
       2017-09-26 09:31:56 +08:00 via Android
    DBproxy
    nandaye
        2
    nandaye  
       2017-09-26 09:37:53 +08:00 via Android
    数据库读写分离只是说写主库读从库。长连接还是短连接看你具体需求,与数据库读写分离没啥关系。
    hantsy
        3
    hantsy  
       2017-09-26 10:37:23 +08:00
    CQRS please.
    hantsy
        4
    hantsy  
       2017-09-26 10:44:34 +08:00
    1. 目前你这个似乎只考简单虑数据库层面,Node 1 负责写,Node 2-n 负责读,Node 间同步由数据库自己负责。
    2. 程序设计层面可以由 CQRS 模式实现(当然这是个绝对不简单的过程),Command 负责写入(包括更新删除)数据库,通过 Messaging Broker ( Apache Kafak,RabbitMQ ) 通知 Query 端 DB 更新,可以由其它一些更高效数据库负责读,比 ElaticSearch, Cassandra 等。
    hcymk2
        5
    hcymk2  
       2017-09-26 10:57:32 +08:00
    DDD 为什么还没死?
    movistar
        6
    movistar  
       2017-09-26 11:04:09 +08:00
    第一次看见有人拿 MessageBroker 做读写分离的,这一致性保障得多麻烦
    一般现成的服务都是拿 binlog 做主从同步,读写分离很多中间件都支持
    无非 Client Side 的开多个连接(TDDL 类)
    Server Side 的由 Broker 来控制读写分离(Atlas 类)
    这种东西没必要自己写...除非你能写的比别人好
    loveCoding
        7
    loveCoding  
       2017-09-26 11:29:38 +08:00
    一般采用中间件来做 , 看看这个 , http://shardingjdbc.io/docs/00-overview/ ,语言不同思想大致是相通的
    zhx1991
        8
    zhx1991  
       2017-09-26 11:56:19 +08:00   ❤️ 2
    有两种

    一种是统一连到一个代理服务上, 这个代理服务连着后面所有的数据库, 然后读写都是这个代理服务去判断.(一般就是读语句会去读从库, 写语句会去写主库, 如果希望强读主库一般会在 sql 里加上 /*master*/ 之类的注释供判断) 360 开源的 atlas 就是这种

    另外一种是客户端本地判断, 等于把上述代理干的活都拿到本地去做.

    这两种理念不同, 第一种整个链路多一层, 出问题的几率更大, 第二种没有这个问题.

    而第二种需要客户端连所有的数据库, 建起来的连接会比较多(肯定都是线程池)
    jlkm2010
        9
    jlkm2010  
       2017-09-26 12:40:18 +08:00
    rason
        10
    rason  
       2017-09-26 14:36:56 +08:00
    @movistar 你楼上说 MessageBroker 做读写分离没有啥毛病,只不过这种适用于实时性不是很高的情况,比如说最近 24 小时的热门产品。
    Hozzz
        11
    Hozzz  
       2017-09-26 16:27:44 +08:00
    一般是两个独立数据库之间建立逻辑同步关系,DML 操作在主数据库上,查询操作在备库上。
    很多商业数据库都自带有逻辑同步工具,很轻松就能做到读写分离;至于数据一致性,一般这种逻辑同步是同机房之间实现,所以可以认为是实时同步的:)
    owenliang
        12
    owenliang  
       2017-09-26 17:16:42 +08:00
    1,框架对主从支持的程度,决定了中间件是否必须。
    2,集群规模对连接数的影响,决定了中间件是否必须。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1890 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 16:28 · PVG 00:28 · LAX 08:28 · JFK 11:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.