安全地提升主人到奴隸
以前我問過類似的問題MySql Switching Masters during Failover with log-slave-updates。
假設這是我們目前的複制
另外,我的應用伺服器很少。每個應用伺服器都直接連接到Master 1以進行 INSERT 和 UPDATE 以及從站
$$ 1-3 $$為了選擇。 我的問題是,我究竟如何才能將大師 2提升為真正的唯一大師。重要提示Master 2和它下面的所有 slave 都是 mysql 5.5 而Master 1是 mysql 5.2
當我在應用程序設置中將Master 1的 IP更改為Master 2的 IP 並進行部署時,有一段時間我在****Master 1和Master 2上都有 UPDATE 和 INSERTS ,這導致 Master 2上出現“重複條目…” 。之後,我重建樹並在部署前幾秒鐘在Master 2上執行 STOP SLAVE。當然,我失去了一些數據,這些數據被插入到Master 1而沒有復製到Master 2。
那麼,在不失去數據的情況下,正確的方法是什麼。
另外,我仍然不明白在 STOP SLAVE 之後要在Master 2上執行什麼以重置“從屬設置”,看起來我真的不需要這樣做,只需 STOP SLAVE 一切都應該工作,但是只是為了保持我想重置“從屬設置”的順序。
當您在應用程序中移動 IP 時,當時打開的任何數據庫連接都完全不知道移動。快速會在Master1
netstat | grep -i mysql
上揭示這一點。您最好按如下方式對 IP 進行切換:
在 Master1 上
FLUSH HOSTS;
service mysql stop
在應用程序中更改 IP
在所有 Web 伺服器上,
service httpd restart
為了保護應用程序不必為了分配新 IP 而對其進行編輯,請嘗試改用 DB VIP。
例如:
- Master1 是 10.1.2.30
- Master2 是 10.1.2.40
- 使用 10.1.2.70 作為 DBVIP
這是您可以設置的內容
- 在 Master1 上,執行
ip addr add 10.1.2.70/24 dev eth1
10.1.2.70
在您的應用中使用然後,當需要切換時,請執行以下操作
在 Master1 上
FLUSH HOSTS;
service mysql stop
ip addr del 10.1.2.70/24 dev eth1
在 Master2 上
ip addr add 10.1.2.70/24 dev eth1
SHOW SLAVE STATUS\G
並確保執行來自 Master1 的所有最終 SQL 語句在所有 Web 伺服器上,
service httpd restart
這樣,切換不會涉及編輯應用程序的任何部分。請注意,我沒有提到在
STOP SLAVE
任何地方執行,因為一旦 mysql 在 Master1 上停止,這將允許任何最終 SQL 語句從 Master1 流向 Master2。