MariaDB HA有幾種類型
1. 同步 -> 也就是galera cluster
2. 半同步 -> Semisynchronous Replication
3. 異步 -> standard replication
本文介紹的就是在Mysql時代早期就有的starndard Replication.
所以是很基本的功能,
不過也玩出了很多花樣,
有MS, MM, MMM, Chain, Circle等等,
其實就是利用MariaDB Server可以是Master+Slave的特性.
0. 在master上確認
0-1. 檢查my.cnf檔
不使用bind-address和skip-networking,這可能會限制遠端連線.
server-id=unique_value , 在同一個replication set內不重複
log-bin = log_name
log-slave-updates=1 => slave想同時具有master資格時使用
0-2. 建立使用者
mysql> CREATE USER 'replication_user'@'ip' IDENTIFIED by 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'slave_ips';
mysql> FLUSH PRIVILEGES;
************************補充說明主從的binary log行為**********************
A. log-bin => 對該台Server操作時會寫入日誌,也就是binary log, 使用 show master status\G; 檢查有無啟動.
B. relay-log => Slave Server透過 IO thread向Master Dump thread要求資料,dump thread將binary log內容傳給slave IO thread,並記錄於relay-log內,slave主機SQL thread再從relay-log解出應用到Slave Server上 (這是replication的流程)
C. log-slave-updates => 當Slave Server開啟此選項時,從relay-log應用的行為會寫入Slave Server的log-bin日誌中,好讓這些行為能被以此Server為Master的Slave所獲得.
否則一般情況下從Master來的行為不會記錄在log-bin檔案內.
******************************************************************************
1. 備份 參考mysqldump
1-1. 從Master (特別說明不要lock 或 維護時執行)
mysqldump -uuser -p --skip-lock-tables --single-transaction --master-data=2 --databases db1 db2 > dumpfile.sql
1-2. 從Slave(建議)
mysql> stop slave 'connection_name' SQL_THREAD;
mysql> show slave 'connection_name' status\G;
(顯示的Relay_Master_Log_File和Exec_Master_Log_Pos代表新slave連接原master作為master時,步驟3所需填入的值)
shell> mysqldump -uuser -p --master-data=2 --databases db1 db2 > dumpfile.sql
(備份檔內的MASTER_LOG_FILE和MASTER_LOG_POS代表新slave將slave做為mster時,步驟3所需填入的值)
mysql> start slave 'connection_name';
或者
mysql> stop slave 'connection_name' SQL_THREAD;
mysql> show slave 'connection_name' status\G;
shell> mysqldump -uuser -p --dump-slave=2 --databases db1 db2 > dumpfile.sql
(備份檔內的MASTER_LOG_FILE和MASTER_LOG_POS代表新slave連接原master作為master時,步驟3所需填入的值)
mysql> start slave 'connection_name';
2. 還原
shell> mysql -uuser -p < dumpfile.sql
3. 設定Slave
mysql> CHANGE MASTER 'connection_name' TO
MASTER_HOST='master_ip',
MASTER_USER='replication_user',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='',
MASTER_LOG_POS=,
MASTER_CONNECT_RETRY=10;
4. 啟動
mysql> start slave 'connection_name';
5. 檢查
mysql> show slave 'connection_name' status\G;
6. Global Transaction ID , 中文參考(詳盡)
首先GTID的使用比較傳統的方式,有兩方面重要進步,
a. 容易切換Master Host,不用重新找新Master需要使用的起始點.
b. Slave狀態屬於crash-safe,主要因為將紀錄Slave狀態的GTID位置與修改複寫表格數據包在同一個交易內.所以crash的話,數據與斷點會一致.
設定方面,
CHANGE MASTER 'connection_name' TO時,
不使用MASTER_LOG_FILE和MASTER_LOG_POS,
而是用MASTER_USE_GTID= slave_pose | current_pos | no取代.
也可以很方便的利用BINLOG_GTID_POS("LOG_FILE", LOG_POS)函式,轉換成GTID位置.
利用GTID的優點,可以很好的處理failover後的自動重跟.
參考
Setting Up Replication
MySQL高可用淺析:MySQL HA方案
MySQL 資料複製基礎介紹