ruby-on-rails - 分布式 Rails 应用程序 - 如何配置?
问题描述
我有一个在 puma 上运行的相当简单的 Rails 应用程序。在单个节点上 - 它很棒并且完全按照我想要的方式工作。
我一直很难找到 - 我被要求在两个节点上部署这个应用程序。如果您连接到一个节点并执行影响数据库的事务 - 该更改也应该反映在另一个节点上。我找不到任何直接的方法来做到这一点/我不知道该怎么做。
现在-我的情况是应用程序部署在两个节点上-我将其压缩,解压缩,捆绑安装,rails s。在任一节点上都可以正常工作——但是这两个节点是完全独立的,并且有自己的 mysql 数据库。我想统一它们,以便一个节点上的操作反映在另一个节点上。有点......两个节点之间的某种关系,使得它们能够相互交谈。
使用 Rails 完成此任务的常用工具或方法有哪些?我的偏好是集成尽可能少的软件系统/安装尽可能少的 gem - 但是当然,如果它有效,我必须考虑它。
解决方案
作为一个简单的设置,您可以在单个服务器上运行您的数据库。我们称之为服务器database.application.rails
。一旦您拥有运行数据库的单个服务器和指向它的 DNS 或主机条目,您需要更新 Railsconfig/database.yml
文件以指向该单个数据库,如下所示:
production:
adapter: mysql2
host: database.application.rails
username: <%= ENV["DB_USER_NAME"] %>
password: <%= ENV["DB_PASSWORD"] %>
database: application_prod
上述配置还假设您将用户名和密码存储为环境变量——这是一种最佳实践,而不是将它们存储在代码库中。
现在,当您启动您的 rails 应用程序时,您会想要使用bundle exec rails s -e production
.
这并不完全是一个高可用性设置,因为您手动启动服务器并且在服务器前面没有单个 Webpuma
服务器。
对于更复杂的部署,使用capistrano部署应用程序并将nginx配置为指向您的两个后端puma
服务器。
推荐阅读
- laravel - 如何在 InertiaJS 中进行表单验证
- web3js - 你如何估计智能合约调用所需的 gas 量?
- android - 缺少依赖但存在于 APK 中,怎么办?
- excel - VBA设置范围从单元格到最后一列的值
- php - 如何使用 PHP 从 MySQL 中选择 UTF8(波斯)字符?
- vue.js - vue apexcharts:从props获取axios数据后,组件中的图表直接渲染,没有动画
- sql - 计算总用户的 x 个用户 - 计数与总和
- php - 组件中的 Livewire x-slot 标签
- node.js - 为什么 gitlab runner 不使用我的自定义 npm 注册表,而是使用默认的 npm 注册表
- c# - C# HttpClient 不处理 304/307 重定向