2

我正在爲客戶建立一個高可用性環境。有一對負載均衡的主機向我們的Rails應用程序提供http請求,這兩個主機並行部署。MySQL集羣(NDB)的Rails適配器解決方案?

此外,還有兩個MySQL主機可用。我想在兩臺主機(即多臺主機)上運行MySQL Cluster(NDB)以獲得完全冗餘的配置。我特別試圖避免基於數據庫複製的主從配置;我覺得這樣會使可寫節點成爲單點故障。

我在尋找如何最好地我們的Rails應用程序接口,以這樣一個多主的MySQL集羣上一些指導。幾乎所有我能找到的數據庫適配器都適用於主從設置。聽起來非常有希望,但它是可悲的過時的。我還沒有設法發現過去五年發展的任何類似的東西。

是任何人都知道任何寶石使用的或者接近採取像我描述作爲一個Rails應用程序和多主機的MySQL集羣之間的適​​配器?

+0

這是一個很好的https://github.com/taskrabbit/makara 它支持多主機,並具有故障轉移 –

+0

@SamD感謝您的建議。我已經與馬卡拉搏鬥了兩天了,而且我還沒有成功完成多主設置。您是否真的在該場景中使用過它? – RonU

+0

我從來沒有做過Makara tbh的高手。我做了主從。它在支持主 - 碩士的文檔中說過,因此我建議 –

回答

0

我最終沒能找到做了什麼,我想一個適配器解決方案。

我決定使用mysql2適配器,並將它指向我的數據庫集羣前面的反向代理(我使用的是haproxy),該集羣可以處理主節點之間的負載平衡和故障切換。

3

我剛剛設置了這個。不應該有太多的工作要做。

在mysqladapter寶石它指定引擎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 

最大承載防止帽並行運行的遷移。這很重要,因爲您不希望羣集同時運行create table類型的事物。甚至可能值得推遲我已經評論過上面,只是爲了一點額外的安全。

另一個關鍵方面。不要忘記設置:

DataMemory = 
IndexMemory = 

默認值是極低的。通常索引大小是DataMemory值/ 5-10

還有一個陷阱到目前爲止,我所看到的是在你的mysqld節點請務必設置:

ndb_autoincrement_prefetch_sz 

到至少100。否則批量插入會永遠佔用。默認值是1。

編輯

ndb_autoincrement_prefetch_sz 

離開這個變量完全孤獨。不要設置它。它可能會導致自動增量索引在集羣上變得不同步。調試是一場噩夢。

此外請確保您的NDB節點不會與NDB MGM節點在同一臺服務器上運行。

快樂編碼。

廣告