網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
一、Keepalived介紹
摘抄自官網(wǎng)的介紹:
Keepalived is a routing software written in C. The main goal of this project is to provide simple and robust facilities for loadbalancing and high-availability to Linux system and Linux based infrastructures.
項(xiàng)目地址:github.com/acassen/kee…
- Keepalived的作用是檢測(cè)服務(wù)器狀態(tài),如果一臺(tái)服務(wù)器宕機(jī)或者出現(xiàn)其他故障導(dǎo)致當(dāng)前服務(wù)器不可用,keep alived就會(huì)檢測(cè)到并將故障的服務(wù)器從系統(tǒng)中剔除,同時(shí)使用備用服務(wù)器替代該服務(wù)器的工作,當(dāng)服務(wù)器工作正常后Keepalived自動(dòng)將服務(wù)器加入到服務(wù)器群中,這些工作全部自動(dòng)完成,不需要人工干涉,需要人工做的只是修復(fù)故障的服務(wù)器。
- Keepalived軟件起初是專(zhuān)為L(zhǎng)VS負(fù)載均衡軟件設(shè)計(jì)的,用來(lái)管理并監(jiān)控LVS集群系統(tǒng)中各個(gè)服務(wù)節(jié)點(diǎn)的狀態(tài),后來(lái)又加入了可以實(shí)現(xiàn)高可用的VRRP功能。因此,Keepalived除了能夠管理LVS軟件外,還可以作為其他服務(wù)(例如:Nginx、Haproxy、MySQL等)的高可用解決方案軟件。
- Keepalived軟件主要是通過(guò)VRRP協(xié)議實(shí)現(xiàn)高可用功能的。VRRP是Virtual Router RedundancyProtocol(虛擬路由器冗余協(xié)議)的縮寫(xiě),VRRP出現(xiàn)的目的就是為了解決靜態(tài)路由單點(diǎn)故障問(wèn)題的,它能夠保證當(dāng)個(gè)別節(jié)點(diǎn)宕機(jī)時(shí),整個(gè)網(wǎng)絡(luò)可以不間斷地運(yùn)行。
所以,Keepalived 一方面具有配置管理LVS的功能,同時(shí)還具有對(duì)LVS下面節(jié)點(diǎn)進(jìn)行健康檢查的功能,另一方面也可實(shí)現(xiàn)系統(tǒng)網(wǎng)絡(luò)服務(wù)的高可用功能。
二、Keepalived的應(yīng)用場(chǎng)景
- 管理LVS軟件
- 基于VRRP實(shí)現(xiàn)高可用
- 健康檢查,故障切換
通過(guò)官網(wǎng)的介紹我們可以看到Keepalived提供了兩個(gè)重要的功能:loadbalancing和high-availability。最初是專(zhuān)門(mén)為L(zhǎng)VS負(fù)載均衡軟件設(shè)計(jì),可以用來(lái)管理并監(jiān)控LVS集群系統(tǒng)中各個(gè)服務(wù)節(jié)點(diǎn)的狀態(tài),后來(lái)的版本中又加入了可以實(shí)現(xiàn)高可用的VRRP功能。
因此,Keeaplived主要有兩種應(yīng)用場(chǎng)景,一個(gè)是通過(guò)配置keepalived結(jié)合ipvs做到負(fù)載均衡(LVS+Keepalived);
另一個(gè)是通過(guò)自身健康檢查、資源接管等功能做高可用(雙機(jī)熱備),實(shí)現(xiàn)故障轉(zhuǎn)移,功能近似于Heartbeat。
目前全球監(jiān)控的分布式MySQL集群,使用了Keeaplived來(lái)實(shí)現(xiàn)proxy的雙機(jī)熱備功能,所以下面只介紹在高可用場(chǎng)景下的相關(guān)知識(shí)。
三、Keepalived的工作原理
1 VRRP協(xié)議
keepalived是以VRRP協(xié)議為實(shí)現(xiàn)基礎(chǔ)的,VRRP全稱(chēng)Virtual Router Redundancy Protocol,即虛擬路由冗余協(xié)議,可以認(rèn)為是實(shí)現(xiàn)路由器高可用的協(xié)議。
- VRRP是用來(lái)實(shí)現(xiàn)路由器冗余的協(xié)議。
- VRRP協(xié)議是為了消除在靜態(tài)缺省路由環(huán)境下路由器單點(diǎn)故障引起的網(wǎng)絡(luò)失效而設(shè)計(jì)的主備模式的協(xié)議,使得發(fā)生故障而進(jìn)行設(shè)計(jì)設(shè)備功能切換時(shí)可以不影響內(nèi)外數(shù)據(jù)通信,不需要再修改內(nèi)部網(wǎng)絡(luò)的網(wǎng)絡(luò)參數(shù)。
- VRRP協(xié)議需要具有IP備份,優(yōu)先路由選擇,減少不必要的路由器通信等功能。
- VRRP協(xié)議將兩臺(tái)或多臺(tái)路由器設(shè)備虛擬成一個(gè)設(shè)備,對(duì)外提供虛擬路由器IP(一個(gè)或多個(gè))。然而,在路由器組內(nèi)部,如果實(shí)際擁有這個(gè)對(duì)外IP的路由器如果工作正常的話(huà),就是master,或者是通過(guò)算法選舉產(chǎn)生的,MASTER實(shí)現(xiàn)針對(duì)虛擬路由器IP的各種網(wǎng)絡(luò)功能,如ARP請(qǐng)求,ICMP,以及數(shù)據(jù)的轉(zhuǎn)發(fā)等,其他設(shè)備不具有該IP,狀態(tài)是BACKUP。除了接收MASTER的VRRP狀態(tài)通告信息外,不執(zhí)行對(duì)外的網(wǎng)絡(luò)功能,當(dāng)主機(jī)失效時(shí),BACKUP將接管原先MASTER的網(wǎng)絡(luò)功能。
- VRRP協(xié)議配置時(shí),需要配置每個(gè)路由器的虛擬路由ID(VRID)和優(yōu)先權(quán)值,使用VRID將路由器進(jìn)行分組,具有相同VRID值的路由器為同一個(gè)組,VRID是一個(gè)0-255的整整數(shù);同一個(gè)組中的路由器通過(guò)使用優(yōu)先權(quán)值來(lái)選舉MASTER。優(yōu)先權(quán)大者為MASTER,優(yōu)先權(quán)也是一個(gè)0-255的正整數(shù)。
對(duì)應(yīng)到高可用的場(chǎng)景,實(shí)際上就是把路由器換成了服務(wù)器或者服務(wù)器上的應(yīng)用: 通常情況下是將兩臺(tái)linux服務(wù)器組成一個(gè)熱備組(master-backup),同一時(shí)間熱備組內(nèi)只有一臺(tái)主服務(wù)器(master)提供服務(wù),同時(shí)master會(huì)虛擬出一個(gè)共用IP地址(VIP),這個(gè)VIP只存在master上并對(duì)外提供服務(wù)。 如果keepalived檢測(cè)到master宕機(jī)或服務(wù)故障,備服務(wù)器(backup)會(huì)自動(dòng)接管VIP成為master,keepalived并將master從熱備組移除,當(dāng)master恢復(fù)后,會(huì)自動(dòng)加入到熱備組,默認(rèn)再搶占成為master,起到故障轉(zhuǎn)移功能。
2 核心組件
keepalived是模塊化設(shè)計(jì),不同模塊負(fù)責(zé)不同的功能,主要有三個(gè)模塊,分別是core、check和VRRP,其中:
- **core模塊:**為keepalived的核心組件,負(fù)責(zé)主進(jìn)程的啟動(dòng)、維護(hù)以及全局配置文件的加載和解析;
- **check:**負(fù)責(zé)健康檢查,包括常見(jiàn)的各種檢查方式,這里的配置決定了工作在哪個(gè)層;
- **VRRP模塊:**是來(lái)實(shí)現(xiàn)VRRP協(xié)議的。
此外還有:
- system call:系統(tǒng)調(diào)用
- watch dog:監(jiān)控check和vrrp進(jìn)程的看管者
- libipfwc:iptables(ipchains)庫(kù),配置LVS會(huì)用到
- libipvs*:配置LVS會(huì)用到
3 分層工作
keepalived做負(fù)載均衡時(shí)工作在TCP/IP協(xié)議的3/4/5層,做高可用時(shí)工作在OSI七層協(xié)議模型的3/4/7層,基本上是一樣的,叫法不同而已
分層 | 功能 | 相關(guān)協(xié)議 |
---|---|---|
應(yīng)用層 | 網(wǎng)絡(luò)服務(wù)和最終用戶(hù)的一個(gè)接口 | TFTP,HTTP,SNMP,DNS,FTP,SMTP,TELNET |
表示層 | 數(shù)據(jù)的表示、安全、壓縮 | 無(wú)協(xié)議 |
會(huì)話(huà)層 | 會(huì)話(huà)的建立、管理、中止 | 無(wú)協(xié)議 |
傳輸層 | 定義傳輸數(shù)據(jù)的協(xié)議端口號(hào),以及流控和差錯(cuò)校驗(yàn) | TCP,UDP |
網(wǎng)絡(luò)層 | 進(jìn)行邏輯地址尋址,實(shí)現(xiàn)不同網(wǎng)絡(luò)之間的路徑選擇 | IP,ICMP,RIP,OSPF,BGP,IGMP |
數(shù)據(jù)鏈路層 | 建立邏輯連接、硬件地址尋址、差錯(cuò)校驗(yàn)等功能 | SLIP,CSLIP,PPP,ARP,RARP,MTU |
物理層 | 建立、連接、斷開(kāi)物理連接 | ISO2110,IEEE802,IEEE802.2 |
具體工作在哪一層的區(qū)別就在于用什么樣的網(wǎng)絡(luò)協(xié)議來(lái)進(jìn)行健康檢查:
Layer3:工作在三層時(shí),keepalived會(huì)定期向熱備組中的服務(wù)器發(fā)送一個(gè)ICMP數(shù)據(jù)包,來(lái)判斷某臺(tái)服務(wù)器是否故障,如果沒(méi)有響應(yīng)則將這臺(tái)服務(wù)器從熱備組移除。
Layer4:工作在四層時(shí),keepalived以TCP端口的狀態(tài)判斷服務(wù)器是否故障,比如檢測(cè)MySQL的3306端口,如果無(wú)法訪問(wèn)則將這臺(tái)服務(wù)器從熱備組移除。
Layer7:工作在七層時(shí),keepalived根據(jù)用戶(hù)設(shè)定的策略判斷服務(wù)器上的程序是否正常運(yùn)行,比如使用HTTP請(qǐng)求的方式,如果返回錯(cuò)誤的狀態(tài)碼則將這臺(tái)服務(wù)器從熱備組移除。
在Keepalived服務(wù)器群之間,只有作為主的服務(wù)器不斷發(fā)送VRRP廣播包,告訴備它還活著,此時(shí)備不會(huì)搶占主,只有當(dāng)主不可用,既備接受不到主的VRRP廣播包,這時(shí)候備就會(huì)啟動(dòng)相關(guān)的服務(wù)接管主的任務(wù)向外提供服務(wù),以保證服務(wù)的正常使用。
4 工作狀態(tài)
keepalived正常啟動(dòng)的時(shí)候,共啟動(dòng)3個(gè)進(jìn)程: 一個(gè)是父進(jìn)程,負(fù)責(zé)監(jiān)控其子進(jìn)程;
一個(gè)是VRRP子進(jìn)程,另外一個(gè)是checkers子進(jìn)程;
兩個(gè)子進(jìn)程都被系統(tǒng)watchlog看管,Healthcheck子進(jìn)程檢查各自服務(wù)器的健康狀況。
如果healthchecks進(jìn)程檢查到master上服務(wù)不可用了,就會(huì)通知本機(jī)上的VRRP子進(jìn)程,讓他刪除通告,并且去掉虛擬IP,轉(zhuǎn)換為BACKUP狀態(tài)。 生產(chǎn)服務(wù)器上的keepalived進(jìn)程
四、Keepalived使用
1 配置介紹
keepalived配置文件按層級(jí)和模塊劃分的,每層由"{ }"來(lái)界定。在主配置文件中可以通過(guò)include來(lái)涵蓋多個(gè)子配置文件。 詳細(xì)語(yǔ)法說(shuō)明:官方文檔 配置文件包括以下幾個(gè)模塊:
- LOBAL CONFIGURATION
- BFD CONFIGURATION
- VRRPD CONFIGURATION
- LVS CONFIGURATION
[root@localhost ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { #全局定義部分 notification_email { #設(shè)置報(bào)警郵件地址,可設(shè)置多個(gè) acassen@firewall.loc #接收通知的郵件地址 } notification_email_from test0@163.com #設(shè)置 發(fā)送郵件通知的地址 smtp_server smtp.163.com #設(shè)置 smtp server 地址,可是ip或域名.可選端口號(hào) (默認(rèn)25) smtp_connect_timeout 30 #設(shè)置 連接 smtp server的超時(shí)時(shí)間 router_id LVS_DEVEL #主機(jī)標(biāo)識(shí),用于郵件通知 vrrp_skip_check_adv_addr vrrp_strict #嚴(yán)格執(zhí)行VRRP協(xié)議規(guī)范,此模式不支持節(jié)點(diǎn)單播 vrrp_garp_interval 0 vrrp_gna_interval 0 script_user keepalived_script #指定運(yùn)行腳本的用戶(hù)名和組。默認(rèn)使用用戶(hù)的默認(rèn)組。如未指定,默認(rèn)為keepalived_script 用戶(hù),如無(wú)此用戶(hù),則使用root enable_script_security #如過(guò)路徑為非root可寫(xiě),不要配置腳本為root用戶(hù)執(zhí)行。 } vrrp_instance VI_1 { #vrrp 實(shí)例部分定義,VI_1自定義名稱(chēng) state MASTER #指定 keepalived 的角色,必須大寫(xiě) 可選值:MASTER|BACKUP interface ens33 #網(wǎng)卡設(shè)置,lvs需要綁定在網(wǎng)卡上,realserver綁定在回環(huán)口。區(qū)別:lvs對(duì)訪問(wèn)為外,realserver為內(nèi)不易暴露本機(jī)信息 virtual_router_id 51 #虛擬路由標(biāo)識(shí),是一個(gè)數(shù)字,同一個(gè)vrrp 實(shí)例使用唯一的標(biāo)識(shí),MASTER和BACKUP 的 同一個(gè) vrrp_instance 下 這個(gè)標(biāo)識(shí)必須保持一致 priority 100 #定義優(yōu)先級(jí),數(shù)字越大,優(yōu)先級(jí)越高。 advert_int 1 #設(shè)定 MASTER 與 BACKUP 負(fù)載均衡之間同步檢查的時(shí)間間隔,單位為秒,兩個(gè)節(jié)點(diǎn)設(shè)置必須一樣 authentication { #設(shè)置驗(yàn)證類(lèi)型和密碼,兩個(gè)節(jié)點(diǎn)必須一致 auth_type PASS auth_pass 1111 } virtual_ipaddress { #設(shè)置虛擬IP地址,可以設(shè)置多個(gè)虛擬IP地址,每行一個(gè) 192.168.119.130 } track_script { #腳本監(jiān)控狀態(tài) chk_nginx_service #可加權(quán)重,但會(huì)覆蓋聲明的腳本權(quán)重值。chk_nginx_service weight -20 } notify_master "/etc/keepalived/start_haproxy.sh start" #當(dāng)前節(jié)點(diǎn)成為master時(shí),通知腳本執(zhí)行任務(wù) notify_backup "/etc/keepalived/start_haproxy.sh stop" #當(dāng)前節(jié)點(diǎn)成為backup時(shí),通知腳本執(zhí)行任務(wù) notify_fault "/etc/keepalived/start_haproxy.sh stop" #當(dāng)當(dāng)前節(jié)點(diǎn)出現(xiàn)故障,執(zhí)行的任務(wù); } virtual_server 192.168.119.130 80 { #定義RealServer對(duì)應(yīng)的VIP及服務(wù)端口,IP和端口之間用空格隔開(kāi) delay_loop 6 #每隔6秒查詢(xún)r(jià)ealserver狀態(tài) lb_algo rr #后端調(diào)試算法(load balancing algorithm) lb_kind DR #LVS調(diào)度類(lèi)型NAT/DR/TUN #persistence_timeout 60 同一IP的連接60秒內(nèi)被分配到同一臺(tái)realserver protocol TCP #用TCP協(xié)議檢查realserver狀態(tài) real_server 192.168.119.120 80 { weight 1 #權(quán)重,最大越高,lvs就越優(yōu)先訪問(wèn) TCP_CHECK { #keepalived的健康檢查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC connect_timeout 10 #10秒無(wú)響應(yīng)超時(shí) retry 3 #重連次數(shù)3次 delay_before_retry 3 #重連間隔時(shí)間 connect_port 80 #健康檢查realserver的端口 } } } }
2 使用keepalived對(duì)nginx進(jìn)行高可用搭建
2.1 環(huán)境準(zhǔn)備
主機(jī)ip | 角色 | 部署軟件 |
---|---|---|
192.168.73.135 | master | keepalived、nginx |
192.168.73.136 | salve | keepalived、nginx |
192.168.73.100 | 虛ip | ? |
|
2.2 nginx軟件安裝和配置
在192.168.73.136操作為例,135上把index改成135即可
[root@localhost ~]# yum -y install nginx [root@localhost ~]# cd /usr/share/nginx/html/ [root@localhost html]# mv index.html index.html.back [root@localhost html]# echo "I am 192.168.73.136" > index.html [root@localhost html]# systemctl start nginx [root@localhost html]# curl 192.168.73.136 I am 192.168.73.136
2.3 Keepalived軟件安裝
[root@localhost ~]# yum install keepalived -y [root@localhost ~]# rpm -ql keepalived /etc/keepalived /etc/keepalived/keepalived.conf # 主配置文件 /etc/sysconfig/keepalived /usr/bin/genhash /usr/lib/systemd/system/keepalived.service /usr/libexec/keepalived /usr/sbin/keepalived
2.4 監(jiān)聽(tīng)存活腳本
[root@localhost ~]# vim /etc/keepalived/check_port.sh #!/bin/bash #keepalived 監(jiān)控端口腳本 #使用方法: #在keepalived的配置文件中 #vrrp_script check_port {#創(chuàng)建一個(gè)vrrp_script腳本,檢查配置 # script "/etc/keepalived/check_port.sh 80" #配置監(jiān)聽(tīng)的端口 # interval 2 #檢查腳本的頻率,單位(秒) #} CHK_PORT=$1 if [ -n "$CHK_PORT" ];then PORT_PROCESS=`ss -lnt|grep $CHK_PORT|wc -l` if [ $PORT_PROCESS -eq 0 ];then echo "Port $CHK_PORT Is Not Used,End." exit 1 fi else echo "Check Port Cant Be Empty!" fi [root@localhost ~]# chmod +x /etc/keepalived/check_port.sh
2.5 最終配置文件
(1)Master配置
[root@localhost ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id 192.168.73.136 } vrrp_script chk_nginx { script "/etc/keepalived/check_port.sh 80" interval 2 weight -20 } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 251 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 11111111 } track_script { chk_nginx } virtual_ipaddress { 192.168.73.100 } }
(2)Slave配置
! Configuration File for keepalived global_defs { router_id 192.168.73.135 } vrrp_script chk_nginx { script "/etc/keepalived/check_port.sh 80" interval 2 weight -20 } vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 251 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 11111111 } track_script { chk_nginx } virtual_ipaddress { 192.168.73.100 } }
2.6 啟動(dòng)主從的Keepalived
[root@localhost ~]]systemctl start keepalived && systemctl enable keepalive
2.7 查看VIP是否啟動(dòng)
[root@localhost keepalived]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:6f:74:0a brd ff:ff:ff:ff:ff:ff inet 192.168.73.136/24 brd 192.168.73.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet 192.168.73.100/32 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::af0e:a936:d997:18da/64 scope link noprefixroute valid_lft forever preferred_lft forever
2.8 測(cè)試
首先在瀏覽器中訪問(wèn)vip,可以看到我們?cè)L問(wèn)的是BACKUP上的web地址
關(guān)掉master上的nginx,查看VIP是否漂移到備機(jī)。
# 關(guān)閉主nginx [root@localhost ~]# systemctl stop nginx # 查看備上的IP信息,我們發(fā)現(xiàn)vip已經(jīng)偏移到備機(jī)上了 [root@localhost ~]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:6f:74:0a brd ff:ff:ff:ff:ff:ff inet 192.168.73.136/24 brd 192.168.73.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet6 fe80::af0e:a936:d997:18da/64 scope link noprefixroute valid_lft forever preferred_lft forever
在瀏覽器中訪問(wèn)vip,可以看到我們?cè)L問(wèn)的是master上的web地址
五、需要注意的問(wèn)題:
1 腦裂介紹
在高可用系統(tǒng)中,如果兩個(gè)節(jié)點(diǎn)的心跳線(xiàn)斷開(kāi),本來(lái)兩個(gè)節(jié)點(diǎn)為一個(gè)整體、動(dòng)作協(xié)調(diào)的一個(gè)HA系統(tǒng),現(xiàn)在由于兩個(gè)之間的心跳線(xiàn)斷開(kāi)導(dǎo)致它們分裂成了兩個(gè)單獨(dú)的個(gè)體。由于雙方互相失去了聯(lián)系,都會(huì)以為對(duì)方出了故障。這時(shí)候這兩個(gè)單獨(dú)的個(gè)體就像"腦裂人"一樣互相爭(zhēng)搶共享資源、爭(zhēng)用應(yīng)用服務(wù),這樣就會(huì)造成嚴(yán)重問(wèn)題:
- 共享資源被瓜分,兩邊服務(wù)都起不來(lái);
- 兩邊服務(wù)都起來(lái)了,同時(shí)提供服務(wù),同時(shí)讀寫(xiě)存儲(chǔ),導(dǎo)致數(shù)據(jù)不一致甚至損壞。
1.1 產(chǎn)生腦裂的原因
一般來(lái)說(shuō),腦裂的發(fā)生,有以下幾種原因:
- (1)HA服務(wù)器之間心跳線(xiàn)故障,導(dǎo)致無(wú)法正常通信;
- (2)HA服務(wù)器上開(kāi)啟了防火墻,阻擋了心跳線(xiàn)的信息傳輸;
- (3)HA服務(wù)器上心跳網(wǎng)卡配置不正確,導(dǎo)致心跳信息發(fā)送失敗;
- (4)其他服務(wù)器配置不當(dāng)?shù)脑颉1热缧奶绞讲煌奶鴱V播沖突,軟件BUG等;
- (5)Keepalived配置里同一 VRRP實(shí)例中如果 virtualrouterid兩端參數(shù)配置不一致也會(huì)導(dǎo)致裂腦問(wèn)題發(fā)生。
1.2 常見(jiàn)的解決辦法
在實(shí)際環(huán)境中,我們可以從以下幾個(gè)方面來(lái)防止腦裂的問(wèn)題:
- (1)同時(shí)使用串行線(xiàn)路或者以太網(wǎng)電纜連接,同時(shí)使用兩條心跳線(xiàn)路,如果一條壞了,另外一條還能正常提供服務(wù);
- (2)當(dāng)檢測(cè)到腦裂時(shí)強(qiáng)行關(guān)閉一個(gè)節(jié)點(diǎn)(該功能需要特殊設(shè)備支持,如Stonith,feyce),相當(dāng)于備節(jié)點(diǎn)接受不到心跳心跳消患,通過(guò)單獨(dú)的線(xiàn)路發(fā)送關(guān)機(jī)命令關(guān)閉主節(jié)點(diǎn)的電源;
- (3)做好腦裂監(jiān)控報(bào)警(用zabbix等來(lái)監(jiān)控),在問(wèn)題發(fā)生時(shí)能在第一時(shí)間介入仲裁,降低損失。
- (4)啟動(dòng)磁盤(pán)鎖。正在服務(wù)一方鎖住共享磁盤(pán),“裂腦”發(fā)生時(shí),讓對(duì)方完全“搶不走”共享磁盤(pán)資源。但使用鎖磁盤(pán)也會(huì)有一個(gè)不小的問(wèn)題,如果占用共享盤(pán)的一方不主動(dòng)“解鎖”,另一方就永遠(yuǎn)得不到共享磁盤(pán)。現(xiàn)實(shí)中假如服務(wù)節(jié)點(diǎn)突然死機(jī)或崩潰,就不可能執(zhí)行解鎖命令。后備節(jié)點(diǎn)也就接管不了共享資源和應(yīng)用服務(wù)。于是有人在HA中設(shè)計(jì)了“智能”鎖。即:正在服務(wù)的一方只在發(fā)現(xiàn)心跳線(xiàn)全部斷開(kāi)(察覺(jué)不到對(duì)端)時(shí)才啟用磁盤(pán)鎖,平時(shí)就不上鎖了;
- (5)加入仲裁機(jī)制。例如設(shè)置網(wǎng)關(guān)IP,當(dāng)腦裂發(fā)生時(shí),兩個(gè)節(jié)點(diǎn)都各自ping以下這個(gè)網(wǎng)關(guān)IP,不通則表明斷點(diǎn)就在本端,不僅“心跳”、還兼對(duì)外“服務(wù)”的本端網(wǎng)絡(luò)鏈路斷了,即使啟動(dòng)(或繼續(xù))應(yīng)用服務(wù)也沒(méi)有用了,那就主動(dòng)放棄競(jìng)爭(zhēng),讓能夠ping通網(wǎng)關(guān)IP的一端去起服務(wù)。更保險(xiǎn)一些,ping不通網(wǎng)關(guān)IP的一方干脆就自我重啟,以徹底釋放有可能還占用著的那些共享資源。
1.3 Keepalived監(jiān)控nginx防止腦裂
(1)執(zhí)行腳本,用來(lái)檢測(cè)
[root@zdd211-11 ~]# vim /etc/keepalived/check_keepalived.sh #!/bin/bash NGINX_SBIN="which nginx" NGINX_PORT=80 function check_nginx(){ NGINX_STATUS="nmap localhost -p ${NGINX_PORT} | grep "80/tcp open" | awk '{print $2}'" NGINX_PROCESS="ps -ef | grep nginx|grep -v grep|wc -l" } check_nginx if [ "$NGINX_STATUS" != "open" -o $NGINX_PROCESS -lt 2 ] then ${NGINX_SBIN} -s stop ${NGINX_SBIN} sleep 3 check_nginx if [ "$NGINX_STATUS" != "open" -o $NGINX_PROCESS -lt 2 ];then systemctl stop keepalived fi fi [root@localhost ~]# chmod +x /etc/keepalived/check_port.sh
(2)安裝nmap 因?yàn)樯厦婺_本有用到這個(gè)工具,因此兩個(gè)主機(jī)都需要安裝
[root@localhost ~]# yum install nmap -y
(3) 修改master配置
[root@localhost ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id 192.168.73.136 } vrrp_script chk_nginx { script "/etc/keepalived/check_port.sh 80" interval 2 weight -20 } vrrp_script chk_nginx { script "/etc/keepalived/check_keepalive.sh" # 腳本路徑 interval 2 # 執(zhí)行時(shí)間間隔 weight -5 # 計(jì)算權(quán)重值,腳本結(jié)果導(dǎo)致的優(yōu)先級(jí)變更,檢測(cè)失敗(腳本返回非0)則優(yōu)先級(jí) -5 fall 3 # 檢測(cè)連續(xù)3次失敗才算確定是真失敗。會(huì)用weight減少優(yōu)先級(jí)(1-255之間) rise 2 # 檢測(cè)2次成功就算成功。但不修改優(yōu)先級(jí) vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 251 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 11111111 } track_script { chk_nginx } virtual_ipaddress { 192.168.73.100 } }
(4) 修改Slave配置配置
! Configuration File for keepalived global_defs { router_id 192.168.73.135 } vrrp_script chk_nginx { script "/etc/keepalived/check_keepalive.sh" interval 2 # 執(zhí)行時(shí)間間隔 weight -5 # 計(jì)算權(quán)重值,腳本結(jié)果導(dǎo)致的優(yōu)先級(jí)變更,檢測(cè)失敗(腳本返回非0)則優(yōu)先級(jí) -5 fall 3 # 檢測(cè)連續(xù)3次失敗才算確定是真失敗。會(huì)用weight減少優(yōu)先級(jí)(1-255之間) rise 2 # 檢測(cè)2次成功就算成功。但不修改優(yōu)先級(jí) vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 251 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 11111111 } track_script { chk_nginx } virtual_ipaddress { 192.168.73.100 } }
2 Keepalived設(shè)置故障恢復(fù)后不重新?lián)尰豓IP
通常生產(chǎn)環(huán)境是不允許VIP來(lái)回漂移,當(dāng)主機(jī)的業(yè)務(wù)出問(wèn)題之后,vip漂移到備機(jī)上保證業(yè)務(wù)不中斷,就算故障恢復(fù)keepalived也不會(huì)把vip切到主機(jī)上;
需要進(jìn)行對(duì)應(yīng)的問(wèn)題問(wèn)題,確認(rèn)主機(jī)環(huán)境沒(méi)有問(wèn)題之后手動(dòng)重啟主機(jī)上keepalived服務(wù),讓vip切回到主機(jī)上。 為
了滿(mǎn)足這樣的業(yè)務(wù)場(chǎng)景,可以使用nopreempt參數(shù),不搶占VIP的機(jī)制實(shí)現(xiàn) 修改master配置如下
[root@localhost ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id 192.168.73.136 } vrrp_script chk_nginx { script "/etc/keepalived/check_keepalive.sh" # 腳本路徑 interval 2 # 執(zhí)行時(shí)間間隔 weight -5 # 計(jì)算權(quán)重值,腳本結(jié)果導(dǎo)致的優(yōu)先級(jí)變更,檢測(cè)失敗(腳本返回非0)則優(yōu)先級(jí) -5 fall 3 # 檢測(cè)連續(xù)3次失敗才算確定是真失敗。會(huì)用weight減少優(yōu)先級(jí)(1-255之間) rise 2 # 檢測(cè)2次成功就算成功。但不修改優(yōu)先級(jí) } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 251 priority 100 advert_int 1 nopreempt ##不搶VIP 機(jī)制 authentication { auth_type PASS auth_pass 11111111 } track_script { chk_nginx } virtual_ipaddress { 192.168.73.100 } }
可以自己重啟keepalived,然后停止web,然后再啟動(dòng)web,驗(yàn)證是否能夠自動(dòng)漂移回主機(jī)
3 組播地址沖突問(wèn)題
當(dāng)在同一個(gè)局域網(wǎng)內(nèi)部署了多組keepalived服務(wù)器時(shí),可能會(huì)發(fā)生高可用接管的嚴(yán)重故障問(wèn)題。 因?yàn)閗eepalived高可用功能是通過(guò)VRRP協(xié)議實(shí)現(xiàn)的,VRRP協(xié)議默認(rèn)通過(guò)IP多播的形式實(shí)現(xiàn)高可用對(duì)之間的通信,如果同一個(gè)局域網(wǎng)內(nèi)存在多組Keepalived服務(wù)器對(duì),就會(huì)造成IP多播地址沖突問(wèn)題,導(dǎo)致接管錯(cuò)亂. 不同組的keepalived都會(huì)使用默認(rèn)的224.0.0.18作為多播地址。此時(shí)的解決辦法是,在同組的keepalived服務(wù)器所有的配置文件里指定獨(dú)一無(wú)二的多播地址,配置如下:
global_defs { ``router_id LVS_19 ``vrrp_mcast_group4 224.0.0.19` `#指定多播地址 }
原文鏈接:https://juejin.cn/post/7137847469525696526#heading-9
相關(guān)推薦
- 2023-04-24 Python?argparse中的action=store_true用法小結(jié)_python
- 2023-04-06 分布式系統(tǒng)CAP定理中的P原理解析_相關(guān)技巧
- 2022-09-21 Flutter實(shí)現(xiàn)底部和頂部導(dǎo)航欄_Android
- 2022-09-07 Python?CSV?文件解析和生成方法示例_python
- 2022-09-14 python與xml數(shù)據(jù)的交互詳解_python
- 2022-11-06 python分析inkscape路徑數(shù)據(jù)方案簡(jiǎn)單介紹_python
- 2022-12-10 C++如何將vector數(shù)字寫(xiě)入到txt文件中_C 語(yǔ)言
- 2022-10-18 C#模擬實(shí)現(xiàn)鼠標(biāo)自動(dòng)點(diǎn)擊與消息發(fā)送功能_C#教程
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支