一;高可用的解決方案
1)vrrp協議的實現
keepalive
2)ais:完備HA集群
RHCS(cman)
heartbeat
corosync
二:vrrp協議:
概念:在節點(主機)出現故障時,實現ip地址的切換。
keepalive就是基於此協議而實現高可用的。
Failover:故障切換,即某資源的主節點故障時,將資源轉移至其它節點的操作;
Failback:故障移回,即某資源的主節點故障后重新修改上線后,將轉移至其它節點的資源重新切回的過程;
術語:
虛擬路由器: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
三:keepalived:
1:簡述
vrrp協議的軟件實現,原生設計的目的為了高可用ipvs服務: 基於vrrp協議完成地址流動; 為集群內的所有節點生成ipvs規則(在配置文件中預先定義); 為ipvs集群的各RS做健康狀態檢測; 基於腳本調用接口通過執行腳本完成腳本中定義的功能,進而影響集群事務; 組件: 核心組件: vrrp stack vrrp協議的實現 ipvs wrapper為集群內的所有節點生成ipvs規則 checkers 為ipvs集群的各RS做健康狀態檢測 控制組件:
配置文件分析器
IO復用器
內存管理組件
虛擬路由器的工作模型:
單主:
雙主
通知機制:
notify_master notify_backup notify_fault
2:安裝
yum install keepalived
程序環境:
主配置文件:/etc/keepalived/keepalived.conf
主程序文件:/usr/sbin/keepalived
Unit File:keepalived.service Unit File的環境配置文件:/etc/sysconfig/keepalived
3:配置文件
/etc/keepalived/keepalived.conf
配置文件組件部分:
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;
4:man keepalived.conf
可以查看配置文件的具體使用細則
第一個配置段: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類地址
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
三:keepalive 單主模式
環境:172.16.253.95 做master
172.16.253.96 做backup
1:解讀配置文件
再解讀/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 }
}
2:更改配置文件
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 }
}
3:重啟keepalived服務
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服務
1:編輯配置文件
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 }
}
2:啟動96主機服務
96主機:先關閉服務,再啟動服務。
[root@hkeepalived]#systemctl stop keepalived
[root@hkeepalived]#systemctl start keepalived
[root@hkeepalived]#systemctl status keepalived
兩個 vip都添加至 eth0 網卡了


3:啟動95主機服務
[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 是如何工作
1:95 96主機
編輯通知機制的腳本放置在/etc/keepalived下
vim notify.sh
!/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
2 :95 96 主機的配置文件恢復至單主模式
刪除 實驗四中 增加的配置文件內容
3:編輯配置文件
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"

4:啟動服務
啟動96主機的服務:
查看郵件有無發送:
mail

啟動95主機的服務:
96主機將收到 變為 backup 的郵件

六:LVS-DR模式--keepalive
環境:
95主機 LVS
96主機 LVS
97 98 主機RS
1:97 98 主機 安裝nginx
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>
2:后端主機 內核參數修改
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有無添加進來
3:lvs主機95 配置服務
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:測試

5 down掉 95主機 lvs
在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
6:實現LVS
以下代碼是 實現 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服務
測試:

7 重啟 95主機的keepalived服務
95主機的 優先級比96的高
vip會偏移至95主機
96主機
95主機

8檢測健康狀況功能 有無實現
給98主機增加iptables規則 :所有tcp的訪問禁止掉
iptables –A INPUT –p tcp –dport 80 –j REJECT
curl http://172.16.253.199 訪問就會僅僅訪問 97主機了

9:增加sorry server
在 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 }
此種模式調用腳本
二:nginx 服務 高可用
1:先定義腳本,再調用腳本
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 關鍵詞 調用腳本

2:測試
在95主機上 touch /etc/keepalived/down文件
vip偏移至96主機
3:編輯 nginx配置文件
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的 服務調度至后端服務器
4:測試web主頁訪問

三:雙主模型nginx 高可用集群
上接實驗三:
1:編輯配置文件
增加 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

}
