1)vrrp協議的實現
keepalive
2)ais:完備HA集羣html
RHCS(cman) heartbeat corosync
概念:在節點(主機)出現故障時,實現ip地址的切換。
keepalive就是基於此協議而實現高可用的。linux
Failover:故障切換,即某資源的主節點故障時,將資源轉移至其它節點的操做;
Failback:故障移回,即某資源的主節點故障後從新修改上線後,將轉移至其它節點的資源從新切回的過程;nginx
術語:web
虛擬路由器:Virtual Router 對應與配置文件中/etc/keepalived中的virtual_ipaddress 生產中一個director主機上一般會有多個網卡,對外爲vip1,接收用戶請求,對內爲vip2,將用戶的請求經過vip2發送給後端提供服務的主機RS。在配置虛擬路由ip時。vip1與vip2須要配置在一個組內,實如今master主機出現故障時,vip1轉向backup備用主機時,vip2也同時轉向backup備用主機。否則vip2還停留在master主機上,轉向後端主機的請求將會沒法到達。 此塊在配置文件中 虛擬路由器標識:VRID(0-255) 物理路由器: master:主設備 backup:備用設備 priority:優先級 VIP:Virtual IP,虛擬ip VMAC:Virutal MAC (00-00-5e-00-01-VRID) GraciousARP 通告:心跳,優先級等;週期性; 搶佔式,非搶佔式; 安全工做: 認證: 無認證 簡單字符認證 MD5
vrrp協議的軟件實現,原生設計的目的爲了高可用ipvs服務: 基於vrrp協議完成地址流動; 爲集羣內的全部節點生成ipvs規則(在配置文件中預先定義); 爲ipvs集羣的各RS作健康狀態檢測; 基於腳本調用接口經過執行腳本完成腳本中定義的功能,進而影響集羣事務; 組件: 核心組件: vrrp stack vrrp協議的實現 ipvs wrapper爲集羣內的全部節點生成ipvs規則 checkers 爲ipvs集羣的各RS作健康狀態檢測 控制組件:
配置文件分析器算法
IO複用器 內存管理組件
虛擬路由器的工做模型:vim
單主: 雙主
通知機制:後端
notify_master notify_backup notify_fault
yum install keepalived
程序環境:安全
主配置文件:/etc/keepalived/keepalived.conf 主程序文件:/usr/sbin/keepalived Unit File:keepalived.service Unit File的環境配置文件:/etc/sysconfig/keepalived
/etc/keepalived/keepalived.confbash
配置文件組件部分:服務器
TOP HIERACHY GLOBAL CONFIGURATION Global definitions Static routes/addresses VRRPD CONFIGURATION VRRP synchronization group(s):vrrp同步組; VRRP instance(s):每一個vrrp instance即一個vrrp路由器; LVS CONFIGURATION Virtual server group(s) Virtual server(s):ipvs集羣的vs和rs;
能夠查看配置文件的具體使用細則
第一個配置段:GLOBAL CONFIGURATION
第二配置段:VRRPD CONFIGURATION
此地址段爲配置keepalived的核心配置段。主要包括兩塊內容
VRRP instance(s):vrrp實例
一個vrrp instance 就是一個vrrp路由器
VRRP synchronization group(s):虛擬路由器同步組
一個主機生產中通常須要配置兩個以上的虛擬路由器。此配置能夠實現將多個虛擬路由器編制在一個組內,能夠實現,當一個虛擬路由器偏移至另外一臺主機時,其他的虛擬路由器(vip)也同時偏移至另外一臺主機上。
inside_network # name of vrrp_instance (below) 內網網絡
outside_network # One for each moveable IP. 外網網絡
第三段:LVS CONFIGURATION
高可用LVS時使用。若使用Nginx時不用關注此塊
配置虛擬路由器: vrrp_instance <STRING> { .... } 專用參數: state MASTER|BACKUP:當前節點在此虛擬路由器上的初始狀態;只能有一個是MASTER,餘下的都應該爲BACKUP; interface IFACE_NAME:綁定爲當前虛擬路由器使用的物理接口; virtual_router_id VRID:當前虛擬路由器的唯一標識,範圍是0-255; priority 100:當前主機在此虛擬路徑器中的優先級;範圍1-254; advert_int 1:vrrp通告的時間間隔; authentication { auth_type AH|PASS auth_pass <PASSWORD> } virtual_ipaddress { <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 } track_interface { eth0 eth1 ... } 配置要監控的網絡接口,一旦接口出現故障,則轉爲FAULT狀態; nopreempt:定義工做模式爲非搶佔模式; preempt_delay 300:搶佔式模式下,節點上線後觸發新選舉操做的延遲時長; 定義通知腳本: notify_master <STRING>|<QUOTED-STRING>:當前節點成爲主節點時觸發的腳本 notify_backup <STRING>|<QUOTED-STRING>:當前節點轉爲備節點時觸發的腳本; notify_fault <STRING>|<QUOTED-STRING>:當前節點轉爲「失敗」狀態時觸發的腳本; notify <STRING>|<QUOTED-STRING>:通用格式的通知觸發機制,一個腳本可完成以上三種狀態的轉換時的通知;
通知機制:
notify_master:to be master時,調用指定的腳本完成輔助操做,,以「通知」爲核心目標
notify_backup to be backup時,調用指定的腳本完成輔助操做,,以「通知」爲核心目標
notify_fault
通知腳本的使用方式: 示例通知腳本: #!/bin/bash # contact='root@localhost' notify() { local mailsubject="$(hostname) to be $1, vip floating" local 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 腳本的調用方法: notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault"
D類IP地址第一個字節以「1110」開始 。它並不指向特定的網絡,目前這一類地址被用在多點廣播(Multicast)中。多點廣播地址用來一次尋址一組計算機,它標識共享同一協議的一組計算機。
D類地址又分爲三種類型:即專用地址、公用地址和私用地址;其中專用地址(224.0.0.0-224.0.0.255)用於網絡協議組的廣播,公用地址(224.0.1.0-238.255.255.255)用於其它組播,私用地址(239.0.0.0-239.255.255.255)用於測試。
在keepdlived的配置文件中
vrrp_mcast_group4 224.24.24.18
此地址用於向共同使用vrrp協議的主機 不斷的廣播自身的ip地址,及優先級。優先級高的主機將會使用vip
在現實中,會使用一根網線將 此兩臺主機直接綁定在一塊兒,實現此類功能
HA Cluster的配置前提:
(1) 各節點時間必須同步;
ntp, chrony (2) 確保iptables及selinux不會成爲阻礙; (3) 各節點之間可經過主機名互相通訊(對KA並不是必須); 建議使用/etc/hosts文件實現; (4) 確保各節點的用於集羣服務的接口支持MULTICAST通訊; D類:224-239;
keepalive天生是用來高可用LVS的。藉助服務腳本接口能夠實現高可用nginx和haproxy
第一步:單主模型
vrrp的地址轉移實現。單主模式。一個虛擬路由vip
第二步:雙主模型
實現雙主節點,每個節點均可以工做起來。雙虛擬路由ip
第三步:高可用LVS
在單主模式下。增長後端的具體服務。實現節點切換時,服務仍然可用。
後端的服務爲兩臺主機,
第四步:增長check。檢查後端主機的健康情況。
在後端主機所有down掉的狀況之下,增長sorry server.用keepalive主機實現
第五步:高可用haproxy
keepalive主機再也不使用LVS(director)。使用nginx或者haproxy
環境:172.16.253.95 作master
172.16.253.96 作backup
再解讀/etc/keepalived/keepalived.conf
全局配置
global_defs {
notification_email {
haha@mashuai.com //出問題時,接收郵件的地址
}
notification_email_from admin@mashuai.com //郵件發件人地址
smtp_server 127.0.0.1 //郵件服務器地址
smtp_connect_timeout 30 //鏈接超時時間
router_id n2 //虛擬路由服務器地址(建議寫上主機名)
vrrp_mcast_group4 224.24.24.18 //多播地址段,默認爲224.0.0.18.作實驗時須要更改
}
vrrp_instance vrrp實例段,核心配置段
vrrp_instance VI_1 { //虛擬路由器的名稱,多個時,名稱要不同
state MASTER //虛擬路由器的狀態,master|backup interface eth0 //經過哪一個網口發送vrrp廣播 virtual_router_id 01 //虛擬路由器的id,要與同一臺主機上的其餘虛擬路由器id 區分開來 priority 100 //物理路由器在此虛擬路由器上的優先級 advert_int 1 //每隔多長時間 廣播一次本身的優先級 authentication { //傳遞信息的認證方式,密碼僅支持8位 auth_type PASS auth_pass 1111 } virtual_ipaddress { //虛擬路由的ip地址 172.16.253.100 }
}
95主機的配置文件
注意:綠色字體爲與96主機不同的地方。
其餘的配置文件內容通通都註釋掉
global_defs {
notification_email {
haha@mashuai.com
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_mcast_group4 224.24.24.18
}
vrrp_instance VI_1 {
state MASTER interface eth0 virtual_router_id 01 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.16.253.100 }
}
96主機的配置文件
global_defs {
notification_email {
haha@mashuai.com
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id n2
vrrp_mcast_group4 224.24.24.18
}
vrrp_instance VI_1 {
state BACKUP interface eth0 virtual_router_id 01 priority 95 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.16.253.100 }
}
95主機 master:
systemctl restart keepalived.service
systemctl status keepalived.service
ip a:虛擬路由器主機ip已經添加進來
tcpdump -nn -i eth0 host 224.24.24.18
172.16.253.95 主機經過224.24.24.18向外發送vrrp廣播,vrid爲1 優先級爲100,字節長度爲20,簡單認證方式,每隔1秒發送一次
96主機:backup
systemctl restart keepalived.service
systemctl status keepalived.service
4:模擬vip偏移至 96主機
95 主機 stop keepalived服務
systemctl stop keepalived.service
在96主機上 vip已經偏移至96主機
再次在 95 主機重啓 keepalived服務 VIP則將從新偏移至95主機
默認vrrp工做於搶佔 模式。誰的級別高,vip偏移至哪臺主機上
簡述:配置兩個虛擬路由器
下圖爲框架:
環境:先stop 95 96兩臺主機的keepalived服務
95主機增長以下代碼:
vrrp_instance VI_2 {
state BACKUP interface eth0 virtual_router_id 02 priority 95 advert_int 1 authentication { auth_type PASS auth_pass 2222 } virtual_ipaddress { 172.16.253.200 }
}
96主機:
增長以下代碼,至關於增長了另外一組虛擬路由器vip2 172.16.253.200
vrrp_instance VI_2 {
state MASTER interface eth0 virtual_router_id 02 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 2222 } virtual_ipaddress { 172.16.253.200 }
}
96主機:先關閉服務,再啓動服務。
[root@hkeepalived]#systemctl stop keepalived
[root@hkeepalived]#systemctl start keepalived
[root@hkeepalived]#systemctl status keepalived
兩個 vip都添加至 eth0 網卡了
[root@hkeepalived]#systemctl stop keepalived
[root@hkeepalived]#systemctl start keepalived
[root@hkeepalived]#systemctl status keepalived
啓動95 主機服務以後 100地址的vip回至95主機。由於172.16.253.100的vip在95主機的優先級要比在96主機上高
目的:演示通知機制中
notify_master notify_bacup 是如何工做
編輯通知機制的腳本放置在/etc/keepalived下
vim notify.sh
contact='root@localhost'
notify() { local mailsubject="$(hostname) to be $1, vip floating" local 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
刪除 實驗四中 增長的配置文件內容
95 96 主機中 在vrrp_instance中增長以下代碼
notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault"
啓動96主機的服務:
查看郵件有無發送:
mail
啓動95主機的服務:
96主機將收到 變爲 backup 的郵件
環境:
95主機 LVS
96主機 LVS
97 98 主機RS
yum install nginx –y
編輯主頁文件:
97:vim /usr/share/nginx/html/index.html
<h1> RS1111111111111</h1>
98:vim /usr/share/nginx/html/index.html
<h1> RS22222222222</h1>
97 98主機編輯腳本
1:
後端主機內核參數的修改 及 vip的添加
編輯腳本,實現對內核參數的修改
vim /root/set.sh
#!/bin/bash
vip=172.16.0.199
mask=255.255.255.255
iface="lo:0"
case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce ifconfig $iface $vip netmask $mask broadcast $vip up route add -host $vip dev $iface ;;
stop)
ifconfig $iface down echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce ;;
*)
echo "start|stop" exit 1
;;
esac
2:測試腳本實現
bash –x set.sh start
ip a
查看 lo的ip有無添加進來
1 安裝ipvsadm
2 添加vip至eth0
ifconfig eth0:0 172.16.253.199 netmask 255.255.255.255 broadcast 172.16.253.199 up
3:配置LVS-NAT 服務
[root@h~]#ipvsadm -A -t 172.16.253.199:80 -s rr
[root@h~]#ipvsadm -a -t 172.16.253.199:80 -r 172.16.253.97:80 -g
[root@h~]#ipvsadm -a -t 172.16.253.199:80 -r 172.16.253.98:80 -g
[root@h~]#ipvsadm -L –n
4:測試
在96主機上部署lvs
95主機
ipvsadm –C
ifdown eth0:0
96主機
重複步驟3 便可
1 安裝ipvsadm
2 添加vip至eth0
ifconfig eth0:0 172.16.253.199 netmask 255.255.255.255 broadcast 172.16.253.199 up
3:配置LVS-NAT 服務
[root@h~]#ipvsadm -A -t 172.16.253.199:80 -s rr
[root@h~]#ipvsadm -a -t 172.16.253.199:80 -r 172.16.253.97:80 -g
[root@h~]#ipvsadm -a -t 172.16.253.199:80 -r 172.16.253.98:80 -g
[root@h~]#ipvsadm -L –n
4 測試 DR模式正常與否
5 測試ok後
96主機上清空全部規則
ipvsadm –C
ifconfig eth0:0 down
如下代碼是 實現 LVS 調度
95 96 主機 keepalived.conf配置文件中加入以下代碼
virtual_server 172.16.253.199 80 {
delay_loop 6 lb_algo rr lb_kind DR protocol TCP real_server 172.16.253.98 80{ weight 1 HTTP_GET { url { path / status_code 200 } } connect_timeout 2 nb_get_retry 3 delay_before_retry 1 } real_server 172.16.253.97 80{ weight 1 HTTP_GET { url { path / status_code 200 } }
connect_timeout 2
nb_get_retry 3 delay_before_retry 1 }
}
重啓 keepalived服務
測試:
95主機的 優先級比96的高
vip會偏移至95主機
96主機
95主機
給98主機增長iptables規則 :全部tcp的訪問禁止掉
iptables –A INPUT –p tcp –dport 80 –j REJECT
curl http://172.16.253.199 訪問就會僅僅訪問 97主機了
在 95 96主機上增長soory server 內容
當 後端 9798主機的所有宕機以後。95 96提供sorry server頁面服務
95 96主機
1:安裝nginx 提供sorry頁面
vim /usr/share/nginx/html/index.html
2:更改配置文件 keepalived.conf
在 virtual_server中
增長一行代碼 sorry_server 127.0.0.1 80
重啓keepalived服務
[root@hkeepalived]#systemctl stop keepalived
[root@hkeepalived]#systemctl start keepalived
down掉 後端主機 9798 nginx服務
測試訪問:
curl http://172.16.253.199 訪問的是95 主機上的 sorry頁面
關閉 95主機的keepalived 服務
測試訪問:
curl http://172.16.253.199 訪問的是96 主機上的 sorry頁面
目的:
藉助腳本實現 高可用服務(ninx/http/haproxy)
也就是說在服務不可用時,vip偏移至備用節點。而不是以前實現的主機down掉以後vip偏移至備用節點。
環境:
95 96主機。keepalived 服務stop
腳本例子:
1:rpm –ql keepalived
此文件內有腳本的例子,以及如何調用
/usr/share/doc/keepalived-1.2.13/samples/keepalived.conf.vrrp.localcheck
2:cat /usr/share/doc/keepalived-1.2.13/samples/keepalived.conf.vrrp.localcheck
3:腳本簡述
1:在配置文件中定義腳本
vrrp_script chk_sshd {
script "killall -0 sshd" # cheaper than pidof interval 2 # check every 2 seconds weight -4 # default prio: -4 if KO fall 2 # require 2 failures for KO rise 2 # require 2 successes for OK
}
調用腳本 使用 vrrp_script 關鍵詞
腳本名 chk_sshd
腳本內容分爲兩塊
1 script "killall -0 sshd" 表示 此段代碼 返回0值,部分功能不變 返回非0值。要執行一些關鍵指令
killall -0 sshd :測試 是否能夠殺掉 sshd進程。能殺掉返回0值,表示sshd服務
正常運行。返回其餘值,表示sshd服務沒有運行正常。
2:weight -4 測試失敗權重-4
fall 2 檢測失敗2次,才減去權重 rise -2 檢查兩次成功,ok
2:在配置文件中調用腳本
在 vrrp_instance中
使用track_script {
chk_haproxy weight 2 chk_http_port chk_https_port chk_smtp_port }
此種模式調用腳本
95 96主機同時更改配置文件
編輯keepalived.conf文件
1)增長腳本 2)調用腳本
1)編輯腳本
vim /etc/keepalived.conf
vrrp_script chk_nginx{
script "[[ -f /etc/keepalived/down ]] && exit 1 ||exit 0 "
interval 1
weight -10
fall 2
rise 1
}
script "[[ -f /etc/keepalived/down ]] && echo 1 ||echo 0 "
down文件存在 返回1 down文件不存在 返回0
依靠down文件存在與否 來下降/保持 主節點的權重
2)調用腳本
track_script { chk_nginx
}
使用 track_script 關鍵詞 調用腳本
在95主機上 touch /etc/keepalived/down文件
vip偏移至96主機
95 96主機
vim /etc/nginx/nginx.conf
server 中增長
location / {
proxy_pass http://websrvs;
}
server上增長
upstream websrvs {
server 172.16.253.97:80;
server 172.16.253.98:80;
}
此段主要實現 nginx的 服務調度至後端服務器
上接實驗三:
增長 vrrp_instance 實例2
96主機 在vip2上爲MASTER
95主機在 vip2上爲BACKUP
96主機增長以下內容:
vrrp_instance VI_2 {
state MASTER interface eth0 virtual_router_id 61 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.16.253.188 }
track_script {
chk_nginx
}
}
95主機增長以下內容:
vrrp_instance VI_2 {
state BACKUP interface eth0 virtual_router_id 61 priority 95 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.16.253.188 }
track_script {
chk_nginx chk_nn
}
### 2: 測試雙主模式
95主機 關閉—啓動服務
96主機關閉服務
1)vip1 及vip2 都在 95主機上
2)啓動96 主機上的keepalived 服務
vip2 跳轉至 96主機上
3) 在95 主機上 建 /etc/keepalived/down文件
vip1 199也跳轉至 96主機上
4) 客戶端測試訪問
3:改變 nginx的調度算法
2 hash算法
hash $request_uri consistent
hash $remote_addr
hash $cookie_name
ip_hash 改成 hash $request_uri consistent
}