
我有一個包含 3 個伺服器的 mySQL/PHP/Apache 叢集(每個叢集都位於不同的大陸,以實現最大的復原能力)。我讀過很多建議,都說-不要這樣做!
本質上我想這樣做的原因是:
- 彈性 - 3 台伺服器中的 2 台可能發生故障,用戶仍然可以登入並查看他們的資料/完成他們的工作
- 備份 - 與上方類似
- 負載共享 - 我可以在不同的盒子之間分配前端負載和後端伺服器進程
我看過不同的選擇,包括 percona galera,似乎都有缺點。主要是透明度 - 在某些時候鏈接或伺服器會出現故障,然後你會得到模糊的 BINLOG 錯誤,然後這就是一個大問題...
所以我自己實現了這個 - 我有一組腳本在每個表上構建 INSERT/UPDATE/DELETE 觸發器 - 任何更改都記錄在複製表中。每分鐘都有一個進程將這些變更推送到其他兩台伺服器。我還有檢查校驗和並就任何差異發出警報的流程。
它的效果很好。不容易,我同意你!多個繁瑣的事情,包括:
- 不使用浮點列類型(0.3434 不等於 0.3434...)
- 避免自動遞增鍵(如果資料同時插入到兩個不同的伺服器上,它們都可以取下一個值,那麼相互插入將會失敗)。
- 如果更改表格結構,請記住重新執行建立觸發器腳本
所以,我的問題是......可能會出現什麼問題?這會在哪裡/為什麼會失敗?我不知道什麼?
答案1
與上述相反,我認為這是一個很好的問題。他們並不是要求對他們所做的事情進行分析,只是要求了解未知的未知因素的一般「第四窗口」。
數據密集型應用程式是很棒的書 他們將其稱為“多領導者複製”而不是“主-主”複製,並且對為什麼這存在缺陷進行了很好的討論。正如您所看到的,Galera 和 Percona 的服務無法做到這一點——所以一定有一個很好的理由(我還沒有使用 Blackhole)。
我認為關鍵資訊是您需要確保表結構可以應對多頭複製 - 因此,如果在單獨的伺服器上添加 2 個新條目,您就不會(如您所說)想要有一個自動增量鍵字段- 您需要設計表和應用程式以使用可能的使用者ID 和時間戳記等...(所以這是手動工作的痛苦)。
您可能還需要合適的工具來快速比較資料庫中的表格並發現不一致之處。