想请问一下,数据库读写分离在程序里面是怎样做到的?是在程序里面写死,读的时候用短连接一个数据库,写的时候又短连接另一个数据库?还是同时在全局保持两个数据库的长连接,然后分别在函数里面调用不同的 cursor 吗?因为公司业务还没到要读写分离的情况,对这个比较好奇,希望有人能解答一下我的问题
1
iyaozhen 2017-09-26 09:31:56 +08:00 via Android
DBproxy
|
2
nandaye 2017-09-26 09:37:53 +08:00 via Android
数据库读写分离只是说写主库读从库。长连接还是短连接看你具体需求,与数据库读写分离没啥关系。
|
3
hantsy 2017-09-26 10:37:23 +08:00
CQRS please.
|
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 等。 |
5
hcymk2 2017-09-26 10:57:32 +08:00
DDD 为什么还没死?
|
6
movistar 2017-09-26 11:04:09 +08:00
第一次看见有人拿 MessageBroker 做读写分离的,这一致性保障得多麻烦
一般现成的服务都是拿 binlog 做主从同步,读写分离很多中间件都支持 无非 Client Side 的开多个连接(TDDL 类) Server Side 的由 Broker 来控制读写分离(Atlas 类) 这种东西没必要自己写...除非你能写的比别人好 |
7
loveCoding 2017-09-26 11:29:38 +08:00
一般采用中间件来做 , 看看这个 , http://shardingjdbc.io/docs/00-overview/ ,语言不同思想大致是相通的
|
8
zhx1991 2017-09-26 11:56:19 +08:00 2
有两种
一种是统一连到一个代理服务上, 这个代理服务连着后面所有的数据库, 然后读写都是这个代理服务去判断.(一般就是读语句会去读从库, 写语句会去写主库, 如果希望强读主库一般会在 sql 里加上 /*master*/ 之类的注释供判断) 360 开源的 atlas 就是这种 另外一种是客户端本地判断, 等于把上述代理干的活都拿到本地去做. 这两种理念不同, 第一种整个链路多一层, 出问题的几率更大, 第二种没有这个问题. 而第二种需要客户端连所有的数据库, 建起来的连接会比较多(肯定都是线程池) |
9
jlkm2010 2017-09-26 12:40:18 +08:00
|
10
rason 2017-09-26 14:36:56 +08:00
@movistar 你楼上说 MessageBroker 做读写分离没有啥毛病,只不过这种适用于实时性不是很高的情况,比如说最近 24 小时的热门产品。
|
11
Hozzz 2017-09-26 16:27:44 +08:00
一般是两个独立数据库之间建立逻辑同步关系,DML 操作在主数据库上,查询操作在备库上。
很多商业数据库都自带有逻辑同步工具,很轻松就能做到读写分离;至于数据一致性,一般这种逻辑同步是同机房之间实现,所以可以认为是实时同步的:) |
12
owenliang 2017-09-26 17:16:42 +08:00
1,框架对主从支持的程度,决定了中间件是否必须。
2,集群规模对连接数的影响,决定了中间件是否必须。 |