<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
摘抄自官網的介紹:
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.
所以,Keepalived 一方面具有設定管理LVS的功能,同時還具有對LVS下面節點進行健康檢查的功能,另一方面也可實現系統網路服務的高可用功能。
通過官網的介紹我們可以看到Keepalived提供了兩個重要的功能:loadbalancing和high-availability。最初是專門為LVS負載均衡軟體設計,可以用來管理並監控LVS叢集系統中各個服務節點的狀態,後來的版本中又加入了可以實現高可用的VRRP功能。
因此,Keeaplived主要有兩種應用場景,一個是通過設定keepalived結合ipvs做到負載均衡(LVS+Keepalived);
另一個是通過自身健康檢查、資源接管等功能做高可用(雙機熱備),實現故障轉移,功能近似於Heartbeat。
目前全球監控的分散式MySQL叢集,使用了Keeaplived來實現proxy的雙機熱備功能,所以下面只介紹在高可用場景下的相關知識。
keepalived是以VRRP協定為實現基礎的,VRRP全稱Virtual Router Redundancy Protocol,即虛擬路由冗餘協定,可以認為是實現路由器高可用的協定。
對應到高可用的場景,實際上就是把路由器換成了伺服器或者伺服器上的應用: 通常情況下是將兩臺linux伺服器組成一個熱備組(master-backup),同一時間熱備組內只有一臺主伺服器(master)提供服務,同時master會虛擬出一個共用IP地址(VIP),這個VIP只存在master上並對外提供服務。 如果keepalived檢測到master宕機或服務故障,備伺服器(backup)會自動接管VIP成為master,keepalived並將master從熱備組移除,當master恢復後,會自動加入到熱備組,預設再搶佔成為master,起到故障轉移功能。
keepalived是模組化設計,不同模組負責不同的功能,主要有三個模組,分別是core、check和VRRP,其中:
此外還有:
keepalived做負載均衡時工作在TCP/IP協定的3/4/5層,做高可用時工作在OSI七層協定模型的3/4/7層,基本上是一樣的,叫法不同而已
分層 | 功能 | 相關協定 |
---|---|---|
應用層 | 網路服務和終端使用者的一個介面 | TFTP,HTTP,SNMP,DNS,FTP,SMTP,TELNET |
表示層 | 資料的表示、安全、壓縮 | 無協定 |
對談層 | 對談的建立、管理、中止 | 無協定 |
傳輸層 | 定義傳輸資料的協定埠號,以及流控和差錯校驗 | TCP,UDP |
網路層 | 進行邏輯地址定址,實現不同網路之間的路徑選擇 | IP,ICMP,RIP,OSPF,BGP,IGMP |
資料鏈路層 | 建立邏輯連線、硬體地址定址、差錯校驗等功能 | SLIP,CSLIP,PPP,ARP,RARP,MTU |
物理層 | 建立、連線、斷開物理連線 | ISO2110,IEEE802,IEEE802.2 |
具體工作在哪一層的區別就在於用什麼樣的網路協定來進行健康檢查:
Layer3:工作在三層時,keepalived會定期向熱備組中的伺服器傳送一個ICMP封包,來判斷某臺伺服器是否故障,如果沒有響應則將這臺伺服器從熱備組移除。
Layer4:工作在四層時,keepalived以TCP埠的狀態判斷伺服器是否故障,比如檢測MySQL的3306埠,如果無法存取則將這臺伺服器從熱備組移除。
Layer7:工作在七層時,keepalived根據使用者設定的策略判斷伺服器上的程式是否正常執行,比如使用HTTP請求的方式,如果返回錯誤的狀態碼則將這臺伺服器從熱備組移除。
在Keepalived伺服器群之間,只有作為主的伺服器不斷傳送VRRP廣播包,告訴備它還活著,此時備不會搶佔主,只有當主不可用,既備接受不到主的VRRP廣播包,這時候備就會啟動相關的服務接管主的任務向外提供服務,以保證服務的正常使用。
keepalived正常啟動的時候,共啟動3個程序: 一個是父程序,負責監控其子程序;
一個是VRRP子程序,另外一個是checkers子程序;
兩個子程序都被系統watchlog看管,Healthcheck子程序檢查各自伺服器的健康狀況。
如果healthchecks程序檢查到master上服務不可用了,就會通知本機上的VRRP子程序,讓他刪除通告,並且去掉虛擬IP,轉換為BACKUP狀態。 生產伺服器上的keepalived程序
keepalived組態檔按層級和模組劃分的,每層由"{ }"來界定。在主組態檔中可以通過include來涵蓋多個子組態檔。 詳細語法說明:官方檔案 組態檔包括以下幾個模組:
[root@localhost ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { #全域性定義部分 notification_email { #設定報警郵件地址,可設定多個 acassen@firewall.loc #接收通知的郵件地址 } notification_email_from test0@163.com #設定 傳送郵件通知的地址 smtp_server smtp.163.com #設定 smtp server 地址,可是ip或域名.可選埠號 (預設25) smtp_connect_timeout 30 #設定 連線 smtp server的超時時間 router_id LVS_DEVEL #主機標識,用於郵件通知 vrrp_skip_check_adv_addr vrrp_strict #嚴格執行VRRP協定規範,此模式不支援節點單播 vrrp_garp_interval 0 vrrp_gna_interval 0 script_user keepalived_script #指定執行指令碼的使用者名稱和組。預設使用使用者的預設組。如未指定,預設為keepalived_script 使用者,如無此使用者,則使用root enable_script_security #如過路徑為非root可寫,不要設定指令碼為root使用者執行。 } vrrp_instance VI_1 { #vrrp 範例部分定義,VI_1自定義名稱 state MASTER #指定 keepalived 的角色,必須大寫 可選值:MASTER|BACKUP interface ens33 #網路卡設定,lvs需要繫結在網路卡上,realserver繫結在迴環口。區別:lvs對存取為外,realserver為內不易暴露本機資訊 virtual_router_id 51 #虛擬路由標識,是一個數位,同一個vrrp 範例使用唯一的標識,MASTER和BACKUP 的 同一個 vrrp_instance 下 這個標識必須保持一致 priority 100 #定義優先順序,數位越大,優先順序越高。 advert_int 1 #設定 MASTER 與 BACKUP 負載均衡之間同步檢查的時間間隔,單位為秒,兩個節點設定必須一樣 authentication { #設定驗證型別和密碼,兩個節點必須一致 auth_type PASS auth_pass 1111 } virtual_ipaddress { #設定虛擬IP地址,可以設定多個虛擬IP地址,每行一個 192.168.119.130 } track_script { #指令碼監控狀態 chk_nginx_service #可加權重,但會覆蓋宣告的指令碼權重值。chk_nginx_service weight -20 } notify_master "/etc/keepalived/start_haproxy.sh start" #當前節點成為master時,通知指令碼執行任務 notify_backup "/etc/keepalived/start_haproxy.sh stop" #當前節點成為backup時,通知指令碼執行任務 notify_fault "/etc/keepalived/start_haproxy.sh stop" #噹噹前節點出現故障,執行的任務; } virtual_server 192.168.119.130 80 { #定義RealServer對應的VIP及伺服器埠,IP和埠之間用空格隔開 delay_loop 6 #每隔6秒查詢realserver狀態 lb_algo rr #後端偵錯演演算法(load balancing algorithm) lb_kind DR #LVS排程型別NAT/DR/TUN #persistence_timeout 60 同一IP的連線60秒內被分配到同一臺realserver protocol TCP #用TCP協定檢查realserver狀態 real_server 192.168.119.120 80 { weight 1 #權重,最大越高,lvs就越優先存取 TCP_CHECK { #keepalived的健康檢查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC connect_timeout 10 #10秒無響應超時 retry 3 #重連次數3次 delay_before_retry 3 #重連間隔時間 connect_port 80 #健康檢查realserver的埠 } } } }
主機ip | 角色 | 部署軟體 |
---|---|---|
192.168.73.135 | master | keepalived、nginx |
192.168.73.136 | salve | keepalived、nginx |
192.168.73.100 | 虛ip |
|
在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
[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
[root@localhost ~]# vim /etc/keepalived/check_port.sh #!/bin/bash #keepalived 監控埠指令碼 #使用方法: #在keepalived的組態檔中 #vrrp_script check_port {#建立一個vrrp_script指令碼,檢查設定 # script "/etc/keepalived/check_port.sh 80" #設定監聽的埠 # 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
(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 } }
[root@localhost ~]]systemctl start keepalived && systemctl enable keepalive
[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
首先在瀏覽器中存取vip,可以看到我們存取的是BACKUP上的web地址
關掉master上的nginx,檢視VIP是否漂移到備機。
# 關閉主nginx [root@localhost ~]# systemctl stop nginx # 檢視備上的IP資訊,我們發現vip已經偏移到備機上了 [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
在瀏覽器中存取vip,可以看到我們存取的是master上的web地址
在高可用系統中,如果兩個節點的心跳線斷開,本來兩個節點為一個整體、動作協調的一個HA系統,現在由於兩個之間的心跳線斷開導致它們分裂成了兩個單獨的個體。由於雙方互相失去了聯絡,都會以為對方出了故障。這時候這兩個單獨的個體就像"腦裂人"一樣互相爭搶共用資源、爭用應用服務,這樣就會造成嚴重問題:
一般來說,腦裂的發生,有以下幾種原因:
在實際環境中,我們可以從以下幾個方面來防止腦裂的問題:
(1)執行指令碼,用來檢測
[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 因為上面指令碼有用到這個工具,因此兩個主機都需要安裝
[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 # 執行時間間隔 weight -5 # 計算權重值,指令碼結果導致的優先順序變更,檢測失敗(指令碼返回非0)則優先順序 -5 fall 3 # 檢測連續3次失敗才算確定是真失敗。會用weight減少優先順序(1-255之間) rise 2 # 檢測2次成功就算成功。但不修改優先順序 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 # 執行時間間隔 weight -5 # 計算權重值,指令碼結果導致的優先順序變更,檢測失敗(指令碼返回非0)則優先順序 -5 fall 3 # 檢測連續3次失敗才算確定是真失敗。會用weight減少優先順序(1-255之間) rise 2 # 檢測2次成功就算成功。但不修改優先順序 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 } }
通常生產環境是不允許VIP來回漂移,當主機的業務出問題之後,vip漂移到備機上保證業務不中斷,就算故障恢復keepalived也不會把vip切到主機上;
需要進行對應的問題問題,確認主機環境沒有問題之後手動重啟主機上keepalived服務,讓vip切回到主機上。 為
了滿足這樣的業務場景,可以使用nopreempt引數,不搶佔VIP的機制實現 修改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 # 執行時間間隔 weight -5 # 計算權重值,指令碼結果導致的優先順序變更,檢測失敗(指令碼返回非0)則優先順序 -5 fall 3 # 檢測連續3次失敗才算確定是真失敗。會用weight減少優先順序(1-255之間) rise 2 # 檢測2次成功就算成功。但不修改優先順序 } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 251 priority 100 advert_int 1 nopreempt ##不搶VIP 機制 authentication { auth_type PASS auth_pass 11111111 } track_script { chk_nginx } virtual_ipaddress { 192.168.73.100 } }
可以自己重啟keepalived,然後停止web,然後再啟動web,驗證是否能夠自動漂移回主機
當在同一個區域網內部署了多組keepalived伺服器時,可能會發生高可用接管的嚴重故障問題。 因為keepalived高可用功能是通過VRRP協定實現的,VRRP協定預設通過IP多播的形式實現高可用對之間的通訊,如果同一個區域網記憶體在多組Keepalived伺服器對,就會造成IP多播地址衝突問題,導致接管錯亂. 不同組的keepalived都會使用預設的224.0.0.18作為多播地址。此時的解決辦法是,在同組的keepalived伺服器所有的組態檔裡指定獨一無二的多播地址,設定如下:
global_defs { ``router_id LVS_19 ``vrrp_mcast_group4 224.0.0.19` `#指定多播地址 }
以上就是keepalived對nginx進行高可用搭建及原理詳解的詳細內容,更多關於keepalived搭建nginx的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45