数据库读写分离的问题

2017-09-26 09:22:32 +08:00
 ray1888

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

3210 次点击
所在节点    程序员
12 条回复
iyaozhen
2017-09-26 09:31:56 +08:00
DBproxy
nandaye
2017-09-26 09:37:53 +08:00
数据库读写分离只是说写主库读从库。长连接还是短连接看你具体需求,与数据库读写分离没啥关系。
hantsy
2017-09-26 10:37:23 +08:00
CQRS please.
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
2017-09-26 10:57:32 +08:00
DDD 为什么还没死?
movistar
2017-09-26 11:04:09 +08:00
第一次看见有人拿 MessageBroker 做读写分离的,这一致性保障得多麻烦
一般现成的服务都是拿 binlog 做主从同步,读写分离很多中间件都支持
无非 Client Side 的开多个连接(TDDL 类)
Server Side 的由 Broker 来控制读写分离(Atlas 类)
这种东西没必要自己写...除非你能写的比别人好
loveCoding
2017-09-26 11:29:38 +08:00
一般采用中间件来做 , 看看这个 , http://shardingjdbc.io/docs/00-overview/ ,语言不同思想大致是相通的
zhx1991
2017-09-26 11:56:19 +08:00
有两种

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

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

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

而第二种需要客户端连所有的数据库, 建起来的连接会比较多(肯定都是线程池)
jlkm2010
2017-09-26 12:40:18 +08:00
rason
2017-09-26 14:36:56 +08:00
@movistar 你楼上说 MessageBroker 做读写分离没有啥毛病,只不过这种适用于实时性不是很高的情况,比如说最近 24 小时的热门产品。
Hozzz
2017-09-26 16:27:44 +08:00
一般是两个独立数据库之间建立逻辑同步关系,DML 操作在主数据库上,查询操作在备库上。
很多商业数据库都自带有逻辑同步工具,很轻松就能做到读写分离;至于数据一致性,一般这种逻辑同步是同机房之间实现,所以可以认为是实时同步的:)
owenliang
2017-09-26 17:16:42 +08:00
1,框架对主从支持的程度,决定了中间件是否必须。
2,集群规模对连接数的影响,决定了中间件是否必须。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/393622

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX