新手问题 Rails 管理多数据库

rails_taotao · 2018年08月25日 · 最后由 rails_taotao 回复于 2019年06月16日 · 3074 次阅读

现在有一个 rails 项目多个公司共同使用,但是希望一个 rails server,一套代码,但是数据库不同。在 rails server 通过域名选择不同的数据库进行访问。不知道各位大佬有没有比较好 gem,或者好的解决方案

不是应该跑两个 rails 应用吗?干嘛执着于一份代码?

a-wing 回复

因为将来会有很多公司都会访问这个 rails server,会根据域名来解析 render 不同的视图层。多个 rails server 的话将来项目特别多,不方便进行维护和迭代

对你这需求略蒙。。。可能我理解有问题

是不是应该 用 nginx 的 url 重写,类似这种需求?

比如主域名abc.com

aaa.com => abc.com/1/
bbb.com => abc.com/2/

multi domain

a-wing 回复

niginx 配置的确是你那样,现在的需求是希望通过解析域名在一个 rails server 访问不同的数据库

客户需要数据隔离就单独部署,不在乎就共用数据库。应用层不分单独分数据库有何意义。

依然很疑惑。。。如果没有公共的数据弄成全部独立的应用就行了。。再配合自动部署。。和维护一个应用一样啊。。。觉得占空间可以主应用之外都做成软链接。。。。(你以后访问量大了之后是不是还要拆开?。。)

Rei 回复

你好,因为视图层是通过域名解析来进行 render,所以就放在一个项目上了,网站的功能都是相同的,应用层也是共同的,只是视图层不一样。因为每个用户都有自己单独的数据需要处理。所以要求数据库进行拆分。因为如果跑多个 rails server 的话,将来服务器的资源就很紧张

Rails 自带可以管理多个数据库,然后前面用 nginx 定向到同一个 Server 的不同地址上,应该可行。 https://stackoverflow.com/questions/6122508/connecting-rails-3-1-with-multiple-databases

msms 回复

谢谢。非常有帮助。

自找苦吃。。。

Rails 是常驻内存的网站程序,你多个域名分别对应不同的数据库,可能会造成大量内部的全局变量互相干扰,比如从一个数据库读出来的数据没有清理干净,然后被另一个域名调用走了。

如果你是架构大佬,对于这种场景能够做到非常详细的测试,那当然 OK。否则迟早有一天你会被其他开发人员打死……

这不就是 saas 做 sharding 吗

msg7086 回复

谢谢分享。

pynix 回复

主要是考虑将来维护问题

a-wing 回复

谢谢分享。小弟经验不足。没有考虑到这个问题、我会慎重选择。

我觉得 hooopo 说的不错啊,你们这个不就是单系统多租户的模式么?感觉一个数据库应该能解决问题。

hooopo 回复

是的。差不多就是这个意思

gakki 回复

差不多就是这个意思。主要因为我们的用户下自己可以单独管理自己的用户信息。然后又自己数据内容。

hooopo 回复

你好,能不能具体点讲下。我不是很明白

这个需求绝对是有的,特别是针对一些旧系统做追加开发,但是楼主的需求好像用不着故意弄复杂。

技术上来说处理多个数据库是可能的,网上有很多这种文章: https://www.thegreatcodeadventure.com/managing-multiple-databases-in-a-single-rails-application/

还有人干脆就写了 gem:https://github.com/ankane/multiverse

samport 回复

你好,因为我们这个项目相当于帮助客户定制公司网站,但是功能是一样的。就是每个客户的自己的数据库不一样,视图层不一样。然后我们的技术总监希望是一个 rails server 跑起来,然后每个客户的数据库单独进行管理。这个项目前期架构不好。

你要的是

每个客户的数据单独进行管理

而不是

每个客户的数据库单独进行管理

吧。

Rei 回复

谢谢指点。

提供一个思路,建几个模板型的 rails 项目,编号 1-n,作为主支,每个公司都是其中之一的分支,每个公司单独部署,可考虑前后端分离,用 vue 或 react 提供更好前端交互体验,后台用 activeadmin 提供增删改查就行

使用 Rails 的一条原则就是,如果你的业务和 Basecamp 不一样,就不要用 Rails。

比如 Log,同样是 User.find,不同的数据库查出来的结果是不一样的,而 Rails 原生 log 不会告诉你当前在哪个数据库上操作,需要自己 Hack。还有更恼人的缓存问题。把每个公司都装入不同的 module 会好一点,但是也要小心测试确保没 bug。

nouse 回复

谢谢分享

ThxFly 回复

谢谢分享,我们这个小型项目。是没有做前后端分离的。我之前也是通过分支管理。但现在维护起来不容易。每个分支都需要单独去维护

我最近也碰到需要拆库的问题,不过我们面对的问题是有几张表数据量特别大,且一直会成倍的增长,需要有个机制能平滑的拆分并处理。开始我也考虑拆数据库,不过现在打算拆分表。

楼主的问题类似多租户的问题,这个 gem 应该可以解决: https://github.com/influitive/apartment ,看了下视频介绍,应该蛮贴近楼主描述的场景的。

hutusi 回复

谢谢您的分享。这个 gem 我看过。之前一直没有用过这个包,最近也在学习这个包

半年过去了,楼主最后是怎么处理的呢?处理完会遇到哪些问题?

ThxFly 回复

使用了 Apartment 这个包进行管理,使用了 Apartment-sidekiq 进行了 sidekiq 进行管理

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