能不能在兩個不同主機之間的mysql 資料表, 做互相備緩的作用

好的,當然可以!在兩個不同的 MySQL 主機之間建立資料表的互相備援機制,最常見且有效的方式就是使用 MySQL Replication (主從複製)

雖然 MySQL Replication 的主要目的是將一個主伺服器的資料同步到一個或多個從伺服器,但透過一些設定,你可以實現類似互相備援的效果。以下是幾種可以考慮的方法:

方法一:傳統的主從複製 (Master-Slave Replication)

這是最常見的 MySQL 複製方式。你可以設定其中一台主機作為主要寫入的 Master,另一台作為唯讀的 Slave。當 Master 發生故障時,你可以將 Slave 提升為新的 Master。

  • 優點: 設定相對簡單,讀寫分離可以提升效能。
  • 缺點: 在 Master 故障時需要手動介入將 Slave 提升為 Master,可能會有短暫的服務中斷。資料只會單向從 Master 複製到 Slave。

設定步驟 (簡述):

  1. 在 Master 伺服器上:
    • 啟用 Binary Log (binlog)。
    • 設定唯一的 server-id
    • 建立一個專用於複製的使用者並授予 REPLICATION SLAVE 權限。
    • 鎖定 Master 資料庫並取得当前的 binlog 檔案名和位置。
    • 備份 Master 資料庫。
  2. 在 Slave 伺服器上:
    • 設定唯一的 server-id (與 Master 不同)。
    • 配置連線到 Master 的資訊 (Master IP、使用者、密碼、binlog 檔案名和位置)。
    • 匯入從 Master 備份的資料。
    • 啟動 Slave 的複製程序。

方法二:雙主複製 (Master-Master Replication)

這是一種更進階的設定,讓兩台伺服器都作為 Master,並且互相複製對方的資料。

  • 優點: 任何一台伺服器都可以接受寫入,具有更高的容錯能力。
  • 缺點: 設定較複雜,需要仔細處理潛在的寫入衝突問題 (例如兩台主機同時修改同一筆資料)。通常需要應用程式層或 MySQL 本身的衝突解決機制。

設定步驟 (簡述):

  1. 在兩台伺服器上:
    • 啟用 Binary Log (binlog)。
    • 為每台伺服器設定唯一的 server-id
    • 在每台伺服器上建立一個專用於複製的使用者並授予 REPLICATION SLAVEREPLICATION CLIENT 權限給對方。
    • 互相配置對方的連線資訊 (IP、使用者、密碼、binlog 檔案名和位置)。
    • 互相備份對方的資料並匯入。
    • 在兩台伺服器上啟動複製程序。
    • 重要: 建議使用 auto_increment_incrementauto_increment_offset 來避免自增主鍵衝突。

方法三:多源複製 (Multi-Source Replication)

MySQL 5.7 及更高版本支援多源複製,允許一個 Slave 伺服器從多個 Master 伺服器接收資料。你可以設定兩台伺服器都作為對方的 “Master”,讓它們的資料都複製到對方 (作為 “Slave” 的角色)。

  • 優點: 比雙主複製更清晰地定義了複製關係,可能更容易管理。
  • 缺點: 需要較高版本的 MySQL。仍然需要考慮潛在的資料衝突。

設定步驟 (簡述):

  1. 在兩台伺服器上:
    • 啟用 Binary Log (binlog)。
    • 為每台伺服器設定唯一的 server-id
    • 在每台伺服器上建立一個專用於複製的使用者並授予 REPLICATION SLAVE 權限給對方。
    • 在每台伺服器上配置多個複製通道,分別指向對方作為 Master。
    • 為每個通道配置連線資訊 (Master IP、使用者、密碼、binlog 檔案名和位置)。
    • 互相備份對方的資料並匯入。
    • 在兩台伺服器上啟動各個複製通道。

選擇哪種方法取決於你的具體需求:

  • 如果你的應用程式主要在一個主機上寫入,而另一台主要用於讀取或作為故障備援,那麼傳統的主從複製可能就足夠了。
  • 如果你希望兩台主機都能處理寫入,並且在其中一台故障時另一台可以立即接管,那麼雙主複製或多源複製可能更適合,但需要更謹慎地處理潛在的衝突。

重要注意事項:

  • 網路連線: 確保兩台主機之間的網路連線穩定可靠。
  • 資料一致性: 無論選擇哪種方法,都需要密切監控複製狀態,確保資料的一致性。
  • 測試: 在生產環境中實施之前,務必在測試環境中充分測試你的備援方案,包括模擬故障切換。
  • 延遲: 複製可能會存在一定的延遲,你需要根據你的應用程式對延遲的容忍度進行評估。

總之,MySQL Replication 提供了在不同主機之間實現資料表互相備援的機制。你需要根據你的具體需求和技術能力選擇最適合你的方法,並仔細配置和測試。建議查閱 MySQL 的官方文件以獲得更詳細的設定指南。

好, 請詳述 方法一:傳統的主從複製 (Master-Slave Replication) 的步驟

好的,以下將詳細說明如何設定傳統的 MySQL 主從複製 (Master-Slave Replication)。這個過程需要在 Master 和 Slave 兩台伺服器上進行配置。

假設情境:

  • Master 伺服器:
    • IP 位址:192.168.1.100
    • MySQL 版本:假設為 8.0
  • Slave 伺服器:
    • IP 位址:192.168.1.101
    • MySQL 版本:假設為 8.0 (建議與 Master 版本一致或更高)

步驟 1:在 Master 伺服器 (192.168.1.100) 上配置

  1. 編輯 MySQL 配置文件:
    • 找到你的 MySQL 配置文件。在 Ubuntu 系統上,通常位於 /etc/mysql/mysql.conf.d/mysqld.cnf/etc/my.cnf
    • 使用文字編輯器(例如 nanovim)打開該文件,並找到 [mysqld] 部分。
    • 進行以下修改或添加:
    程式碼片段[mysqld] server-id=1 # 設定 Master 伺服器的唯一 ID (必須是唯一的正整數) log_bin=mysql-bin # 啟用 Binary Log,這是複製的基礎 binlog_format=ROW # 設定 Binary Log 的格式 (ROW 格式更安全,推薦使用) # binlog_do_db=mySite # 可選:只記錄特定資料庫的操作 (如果只想複製 mySite) # binlog_ignore_db=other_db # 可選:忽略特定資料庫的操作 bind-address=192.168.1.100 # 確保 MySQL 監聽的是 Master 的 IP 位址 (如果需要外部連線)
    • server-id 為你的 Master 伺服器設定一個唯一的整數 ID。在你的複製環境中,每個伺服器都必須有不同的 server-id
    • log_bin 指定 Binary Log 檔案名的前綴。MySQL 會在這個前綴後面加上序列號。
    • binlog_format 設定 Binary Log 的格式。ROW 格式記錄實際的行變更,比 STATEMENT 格式更安全,能避免某些語句在 Slave 上執行結果不一致的問題。MIXED 格式是兩者的混合。
    • binlog_do_dbbinlog_ignore_db 這兩個選項是可選的。如果你只想複製特定的資料庫,可以使用 binlog_do_db 指定;如果你想排除某些資料庫不被複製,可以使用 binlog_ignore_db
    • bind-address 確保 MySQL 監聽的是 Master 伺服器的 IP 位址,以便 Slave 伺服器可以連線。如果需要允許來自任何 IP 的連線,可以設定為 0.0.0.0,但通常建議限制為 Slave 的 IP 或特定的網路範圍以提高安全性。
  2. 重新啟動 MySQL 伺服器:
    • 儲存對配置文件的更改並重新啟動 MySQL 服務,以使配置生效。
    Bashsudo systemctl restart mysql
  3. 建立用於複製的使用者:
    • 登入到 Master 伺服器的 MySQL:
    Bashmysql -u root -p
    • 在 MySQL 命令列中,建立一個專門用於複製的使用者。建議限制這個使用者只能從 Slave 伺服器的 IP 位址連線,以提高安全性。將 <slave_user> 替換為你希望使用的使用者名(例如 replica),並將 <your_password> 替換為安全的密碼:
    SQLCREATE USER '<slave_user>'@'192.168.1.101' IDENTIFIED BY '<your_password>';
    • 授予該使用者 REPLICATION SLAVE 權限:
    SQLGRANT REPLICATION SLAVE ON *.* TO '<slave_user>'@'192.168.1.101';
    • 刷新權限:
    SQLFLUSH PRIVILEGES;
    • 退出 MySQL 命令列:
    SQLexit
  4. 鎖定 Master 資料庫並取得当前的 Binary Log 文件名和位置:
    • 再次登入到 Master 伺服器的 MySQL:
    Bashmysql -u root -p
    • 鎖定所有資料庫,以確保在備份過程中不會有新的寫入操作:
    SQLFLUSH TABLES WITH READ LOCK;
    • 取得当前的 Binary Log 文件名和位置:
    SQLSHOW MASTER STATUS;
    • 記下 FilePosition 的值。你將在配置 Slave 伺服器時需要這些資訊。
    • 不要關閉這個 MySQL 連線! 你需要在鎖定狀態下進行資料備份。
  5. 備份 Master 資料庫:
    • 在另一個終端機視窗中,使用 mysqldump 工具備份 Master 伺服器的資料。你可以選擇備份所有資料庫或特定的資料庫 (mySite)。
    • 備份所有資料庫:
    Bashmysqldump -u root -p --all-databases --master-data=2 > /tmp/master_backup.sql
    • 備份特定資料庫 (mySite):
    Bashmysqldump -u root -p mySite --master-data=2 > /tmp/mysite_backup.sql
    • --master-data=2 選項會在備份檔案中包含 CHANGE MASTER TO 語句,其中包含了当前的 Binary Log 文件名和位置,方便 Slave 伺服器後續配置。
  6. 解除 Master 資料庫的鎖定:
    • 回到之前鎖定資料庫的 MySQL 命令列視窗,執行以下命令解除鎖定:
    SQLUNLOCK TABLES;
    • 退出 MySQL 命令列:
    SQLexit

步驟 2:在 Slave 伺服器 (192.168.1.101) 上配置

  1. 編輯 MySQL 配置文件:
    • 找到 Slave 伺服器上的 MySQL 配置文件(通常也是 /etc/mysql/mysql.conf.d/mysqld.cnf/etc/my.cnf)。
    • 使用文字編輯器打開該文件,並找到 [mysqld] 部分。
    • 進行以下修改或添加:
    程式碼片段[mysqld] server-id=2 # 設定 Slave 伺服器的唯一 ID (必須與 Master 不同) # relay_log=mysql-relay-bin # 可選:指定 Relay Log 的檔案名前綴 (預設即可) # log_slave_updates=1 # 可選:如果這個 Slave 也會作為其他 Slave 的 Master,則需要啟用 bind-address=192.168.1.101 # 確保 MySQL 監聽的是 Slave 的 IP 位址 (如果需要外部連線)
    • server-id 為你的 Slave 伺服器設定一個唯一的整數 ID,必須與 Master 的 server-id 不同
    • relay_log Slave 伺服器會使用 Relay Log 來記錄從 Master 接收到的 Binary Log 事件。預設會自動設定。
    • log_slave_updates 如果這個 Slave 伺服器未來也可能作為其他 Slave 伺服器的 Master,你需要啟用這個選項,讓 Slave 也記錄它執行的更新到自己的 Binary Log 中。
    • bind-address 確保 MySQL 監聽的是 Slave 伺服器的 IP 位址。
  2. 重新啟動 MySQL 伺服器:
    • 儲存對配置文件的更改並重新啟動 MySQL 服務:
    Bashsudo systemctl restart mysql
  3. 匯入 Master 伺服器的備份資料:
    • 將你在 Master 伺服器上備份的 SQL 檔案 (/tmp/master_backup.sql/tmp/mysite_backup.sql) 傳輸到 Slave 伺服器上(例如使用 scp 命令)。假設你將其傳輸到 Slave 伺服器的 /tmp 目錄。
    • 登入到 Slave 伺服器的 MySQL:
    Bashmysql -u root -p
    • 匯入備份檔案:
    SQLSOURCE /tmp/master_backup.sql; # 如果你備份了所有資料庫 # 或者 SOURCE /tmp/mysite_backup.sql; # 如果你只備份了 mySite 資料庫
    • 退出 MySQL 命令列:
    SQLexit
  4. 配置 Slave 伺服器以連接到 Master:
    • 再次登入到 Slave 伺服器的 MySQL:
    Bashmysql -u root -p
    • 使用 CHANGE MASTER TO 命令配置 Slave 連接到 Master。將 <master_ip>, <replication_user>, <replication_password>, <master_log_file>, 和 <master_log_position> 替換為你在 Master 伺服器上取得的實際值和你在 Master 上建立的複製使用者資訊:
    SQLCHANGE MASTER TO MASTER_HOST='192.168.1.100', MASTER_USER='<slave_user>', MASTER_PASSWORD='<your_password>', MASTER_LOG_FILE='<File 值>', MASTER_LOG_POS=<Position 值>;
    • 例如:
    SQLCHANGE MASTER TO MASTER_HOST='192.168.1.100', MASTER_USER='replica', MASTER_PASSWORD='your_secret_password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=123;
  5. 啟動 Slave 的複製進程: SQLSTART SLAVE;
  6. 檢查 Slave 的複製狀態: SQLSHOW SLAVE STATUS\G
    • 仔細查看輸出結果。你需要關注以下幾個重要的欄位:
      • Slave_IO_State: 應該顯示 Waiting for master to send event
      • Slave_SQL_Running_State: 應該顯示 Slave has read all relay log; waiting for more updates
      • Seconds_Behind_Master: 應該是 0 (或非常小的數值),表示 Slave 與 Master 的同步沒有延遲。如果這個值很大,表示 Slave 落後於 Master。
      • Master_Log_File: 顯示 Slave 當前正在讀取的 Master 的 Binary Log 文件名。
      • Read_Master_Log_Pos: 顯示 Slave 在 Master 的 Binary Log 中的讀取位置。
      • Relay_Log_File: 顯示 Slave 當前正在寫入或執行的 Relay Log 文件名。
      • Relay_Log_Pos: 顯示 Slave 在 Relay Log 中的位置。
      • Last_IO_ErrorLast_SQL_Error: 如果有錯誤,這裡會顯示錯誤訊息。確保這兩個欄位都是空的。
  7. 測試複製:
    • 在 Master 伺服器上執行一些寫入操作(例如插入、更新、刪除資料)。
    • 在 Slave 伺服器上查詢資料,確認這些操作是否已經同步過來。

停止和啟動 Slave 複製:

  • 停止 Slave 複製: SQLSTOP SLAVE;
  • 啟動 Slave 複製: SQLSTART SLAVE;

注意事項:

  • 確保 Master 和 Slave 伺服器的時鐘同步,可以使用 NTP 服務。
  • 網路穩定性對於複製至關重要。
  • 監控複製狀態,及時處理可能出現的錯誤。
  • 在生產環境中進行任何配置更改之前,務必在測試環境中進行充分的測試。
  • 如果你的 Master 上啟用了防火牆,請確保允許來自 Slave IP 位址的 MySQL 連接 (預設是 3306 端口)。

完成以上步驟後,你就成功配置了傳統的 MySQL 主從複製。Master 伺服器上的資料變更將會自動同步到 Slave 伺服器。Slave 伺服器可以用於讀取操作,或者在 Master 伺服器發生故障時,可以將 Slave 提升為新的 Master (需要手動操作)。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *