MySQL主從復(fù)制原理與配置
1.什么是主從備份
主從復(fù)制簡單來說就是主庫把增刪改查操作寫入二進制文件,從庫讀取文件,復(fù)制數(shù)據(jù),使得主從數(shù)據(jù)庫保持一致。
主從復(fù)制的優(yōu)勢在于:
- 1.高可用性:主庫出現(xiàn)異常時,快速切換從庫恢復(fù)應(yīng)用
- 2.負載均衡:讀寫分離。主庫寫,從庫讀。但需要其他插件實現(xiàn),比如MaxScale
- 3.備份數(shù)據(jù):從庫數(shù)據(jù)與主庫是一致的,相當(dāng)于一個備份手段
2.原理
如圖可以看到:
主庫接收到客戶端的更新請求后,執(zhí)行內(nèi)部事務(wù)的更新邏輯,同時寫binlog。
備庫 B 跟主庫 A 之間維持了一個長連接。
主庫 A 內(nèi)部有一個線程,專門用于服務(wù)備庫 B 的這個長連接。
一個事務(wù)日志同步的完整過程是這樣的:
- 1.在備庫 B 上通過 change master 命令,設(shè)置主庫 A 的 IP、端口、用戶名、密碼,以及要從哪個位置開始請求 binlog,這個位置包含文件名和日志偏移量。
- 2.在備庫 B 上執(zhí)行 start slave 命令,這時候備庫會啟動兩個線程,就是圖中的 io_thread 和 sql_thread。其中 io_thread 負責(zé)與主庫建立連接。
- 3.主庫 A 校驗完用戶名、密碼后,開始按照備庫 B 傳過來的位置,從本地讀取 binlog,發(fā)給 B。
- 4.備庫 B 拿到 binlog 后,寫到本地文件,稱為中轉(zhuǎn)日志(relay log)。
- 5.sql_thread 讀取中轉(zhuǎn)日志,解析出日志里的命令,并執(zhí)行。
3.配置主服務(wù)器
修改配置文件my.cnf
添加如下配置
server-id=1 # 設(shè)置 id,這個可以是任意數(shù)字 log-bin=/mydata/log/master-bin # 啟動 binlog 日志,名字必須是 log-bin sync_binlog=1 # 確保主從復(fù)制的事務(wù)安全
配置完成后重啟數(shù)據(jù)庫
4.配置從服務(wù)器
修改配置文件my.cnf
添加如下配置
server-id=2 # 這個 id 隨便給,但不要和 master 的一樣 relay-log=/mydata/log/slave-relay # 這里是 relay-log 了,名字必須是 relay-log,備份的名字也就 slave-relay sync_binlog=1 read-only=ON # 開啟只讀模式,確保主備數(shù)據(jù)一致
配置完成后重啟數(shù)據(jù)庫
4.1進入數(shù)據(jù)庫,準(zhǔn)備建立連接
CHANGE MASTER TO MASTER_HOST='192.168.75.20', # master IP MASTER_USER='slave', # master 上創(chuàng)建專門用于備份的用戶 MASTER_PASSWORD='6yhn^YHN', # 及其密碼 MASTER_PORT=3306, # 從這行開始,都可以不輸入,只要上面幾行即可開啟備份(而且最好不要設(shè)置,要不然會挖坑) MASTER_LOG_FILE='master-bin.000002', # master 上 mysql 執(zhí)行 show master status \G 查到的 File MASTER_LOG_POS=602, # master 上 mysql 執(zhí)行 show master status \G 查到的 Position MASTER_CONNECT_RETRY=10; # 設(shè)置超時時間,超過 n 秒沒連接上,則表示 master 掛了
4.2開啟 slave 連接,主備機連接成功,數(shù)據(jù)開始同步
start slave;
4.3查看有關(guān)從屬服務(wù)器線程的關(guān)鍵參數(shù)的信息
show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.75.20 Master_User: slave Master_Port: 3306 Connect_Retry: 60 Master_Log_File: master-bin.000002 Read_Master_Log_Pos: 602 Relay_Log_File: slave-relay.000003 Relay_Log_Pos: 817 Relay_Master_Log_File: master-bin.000002 Slave_IO_Running: Yes # 這里兩個 Yes,則表示連接上了 Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 602 Relay_Log_Space: 1235 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 Master_UUID: d94faa39-e098-11ea-9c51-000c29823fb8 Master_Info_File: /mydata/mysql/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: 1 row in set (0.00 sec)
按照以上步驟即可完成配置
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于Mysql8.0版本驅(qū)動getTables返回所有庫的表問題淺析
這篇文章主要給大家介紹了關(guān)于Mysql 8.0版本驅(qū)動getTables返回所有庫的表問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12關(guān)于mysql數(shù)據(jù)庫連接編碼問題
這篇文章主要介紹了關(guān)于mysql數(shù)據(jù)庫連接編碼問題,默認的編碼和數(shù)據(jù)庫表中的數(shù)據(jù)使用的編碼是不一致的,如果是中文,那么在數(shù)據(jù)庫中執(zhí)行時已經(jīng)是亂碼了,需要的朋友可以參考下2023-04-04SQL?FOREIGN?KEY約束保障表之間關(guān)系完整性關(guān)鍵規(guī)則詳解
這篇文章主要介紹了SQL?FOREIGN?KEY約束保障表之間關(guān)系完整性關(guān)鍵規(guī)則詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12MySQL執(zhí)行SQL文件報錯:Unknown collation ‘utf8mb4_0900_ai_
這篇文章主要給大家分享了MySQL執(zhí)行SQL文件出現(xiàn)【Unknown collation ‘utf8mb4_0900_ai_ci‘】的解決方案,如果又遇到相同問題的同學(xué),可以參考閱讀本文2023-09-09