通知腳本的使用方式:
示例通知腳本:
#!/bin/bash
#
contact='root@localhost'---定義誰能接收,未來是一個數組,用python來編寫,鏈接真正的郵件服務器,去發真正的郵件html
notify() { local mailsubject="$(hostname) to be $1,vip floating"---float流動 local mailbody="$(date+'%F %T'):vrrp transition,$(hostname) changed to be $1" echo "$mailbody" | mail -s "mailsubject" $contact } case $1 in master) notify master---給上邊的函數傳遞參數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"
虛擬服務器:
配置參數:
virtual_server IP port |
virtual_server fwmark int
{
...
real_server {
...
}
}node
經常使用參數: delay_loop <INI>:服務輪詢的時間間隔 lb_algo rr|wrr|lc|wlc|lblc|sh|dh:定義調度方法 lb_kind NAT|DR|TUN:集羣的類型 persistence_timeout<INI>:持久鏈接時長 sorry_server <IPADDR><PORT>:備用服務器地址; real_server <IPADDR><PORT> { weight <INI> notify_up <STRING>|<QUOTED-STRING> notify_down <STRING>|<QUOTED-STRING> HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK{...}:定義當前主機的健康狀態檢測方法 } HTTP_GET|SSL_GET:應用層檢測 HTTP_GET|SSL_GET { url { path <URL_PATH>:dinginess要監控的URL; status_code <INI>:判斷上述檢測機制爲健康狀態的響應碼; digest <STRING>:判斷上述檢測機制爲健康狀態的響應的內容的校驗碼; } nb_get_retry <INI>:重試次數 delay_before_retry <INI>:重試以前的延遲時長; connect_ip <IP ADDRESS>:向當前RS的哪一個IP地址發起健康狀態檢測請求 connect_port <PORT>:向當前RS的哪一個PORT發起健康狀態檢測請求 bindto <IP ADDRESS>:發出健康狀態檢測請求時使用的源地址 bind_port <PORT>:發出健康狀態檢測時使用的源端口; connect_timeout <INTEGER>:鏈接請求的超時時長; }
高可用的ipvs集羣示例:python
node1:
vim /etc/keepalived/notify.sh
#!/bin/bash
#
contact='root@localhost'---定義誰能接收,未來是一個數組,用python來編寫,鏈接真正的郵件服務器,去發真正的郵件nginx
notify() {
local mailsubject="$(hostname) to be $1,vip floating"---float流動
local mailbody="$(date+'%F %T'):vrrp transition,$(hostname) changed to be $1"
echo "$mailbody" | mail -s "mailsubject" $contact
}web
case $1 in
master)
notify master---給上邊的函數傳遞參數master
;;
backup)
notify backup
;;
fault)
notify fault
;;
*)
echo "Usage:$(basename $0){master|backup|fault}"
exit 1
;;
esac算法
chmod +x notify.sh---給腳本文件執行權限
bash -n notify.sh---檢查語法
bash -x notify.sh master---手動執行腳本文件(一步一步執行),並傳遞一個參數master
能夠看下有沒有收到郵件,使用mail命令,可使用mail -r命令刪除測試的郵件
scp -p notify.sh node2:/etc/keepalived/---複製到node2節點上
而後能夠先複製下keepalived配置文件,讓結果更明晰
cp keepalived.conf{,.dual}vim
vim keepalived.conf
!Configuration File for keepalived後端
global_defs {
notification_email {---收郵件地址,要在互聯網上真正能接收br/>root@localhost
}
notification_email_from Alexandre.Cassen@firewall.loc---發郵件地址,能夠假裝源地址,可是有的服務器不容許假裝,要經過下面的smtp_server的檢查
smtp_server 127.0.0.1---通常是本機,可使用ss -tnl查看25號端口始終是開啓的,能夠很容易的從本機發送郵件到本機,例如:echo "hello" | mail -s "hi" root@localhost---s能夠給上郵件的標題,收郵件的命令是mail,就能夠看到收到的郵件,按提示的數字就能夠打開查看郵件
smtp_connect_timeout 30
router_id nide1---用來標識當前主機
vrrp_mcast group4 224.1.101.33---224.0.0.18是默認的,可是有可能會衝突,能夠本身隨便寫一個
}數組
vrrp_instance VI_1 {---第一個實例就是第一個路由器,VI_1是名稱隨便定義
state MASTER---配置爲主設備,可是還須要設置優先級
priority 100---優先級是100
interface eno167777736---把vip綁定到哪一個網卡設備
virtual_router_id 33---0到255之間使用哪個都行,可是兩個設備之間要統一
advert_int 1---每隔多長時間向外通告一次
authentication {---要不要認證
auth_type PASS---簡單字符串認證
auth_pass RT3SKUI2---這裏不要使用默認的1111,能夠用openssl rand -base64 7生成一個隨機的字符串
}
virtual_ipaddress {---指定IP地址的格式爲ip、掩碼、設備、別名
172.16.0.99/16 dev eno16777736 label eno16777736:0
}bash
notify_master "/etc/keepalived/notify.sh master"----要放到實例中 notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault"
}
定義虛擬主機
virtual_server 172.16.0.99 80 {
delay_loop 2---定義每隔2秒鐘檢測一次
lb_algowrr---定義調度算法
lb_kind DR---定義類型
protocol TCP---協議
sorry_server 127.0.0.1 80---定義sorry_server
real_server 172.16.0.6 80 { weight 1---權重是1 HTTP_GET {---健康狀態檢測方式 url {---對哪一個url發請求,不指定會默認對主頁發請求 path /index.html status_code 200---只有是200才認爲是成功的,也可使用別的方式,digest(後端realserver響應的內容應該都是同樣的)curl -s http://172.16.0.6 | genhash---把響應的結果用管道送給md5這個命令,能幫助咱們生成校驗碼,每次作健康狀態檢測時,會自動比對,比對成功,說明是正確的,這種方法比響應碼嚴格多了,也可使用genhash -s 172.16.0.6 -p 80 -u /index.html會生成校驗碼,跟上邊的md5生成的結果同樣 nb_get_retry 3---重試幾回來作檢測 delay_before_retry 2---每一次重試前延遲多長時間 connect_timeout 3---真正發起請求的鏈接的超時時長 } } } real_server 172.16.0.7 80 { weight 1---權重是1 HTTP_GET {---健康狀態檢測方式 url {---對哪一個url發請求,不指定會默認對主頁發請求 path /index.html status_code 200---只有是200才認爲是成功的,也可使用別的方式,digest(後端realserver響應的內容應該都是同樣的)curl -s http://172.16.0.6 | genhash---把響應的結果用管道送給md5這個命令,能幫助咱們生成校驗碼,每次作健康狀態檢測時,會自動比對,比對成功,說明是正確的,這種方法比響應碼嚴格多了,也可使用genhash -s 172.16.0.6 -p 80 -u /index.html會生成校驗碼,跟上邊的md5生成的結果同樣 nb_get_retry 3---重試幾回來作檢測 delay_before_retry 2---每一次重試前延遲多長時間 connect_timeout 3---真正發起請求的鏈接的超時時長 } } }
}
配置雙主模型:
vrrp_instance VI_2 {---第一個實例就是第一個路由器,VI_1是名稱隨便定義
state BACKUP---配置爲主設備,可是還須要設置優先級
priority 96---優先級是96
interface eno167777736---把vip綁定到哪一個網卡設備
virtual_router_id 34---0到255之間使用哪個都行,可是兩個設備之間要統一
advert_int 1---每隔多長時間向外通告一次
authentication {---要不要認證
auth_type PASS---簡單字符串認證
auth_pass Ra3S7Uy2---這裏不要使用默認的1111,能夠用openssl rand -base64 7生成一個隨機的字符串
}
virtual_ipaddress {---指定IP地址的格式爲ip、掩碼、設備、別名
172.16.0.99/16 dev eno16777736
}
}
systemctl stop keepalived.service
node2:
vim keepalived.conf
!Configuration File for keepalived
global_defs {
notification_email {---收郵件地址,要在互聯網上真正能接收br/>root@localhost
}
notification_email_from Alexandre.Cassen@firewall.loc---發郵件地址,能夠假裝源地址,可是有的服務器不容許假裝,要經過下面的smtp_server的檢查
smtp_server 127.0.0.1---通常是本機,可使用ss -tnl查看25號端口始終是開啓的,能夠很容易的從本機發送郵件到本機,例如:echo "hello" | mail -s "hi" root@localhost---s能夠給上郵件的標題,收郵件的命令是mail,就能夠看到收到的郵件,按提示的數字就能夠打開查看郵件
smtp_connect_timeout 30
router_id nide1---用來標識當前主機
vrrp_mcast group4 224.1.101.33---224.0.0.18是默認的,可是有可能會衝突,能夠本身隨便寫一個
}
vrrp_instance VI_1 {---第一個實例就是第一個路由器,VI_1是名稱隨便定義
state MASTER---配置爲主設備,可是還須要設置優先級
priority 100---優先級是100
interface eno167777736---把vip綁定到哪一個網卡設備
virtual_router_id 33---0到255之間使用哪個都行,可是兩個設備之間要統一
advert_int 1---每隔多長時間向外通告一次
authentication {---要不要認證
auth_type PASS---簡單字符串認證
auth_pass RT3SKUI2---這裏不要使用默認的1111,能夠用openssl rand -base64 7生成一個隨機的字符串
}
virtual_ipaddress {---指定IP地址的格式爲ip、掩碼、設備、別名
172.16.0.99/16 dev eno16777736 label eno16777736:0
}
notify_master "/etc/keepalived/notify.sh master"----要放到實例中 notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault"
}
定義虛擬主機
virtual_server 172.16.0.99 80 {
delay_loop 2---定義每隔2秒鐘檢測一次
lb_algowrr---定義調度算法
lb_kind DR---定義類型
protocol TCP---協議
sorry_server 127.0.0.1 80---定義sorry_server
real_server 172.16.0.6 80 { weight 1---權重是1 HTTP_GET {---健康狀態檢測方式 url {---對哪一個url發請求,不指定會默認對主頁發請求 path /index.html status_code 200---只有是200才認爲是成功的,也可使用別的方式,digest(後端realserver響應的內容應該都是同樣的)curl -s http://172.16.0.6 | genhash---把響應的結果用管道送給md5這個命令,能幫助咱們生成校驗碼,每次作健康狀態檢測時,會自動比對,比對成功,說明是正確的,這種方法比響應碼嚴格多了,也可使用genhash -s 172.16.0.6 -p 80 -u /index.html會生成校驗碼,跟上邊的md5生成的結果同樣 nb_get_retry 3---重試幾回來作檢測 delay_before_retry 2---每一次重試前延遲多長時間 connect_timeout 3---真正發起請求的鏈接的超時時長 } } } real_server 172.16.0.7 80 { weight 1---權重是1 HTTP_GET {---健康狀態檢測方式 url {---對哪一個url發請求,不指定會默認對主頁發請求 path /index.html status_code 200---只有是200才認爲是成功的,也可使用別的方式,digest(後端realserver響應的內容應該都是同樣的)curl -s http://172.16.0.6 | genhash---把響應的結果用管道送給md5這個命令,能幫助咱們生成校驗碼,每次作健康狀態檢測時,會自動比對,比對成功,說明是正確的,這種方法比響應碼嚴格多了,也可使用genhash -s 172.16.0.6 -p 80 -u /index.html會生成校驗碼,跟上邊的md5生成的結果同樣 nb_get_retry 3---重試幾回來作檢測 delay_before_retry 2---每一次重試前延遲多長時間 connect_timeout 3---真正發起請求的鏈接的超時時長 } } } 上邊是http狀態檢測,下邊是tcp狀態檢測: real_server 172.16.0.7 80 { weight 1---權重是1 TCP_CHECK {---健康狀態檢測方式 nb_get_retry 3---重試幾回來作檢測 delay_before_retry 2---每一次重試前延遲多長時間 connect_timeout 3---真正發起請求的鏈接的超時時長 } } }
}
配置雙主模型:
vrrp_instance VI_2 {---第一個實例就是第一個路由器,VI_1是名稱隨便定義
state BACKUP---配置爲主設備,可是還須要設置優先級
priority 96---優先級是96
interface eno167777736---把vip綁定到哪一個網卡設備
virtual_router_id 34---0到255之間使用哪個都行,可是兩個設備之間要統一
advert_int 1---每隔多長時間向外通告一次
authentication {---要不要認證
auth_type PASS---簡單字符串認證
auth_pass Ra3S7Uy2---這裏不要使用默認的1111,能夠用openssl rand -base64 7生成一個隨機的字符串
}
virtual_ipaddress {---指定IP地址的格式爲ip、掩碼、設備、別名
172.16.0.99/16 dev eno16777736
}
}
systemctl stop keepalived.service
systemctl start keepalived.service
keepalived不僅能轉移IP地址,還能轉移服務
視頻中演示的是DR類型的高可用以及負載均衡
兩個server節點都安裝上httpd服務,而且都要同步時間
yum -y install httpd
ntpdate 172.16.0.1
vim /var/www/html/index.html
<h1>Real Server1</h1>
<h1>Real Server2</h1>
systemctl start httpd.service
ss -tnl---驗證服務有沒有啓動,查看端口80
要把兩個server設置上vip,須要一個腳本(之前講過的)
vim setrs.sh
#!/bin/bash
#
vip='172.16.0.99'
netmask='255.255.255.255'
iface='lo:0'
case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig $iface $vip netmask $netmask 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/lo/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce ;;
*)
exit 1
esac
bash -n setrs.sh---檢查語法
bash -x setrs.sh start
ifconfig---查看ip地址有沒有配置上去
route -n---查看路由有沒有添加
scp setrs.sh 172.16.0.6:/root---複製腳本
n2節點:提供web服務的節點
bash -x setrs.sh start
ifconfig
route -n
剩下的就是生成ipvs規則了,可是使用keepalived自動生成,就不須要ipvsadm了,可是最好安裝一下,爲了看規則而不是生成規則
yum -y install ipvsadm
ipvsadm -ln---能夠看到兩個realserver
curl http://172.16.0.99---屢次請求能夠看到是輪詢狀態
此時只是node2節點啓動起來了,若是把node1節點啓動,node1會搶佔ip,而且ipvs也是配置上去了,客戶端請求看到的仍然是輪詢狀態
}
注意:如何定義sorry server,兩個虛擬主機都要裝nginx,只要有nginx就當sorry serveryum install -y nginxsystemctl start nginx.service