Rails Rails 怎么做数据库分库的?

happyming9527 · 2016年08月17日 · 最后由 279959599 回复于 2019年03月28日 · 6414 次阅读

最近接了个活,后端得做高负载的处理,我想要分库处理。论坛里有朋友后端数据库是多个的么?你们是如何做夸库的事务处理的呢?貌似 rails 是不支持两阶段提交的。请问大家有什么好方案呢?

pg 单表 7 亿,1000 万/日。用的青云云 pg,1 核 2G,查询速度很快,你可以参考下。

@nine 服务器都部署在海外。准备用 aws,这方面有啥推荐的不?

#3 楼 @happyming9527 用 Amazon 更好,直接上 RDS

看了下大家的回复,首选都是云数据库,云未来可期

#2 楼 @huacnlee 想知道你们的项目最后怎么了...

分库还是不建议自己折腾。搞个主从还是比较简单的。可以用这个 gem https://github.com/thiagopradi/octopus

@huacnlee 这样分 1024 张表,之后其他跟用户表相关的表你们是如何处理的?是不是为了查询性能,增加了很多陇余的表?比如将跟用户相关的订单表按照用户的 id 分布规律,划分了分表..但是订单表又可能要按照 product_id 来查询,是不是又要根据 product_id 的分表规律,来再划分一次订单的分表?

@benzhang 生产环境部署读写分离,用 binlog 同步会有多大延迟?

#10 楼 @happyming9527 你还没有回答我的第一个问题!

应用层只有一个 Model,以照片应用为例(实际上我们就是照片应用)

Photo 表,背后是 photos_1 - photos_1024,但 Model 只有一个,查询在 Rails 输出的时候还是:

select * from photos where user_id = ?

但到了 MySQL Proxy 层(阿里内部的非开源系统),将会分析这条 SQL,找到 user_id 关键字,并基于之前的分库分表设计,将 photos 换成 photos_(n),最后再往后面的 MySQL 发送请求。

但这样做有局限性,无法跨表查询或跨表查询会相对较慢,例如这样的语句场景会有问题(同时查询 user_id in (1, 2, 3)),1, 2, 3 的用户的 Photo 可能分布在不同的 photos_(n) 表里面,Proxy 需要分别查询最后再组合在一块儿,所以很多的实现都需要避开这样的问题。

所以,根据实际业务场景,选择合适的分表字段是很重要的!例如订单的场景,绝大多数场景一定都是自己看自己的订单,所以基于 user_id 拆分表是可行的。同理,Timeline,Notification 也是可以的。


以上都是理论,实际执行的时候比较复杂。并且,核心点还是你需要中间层的分库框架。

@huacnlee 我想我是不需要分库分表了。谢谢你的耐心解答 0rz.我还有个问题一直不懂。是不是把一百万用户的信息放到 redis 里面,读取速度会比从 mysql 读取要快?在 mysql 中根据 id 查询,和从 redis 中按照 user_id 读取,哪个更快呢? 根据我以前碰到的问题,貌似 mysql 里两张内存中的临时表,对某个数字字段做关联查询,查询速度比在硬盘上的两张表,对数字字段加索引后,进行关联。查询的要慢.是不是在 mysql 中的内存中的表,进行关联查询,是要做全表扫描的?

MySQL 主键、基于索引的查询,哪怕几百万的数据,也是非常快的。

不要听传言说 Redis 快、MongoDB 快就去用那些东西,前提还是你懂他们不?你知道他们适用的场景不?

飞机比汽车快,但你会开么?以及飞机能在城里开么?

前面都说了,要看场景选择合适的方案。至于怎么知道什么适合你,你需要去了解这些东西(MySQL、Redis ...)它们适用于什么场景,优缺点是什么。

你的第二句我没看懂...

@huacnlee 谢谢你的解答!0rz

#11 楼 @happyming9527 我们用的是 PostgreSQL,延时具体没有测过,这个还是得看应用场景。重要的都放倒事务里面,基本上不会出啥问题。

#11 楼 @happyming9527 我们用的是 PostgreSQL,延时具体没有测过,这个还是得看应用场景。重要的都放倒事务里面,基本上不会出啥问题。

#3 楼 @nine 这个你是说 PG 比 Mysql 好么

楼主。我最近也在关注~ 看这个谈到的大表优化问题。https://www.zhihu.com/question/19719997

逼逼半天有啥用。有时候需求身不由己。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号