MariaDB Replication 設定

從上次買了 KVM 的虛擬主機之後,一直到現在都還沒時間處理好,這幾天終於撥出一點時間處理,這篇記錄下設定的經過。

本篇內容主要參考 MariaDB : Replication Setting 加上自己的註解,一方面備份文章及過程,如果英文不錯或需要更詳細內容的,可以直接到那邊看!

緣由

小蛙的機器都是三更半夜進行一次備份,並且自動把備份 sync 到 Google Drive 上,可參考 一個腳本每天自動備份gdirve 讓你在 Linux 文字介面也能好好使用 Google Drive 這兩篇。前陣子多買了一台 KVM 虛擬主機想要來玩 docker,一直遲遲沒有進展,這一兩天有一點時間,決定讓 MariaDB 同步寫入兩台資料庫中,這樣如果 Master DB 掛掉或出問題的話,馬上切到 Slave DB 上,跟之前備份的差別在於,備份的時間是在每天深夜,如果壞掉還原的資料時間點也是在該時刻,換成 Replication 的方式的話,就可以回到掛掉前的時間點。(小蛙的內容也沒有常常更新拉,只是想玩看看 MariaDB Replication 而已 …)

開始之前

開始之前先確認一些概念

  • 會有一台主要的資料庫 master (廢話)
  • 會有一台次要的資料庫 slave (廢話 again)
  • 主要的寫入都是在 master 裡面
  • slave 不提供資料寫入
  • 當 master 有資料寫入時,會自動觸發寫入 slave

這樣看起來應該沒問題吧!接著會進行的步驟大概是:

  • 編輯 master 設定檔
  • 在 master 建立一個供 slave 連線的使用者
  • 記下 master 的連線及同步設定
  • 匯出 master 的所有資料
  • 編輯 slave 設定檔
  • 匯入資料到 slave
  • 在 slave 上設定 master 的連線資訊
  • 檢查是否正常運作

設定 Master

修改 MariaDB 設定

# 使用文字編輯器修改設定檔
vim /etc/mysql/mariadb.conf.d/50-server.cnf
# 搜尋 bind-address 並修改成自己連線的 IP
bind-address = 10.0.0.1
# 搜尋 server-id,修改成自己想要設定的 ID
# 可以隨便設定,只要每一台都不同即可
server-id = 101
# 搜尋 log_bin,取消註解
log_bin = /var/log/mysql/mysql-bin.log
# 離開文字編輯器
:wq!
# 重啟 mariadb
systemctl restart mariadb

進入資料庫建立一個供 slave 連線的使用者

# 登入 mariadb
mysql -u root -p
# 進入 mariadb 之後建立 slave 使用者
# 這邊要注意 
# a. '%' 表示任意主機,也可限定主機名稱或 IP 較安全
# b. 'your password' 改成從 slave 要連線過來的密碼          
MariaDB [(none)]> grant replication slave on *.* to replica@'%' identified by 'your password'; 
# 讓上述設定生效
MariaDB [(none)]> flush privileges;

把 master lock 住,取得 master 的資訊

# 把資料表鎖住,避免匯出的當下有資料變動
MariaDB [(none)]> flush tables with read lock; 
# 查看 master 的狀態,把 File 跟 Position 記下來
MariaDB [(none)]> show master status; 
# 離開 mariadb
MariaDB [(none)]> exit;

開始匯出 master 所有資料

# 匯出所有資料
mysqldump -u root -p --all-databases --lock-all-tables --events > mysql_dump.sql 
# 再進入 mariadb 把 lock 狀態解除
mysql -u root -p
MariaDB [(none)]> unlock tables; 
MariaDB [(none)]> exit; 

到這邊 master 的設定差不多就完成了。(這邊記錄的順序跟原文不太一樣,不過達成的目的都相同)

設定 Slave

進入 slave 後,一樣先設定 mariadb 設定檔

# 使用文字編輯器修改設定檔
vim /etc/mysql/mariadb.conf.d/50-server.cnf
# 搜尋 bind-address 並修改成自己連線的 IP
bind-address = 10.0.0.2
# 搜尋 server-id,修改成自己想要設定的 ID
# 可以隨便設定,只要每一台都不同即可
server-id = 102
# 搜尋 log_bin,取消註解
log_bin = /var/log/mysql/mysql-bin.log
# 加入惟獨的屬性
read_only=1
# 設定 hostname
report-host=xxxx.abc.net
# 離開文字編輯器
:wq!
# 重啟 mariadb
systemctl restart mariadb

把剛剛 master 匯出的資料抓回來

# 用法 rsync -avzh 來源 目的地
# 我們從 slave 把檔案從 master 拉過來,
# 因此 rsync -avzh master的連線資訊+檔案 slave的位置
rsync -avzh root@test:/root/mysql_dump.sql ./

把所有資料匯入到資料庫中

# 將 master dump 出來的資料匯入到資料庫中
mysql -u root -p < /root/mysql_dump.sql

設定 master 連線資訊

# 進入 mariadb
mysql -u root -p 
# 設定 master 連線資訊
MariaDB [(none)]> change master to 
    -> master_host='10.0.0.1',               # master IP
    -> master_user='replica',                # 剛剛設定的帳號
    -> master_password='yourpassword',       # 剛剛設定的密碼
    -> master_log_file='mysql-bin.000001',   # 上面得到的 File
    -> master_log_pos=311;                   # 上面得到的 Position

啟動 slave

# 啟動 slave
MariaDB [(none)]> start slave;
# 查看 slave 狀態
MariaDB [(none)]> show slave status\G 
# Slave_IO_State: Waiting for master to send event
# 如果顯示這樣表示連線成功,正在等待資料更新
# 有可能會有其他錯誤,連線錯誤、無法登入錯誤 ... 等

後記

show slave status\G 可以看到目前同步的狀態,Read_Master_Log_Pos 基本上會跟 show master status; 的 Position 一樣,也可以從 Last_Error 看到目前同步是否發生什麼錯誤。

MySQL / MariaDB / Oracle 相關文章:

    發佈留言

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

    這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料