Linux Cluster:KeepAlive
1.集群類型:LB(負載均衡集群),HA(高可用集群),HP(高性能集群)
LB:均衡負載的實現LVS
HA:高可用的實現KeepAlived
2.RS:健康狀態檢測方式:
(1)網絡層:icmp ping
(2)傳輸層:tcp ping
(3)應用層:對相應服務下的關鍵點發起請求;基于資源獲取的方式;
3.各檢測之間的時間間隔限定:
前端的調度器,要實現高可用,而且要實現對各RS做健康監測,且實現動態增刪RS;
網絡層的健康監測效果是最差的,使用簡單,應用層的健康監測效果最佳,但消耗資源;
檢測超時限定:timeout
檢測次數限定:soft failure –> soft failure –> hard failure
OK –> PROBLEM:3+次 PROBLEM –> OK:1+次
第一次監測失敗為soft failure,第三次監測失敗則認為是hard failure;從OK檢測到失敗一般在3次以上;而從失敗檢測到OK只需一次就可認為是OK;
4.HA:衡量高可用的標準
A=MTBF/(MTBF+MTTR)
MTBF:平均無故障時間;
MTTR:平均修復時間;
提高系統高可用:
通過降低MTTR提高系統高可用:通過冗余(redundant)實現;
當調度器故障時,需要自動判斷是否故障,且要能自動實現冗余切換;
實現方法有三種:1、內生邏輯自動完成2、外在腳本實現3、人工手動介入實現;
自動完成是可用的,在主備節點間,運行一個服務程序層;通過網絡連接,相互通告自己的連接狀態是否健康;冗余節點可有多臺,可認為在同一組內;主用服務器,發送heartbeat,備用節點發現heartbeat不在時,要選舉出一臺主用服務器來替代故障機;
Heartbeat:Heartbeat 項目是 Linux-HA 工程的一個組成部分,它實現了一個高可用集群系統。心跳服務和集群通信是高可用集群的兩個關鍵組件
網絡分區:Network Partition
當A主機正常發送heartbeat,由于網絡原因,其它備份主機收不heartbeat信息;此時,備份主機會選舉出一臺主機添加上A主機的IP地址,而A主機此時也存在該地址;前路由會出現無法識別網絡的問題,這樣就叫由于網絡故障出現的網絡分區;各主機間會出現,IP的資源爭奪;
如何判斷IP資源歸誰所有,通過票數決定,看A主機和備份主機各占總票數的多少來決定;得票數要大于總票數的半數,為勝出方,取得IP資源當做主用服務器;
大于總票數的一半稱為total/2,法定票數(with quorum);
如果集群只有兩個節點時,無論任何一方down掉,任何一方都不能有法定票數,即為without quorum;
為了解決只有AB兩主機時,一臺出現故障,而冗余要替換成主用這個問題,就使用一個路由器當做仲裁,判斷是否大于半數;路由器可參與選舉,這樣AB主機加上路由器就出現了總數為3票;如果B節點發現A節點聯系不到,但自己能與路由器通信,此時B就認為自己的票數是大于半數的,自動成為主用服務器;
構建一個冗余的集群時,最好擁有奇數節點;
一般構建高可用集群(基于冗余方式),對另一個節點做冗余,通常把這些節點做集群,定義在一個組內,這些節點上運行一個服務,這個服務可實現,主節點不斷向組內的其它備用節點通告heartbeat信息,通常1秒1次,其它冗余節點收到后,則不會在備用組內選舉主服務器;當3次收不到heartbeat時,就會在冗余組內選舉一個主服務器,把原來的IP等資源爭奪過來,提供主用服務;
提供高可用服務的程序,就為keepalived(基于vrrp協議實現);
HA Service:要有必須的資源:ip,httpd,store
HA Cluster的實現方案:
vrrp協議的實現;keepalived
ais:完備的HA集群;
不僅能完成心跳信息的判斷,還能判斷服務是否正常,在主服務器失敗后由備用機替換為主用;
ais家族:需要多個組件,有3層,最底層是集群事務層,上一層是資源管理器層、再上一層是資源代理層;每一次都有非常復雜的結構;基于以下三個實現;
Heartbeat:心跳檢測,用于主背服務器之間檢測是否可用
corosync:實現HA心跳信息傳輸的功能就是Corosync
cman)
VRRP協議:虛擬冗余路由協議
1、vrrp中的術語:
VR:虛擬路由器
VRID:虛擬路由器的標識號(0-255)
Master(Active):主路由器(活動節點)
Backup(Passive):備份路由器(被動節點)
VIP:虛擬IP地址;流動(浮動)IP;
VMAC:VIP對應的虛擬MAC地址(48位);00-00-5E-00-01-{VRID}
2、優先級:初始化過程中就決定了優先級;
VRRP備份服務如果啟動成為了主服務器之后,會發起gracious arp(免費arp廣播),因為此時VIP的MAC地址已經改變了,VRRP會自己詢問自己的MAC地址,然后再廣播回答自己的MAC地址,同一局域網內的其他主機之前如果存在之前的VIP的MAC地址會自動更新MAC地址,完成IP替換。
3、vrrp工作方式:2種
搶占式:優先級高的,搶占為主用;主要體現在如果主服務器出 現故障被備用服務器替換之后,此前的主服務器已經修復成功之后會再次搶占自己為主服務器。
非搶占式:按照優先級決定主背,不會搶占。
4、應用工作模式:
主/備:
備/主:配置多個虛擬路由器(交叉主備);
例:對Director使用高可用,準備兩臺DR,互為主備;提供兩個VIP
A節點VIP:172.18.100.7
B節點VIP:172.18.100.8
A為B的備份,B為A的備份;
當A節點掉線,B節點將成為A節點的主,同時還是B節點的主;
這樣意味著AB節點上要配置兩個VIP地址;在DNS解析時,一個A記錄要有2個VIP;這樣,就實現了2級負載均衡;
keepalived就是在Linux主機上vrrp協議的實現;能實現lvs高可用的;也可制作腳本對http或nginx實現高可用;
5、vrrp認證方式:
無認證;
簡單字符串認證:預共享密鑰;
md5認證;
6、keepalived:(簡寫為ka)是vrrp協議的實現;
原生設計目的用于實現為高可用ipvs服務;ka能夠根據配置文件中定義自動生成ipvs規則(增、刪),并能夠對各RS的健康狀態進行檢測;
支持vrrp_script接口,vrrp_track;通過編寫vrrp腳本,通過vrrp_track跟蹤各種服務;
7、keepalived組件:
控制面板(組件)、配置文件分析器、內存管理、IO復用
核心組件:
vrrp stack:實現vrrp協議;
smtp:發送通知郵件;可在地址流動時發郵件,還可根據checkers檢查后把宕機從從ipvs規則中移除,發出此郵件;
checkers:檢測后端RS健康狀態,可基于tcp、htp、ssl、misc檢測;發現宕機就從ipvs規則中移除;
watchdog:實現監控vrrp stack和checkers的健康;
ipvs wrapper:checkers通過調用該包裝器,來實現在ipvs中添加、刪除或修改規則;
8、HA Cluster配置的前提:(各調度器)
1、各節點時間同步;
可基于ntp協議同步,設置/etc/chrony.conf(centos 7)
命令:ntpdate 時間服務器IP
2、確保iptables及selinux不會阻礙,因為各調度器之間會傳遞心跳信息
心跳信息傳遞:3種方式
單播、廣播、組播
組播:最佳使用方式;組播地址:224.0.0.0-239.0.0.0
3、各節點之間可通過主機名相互通信(對ka并非必須,ka是無所謂的);
名稱解析服務的解析結果必須與“uname -n”命令的結果一致;
如果是主機名通信,dns解析名必須與真實主機名一致;
4、各節點之間的root用戶可以基于密鑰認證的ssh通信,(對ka并非必須,ka無所謂);
9、配置文件內容詳解
]# vim /etc/keepalived/keepalived.conf; global_defs { //全局配置段 notification_email { //接收通告郵件的地址,收件人 root@localhost } notification_email_from kaadmin@magedu.com //發件人 smtp_server 127.0.0.1 //配置郵件服務器,要求能在互聯網上正反解析; smtp_connect_timeout 30 //郵件服務器的超時時長 router_id node1 //定義當前路由器設備的ID號,一般為主機名; vrrp_mcast_group4 224.0.11.18 //組播地址,默認為224.0.0.18,同一個VRRP組的集r群里的所有節點都有使用此地址;表示同一個組播域,用于主背服務器心跳檢測使用。} vrrp_instance VI_1 { //虛擬路由器配置段,實例名稱為VI_1,也可自定義; state MASTER //當前節點在此虛擬路由器中的初始狀態;表示為主節點;取值為:MASTER|BACKUP; interface eno16777736 //表示vrrp發送通告的接口; virtual_router_id 11 //虛擬路由器ID,范圍0-255; priority 100 //當前物理節點在此虛擬路由器中的優先級; advert_int 1 //表示vrrp的通告的時間間隔;為1秒; authentication { //認證方式 auth_type PASS //使用簡單密碼認證 auth_pass 347hdfk3 //隨機隨機字符串,可使用openssl rand -base64 8生成,前8位字符有效;; } virtual_ipaddress { //定義虛擬IP,不指明則為前面的interface指明的接口地址; 172.18.11.66 //網卡別名地址,可寫為172.18.11.66 dev eno16777736 label eno16777736:0 } }
例:搭建VRRP
1、各調度器時間需要同步
]# ntpdate 172.18.0.1 //向時間服務器同步;
可創建自動計劃任務,向時間服務器每5分鐘同步一次時間
]# crontab -e
*/5 * * * * /usr/sbin/ntpdate 172.18.0.1 &> /dev/null
2、 安裝keepalived
]# yum -y install keepalived ]# vim /etc/keepalived/keepalived.conf global_defs { notification_email { root@localhost } notification_email_from root smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id node1 vrrp_mcast_group4 224.0.11.18 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 18 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 76asdf2f } virtual_ipaddress { 10.1.25.100/16 } }
3、node1配置完成、復制KeepAlived.conf配置文件到node2
]# scp keepalived.conf root@172.18.11.121:/etc/keepalived
]# vim /etc/keepalived/keepalived.conf
修改:
state BACKUP 修改為備用
priority 50 修改小優先級;
注意:密碼、router_id、vrrp_mcast_group4要保存一致;
4、在兩個調度器上開啟keepalived服務:測試即可
vrrp有兩種工作主/備,主/主工作模型;
為了提高利用率,就使用主/主工作模型;
即A主B從,B主A從;這樣AB都能發揮作用;在外部都稱為主時,可在前端dns配置A記錄把兩個ip都配置在一個主機名上即可;
但在有些場景中,AB都稱為主時不是配置在同一網卡上的兩個不同的別名,而是分別配置在兩塊網卡上;
AB每個主機都有兩塊網卡,一塊網卡面向外網,一塊網卡面向內網通信;期望通信時,這兩個地址都是VIP,只不過,前面外網是虛擬路由器1,內網是虛擬路由器2;里面的別名配置在內網網卡上,外面的別名配置在外網網卡上;當外網其中一個線路掉線時,可自動切換到另一個外網網卡的服務器上,要求而也要內網同樣要切換;要求內外通信使用VIP,所以沒有必要切換的內網也要切換;
這種把兩個虛擬路由器,配置為只能對一個設備是主服務器,同進同退,這種就叫做一個同步組;
centos 7:
主配置文件:/etc/keepalived/keepalived.conf
Unit file:/usr/lib/systemd/system/keepalived.service
配置文件:/etc/sysconfig/keepalived
一、配置文件內容塊:
1.GLOBAL CONFIGURATION
//全局配置段,對所有vvrp實例虛擬服務器都是生效; global_defs { ...}
2.VRRPD CONFIGURATION —虛擬路由器同步組配置段
vrrp_sync_group VG_1 { ...}
3.VRRP instance(s) 虛擬路由器實例配置段
vrrp_instance INST_NAME { ...}
4.LVS CONFIGURATION 集群配置段
virtual_server_group <STRING> { 虛擬服務器組配置段 ...}
5.Virtual server(s) 虛擬服務器配置段
virtual_server IP port
virtual_server fwmark int { 十進制的整數,(實際最終用的是十六進制數)
protocol TCP 注意:keepalived只支持tcp;
…
real_server <IPADDR> <PORT>{ 真實后端服務器配置段
…
}
}
虛擬路由示例配置:
vrrp_instance <string> { state MASTER|BACKUP //當前節點在此虛擬路由器中的初始狀態; interface ETHERCARD //vrrp實例工作的網絡接口;發送通告的接口; virtual_router_id 51 //虛擬路由器ID,范圍0-255; priority 100 //當前物理節點在此虛擬路由器中的優先級; advert_int 1 //通告的時間間隔; authentication { 認證機制 # PASS||AH 使用哪種認證方式 # PASS - Simple Passwd (suggested) 簡單密碼 # AH - IPSEC (not recommended)) 驗證頭協議 auth_type PASS auth_pass 1234 前8位字符有效; } virtual_ipaddress { 定義虛擬IP格式:<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL> 192.168.200.17/24 dev eth1 //可為網卡別名的地址; 192.168.200.18/24 dev eth2 label eth2:1 } use_vmac <VMAC_INTERFACE> //使用虛擬MAC地址,00-00-5E-00-01-{VRID},可省略; mcast_src_ip <IPADDR> -----組播地址作為的源地址 unicast_src_ip <IPADDR> ----單播地址作為的源地址 track_interface { ----定義要監控的接口;指明跟蹤的接口,接口發生故障時,可實現自我監控機制;發通告的接口與VIP所在接口可不是同一個接口; eth0 eth1 } nopreempt ----表示工作于非搶占模式,不指明,則默認為搶占,兩臺服務器性能一樣可設為非搶占; preempt_delay 300 ---設定上線后搶占延遲時間,默認為300秒即5分鐘; 通告腳本定義,對于整個路由設備,內部出現故障時,可向外通告; notify_master <STRING>|<QUOTED-STRING> 變為主服務器時發通告,此處為腳本的路徑;路徑中有空格要使用雙引號; notify_backup <STRING>|<QUOTED-STRING> 變為備用服務器時發通告; notify_fault <STRING>|<QUOTED-STRING> 變為故障服務器時發通告; notify <STRING>|<QUOTED-STRING> 以上三個功能可用一個腳本實現; }
虛擬服務器示例:
]# vim /etc/keepalived/keepalived.conf //配置虛擬服務器示例:
virtual_server IP PORT
virtual_server FWM # { //設定一個整數
lb_algo rr|wrr|lc|wlc|lbli|sh|dh //定義負載均衡的調度方法;
delay_loop <INT> //定義服務輪詢時間間隔;每隔多長時間對后端服務器做健康狀態檢測
lb_kind NAT|DR|TUN //集群的類型;-m,-g,-i
persistence_timeout <INT> //持久連接時長,默認單位是秒鐘,沒定義或為0表示不使用持久連接
protocol TCP //服務協議,只支持tcp;
virtualhost <STRING> //后端RS上的虛擬主機,做健康狀態檢測時是對每個虛擬主機做檢測,向后端主機發送報文時會帶上host首部,如果
不定義,則是向每個后端主機的IP地址發報文檢測健康狀態(即默認虛擬主機響應);
quorum <INT> //定義法定票數;即后端的RS至少有幾臺在線,才認為此集群是ok的,少于此處設定的值就認為整個集群都掛了;
quorum_up <STRING>|<QUOTED-STRING> //用于法定票數,執行的腳本;
sorry_server <IPADDR> <PORT> //所有RS均故障時,提供say sorry的服務器;
real_server <IPADDR> <PORT> { //后端真實服務器
weight <INT> //權重
notify_up <STRING>|<QUOTED-STRING> //當前RS節點上線時調用的通知腳本;
notify_down <STRING>|<QUOTED-STRING> //當前RS節點離線時調用的通知腳本;
# HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK —支持的所有健康狀態檢測方式;
1.基于HTTP或HTTPS協議檢測健康狀態
HTTP_GET|SSL_GET { 基于http或https協議做健康狀態檢測方法指令
url {
path <STRING> —健康狀態檢測時請求的資源的URL;
digest <STRING> —-基于獲取內容的摘要碼(使用摘要md5方法)進行健康狀態判斷;判斷是否健康;
status_code <INT> —-使用響應碼方法,判斷是否健康;所請求路徑的狀態碼與此處一致就認為ok;
}
nb_get_retry <INT> –健康狀態測試請求嘗試的次數;
delay_before_retry <INT> –兩次健康狀態測試請求嘗試之間的時間間隔;
connect_timeout <INTEGER> —向RS發健康狀態測試請求連接的超時時長;
connect_ip <IP ADDRESS> —檢查RS健康狀態時向此處指定的RS的IP地址發測試請求;不指明則為上面配置中定義的RS的IP;
connect_port <PORT> —-向此處指定的端口發健康狀態測試請求;
bindto <IP ADDRESS> —-指定測試健康狀態請求報文的源IP;向RS發測試請求時有源IP,一般為DIP;
bind_port <PORT> —-指定測試健康狀態請求報文的源端口;
}
}
2.基于TCP方式檢測健康狀態
TCP_CHECK { —-基于tcp方式檢測健康狀態
connect_ip <IP ADDRESS>
connect_port <PORT>
bindto <IP ADDRESS>
bind_port <PORT>
connect_timeout <INTEGER>
warmup <INT> —延遲多長時間再做健康狀態檢查,同時做檢測會有問題,如果有100個RS要做檢測,就需要此處設置;
}
實驗1:對后端WEB-server提高前端調度器的高可用集群,基于keepalived定義兩個調度器高可用lvs-dr模型的負載均衡集群
1.實驗環境:
KeepAlived地址:1:10.1.25.2
2:10.1.25.4
Web-Server地址:10.1.25.1、10.1.25.5
2.實現前提:
(1)KeepAlived時間要一致,可使用ntpdate命令同步
(2)KA之間能使用主機名通信,使用/etc/hosts/文件,主機名需要和uname -n的結果一致
(3)盡量讓KA之間可以無密碼通信,使用ssh-keygen和ssh-copy-id
(4)關閉防火墻和selinux
(5)由于KA中指定配置為DR模型,所以需要配置整個拓撲為DR模型,但不用配置ipvsadm
3.實驗步驟:
A.配置KA
[root@Centos6-2 keepalived]# vim keepalived.conf global_defs { notification_email { root@localhost } notification_email_from Centos6-2@localhost smtp_server 127.0.0.1 smtp_connect_timeout 20 router_id Centos6-2 vrrp_mcast_group4 224.0.25.1 } vrrp_instance v1 { state MASTER priority 100 interface eth0 virtual_router_id 25 advert_int 1 authentication { auth_type PASS auth_pass 12345678 } virtual_ipaddress { 10.1.25.125 dev eth0 brd 10.1.25.125 label eth0:10 } } virtual_server 10.1.25.125 80 { lb_algo rr delay_loop 2 lb_kind DR persistence_timeout 0 sorry_server 127.0.0.1 80 real_server 10.1.25.1 80 { weight 1 HTTP_GET { url { path /index.html status_code 200 } nb_get_retry 3 delay_before_retry 2 connect_timeout 3 } } real_server 10.1.25.5 80 { weight 1 HTTP_GET { url { path /index.html status_code 200 } nb_get_retry 3 delay_before_retry 2 connect_timeout 3 } } }
B.配置KA2
更改:virtual_ipaddress 、state 、priority 、等指令即可,
注意:virtual_router_id、auth_pass、vrrp_mcast_group4等指令需要一致
C.配置WEBserve,配置基本相同
i:搭建服務
~]# yum install -y httpd ~]# echo “WEB-Server1” > /var/www/html/index.html ~]# service httpd start ii:由于KA中指定配置為DR模型,所以需要配置整個拓撲為DR模型,但不用配置ipvsadm ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce ~]# router add -host 10.1.25.125 dev lo ~]# ifconfig lo:0 10.1.25.125 netmask 255.255.255.255 broadcast 10.1.25.125 up
借助keepalived的vrrp_script,track_script完成高可用服務;
1.vrrp_script:
自定義一個(服務)資源監控腳本;vrrp腳本能通過返回成功或失敗,或是vrrp實例或進程能根據腳本的狀態返回值來作為判斷服務是成功還是失敗的基本依據,并且能在腳本成功時,使相應節點的優先級提升或在失敗時相應節點的優先級通過計算以后降低;
公共定義,可被多個實例調用,因此,定義在vrrp實例之外;
2.track_script:
·調用vrrp_script定義的腳本去監控資源;track_script還能夠在監控的過程中,一旦發現腳本成功了能夠使得優先級升高,失敗了就能夠使得優先級降低,從而完成向外通告時通告一個較高優先級或較低的優先級,從而完所謂的角色轉換,這就是track_script的基本思路;
·定義在vrrp實例之內,調用事先定義好的vrrp_script;如同track interface,所以track就是跟蹤接口方式;失敗就向外通告降低優先級,成功就向外通告升高優先級;
·降低到什么程度,例如對一個主節點可運行兩個資源,第一,是定義在網卡的ip地址,第二,是監控的nginx服務;不斷的通過一個腳本探測nginx所監聽的80端口,甚至是nginx中的某個資源是否能夠正常訪問,如果發現不能訪問,就會嘗試的借助于vrrp實例中track_scipt的定義,使得當前節點優先級減去一個數值,減得的結果會低于backup節點,這樣,在向外通告時主節點的優先級會低于backup節點,這時,backup會成為主節點;這就是keepalived監控web服務實現高可用的思路;
對于keepalived而言,允許定義一個服務或資源追蹤腳本,并且根據腳本的狀態返回值,來作為判斷當前節點上所運行的服務是否OK的基本依據;如果需要這個腳本作為探測依據,就通過track_script來調用vrrp_script腳本定義的內容;
實驗2:定義利用down文件維護服務器
1.實驗要求:
A)當主服務優先級高并且不存在down文件時正常處于運行狀態,當down文件存在時則降低優先級自動讓備用服務器代替處理任務
2.實驗配置:
[root@Centos6-2 keepalived]# vim keepalived.conf global_defs { notification_email { root@localhost } notification_email_from Centos6-2@localhost smtp_server 127.0.0.1 smtp_connect_timeout 20 router_id Centos6-2 vrrp_mcast_group4 224.0.25.1 } vrrp_script chk_down { //自定義vrrp腳本調用名為chk_down script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" //文件存在,退出碼1,不存在則返回0; interval 2 //每個2秒檢查一次; weight -5 //檢測失敗則權重-5;成功將不執行;} vrrp_instance v1 { state MASTER priority 100 interface eth0 virtual_router_id 25 advert_int 1 authentication { auth_type PASS auth_pass 12345678 } virtual_ipaddress { 10.1.25.125 dev eth0 brd 10.1.25.125 label eth0:10 } track_script { 調用上面自定義的vrrp腳本調用名 chk_down }
3.備用服務器只需要更改state、priority即可
4.實驗結果:
i.當主服務器不存在down文件時,依然正常工作
Ii.當主服務存在down文件時,備用服務器立即代理主服務器工作
這就是vrrp_script、rack_script腳本基本工作機制;
可利用這樣的腳本來判斷http服務是否ok,實現出現故障時,地址自動浮動到另一節點上繼續提供服務;
要判斷一個服務是否在線,腳本應寫的越簡單越好;
判斷一個進程是否運行正常,如果正常就返回成功,不正常就返回失?。?br /> 沒有killall命令,需要安裝psmisc程序包:
使用示例1:當down文件存在,則降低該服務器的的優先級,備用服務器充當主服務器,利用文件是否存在來維護服務器
vrrp_script chk_down { script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" interval 2 weight -5} track_script { chk_down }
使用示例2:利用服務器來決定主背,使用killall -0 監控具體的服務進程,執行此命令時,如果進程不存在,則返回值為1 ,如果進程存在則被kill掉,返回值為0;
Killall命令返回值為1時,降低改服務器的優先級,讓備用服務器充當主服務器,killall命令返回值為0時,則不減5,表示該服務正在運行,該服務器則可以充當主服務器; vrrp_script chk_httpd { script "killall -0 httpd && exit 0 || exit 1" interval 2 weight -5 } track_script { chk_httpd }
注意:此演示的腳本一次判斷服務是否正常有可能會失敗,這樣就不是很妥當,應該需要多次判斷是否失敗,即便發現本機失敗了,也不要著急把地址及服務流轉出去;應該先嘗試重啟本地服務,重啟失敗后再向外流轉出去;或者是失敗后把服務完全kill掉可通過復雜腳本完成;
實驗3:利用通知機制返回當前服務器運行類型
1.通過擴展通知腳本,對當前服務器主背轉換以及故障時監控通知示例:
~]#vim /etc/keepalived/notify.sh
#!/bin/bash contact='root@localhost' notify() { mailsubject="$(hostname) to be $1, vip floating." mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1" echo "$mailbody" | mail -s "$mailsubject" $contact } case $1 in master) notify master ;; backup) notify backup ;; fault) notify fault ;; *) echo "Usage: $(basename $0) {master|backup|fault}" exit 1 ;; esac 2.配置腳本通知機制 ~]#vim /etc/keepalived/keepalived.conf 在vrrp_instance端添加以下指令即可 Vrrp_instance v1 { notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" }
綜合實驗:配置高可用負載均衡,配置Nginx代理搭建DISCUZ應用程序實現動靜分離
1.實驗環境:六臺主機,如上圖
a) 配置各主機IP地址
b) 所有主機關閉iptables和SElinux
2.實驗目的:
a) 配置兩臺KeepAlived實現客戶端請求時的高可用;
b) 配置兩臺Nginx代理服務器實現動靜態代理時的高可用;
c) 分別配置http服務器和php-fpm+mysql實現動靜態分離;
3.實驗步驟:
(1)KeepAlived主機配置:
[root@Centos6-1~]#yum install -y keepalived [root@Centos6-1 keepalived]# cat keepalived.conf ! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from nginx1@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id Centos6-1 vrrp_mcast_group4 224.0.25.1 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.1.25.125 dev eth0 brd 10.1.25.125 label eth0:10 } } virtual_server 10.1.25.125 80 { delay_loop 3 lb_algo rr lb_kind DR protocol TCP real_server 10.1.25.4 80 { weight 1 HTTP_GET { url { path /index.html status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 10.1.25.6 80 { weight 1 HTTP_GET { url { path /index.html status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
(2)兩臺KeepAlived主機配置差不多相同,主配置文件中更改一些參數即可
(3)配置Nginx Proxy代理服務器: 兩臺服務器配置差不多一致
[root@Centos7-1 ~]#yum install -y nginx [root@Centos7-1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore [root@Centos7-1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce [root@Centos7-1 ~]# route add -host 10.1.25.125 dev lo [root@Cento7-1 ~]# ifconfig lo:1 10.1.25.125 netmask 255.255.255.255 broadcast 10.1.25.125 up [root@Centos7-1 ~]#iptables -F ;setenforce 0 [root@Centos7-1 ~]# vim /etc/nginx/conf.d/default.conf server { listen 80; server_name www.nginx1.com; root /var/www/html; index forum.php; location / { proxy_pass http://10.1.25.11; index index.php; } location ~ \.php$ { fastcgi_pass 10.1.25.5:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name; include fastcgi_params; }
(4)配置http服務器
[root@Centos6-3 ~]# yum install -y http [root@Centos6-3 ~]# iptables -F;setenforce 0 ;cd /var/www/html [root@Centos6-3 ~]# wget ftp://10.1.0.1/pub/Sources/sources/php/Discuz_X3.2_SC_UTF8.zip [root@Centos6-3 ~]# unzip Discuz_X3.2_SC_UTF8.zip [root@Centos6-3 ~]# mv upload/* . [root@Centos6-3 ~]# chmod 777 -R * [root@Centos6-3 ~]# service httpd start
(5)配置php-fpm + mysql
[root@Cento-2 ~]# vim /etc/php-fpm.d/www.conf listen = 10.1.25.5:9000 //更改 ;listen.allowed_clients = 127.0.0.1 //添加;號注釋 [root@Centos7-2 ~]# mysql mysql> grant all on *.* to disuser@’%’ identified by ‘dispass’ ; mysql> grant all on *.* to disuser@’127.0.0.1’ identified by ‘dispass’ ; mysql> gras7-2 ~]# yum install -y php-mysql php-fpm php-gd php-xml php-mbstring php-mvrypt mariadb-server [root@Centos7nt all on *.* to disuser@’localhost’ identified by ‘dispass’ ; mysql> flush privileges; [root@Centos7-2 ~]# wget ftp://10.1.0.1/pub/Sources/sources/php/Discuz_X3.2_SC_UTF8.zip [root@Centos7-2 ~]# unzip Discuz_X3.2_SC_UTF8.zip [root@Centos7-2 ~]# mv upload/* . [root@Centos7-2 ~]# chmod 777 -R * [root@Centos7-2 ~]# service php-fpm start [root@Centos7-2 ~]# service mariadb-server start
原創文章,作者:Lii,如若轉載,請注明出處:http://www.www58058.com/56777