如何在Synology Docker上設定MariaDB的Master-Slave模式

本篇參考文章:

Docker上的MariaDB安裝

  1. 到「倉庫伺服器」下載需要的MariaDB映像檔
  2. 在「映像檔」中點選剛才下載的映像檔,然後點選「部署」
  3. 接著依序依照自己的需求設定裡面的值即可

需要注意的是,在進行佈署(建立)時,記得新增以下參數

  • MYSQL_ROOT_PASSWORD=root密碼
  • MYSQL_ROOT_HOST=%(如果你有需要)

資料的複製

Master

mysqldump指令的參數,可以參考 Mysqldump參數大全

將指定資料庫的資料,dump至.sql檔

> mysqldump -u root -p --databases dbA dbB dbC --lock-all-tables --events > mysql_dump.sql

登入 mariadb 把 lock 狀態解除

> mysql -u root -p
MariaDB [(none)]> unlock tables; 
MariaDB [(none)]> exit; 

Slave

將剛才產生的.sql匯入Slave的資料庫中

> mysql -u root -p < /路徑/mysql_dump.sql

Master端的設定

設定my.cnf

修改my.cnf

  • 如果是套件中的mariadb 10:usr/local/mariadb10/etc/mysql/
  • 如果是docker中的mariadb:要透過docker進入該終端機,/etc/mysql/
  • 如果是windows下的mariadb:C:/Program Files/MariaDB XXX/data/
  • 如果是windows下docker desktop的mariadb:/etc/mysql/
  • 如果是windows下docker desktop的bitnami/mariadb:/opt/bitnami/mariadb/conf/

如果在docker中沒有vi等的文字編輯器,可以參考這篇「在docker內安裝vi/nano文字編輯器」。

[mariadb]
log-bin                         # enable binary logging
server_id=111                   # 唯一識別Mariadb伺服器的數字

# binlog名稱前綴的配置參數(非必要)
#log-basename=master
#binlog-format=MIXED            # default,其他有statement、row

# 需要被同步的資料庫名稱,沒設定時就會同步所有資料庫
# binlog-do-db用於指定主伺服器應記錄哪些資料表的更新
binlog-do-db=DB_A,DB_B,DB_C

# 不需要被同步的資料庫名稱
# binlog-do-db 參數將覆蓋 binlog-ignore-db 參數
binlog-ignore-db=mysql,information_schema

# 跳過master-slave複製中遇到的所有錯誤或指定類型的錯誤,避免slave端複製中斷。
#slave_skip_errors=1062

Master的必要參數

參數說明預設值可能的值
server-id主伺服器的唯一識別號。1 到 2^32-1 之間的整數
log-bin是否啟用二進位日誌。OFFON 或 OFF

Master的非必要參數

參數說明預設值可能的值
binlog-format二進位日誌格式。STATEMENTROW、STATEMENT 或 MIXED
binlog-do-db應記錄在二進位日誌中的資料庫。資料庫名稱的逗號分隔列表
binlog-ignore-db不應記錄在二進位日誌中的資料庫。資料庫名稱的逗號分隔列表
expire_logs_days二進位日誌檔案的保留天數。00 到 65535 之間的整數
max_binlog_size二進位日誌檔案的最大大小。1GB1GB 到 2TB 之間的大小
log-basename二進位日誌檔案的名稱前綴。binlog

確認master的狀態

  1. 重新啟動mariadb
  2. 透過終端機登入mariadb,並確認master的狀態
# 登入mariadb
> mysql -u root -p
> 輸入root的密碼

# 輸入指令確認master狀態
MariaDB [(none)]> show master status;
show master status後,要記住File與Position這兩個欄位的欄位值,在之後的Slave設定中會使用到。

建立複製用的帳號

MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'%' IDENTIFIED BY '12345678';
MariaDB [(none)]> FLUSH PRIVILEGES;

Slave端的設定

設定my.cnf

[mariadb]
skip_name_resolve = ON
server-id = 2

# 要同步的資料庫
replicate-do-db = DB_A,DB_B         
# 要同步的表格
replicate_wild_do_table=DB_A.%
replicate_wild_do_table=DB_B.%
# 忽略指定資料庫
#replicate_ignore_db=MasterC 
#忽略指定資料表
#replicate_ignore_table=MasterB.table1

skip-slave-start = FALSE       # Slave重啟時,會自動啟動slave的模式

# 中繼日誌檔名稱
relay-log = slave-log
read_only = 1

# 從伺服器是否應跳過錯誤(非必要)
slave-skip-errors = off

# 回報slave端的位置資訊(非必要)
report-host = 192.168.101.91
report-port = 3306

Slave參數

參數說明預設值可能的值
relay-log中繼日誌檔案的名稱。mariadb-relay-bin有效的文件名
relay-log-index中繼日誌索引檔案的名稱。mariadb-relay-bin.index有效的文件名
relay-log-pos從伺服器在中繼日誌中的位置。00 到 232-1 之間的整數
slave-skip-errors從伺服器是否應跳過錯誤。off、all、error_code、ddl_exist_errors
slave-net-timeout從伺服器等待主伺服器響應的超時時間。601 到 65535 之間的整數
slave-exec-mode從伺服器如何執行更新。STRICTSTRICT、IDEMPOTENT、NO_FK_CHECKS
report-host從伺服器應向其報告其狀態的主機名或 IP 位址。localhost有效的 IP 位址或主機名
report-port從伺服器應向其報告其狀態的埠號。33061 到 65535 之間的整數

說明:

ddl_exist_errors:Slave伺服器將跳過以下錯誤號:

  • 1007:資料庫已存在,創建資料庫失敗。
  • 1008:資料庫不存在,刪除資料庫失敗。
  • 1050:資料表已存在,創建資料表失敗。
  • 1051:資料表不存在,刪除資料表失敗。
  • 1054:欄位不存在,或程式檔案跟資料庫有衝突。
  • 1060:欄位重複,導致無法插入。
  • 1061:重複鍵名。
  • 1068:定義了多個主鍵。
  • 1094:位置執行緒 ID。
  • 1146:資料表缺失,請恢復資料庫。

資料的匯入

確認master、slave兩端的資料一致,將master的資料匯出為xxx.sql,然後在slave端匯入。

#登入mariadb
> mysql -u root -p

> create database DB_NAME;
> use DB_NAME;
> source /path/xxx/abc.sql

建立Slave連線

#登入mariadb
> mysql -u root -p -P 3306

> CHANGE MASTER TO 
-> MASTER_HOST='aaa.com.tw',     # master端的位置
-> MASTER_USER='repluser',
-> MASTER_PORT=3306,
-> MASTER_PASSWORD='12345678',
-> MASTER_LOG_FILE='master-bin.000025',  # 由之前master的show master status得知
-> MASTER_LOG_POS=761;                   # 由之前master的show master status得知

啟動Slave連線

> START SLAVE;

確認Slave是否啟動執行?

> show slave status \G

確認以下的兩個狀態是否為Yes

  • Slave_IO_Running:Yes
  • Slave_SQL_Running:Yes

其他操作與錯誤排除

  • 透過命令提示字元執行「mysql」時,找不到這個指令
    • 到「檢視進階系統設定」(直接按windows鍵後,尋找「檢視進階系統設定」字串即可),到「環境變數」中新增變數「Path」裡的值。在Path中新增MariaDB的bin路徑,例如「C:\Program Files\MariaDB 版本\bin」。
  • 如果要停止Slave端的運作,可以使用以下指令
> STOP SLAVE;
  • 如果Slave端在設定時發生「Could not initialize master info structure for ”; more error messages can be found in the MariaDB error log」的錯誤訊息,可以透過以下指令來排除。
> reset slave;