前言前篇說了作為運維在資料庫塊最起碼要會兩大技能,今天來說說第二技能--主從複製隨著業務的增長,一臺資料庫伺服器以滿足不了需求了,負載過重,這時候就需要減壓,實現負載均衡讀寫分離,一主一從或一主多從主伺服器只管寫,從伺服器管讀,從而提高效率減輕壓力。主從複製分類:主從同步:當用戶寫數據主伺服器必須和... ...
前言
前篇說了作為運維在資料庫塊最起碼要會兩大技能,今天來說說第二技能--主從複製
隨著業務的增長,一臺資料庫伺服器以滿足不了需求了,負載過重,這時候就需要減壓,實現負載均衡讀寫分離,一主一從或一主多從
主伺服器只管寫,從伺服器管讀,從而提高效率減輕壓力。
主從複製分類:
主從同步:當用戶寫數據主伺服器必須和從伺服器同步一致了才告訴用戶寫入成功,等待時間太長
主從非同步:只要用戶訪問寫數據主伺服器寫入立馬返回給用戶成功
主從半步同步:當用戶訪問寫數據主伺服器寫入並同步其中一個從伺服器就返回給用戶成功
備註:通常都是使用的主從非同步,根據環境需求來選擇,想要數據更安全選擇半步同步
主從複製註意事項
註意:selinux策略、防火牆
1、開啟二進位日誌
log_bin
2、設置二進位記錄格式為ROW(推薦)
3、設置唯一server-id
server_id=#
4、設置datadir中日誌名稱(可選)
log-basename=master
5、創建有複製許可權的用戶賬號
GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'HOST' IDENTIFIED BY 'replpass';
6、如果要啟用級聯複製,需要在從伺服器啟用
log_bin log_slave_updates
7、限制從伺服器為只讀
read_only=ON
8、禁止主機名解析
skip_name_resolve = on
9、高可用從伺服器要加上
relay_log_purge=0 #不清除中繼日誌
10、如何保證主從複製的事務安全(根據需求添加)
1)在master節點啟用參數:
sync_binlog=1 # 每次寫後立即同步二進位日誌到磁碟,性能差
2)如果用到的為InnoDB存儲引擎:
innodb_flush_log_at_trx_commit=1 # 每次事務提交立即同步日誌寫磁碟 innodb_support_xa=ON # 預設值,分散式事務MariaDB10.3.0廢除 sync_master_info=# # #次事件後master.info同步到磁碟
3)在slave節點啟用參數:
sync_relay_log=# # #次寫後同步relay log到磁碟 sync_relay_log_info=# # #次事務後同步relay-log.info到磁碟
主從複製原理
如圖
備註:
主從同步有延遲,為什麼?因為它時是單線程傳送日誌
實戰-實現主從複製+高可用
準備工作
準備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、創建可用於複製的賬號
grant replication slave on *.* to repluser@'192.168.43.%' identified by 'centos';
2、完全備份數據(用於在從伺服器上來還原)
mysqldump -pcentos -A -F --single-transaction --master-data=1 >/data/all-`date +%F`.sql
備註:備份時的某表的狀態
為了下麵的實驗測試在這裡我們備份玩再增加一條記錄
insert hellodb.students (name,age)values('gaoda001',20);
3、傳送到從伺服器37、57上
scp…
37、57(從)伺服器設置
1、配置文件
vim /etc/my.cnf
1)開啟二進位日誌
log-bin=mysql-bin
2)設置server-id(要和主服務id區分開)
server-id=2
備註:57設置為3 只要他們不相同就可
3)從伺服器設置為只讀
read_only=on
4)禁止主機名解析
skip_name_resolve = on
5)數據和索引分開存放
innodb_file_per_table = on # 10版本以上預設開啟
6)重啟或啟動服務
備註:以防萬一可以查看下最重要的兩項開啟了沒有
mysql -e "show variables like 'log%'" mysql -e "show variables like 'server%'"
2、實現複製
1)進入資料庫查找同步代碼
MariaDB [(none)]> help change MariaDB [(none)]> help change master to
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、首先在主伺服器上安裝插件
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
備註:
show plugins; ##查看當前系統中的插件列表
UNINSTALL PLUGIN rpl_semi_sync_master;##卸載插件
2、查看插件狀態
SHOW GLOBAL VARIABLES LIKE '%semi%';
3、開啟
set global rpl_semi_sync_master_enabled=on;
備註:最好寫在配置文件中
4、查看插件變數狀態
SHOW GLOBAL STATUS LIKE '%semi%';
備註:這裡記錄有幾個半同步主機
從伺服器設置
1、安裝插件
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
2、啟動插件
set global rpl_semi_sync_slave_enabled=on;
備註:同樣建議寫在配置文件中
3、從伺服器查看改插件是否開始工作
SHOW GLOBAL STATUS LIKE '%semi%';
為什麼沒有開始工作?
因為是先開啟的主從複製再安裝的次插件
所以這種情況下,先停止從伺服器的主從複製功能
1)停止:
stop slave;
2)再次開啟主從複製
start slave;
3)再去查看
備註:現在就啟用了半同步功能,下麵開始搭建高可用,實現主伺服器宕機自動提升從伺服器當主
MHA高性能
備註:四台主機之間必須是ssh基於key驗證登陸,所以要先實現ssh互相鏈接
步驟:
ssh-keygen
cd .ssh
ssh-copy-id 192.168.43.67
把.ssh目錄考到其他主機
1、在主伺服器上創建管理者賬號
grant all on *.* to mhauser@'192.168.43.%' identified by 'centos';
2、在67管理主機上安裝以下包
mha4mysql-manager mha4mysql-node
3、在17、37、57安裝如下包
mha4mysql-node
4、在管理主機創建管理節點
mkdir /etc/mastermha/ cd /etc/mastermha/ vim app1.cnf
根據上面創建的信息填寫
[server default] user=mhauser password=centos manager_workdir=/app/mastermha/app1/ manager_log=/app/mastermha/app1/manager.log remote_workdir=/app/mastermha/app1/ ssh_user=root repl_user=repluser repl_password=centos ping_interval=1 ##以上是全局設置 ##以下是針對某一組集群設置 [server1] hostname=192.168.43.17 candidate_master=1 [server2] hostname=192.168.43.37 candidate_master=1 [server3] hostname=192.168.43.57 candidate_master=1
備註:
candidate_master=1:是說主伺服器宕機了帶有這項的主機有機會當主
5、測試
1)ssh協議
/usr/bin/masterha_check_ssh --conf=/etc/mastermha/app1.cnf
2、檢查複製
masterha_check_repl --conf=/etc/mastermha/app1.cnf
3、啟動(預設前臺執行)
masterha_manager --conf=/etc/mastermha/app1.cnf
備註:如果你是編譯安裝在/etc/mastermha/app1.cnf配置文件中指定日誌路徑,最好主從伺服器資料庫設置的位置都是一致的。