2

我正在为客户设置高可用性环境。有一对负载平衡的主机为我们的 Rails 应用程序提供 http 请求,它们并行部署在两台主机上。

此外,还有两个 MySQL 主机可用。我想在两台主机(即多主机)上运行 MySQL Cluster (NDB) 以获得完全冗余的配置。我特别想避免基于数据库复制的主从配置;我觉得这使可写节点成为单点故障。

我正在寻找一些关于如何最好地将我们的 Rails 应用程序连接到这样的多主 MySQL 集群的指导。我能找到的几乎所有数据库适配器都是用于主从设置的。Failover_adapter听起来很有希望,但它已经过时了。在过去的五年中,我没有设法发现任何类似的开发。

有没有人知道要使用的任何 gem 或用作 Rails 应用程序和多主 MySQL 集群之间的适​​配器的方法,就像我描述的那样?

4

2 回答 2

4

我最近才设置了这个。应该没有太多工作要做。

在 mysqladapter gem 中将引擎指定为 InnoDB,这显然不适合集群。您需要将其添加到初始化文件中:

ActiveRecord::ConnectionAdapters::Mysql2Adapter
class ActiveRecord::ConnectionAdapters::Mysql2Adapter
  def create_table(table_name, options = {})
    super(table_name, options.reverse_merge(:options => "ENGINE=NDB"))
  end
end

这是适配器中的原件。

def create_table(table_name, options = {})
  super(table_name, options.reverse_merge(:options => "ENGINE=InnoDB"))
end

另一个关键方面是您不希望同时进行迁移,因此在 deploy.rb 文件中:

task :migrate, :max_hosts => 1 do
  # sleep 0.5
  run "cd #{release_path} && bundle exec rake db:migrate RAILS_ENV=#{rails_env}"
end

Max hosts 阻止 cap 并行运行迁移。这很重要,因为您不希望集群同时运行创建表类型的东西。甚至可能值得延迟我在上面评论过的内容,只是为了增加一点安全性。

还有一个关键方面。不要忘记设置:

DataMemory = 
IndexMemory =

默认值非常低。通常索引大小为 DataMemory/5-10

到目前为止,我看到的另一个陷阱是在您的 mysqld 节点中,请确保您设置:

ndb_autoincrement_prefetch_sz

至少为 100。否则批量插入将永远持续下去。默认值为 1。

编辑

ndb_autoincrement_prefetch_sz

完全不理会这个变量。不要设置它。它可能导致自动增量索引在集群上变得不同步。这是调试的噩梦。

此外,请确保您的 NDB 节点不会与 NDB MGM 节点在同一台服务器上运行。

快乐编码。

广告

于 2014-06-11T14:10:38.383 回答
0

我最终无法找到符合我要求的适配器解决方案。

我决定使用mysql2适配器并将其指向我的数据库集群前面的反向代理(我使用haproxy ),它可以处理主节点之间的负载平衡和故障转移。

于 2013-12-26T15:54:45.533 回答