Skip to main content

MariaDB Replication 複寫

  因 BUBU 很早之前就想要測試看看 MariaDB 複寫功能了,剛好因為使用 PowerDNS 這個服務資料庫是用 MariaDB 來做服務會把一些 DNS 的資訊寫入到資料庫。

運行環境


  環境都是在 「Proxmox VE 」 虛擬系統上架設,都是以 「 LXC 」模式為主,除非有特殊狀況會告知使用 「 VM 」 模式

  • 系統環境: Debian 11、12
  • 資料庫服務: MariaDB 10.6、MariaDB 10.8、MariaDB 11.4

測試過程


Master 設定

  • 先進到 Mariadb 設定檔
vim /etc/mysql/mariadb.conf.d/50-server.cnf
  • 修改設定檔內容如下:
# 設定成允許任意可連線,後續再用防火牆來做來源的限制。
bind-address = 0.0.0.0

# 設定 server-id 這由自己去設定想要的 ID
server-id = 101

# 將這個給取消註解
log_bin = /var/log/mysql/mysql-bin.log

# 設定了保留10天BINLOG(單位:天)
expire_logs_days = 10

# 記錄檔的大小
max_binlog_size = 100M

# 可以指定想要同步的資料表
binlog_do_db = powerdns
  • 設定完重啟資料庫
systemctl stop mariadb && systemctl start mariadb
  • 登入資料庫新增加 slave 連線使用者
mariadb -u root -p

# 新增加使用者並給予權限
GRANT REPLICATION SLAVE ON *.* TO 'pdns-secondary'@'<SECONDARY_SERVER_IP>' IDENTIFIED BY '<SECRET_PASSWORD>';

# 讓剛剛輸入的值生效
flush privileges;
  • 輸出現在資料狀態
show master status \G;
  • 將輸出的畫面上 FilePosition 的值都記錄下來。
Slave 設定

  • 先進到 Mariadb 設定檔
vim /etc/mysql/mariadb.conf.d/50-server.cnf
  • 修改設定檔內容如下:
# 設定 server-id 這由自己去設定想要的 ID
server-id = 102

# 將這個給取消註解
log_bin = /var/log/mysql/mysql-bin.log

# 啟用中繼日誌服務
relay-log=slave-relay-bin

# 中繼日誌索引
relay-log-index=slave-relay-bin.index

# 複寫的資料表
replicate-do-db=powerdns
  • 重啟資料庫
systemctl stop mariadb && systemctl start mariadb
  • 登入資料庫設定 Master 主機相關資訊
mariadb -u root -p

MariaDB [(none)]> change master to master_host='10.0.0.1', master_user='pdns-secondary', master_password='SECRET_PASSWORD', master_log_file='mysql-bin.000001', master_log_pos=311; 
  • 參數說明
參數名稱 說明
master_host Master 主機位置
master_user 連線帳號
master_password 連線密碼
master_log_file 當前日誌檔
master_log_pos 日誌檔中事件啟時
  • 啟動 slave 服務
start slave;
  • 檢查目前 slave 的狀態
show slave status \G;
  • 注意 slave 這兩個項目狀態,都要是 YES 否則同步就會有問題。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

補充說明


  使用情境是在資料很多的設定

  • Master
# 設定 server-id 用於複寫,需在集群中唯一
server-id = 101

# 錯誤日誌文件路徑
log_error = /var/log/mysql/error.log 

# 將這個給取消註解
# 啟用二進制日誌,設定日誌文件路徑
log_bin = /var/log/mysql/mysql-bin.log

# 二進制日誌格式設為 ROW,提升複寫可靠性
binlog_format = ROW

# 每次提交都同步二進制日誌,確保數據一致性
sync_binlog = 1

# 設定了保留10天BINLOG(單位:天)
# 二進制日誌自動刪除的天數,節省磁盤空間
expire_logs_days = 7

# 記錄檔的大小
max_binlog_size = 100M
  • Slave
# 唯一的伺服器 ID
server-id = 102

# 啟用二進位日誌,並指定日誌檔案的前綴
log-bin = /var/log/mysql/mysql-bin.log

# 設定二進位日誌的保留天數
expire_logs_days = 7

# 啟用從伺服器的更新會記錄到自己的二進位日誌
log-slave-updates

# 設定二進位日誌的同步頻率
sync_binlog = 0

# 記錄所有變動的格式,使用ROW格式
binlog_format = row

# 啟用中繼日誌並指定日誌檔案名稱
relay-log = slave-relay-bin

# 指定中繼日誌索引檔案
relay-log-index = slave-relay-bin.index

# 啟用多核心並行處理,設置並行執行緒數量
slave_parallel_workers = 16

# 建議禁用符號鏈接以防止各種安全風險
symbolic-links = 0

# 忽略指定的錯誤,避免複寫中斷(注意:'all'為高風險設定)
slave-skip-errors = 1062,1032

# 中繼日誌自動清理
relay_log_purge = 1

備註


以上設定完成後在主機的服務上設定一些資訊讓這些資訊寫入資料庫後,再去看第二台的的資料庫看是否有正常將資料寫入過來。




參考相關網頁