未分類
- 如果MHA出錯,在從新配置主從復制時需要先對每個庫(只清空主庫也行)進行清空主從復制然后重新搭建主從復制,主庫一定要清空,否則nohup進程啟動會出錯。
- 進一步高可用:如果nohup進程的服務器宕機了,而正好此時主庫的服務器也宕機。所以我們可以給每個從庫都裝mha管理端,都起nohup進程,這樣如果進行一次切換,全部的nohup進程都會掉線。
注意的問題
MHA賬號系統必須要一致,所以不能給開發兩個賬號,所以在控制開發的權限的時候只有一種方法就是:給從庫設只讀。
而當主庫宕機,從庫進行切換時,MHA在進行切換的時候可以自動設置只讀和解除只讀
准備工作
1.需要准備3台克隆機(數據庫不能克隆)
2.關閉防火牆和SELINUX(setenforce=0)
3.三台虛擬機主機名需要映射
4.主從之間要實現免交戶登陸為什么?
因為當主庫宕機以后,它要從管理節點的服務器種的配置文件中查看能不能登上主庫的服務器,如果不能,則實現不了切換
概念
-
如果MHA部署在一台Slave上,那么它就只能管理一個主從復制結構
-
MHA為什么不能部署在master上?
本身是防的是主庫宕機,如果網絡出問題,那么MHA也會失效。 -
完全透明指的是:整個過程MHA日志中會記錄的非常詳細,方便運維來排查錯誤。
工作流程(原理)
- 從宕機崩潰的master保存的二進制日志文件(binlog events)
- 識別含有最新更新的slave
- 應用差異的中繼日志(relay log)到其他的slave
- 應用從master保存的二進制日志實踐(binlog events)
- 提升一個slave為新的master
- 使其他的slave連接新的master進行復制
原理簡單來講
(1)復制主庫binlog日志出來
(2)找出relaylog日志中最全的從庫
(3)將最全的relaylog日志所在的所有從庫中同步(第一次同步)
(4)將之前最全的那個從庫提升為主庫
(5)將復制出來的binlog日志,放到新提升的主庫里
(6)其他所有從庫重新只向新提升的主庫,繼續主從復制 - 知識點:
1.誰的relay log中的內容最多,說明誰的主從復制最快
MHA架構圖
- 如果只有一個主從復制,就不必要有MHA管理端,直接把它放到主從復制中的一個從庫中
MHA工具介紹
-
masterha_check_ssh:檢查ssh連接的一個腳本,MHA要想管理,就必須能ssh到任何一個節點上,如果連不上,MHA是做不到管理的
-
masterha_check_repl:檢查主從復制,檢測誰是主誰是從,有幾個架構,能不能完成替換工作(替換就是雙主架構,檢查從庫上有沒有開啟binlog日志及配置文件中還要加一個東西(從庫是不是也能當成主庫)。因為它要把從替換為主)
環境准備
1.三台6.5版本的linux系統,並且都裝有mysql(不能是克隆的),給root設置mysql密碼
mysql二進制安裝
-
之后給root用戶設置mysql登陸密碼
-
盡量不要強殺mysql進程
配置基於GTID的主從復制
-
mysql5.6版本和之前版本的區別:一定程度上緩解了SQL單線程問題,降低了主從復制的延遲
-
GTID :是一種自動追蹤(自動同步)進程。如果開始同步,不再需要告訴它從哪開始同步(相當於在從上同步不再需要告訴它從哪個日志的哪個位置開始)
特性:
(1)支持多線程復制(每個庫有一個單獨的sql線程)
(2)支持啟用GTID,在主從復制中,它會自動去找binlog和位置
(3)支持延遲復制 -
但是有時候打開GTID反倒麻煩
因為GTID一旦打開就控制不了它的同步進程。要想重新控制,必須先關閉GTID。所以,一旦同步出現問題,要先關閉GTID然后進行調整。
一.要想做MHA主庫和從庫的先決條件
(1) 主庫從庫都必須開啟binlog日志
(2)都要有主從復制賬號(賬號系統必須一致)
(3)server-id不能一致
二.主庫操作
1.修改配置文件,由於是二進制安裝,所以配置文件需要自己寫
如:
2.重啟mysql服務
3.創建主從復制賬號
三.從庫配置
1.修改配置文件(server-id不能一樣,其它都一樣),完了重啟mysql服務
2.
3.查看GTID(在主庫上)
4.打開GTID功能(在配置文件/etc/my.conf中修改,每個庫都要修改)
- 之后重啟數據庫查看狀態
四.配置主從復制(在從庫上)
啟動主從復制 start slave
五.mysql配置文件(禁止mysql自動刪除relaylog。每個從庫都得有,主庫也必須有)
- 為什么要禁止mysql自動刪除中繼日志?怎樣設置?MHA要用到relaylog,但是relaylog要占空間,這樣的話,長此以往從庫的空間不久不夠用了,這種情況怎么解決?
mysql有個機制是自動刪除中繼日志,但是在做MHA時要用到relaylog,所以要把它設置成不能讓它自己刪,而要把刪中繼日志的功能交給MHA。
永久禁止mysql自動清除relaylog
之后重新啟動服務
六.部署MHA
1.安裝依賴包(所有庫上)
- 節點包(每個庫上都得安裝節點包)
2.在主庫上給MHA建立管理賬號(因為已經開始主從復制,所以建立的賬號也會在其他從庫上出現)
3.部署管理節點(mha-manager)
------3.1 在其中的一個從庫上,或者其他服務器,不能在主庫上
公網源安裝 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
wget -O /etc/yum.repos.d/eple-6.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum -y install perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes
----3.2 配置MHA的配置文件(需要自己寫)
如:
4.配置ssh信任(就是免密鑰,在所有節點上配置)
- 在免密鑰時,還得自己發自己
在每台服務器上進行分發(包括自己)
5.啟動檢查(在管理節點上)
6.主從復制檢測
- 完了之后在每台服務器上先測試
mysql -umha -p666666 -h 本機IP
如果不能連上(說明沒有密碼,需要進行授權)
那么就要在主庫上進行單獨授權
如果出現錯誤(說明提升為主庫的從庫上沒有主從復制賬號,沒有主從復制賬號,那么其它的從庫就不能連接上。)
解決辦法:在給其他從庫都加上主從復制賬號(賬號要一致),因為主從復制賬號是在主從復制之前創建的所以從庫是沒有這個賬號的。那么就要給其他從庫進行創建賬號grant replication slave on *.* to rep@'192.168.200.%' identified by '666666';
如果成功則顯示
七.啟動MHA
nohup masterha_manager --conf=/etc/mha/mha1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/mha1/manager.log 2>&1 &
啟動之后多按幾次回車,如果不報錯,就說明啟動成功
下來進行測試
(1)在主庫服務器上
(2)在從服務器上查看主從復制 show slave status
(3)把主庫mysqld服務停止 service mysqld stop
(4) 再在從庫上進行查看
發現它已經進行切換,並且對配置文件中的主庫進行移除(因為serve1進程已經宕掉,如果不進行移除,那么在啟動nohup進程時會再對server1進行檢查,它把server1移除是為了能夠再次啟動nuhup進程的)
之后:
在進行切換的時候nohup進程掉線,需要手動再次啟動nohup進程。(mha進程只能完成一次切換,之后它就會宕掉,但我們也只需要一次切換就行) nohup masterha_manager --conf=/etc/mha/mha1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/mha1/manager.log 2>&1 &
恢復:
(1)在管理端打開日志 cat /var/log/mha/mha1/manager
(2)在原本壞了的服務器上
-
show slave status
是什么都沒有的 -
然后粘貼從日志中復制的代碼
之后開啟同步 -
start slave
-
show slave status
-
在配置文件中加入server1的模塊
vim /etc/mha/mha1.cnf
-
殺掉mha的nohup進程
-
重新啟動nohup進程(多按幾次回車進行確定),至此恢復完成
nohup masterha_manager --conf=/etc/mha/mha1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/mha1/manager.log 2>&1 &
存在的問題
雖然MHA搭建完成,但是存在問題
1.如果主庫服務器宕機,那么是怎么把binlog日志復制出來的
2.從從庫切換為主庫,IP地址發生改變,但是開發人員是不知道的,那么怎么讓它切換以后IP地址不發生改變(使用VIP)
- MHA兩個重要的參數
如果MHA安裝在從庫上,那么就得用參數告訴主庫不能把這個從庫切換為主庫,因為如果帶有MHA的從庫切換為主,要是宕機那么MHA也會宕,因此就不能去完成切換。
問題的解決
1.怎么在切換的時候不更改IP地址,怎么使用VIP?
通過IP漂移,IP漂移兩種方式:
(1) 通過keepalived的方式管理虛擬IP的漂移
(2) 通過MHA自帶腳本方式,管理虛擬IP的漂移
漂移腳本的方式:
(1)提示:yum安裝的manager是沒有這個腳本的。
我們需要從manager的源碼包里復制一個。解壓manager
(2)直接創建一個文件叫master_ip_failover,下邊是代碼(81行,如果算上最后邊的空行是82行)
!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
use Getopt::Long;
my (
ssh_user, orig_master_ip, new_master_host,
new_master_port
);
my key = '0';
my key ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
GetOptions(
'command=s' => $command,
'ssh_user=s' => $ssh_user,
'orig_master_host=s' => $orig_master_host,
'orig_master_ip=s' => $orig_master_ip,
'orig_master_port=i' => $orig_master_port,
'new_master_host=s' => $new_master_host,
'new_master_ip=s' => $new_master_ip,
'new_master_port=i' => $new_master_port,
);
exit &main();
sub main {
if ( command eq "stopssh" ) {
my exit_code = 1;
eval {
print "Disabling the VIP on old master:$orig_master_host \n";
&stop_vip();
$exit_code = 0;
};
if (@) {
warn "Got Error: @) {
warn "Got Error: exit_code;
}
exit exit_code;
}
elsif (command eq "start" ) {
print "Enabling the VIP - new_master_host \n";
&start_vip(); ###############
exit_code = 0;
};
if (@) {
warn exit_code;
}
exit exit_code;
}
elsif (command eq "status" ) {
print "Checking the Status of the script..OK \n"; ssh $ssh_user\@$orig_master_host \" $ssh_start_vip \"
;
exit 0;
}
else {
&usage();
exit 1;
}
}
sub start_vip() { ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"
;
}
sub stop_vip() { ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"
;
}
sub usage {
print
"Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";
}
過程
(1)復制腳本到/usr/local/bin/,還需要給這個腳本加x權限 cp master_ip_failover /usr/local/bin/
chmod +x /usr/local/bin/master_ip_failover
(2)需要修改腳本 vim /usr/local/bin/master_ip_failover
(3)修改mha配置文件,讓它能認識漂移腳本 vim /etc/mha/mha1.cnf
(4)用pkill殺了mha進程,重新啟動 pkill perl
如果啟動不成功,可能的原因:
(1)ssh驗證出錯
(2)mha配置文件出錯
(3)主從復制驗證出錯
(5)之后查看VIP。(只有主庫上有VIP,其他從庫都是沒有的)
如果主庫宕機以后,VIP會自動切到轉化為主庫的從庫上
2.如果主庫的服務宕了,從庫可以把binlog日志拿過來,但是如果主庫服務器宕機,那么從庫是怎么把binlog日志拿過來的?
那么就要在它宕機之前把binlog日志拿過來。所以就需要binlog-server備份服務器(可以做在從庫上,不用過於安全)
(1).先要修改MHA配置文件
(2)拉取主庫上的binlog日志 cd /data/mysql/binlog/
(3)殺掉mha進程,重新啟動
- 這個時候重新啟動mha進程,它就檢測好幾個東西
(1)檢測ssh
(2)檢測主從復制
(3)檢查配置文件
(4)檢測有沒有開啟拉日志的進程pkill perl
nohup masterha_manager --conf=/etc/mha/mha1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/mha1/manager.log 2>&1 &