了解昨天提到的主從運作流程後,今天來實際搭建主從架構~
在前面我們起了一台VM當作Master,現在在新增一台VM當作Slave,讓Slave能夠連接到Master完成主從複製功能。 ps.參考Day.3 部署流程
跳過Slave部署mysql流程. . .
1.確認Master配置有開啟binlog設定 (設定檔: /etc/mysql/my.cnf)
[mysqld]
#確保與要連線的slave ID不同(唯一)
server-id = 1
#binlog(ON)&設定檔名以mysql-bin開頭
log-bin = mysql-bin <- (確認有設定)
#binlog的格式(模式:row/statement/mixed)
binlog-format = row
#保留x天binlog (default:0,表示不自動刪除)
expire_logs_days = 1
#寫緩衝x次,刷一次磁碟(0:預設系統每隔一段時間重整快取資料到磁碟,1:每次事務提交就會寫入磁碟,N:每N個事務提交...)
sync-binlog = 1
...
mysql> CREATE USER 'replicate'@'%' IDENTIFIED BY '1234';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replicate'@'%';
mysql> FLUSH PRIVILEGES;
root@mysql-master-1:/mnt/mysql_data/mysql# mysqldump -uroot -p1234 --routines --events --single-transaction --master-data=2 --flush-logs --all-databases >
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000004 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
[client]
#mysql 客戶端連線服務端預設port
port=3306
socket=/mnt/mysql_data/mysql/mysql.sock
[mysqld]
#mysql使用socket方式登陸的sock檔案路徑
socket=/mnt/mysql_data/mysql/mysql.sock
#mysql 資料庫檔案所在目錄
datadir=/mnt/mysql_data/mysql
#錯誤日誌路徑
log-error=/var/log/mysql/error.log
#mysql服務端預設監聽port
port=3306
# 設定字符集utf8
character_set_server=utf8
#slow log是否開啟(1啟用/0禁用)
slow-query-log = 1
#慢查詢日誌路徑&檔名
slow_query_log_file=/mnt/mysql_data/mysql/slow.log
#執行超過x秒就紀錄 (EX: 1s)
long_query_time = 1
#服務器ID,注意要與master的server_id不同(唯一)
server-id = 2
#relay_log 配置中繼日誌
relay-log=/mnt/mysql_data/mysql/slave1-relay-bin
#只讀狀態
read_only = 1
#====slave crash-safe====
#master.info和relay-log.info內容寫入DB:mysql中的表
master_info_repository = TABLE
relay_log_info_repository = TABLE
#意外時重啟後會忽略未被執行的relay log,重新連接master獲取relay log來進行恢復
relay-log-recovery = 1
...
root@mysql-slave-1:/mnt/mysql_data/mysql# systemctl restart mysql
mysql> change master to master_host='10.128.0.4',master_user='replicate',master_password='1234',master_log_file='mysql-bin.000004',master_log_pos=154;
mysql> start slave;
最後確認一下狀態是否成功連接就完工啦
如果主從有同步異常停止時,會造成讀取資料不一致,影響業務上運作。
所以如何快速第一時間檢視問題點 ?
1.透過show slave status 瀏覽狀態
2.錯誤日誌
ex.假設今天先在slave刪掉了一筆紀錄。那當我在master執行刪除同一筆資料,語法同步至slave時會產生該筆資料不存在的問題,等於SQL-thread提取的日誌無法應用在slave上會噴下圖1032錯誤,造成同步失敗停止。因為對於slave來說該筆資料早就被刪除了!!
以上面例子來說可以看到錯誤提示為在Master-(mysql-bin.000004, end_log_pos 1010)位置的DELETE事件錯誤,由於在slave上要執行刪除的資料已經不存在,所以在這邊我們可以透過還原被刪除的資料,逆向手動執行INSERT那筆要被刪除的資料讓DELETE語法能順利執行。
首先在master上透過錯誤提示位置找到該event紀錄的詳細欄位資訊用來還原該筆資料。
在slave上執行還原插入資料後重啟複製線程
mysql> insert into user.user_powers(user_id,nick_name,group_id) values(23122141,'kiki',1242000);
mysql> start slave;
以上算是針對該問題安全解決的做法。但有時看情況也可選擇直接跳過該錯誤Event,如果不會影響到資料的一制性(ex.本例)
mysql> stop slave;
#代表跳過這1個event
mysql> SET GLOBAL sql_slave_skip_counter = 1;
mysql> start slave;
提供2種方式沒問題的話就可以看到Slave_SQL_Running狀態恢復成YES正常運作啦~