前言
前篇說了作為運維在數據庫塊最起碼要會兩大技能,今天來說說第二技能--主從復制
隨著業務的增長,一臺數據庫服務器以滿足不了需求了,負載過重,這時候就需要減壓,實現負載均衡讀寫分離,一主一從或一主多從
主服務器只管寫,從服務器管讀,從而提高效率減輕壓力。
主從復制分類:
主從同步:當用戶寫數據主服務器必須和從服務器同步一致了才告訴用戶寫入成功,等待時間太長
主從異步:只要用戶訪問寫數據主服務器寫入立馬返回給用戶成功
主從半步同步:當用戶訪問寫數據主服務器寫入并同步其中一個從服務器就返回給用戶成功
備注:通常都是使用的主從異步,根據環境需求來選擇,想要數據更安全選擇半步同步
主從復制注意事項
注意:selinux策略、防火墻
1、開啟二進制日志
2、設置二進制記錄格式為ROW(推薦)
3、設置唯一server-id
4、設置datadir中日志名稱(可選)
5、創建有復制權限的用戶賬號
6、如果要啟用級聯復制,需要在從服務器啟用
7、限制從服務器為只讀
8、禁止主機名解析
9、高可用從服務器要加上
10、如何保證主從復制的事務安全(根據需求添加)
1)在master節點啟用參數:
2)如果用到的為InnoDB存儲引擎:
3)在slave節點啟用參數:
主從復制原理
如圖
備注:
主從同步有延遲,為什么?因為它時是單線程傳送日志
實戰-實現主從復制+高可用
準備工作
準備4臺主機67、17、37、57,分別充當角色為管理主機、主服務器、2個從服務器
安裝包:和主服務器同版本的mysql數據庫包、和高可用安裝包
mha4mysql-manager
mha4mysql-node
比如主服務器已經運行了1年了,發現滿足不了需求了,需要搭建從服務器,我們先從搭建從服務器開始
備注:首先確保主服務器開啟了二進制日志
確認二進制文件已啟動
MariaDB [(none)]> show variables like '%log_bin%'
確認server-id
MariaDB [(none)]> show variables like 'server%';
主服務器設置
1、創建可用于復制的賬號
2、完全備份數據(用于在從服務器上來還原)
備注:備份時的某表的狀態
為了下面的實驗測試在這里我們備份玩再增加一條記錄
insert hellodb.students (name,age)values('gaoda001',20);
3、傳送到從服務器37、57上
scp…
37、57(從)服務器設置
1、配置文件
1)開啟二進制日志
2)設置server-id(要和主服務id區分開)
備注:57設置為3 只要他們不相同就可
3)從服務器設置為只讀
4)禁止主機名解析
5)數據和索引分開存放
6)重啟或啟動服務
備注:以防萬一可以查看下最重要的兩項開啟了沒有
2、實現復制
1)進入數據庫查找同步代碼
2)根據情況編輯上圖上的信息
注:起始位置可以在完全備份文件里查看
兩種方式:
① 先還有完全備份數據再拿以上信息編輯下,在數據庫中執行
② 直接把上面的信息添加到完全備份文件里
下面用第二種方式來操作如圖
3)37主機還原并查看
mysql < all-2018-08-08.sql
備注:以還原到備份時的狀態
主服務器備份完有用戶新加數據對吧,下面開啟主從復制看看能不能復制過來最新的數據
4)查看復制狀態
MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 192.168.43.17
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000005
Read_Master_Log_Pos: 385 #從主服務器讀取到的位置
Relay_Log_File: centos7_05-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql-bin.000005
Slave_IO_Running: No #表示還沒開啟
Slave_SQL_Running: No #表示還沒開啟
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: 385
Relay_Log_Space: 256
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: NULL ##注意這個 表示同步時間差
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: 0
Master_SSL_Crl:
Master_SSL_Crlpath:
Using_Gtid: No
Gtid_IO_Pos:
Replicate_Do_Domain_Ids:
Replicate_Ignore_Domain_Ids:
Parallel_Mode: conservative
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State:
1 row in set (0.03 sec)
5)開啟主從復制并查看狀態
start slave;
MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.43.17
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000005
Read_Master_Log_Pos: 608
Relay_Log_File: centos7_05-relay-bin.000003
Relay_Log_Pos: 778
Relay_Master_Log_File: mysql-bin.000005
Slave_IO_Running: 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: 608
Relay_Log_Space: 1092
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_SSL_Crl:
Master_SSL_Crlpath:
Using_Gtid: No
Gtid_IO_Pos:
Replicate_Do_Domain_Ids:
Replicate_Ignore_Domain_Ids:
Parallel_Mode: conservative
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
1 row in set (0.00 sec)
6)查看表確認有沒有從主服務器同步最新的數據
7)57(從服務器同樣的設置)
備注:目前現實了異步同步復制,下面來看半同步設置
半同步設置
主服務器設置
1、首先在主服務器上安裝插件
備注:
show plugins; ##查看當前系統中的插件列表
UNINSTALL PLUGIN rpl_semi_sync_master;##卸載插件
2、查看插件狀態
3、開啟
備注:最好寫在配置文件中
4、查看插件變量狀態
SHOW GLOBAL STATUS LIKE '%semi%';
備注:這里記錄有幾個半同步主機
從服務器設置
1、安裝插件
2、啟動插件
備注:同樣建議寫在配置文件中
3、從服務器查看改插件是否開始工作
SHOW GLOBAL STATUS LIKE '%semi%';
為什么沒有開始工作?
因為是先開啟的主從復制再安裝的次插件
所以這種情況下,先停止從服務器的主從復制功能
1)停止:
2)再次開啟主從復制
3)再去查看
備注:現在就啟用了半同步功能,下面開始搭建高可用,實現主服務器宕機自動提升從服務器當主
MHA高性能
備注:四臺主機之間必須是ssh基于key驗證登陸,所以要先實現ssh互相鏈接
步驟:
ssh-keygen
cd .ssh
ssh-copy-id 192.168.43.67
把.ssh目錄考到其他主機
1、在主服務器上創建管理者賬號
2、在67管理主機上安裝以下包
3、在17、37、57安裝如下包
mha4mysql-node
4、在管理主機創建管理節點
根據上面創建的信息填寫
[
備注:
candidate_master=1:是說主服務器宕機了帶有這項的主機有機會當主
5、測試
1)ssh協議
2、檢查復制
3、啟動(默認前臺執行)
備注:如果你是編譯安裝在/etc/mastermha/app1.cnf配置文件中指定日志路徑,最好主從服務器數據庫設置的位置都是一致的。