我最近才设置了这个。应该没有太多工作要做。
在 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 节点在同一台服务器上运行。
快乐编码。
广告