前提
本方案是兩節點主從方案,只要建立好主從,及時數據庫掛掉又拉起主從模式不會失效。
- 保證時間同步
- 保證都安裝了
mysql/mariadb
建立主從的過程
這裏介紹的是兩節點主從,如果是集羣模式,至少需要三個節點,因爲偶數個節點是導致腦裂高發的原因(無法確定該同步誰的)。
- 主從服務器節點設置不同的
server-id
- 啓用二進制日誌和
relaylog
- 主節點創建一個擁有複製權限的用戶賬號
- 查詢主節點
binlog
信息 - 設置從節點同步主節點
停止所有寫入
在所有服務器上執行此步
在所有服務器上執行此步
在所有服務器上執行此步
停止所有寫入是爲了防止數據設置同步的過程中數據不一致。
如果 mariadb
是通過 hosts
文件中的域名進行訪問的,那麼只需要編輯 /etc/hosts
, 把mysql
的域名解析刪掉就可以停止所有讀寫,執行以下命令。
關掉所有讀寫mysql
的服務,你也可以直接用iptables
來禁用端口通信(如果應用有自動重連機制的話,否則只能重啓應用了)
等待 1 分鐘,依次進入集羣中所有的 mariadb
,查看進程狀態,確保沒有額外的讀寫操作( command
列除了 show processlist
外沒有多餘的 sleep
和 query
)。
MariaDB [(none)]> show processlist;
備份與導入
首先,你需要保證所有的節點數據一致,在升級過程中萬一升級失敗能及時的恢復數據。
請參考本小冊備份數據庫
添加一個專門用來同步的用戶
在從節點中的 mariadb
執行以下命令,如果全部輸出 ok,則繼續。
/usr/local/mariadb/bin/mysql -A -e "GRANT replication slave ON *.* TO 'rep'@'%' IDENTIFIED BY '123456'; flush privileges;"
mysql -A -urep -p123456 -e "select 'ok';"
停止所有節點
執行以下命令停止
/usr/local/mariadb/bin/mysqladmin shutdown
此時節點應該自動停止了,檢查是否沒有 mariadb
和 mysql
進程,如果有按需求判斷是否停掉(kill
)。
ps -ef | grep -E "mariadb|mysql"
更新 mysql 配置(從節點)
先創建relaylog
日誌存儲的目錄,用來防止同步波動緩存同步信息。(注意,請設置成你自己的數據目錄)
mkdir /data/mariadb/relaylog
chown -R mysql.mysql /data/mariadb/relaylog/
添加配置到 [mysqld]
配置節中(注意現在不啓動),該配置表示我們只同步 cloud
庫和其下的表,如果要同步更多的庫和表可以用逗號分隔,追加。
如果想了解各個參數是什麼含義可以到本小冊relaylog裏看
vim /etc/my.cnf.d/server.cnf
# 添加內容如下
replicate-do-db=cloud #cloud是你想同步的庫名,如果有多個請用逗號隔開
log-slave-updates
replicate-wild-do-table=cloud.% #cloud是你想同步的庫名,cloud.% 代表這個庫下面的所有表,如果有多個請用逗號隔開
binlog-ignore-db=mysql # 忽略mysql庫
slave-skip-errors=1032,1062,1053,1146,2003
max_relay_log_size = 0
relay_log=/data/mariadb/relaylog/relay-bin #請設置成正確的目錄,上面剛剛創建的那個,最後的relay-bin是文件前綴
relay_log_purge = 1
relay_log_recovery = 1
sync_relay_log =0
sync_relay_log_info = 0
slave-skip-errors=1032,1062,1053,1146,2003
參考添加成功的圖片
啓動主節點並獲取主節點信息
如果你的目錄不同請自行修改
mkdir -p /var/run/mariadb; chown -R mysql:mysql /var/run/mariadb; /usr/local/mariadb/bin/mysqld_safe --datadir=/data/mariadb/data --pid-file=/var/run/mariadb/mariadb.pid > /dev/null 2>&1 &
獲取同步主節點的關鍵信息
進入主節點數據庫中,執行命令
unlock tables;
show master status;
得到同步主節點的關鍵信息
啓動從節點並設置同步信息
mkdir -p /var/run/mariadb; chown -R mysql:mysql /var/run/mariadb; /usr/local/mariadb/bin/mysqld_safe --datadir=/data/mariadb/data --pid-file=/var/run/mariadb/mariadb.pid > /dev/null 2>&1 &
建立主從結構
進入從節點的數據庫,指定主庫信息,完成主從關係建立(注意:下面命令中的【主節點 ip 地址】別忘記替換,使用 eth0
本地網卡的 ip
,不要使用浮動 ip
,也不要使用 vip
)
賬號和密碼就是我們剛剛設置的,
unlock tables;
CHANGE MASTER TO
MASTER_HOST='主節點的ip地址',
MASTER_PORT=3306,
MASTER_USER='rep',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000171',
MASTER_LOG_POS=33105258;
start slave; #開始同步
查看 slave 的狀態,注意查看 slave 的進程狀態,下面紅色方框中圈起來的是兩個 Yes
就表示狀態正常了,注意等待主庫複製的延遲秒數變爲 0 Seconds_Behind_Master: 0
show slave status \G
the end
可能遇到的坑
請根據你的業務寫入速度和同步速度,設置好主節點的binlog
大小和過期時間,具體設置方法請參考本小冊
mysql 正確清理 binlog 日誌的兩種方法中的方法二、通過設置 binlog 過期的時間,使系統自動刪除 binlog 文件。
如果你想建立互爲主從
如果你想建立互爲主從,那麼你可以把主節點當作從節點,把從節點當作主節點,從本文的
添加一個專門用來同步的用戶開始重新執行,直到最後一步。