讀寫分離的實現需要兩個步驟:
第一:讀寫操作分別指向不同伺服器。
第二:不同伺服器的資料保持同步。
這裡面的知識含量非常的大,我要做的是將流程儘量簡化進行部落格記錄,方便日後更加直接高效的部署資料庫。
讀寫操作部分對於開發者來說最常用的方式是在專案中根據sql型別進行選擇不同的資料庫地址,如insert update 走主庫 select走從庫,還有一種方式是使用第三方開發的中介軟體服務。
這篇部落格主要記錄主從複製。
在網上找了一張圖,雖然醜了點,但意思就是這樣
如圖所示,完成主從複製的整個流程需要三個程式:
(為了思路清晰,我特意按照順序進行闡述)
前提:開啟二進位制日誌記錄後,主庫每次提交事務完成資料更新前,會將資料更新的事件記錄到二進位制日誌中,然後才會進行事務提交。
1.從庫I/O執行緒:此執行緒會跟主庫建立一個客戶端連線,連線建立完成後,主庫上會啟動一個二進位制轉儲執行緒。
2.主庫二進位制轉儲執行緒:負責讀取主庫上的二進位制日誌中的事件,讀取到後,從庫I/O執行緒會將事件記錄到從庫的中繼日誌中。
3.從庫的SQL執行緒:該執行緒從中繼日誌中讀取事件並在從庫中執行,從而實現資料更新。
接下來,我將根據標準流程部署主從複製。
我這裡開了兩臺虛擬機器,centos1為主庫,centos2為從庫。
建立複製賬號:
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO qq000@'192.168.31.%' IDENTIFIED BY 'ZZZxxx/123456'
此sql主從都需執行一遍,至於主從都賦予這兩個許可權是因為從庫需要有隨時變成主庫的準備。
主庫配置:
vim /etc/my.cnf
log_bin = mysql-bin
server_id = 1
(log_bin為二進位制日誌指定名稱可自定義,server_id需要唯一,我的centos1設為1,centos2設為2)
配置好後重啟MySQL:
systemctl restart mysqld
在MySQL中執行:
show master status;
會看到MySQL已經建立了二進位制日誌檔案
從庫配置:
vim /etc/my.cnf
log_bin = mysql-bin
server_id = 2
relay_log = /var/lib/mysql/mysql-relay-bin
log_slave_updates = 1
read_only = 1
(
relay_id指定中繼日誌的路徑,
log_slave_update允許從庫將其重放的事件也記錄到自身的二進位制日誌中,
read_only是設定從庫只讀狀態 但不會影響slave同步複製的功能。
)
重啟MySQL:
systemctl restart mysqld
在從庫中執行sql進行復制目標的配置:
CHANGE MASTER TO
MASTER_HOST='192.168.31.244',
MASTER_USER='qq000',
MASTER_PASSWORD='ZZZxxx/123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=0;
開始複製:
START SLAVE
檢視狀態:
SHOW SLAVE STATUS
接下來很大機率就是解決各種報錯的問題了
這兩個欄位 必須為yes
如果不對,那麼下面這個欄位會有報錯資訊:
或者配置資訊有誤,或者防火牆不通(firewalld selinux),或者從庫本身的資料和主庫有比較大的差異。
如果出現表存在庫存在的錯誤 可以用如下兩條三條sql搞定:
stop slave;
set global sql_slave_skip_counter=1;
start slave;
錯誤處理完成後 在主庫建立一張表test_a
從庫自動同步