如何在 Rails 中设置分布式数据库

How to setup distributed databases in Rails

我正在寻找一种在我的 Rails 应用程序中对三个数据库实现故障转移和额外负载平衡的方法。

后面的代码目前可以正常工作,但是如果 db_1 出现故障,那么我的应用程序就会死掉。

我想使用 db_1 作为主设备,其他两个 db_2db_3 作为故障转移。

此外,我想对它们进行负载平衡,但这是一个不太重要的要求。

config/database.yml

db_1:
  adapter: mysql2
  reconnect: false
  pool: 5
  username: <username>
  password: <password>
  database: database_test
  host: 101.101.101.1

db_2:
  adapter: mysql2
  reconnect: false
  pool: 5
  username: <username>
  password: <password>
  database: database_test
  host: 101.101.101.2

db_3:
  adapter: mysql2
  reconnect: false
  pool: 5
  username: <username>
  password: <password>
  database: database_test
  host: 101.101.101.3

app/models/ext_databases.rb

class ExtDatabases < ActiveRecord::Base
        self.abstract_class = true
        establish_connection :db_1
end

app/models/users.rb

class Users < ExtDatabases
        Users.table_name = "ext_users"
end

那应该在MySQL这边处理。 MySQL 有几个选项,例如主动-被动(复制)、主从、集群或分片。使用 google 上的这些关键字查找官方 MySQL 文档。每种策略都有自己的优点和缺点,您需要在做出决定之前了解它们。

MySQL 已经有一个工具可以进行自动故障转移,它的名字很恰当 mysqlfailover

This utility permits users to perform replication health monitoring and automatic failover on a replication topology consisting of a master and its slaves. The utility is designed to run interactively or continuously refreshing the health information at periodic intervals. Its primary mission is to monitor the master for failure and when a failure occurs, execute failover to the best slave available. The utility accepts a list of slaves to be considered the candidate slave.

当然,这意味着您确实需要设置 mysql 复制,但从您问题的语气来看,您似乎已经这样做了。

mysql故障转移不是唯一的选择。完全兼容mysql但独立开发的数据库Percona有自己的东西:

https://www.percona.com/doc/percona-xtradb-cluster/5.5/manual/failover.html