如何在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/

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

[mariadb]
log-bin                         # enable binary logging
server_id=111
log-basename=master             # 識別名稱
#binlog-format=MIXED            # default,其他有statement、row

binlog-do-db=DB_A               # 需要被同步的資料庫名稱,沒設定時就會同步所有資料庫
binlog-do-db=DB_B
binlog-do-db=DB_C

# 忽略的資料庫binlog
binlog-ignore-db=mysql,information_schema

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

確認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

skip_name_resolve = ON
server-id = 2
relay-log = slave-log
read_only = 1
report-port = 3306
report-host = 192.168.101.91      # slave端的位置
replicate-do-db = DB_A         # 要同步的資料庫
replicate-do-db = DB_B         # 要同步的資料庫
replicate_wild_do_table=MasterA.%
replicate_wild_do_table=MasterB.%

#replicate_ignore_db=MasterA     # 忽略指定資料庫
#replicate_ignore_table=MasterA.table1 #忽略指定資料表

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

資料的匯入

確認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

> 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;