MySQL 主庫(kù)和備庫(kù)之間的代理是一種重要的數(shù)據(jù)庫(kù)備份和恢復(fù)策略,它利用代理服務(wù)器的特性幫助我們實(shí)現(xiàn)自動(dòng)化的備份和恢復(fù)。在這種架構(gòu)中,主庫(kù)通過(guò)代理服務(wù)器將新的更新發(fā)送到備庫(kù),同時(shí),在備庫(kù)更新偏差超出閾值時(shí),也會(huì)將差異請(qǐng)求發(fā)送給主庫(kù)。
# 示例代碼:基于 Python 的 MySQL 主備庫(kù)之間代理實(shí)現(xiàn) def update_slave(master_conn, slave_conn, last_sync_pos): """在主庫(kù)上執(zhí)行 SQL 語(yǔ)句并同步至備庫(kù)""" master_cursor = master_conn.cursor() slave_cursor = slave_conn.cursor() master_cursor.execute("FLUSH TABLES WITH READ LOCK") master_cursor.execute("SHOW MASTER STATUS") master_status = master_cursor.fetchone() if last_sync_pos: master_cursor.execute(f"SELECT @@GLOBAL.gtid_executed") executed_gtid_set = set(master_cursor.fetchone()[0].split(",")) last_synced_gtid_set = set(last_sync_pos.split(",")) master_diff_logs = "SELECT * FROM mysql.gtid_executed WHERE @@GLOBAL.gtid_executed = '{}'".format( ",".join(executed_gtid_set - last_synced_gtid_set) ) master_cursor.execute(master_diff_logs) for log in master_cursor.fetchall(): log = log[0].decode() slave_cursor.execute(log) slave_pos = slave_conn.get_last_insert_id() master_cursor.execute("UNLOCK TABLES") return master_status[0], slave_pos
除了上述代理實(shí)現(xiàn)方式,還可以使用數(shù)據(jù)庫(kù)復(fù)制技術(shù)(例如 MySQL 的半同步復(fù)制和多源復(fù)制)來(lái)實(shí)現(xiàn)主備庫(kù)之間的數(shù)據(jù)同步。無(wú)論你選擇哪種方法,都需要確保備庫(kù)的數(shù)據(jù)與主庫(kù)的數(shù)據(jù)高度一致,以便在主庫(kù)發(fā)生故障的情況下迅速地切換到備庫(kù)。