英特爾 12 代 Alder Lake 處理器烤機:最高 93℃,功耗達 250W
主從同步的定義
Mysql 主從複製是指資料可以從一個Mysql資料伺服器主節點,複製到一個或多個從節點資料伺服器。Mysql 預設採用非同步複製的方式,這樣從節點不用一直訪問主伺服器來更新資料,從伺服器甚至可以通過撥號斷斷續續的連線主伺服器,通過配置檔案,從節點可以複製主資料庫中的所有資料庫或特定的資料庫或特定的表。
主從同步好處
-
讀寫分離,使資料庫可以支撐更大的併發
主伺服器負責寫,從伺服器負責讀,即使出現鎖表的情況,通過讀從庫也可以保證業務的正常進行
降低單臺伺服器的I/O 訪問壓力,提升單臺伺服器I/O 效能
在主伺服器上生成資料,而在從伺服器上分析這些資料,從而提高主伺服器的效能
-
發揚不同表引擎的優點
目前Myisam表的查詢速度比innodb略快,而寫入併發innodb比myIsam要好。那麼,我們可以使用innodb作為master,處理高併發寫入,使用master作為slave,接受查詢。或在myisam slave中建立全文索引,解決innodb無全文索引的弱點
-
資料熱備
提高資料安全,因為資料已經複製到從伺服器,從伺服器可以終止複製程序,可以在從伺服器上備份而不破壞主伺服器相應的資料
主從同步機制
Mysql 伺服器之間的主從同步是基於二進位制日誌機制,主伺服器使用二進位制來記錄資料庫的變動情況,從伺服器通過讀取和執行該二進位制日誌檔案來保持和主伺服器的資料一致性
- slave 執行 change master to 命令 (主庫的連線資訊 + 複製的起點)
- slave 將以上資訊記錄到 master.info 檔案中
- slave 執行 start slave 命令,伺服器立刻開啟 IO 和 SQL 執行緒
- slave IO執行緒 讀取 master.info 檔案中的資訊,獲取到 IP/PORT/USER/PASSWORD/BINLOG 等資訊
- slave IO執行緒 請求連線master 伺服器,master 提供一個 DUMP 執行緒 和 IO執行緒互動
- master DUMP執行緒 將最新的binlog,通過網路傳輸給 salve IO執行緒
- salve IO執行緒 接收到 binlog 日誌,儲存到TCP/IP快取,立即返回ACK給master,並且更新 master.info
- salve IO執行緒 將TCP/IP快取中資料,寫入到磁碟檔案relaylog中(中繼日誌)
- slave SQL 執行緒 讀取relay.info中的資訊,獲取到上次已應用過的relaylog的位置資訊
- slave SQL 會按照上次的位置點回放到最新的relaylog,再次更新relay.info資訊
- salve purge
relay 定期清理
主從複製型別
-
非同步複製
一個主庫,一個或多個從庫,資料非同步同步到從庫
-
同步複製
在MySQL cluster中特有的複製方式
-
半同步複製
在非同步複製的基礎上,確保任何一個主庫上的事物在提交之前至少有一個從庫已經收到該事物並日志記錄下來
-
延遲複製
在非同步複製的基礎上,人為設定主庫和從庫的資料同步延遲時間,即保證資料延遲至少是這個引數
主從配置
Master
新增主從配置 /etc/my.cnf
[mysqld]
server-id=1
log-bin=matser-mysql-bin
binlog_cache_size=1M
binlog-format=MIXED
binlog-do-db=api
binlog-ignore-db=mysql
expire_logs_days=7
引數欄位 | 引數說明 |
---|---|
server-id | 唯一標識 |
log-bin | binlog 日誌路徑 |
binlog_cache_size | binlog 快取大小 |
binlog_format | binlog 格式 Statement ,ROW , MIXED |
binlog-do-db | binlog 記錄的資料庫 |
binlog-ignore-db | binlog 不記錄的資料庫 |
expire_logs_days | 日誌儲存大小 |
建立從伺服器登入賬號,並設定授權
CREATE USER 'slave'@'%' IDENTIFIED BY 'MyNewPass4!';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
FLUSH PRIVILEGES;
重啟mysql服務,並查詢master 狀態
systemctl restart mysqld
mysql> show master status;
+-------------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------------+----------+--------------+------------------+-------------------+
| matser-mysql-bin.000001 | 154 | api | mysql | |
+-------------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
檢視master的binlog的檔名(File)和binlog的偏移量(Position)
Slave
[mysqld]
server-id=2
log-bin=matser-mysql-bin
binlog_cache_size=1M
binlog-format=MIXED
binlog-do-db=api
binlog-ignore-db=mysql
expire_logs_days=7
引數欄位 | 引數說明 |
---|---|
server-id | 唯一標識 |
log-bin | binlog 日誌路徑 |
binlog_cache_size | binlog 快取大小 |
binlog_format | binlog 格式 Statement ,ROW , MIXED |
binlog-do-db | binlog 記錄的資料庫 |
binlog-ignore-db | binlog 不記錄的資料庫 |
expire_logs_days | 日誌儲存大小 |
change master to配置和改變slave伺服器用於連線master伺服器的引數,以便slave伺服器讀取master伺服器的binlog及slave伺服器的relay log。同時也更新master info及relay log info資訊庫。執行該語句前如果從機上slave io及sql執行緒已經啟動,需要先停止(執行stop slave)
change master to master_host = 'ip',master_user='user',master_password='yourpasswod',master_log_file='file',aster_log_pos=position;
change master to後面不指定某個引數的話,該引數保留原值或預設值。所以後續如果某些引數沒有更改的話,change master to後無需帶該引數,例如我們只改變了用於複製的使用者密碼,那麼change master to只需針對MASTER_PASSWORD選項作出修改即可
stop slave;
change master to master_password = 'new_password';
start slave;
全備master資料庫,主從資料庫的資料要保持一致,不然主從同步會出現bug
-
鎖定主資料庫,只允許讀取,不允許寫入,這樣做的目的是為了防止備份過程中或備份完成後有新資料插入,導致備份資料和主資料不一致
flush tablses with read lock;
-
通過主伺服器上全備初始化從伺服器上的資料
[root@localhost data]# cd /usr/local/tmp [root@localhost db_backup]# mysqldump -uroot -p --master-data=1 --single-transaction --routines --triggers --events --all-databases > all.sql Enter password:
-
將sql檔案傳遞給從伺服器,並執行sql檔案
scp /usr/local/tmp/all.sql [email protected] :/usr/local/tmp/ mysql -uroot -p'MyNewPass4!' <all.sql
-
解鎖主伺服器
unlock tables;
開啟主從同步
- 開啟同步命令
start slave;
-
檢視節點狀態