一:前言
Keepalived使用的vrrp協議方式,虛擬路由冗余協議 (Virtual Router Redundancy Protocol,簡稱VRRP);Keepalived的目的是模擬路由器的高可用,一般Keepalived是實現前端高可用,常用的前端高可用的組合有,就是我們常見的LVS+Keepalived、Nginx+Keepalived、HAproxy+Keepalived??偨Y一下,Keepalived中實現輕量級的高可用,一般用于前端高可用,且不需要共享存儲,一般常用于兩個節點的高可用。
提到高可用我們再來把Heartbeat、Corosync、Keepalived這三個集群組件互相比較一下.
二:keepalived
Keepalived 是一個基于VRRP協議來實現的LVS服務高可用方案,可以利用其來避免單點故障。一個LVS服務會有2臺服務器運行Keepalived,一臺為主服務器(MASTER),一臺為備份服務器(BACKUP),但是對外表現為一個虛擬IP,主服務器會發送特定的消息給備份服務器,當備份服務器收不到這個消息的時候,即主服務器宕機的時候, 備份服務器就會接管虛擬IP,繼續提供服務,從而保證了高可用性。
在路由器上配上靜態路由就會產生單點故障,那該怎么辦呢?VRRP就應用而生了,VRRP通過一競選(election)協議來動態的將路由任務交給LAN中虛擬路由器中的某臺VRRP路由器.
VRRP工作原理, 在一個VRRP虛擬路由器中,有多臺物理的VRRP路由器,但是這多臺的物理的機器并不能同時工作,而是由一臺稱為MASTER的負責路由工作,其它的都是BACKUP,MASTER并非一成不變,VRRP讓每個VRRP路由器參與競選,最終獲勝的就是MASTER。MASTER擁有一些特權,比如,擁有虛擬路由器的IP地址,我們的主機就是用這個IP地址作為靜態路由的。擁有特權的MASTER要負責轉發發送給網關地址的包和響應ARP請求。
VRRP通過競選協議來實現虛擬路由器的功能,所有的協議報文都是通過IP多播(multicast)包(多播地址224.0.0.18)形式發送的。虛擬路由器由VRID(范圍0-255)和一組IP地址組成,對外表現為一個周知的MAC地址。所以,在一個虛擬路由 器中,不管誰是MASTER,對外都是相同的MAC和IP(稱之為VIP)??蛻舳酥鳈C并不需要因為MASTER的改變而修改自己的路由配置,對客戶端來說,這種主從的切換是透明的。
在一個虛擬路由器中,只有作為MASTER的VRRP路由器會一直發送VRRP通告信息(VRRPAdvertisement message),BACKUP不會搶占MASTER,除非它的優先級(priority)更高。當MASTER不可用時(BACKUP收不到通告信息), 多臺BACKUP中優先級最高的這臺會被搶占為MASTER。這種搶占是非??焖俚?<1s),以保證服務的連續性。由于安全性考慮,VRRP包使用了加密協議進行加密
三:為什么要用keepalived+lvs
lvs是一個在四層上實現后端realserver的負載均衡的集群,lvs遺留下兩個問題,一個是lvs的單點故障;第二個是lvs不能檢測后端realserver的健康狀態檢查。
解決lvs的單點故障就用到了高可用集群:
①、可以是heartbeat+ldirectord這種重量級的;
②、可以是keepalived+lvs這種輕量級的解決方案。
解決lvs不能檢測后端realserver的健康狀態也后很多種方法:
①、可以在lvs上寫腳本ping后端realserver的ip地址,ping幾次發現ip地址ping不通則在ipvs規則里面刪除,當后端服務器可以ping了,則把后端realserver添加到ipvs規則里面。
②、可以在lvs上寫腳本請求后端realserver的測試幾次網頁文件,查看狀態碼是否為200,不是則在ipvs規則里面清楚,當測試網頁返回的狀態嗎是200之后,則把后端realserver添加到ipvs規則里面
③、以上兩種方法都是依賴于腳本,keepalived的出現解決了不依賴于腳本,也可以對后端realserver的健康狀態檢查,keepalived的配置文件里面可以自行生成ipvs的規則,并且自行檢測后端realserver的狀態,當后端realserver不能提供服務了,keepalived會自行將其在ipvs規則里面刪除,當后端realserver可以提供服務了,又自行的在ipvs規則里面添加。
三:配置keepalived實現HTTP高可用
1) 環境準備
CentOS 6.5 X86_64
ipvsadm.x86_64 0:1.25-10.el6
keepalived.x86_64 0:1.2.7-3.el6
httpd-2.2.15-29.el6.centos.x86_64
2)試驗拓撲圖
試驗拓撲圖中VIP為172.16.16.7.節點node1為172.16.16.1,節點node2為172.16.16.5
3)配置master
12345678910111213141516171819202122232425262728293031323334353637383940414243 vim /etc/keepalived/keepalived.confglobal_defs{notification_email{stu16@llh.com #接收郵件地址}notification_email_from kanotify@magedu.com #發送郵件地址smtp_connect_timeout 3smtp_server 127.0.0.1router_id LVS_DEVEL}vrrp_script chk_mantaince_down { #定義檢測機制script “[[ -f /etc/keepalived/down ]] && exit 1 || exit 0”interval 1 #每個多長時間檢測一次weight -2 #當在/etc/keepalived/下創建一個down文件時執行下面的命令權重減2.fall 3 #從正常到失敗檢測幾次完成raise 3 #從失敗到正常需要檢測幾次}vrrp_instance VI_1 {interface eth1state MASTER # BACKUP for slave routers #當在被節點上修改為BACKUPpriority 101 # 100 for BACKUP #被節點的priority數值要小于主節點virtual_router_id 16 #主機routeID,garp_master_delay 1authentication {auth_type PASSauth_pass password #輸入驗證密碼}track_interface {eth0 #配置IP地址所在的網卡}virtual_ipaddress {172.16.16.7/16 dev eth0 label eth0:0 #配置的IP地址}track_script { #調用檢測機制chk_mantaince_down}notify_master “/etc/rc.d/init.d/httpd start” # 當成為master時就啟動http服務notify_backup “/etc/rc.d/init.d/httpd stop” # 當成為backup時就關閉http服務notify_fault “/etc/rc.d/init.d/httpd stop”}
4)將配置文件同步到slave
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
scp /etc/keepalived/keepalived.conf root@172.16.16.5:/etc/keepalived/
修改配置文件
global_defs
{
notification_email
{
stu16@llh.com #接收郵件地址
}
notification_email_from kanotify@magedu.com #發送郵件地址
smtp_connect_timeout 3
smtp_server 127.0.0.1
router_id LVS_DEVEL
}
vrrp_script chk_mantaince_down { #定義檢測機制
script “[[ -f /etc/keepalived/down ]] && exit 1 || exit 0”
interval 1 #每個多長時間檢測一次
weight -2 #當在/etc/keepalived/下創建一個down文件時執行下面的命令權重減2.
fall 3 #從正常到失敗檢測幾次完成
raise 3 #從失敗到正常需要檢測幾次
}
vrrp_instance VI_1 {
interface eth1
state BACKUP # BACKUP for slave routers #此處修改為BACKUP
priority 100 # 100 for BACKUP #此處修改為100
virtual_router_id 16 #主機routeID,
garp_master_delay 1
authentication {
auth_type PASS
auth_pass password #輸入驗證密碼
}
track_interface {
eth0 #配置IP地址所在的網卡
}
virtual_ipaddress {
172.16.16.7/16 dev eth0 label eth0:0 #配置的IP地址
}
track_script { #調用檢測機制
chk_mantaince_down
}
notify_master “/etc/rc.d/init.d/httpd start” # 當成為master時就啟動http服務
notify_backup “/etc/rc.d/init.d/httpd stop” # 當成為backup時就關閉http服務
notify_fault “/etc/rc.d/init.d/httpd stop”
}
|
5)啟動keepalive
1
2
3
4
|
[root@node1 ~]# service keepalived start
正在啟動 keepalived: [確定]
[root@node2 ~]# service keepalived start
正在啟動 keepalived: [確定]
|
四:keepalive+lvs 實現LVS雙主高可用
1)試驗拓撲圖
2)配置RIP1服務
1
2
3
4
5
6
7
8
9
10
|
因為RIP服務器配置的有VIP地址所以外面有請求VIP時他也會進行相應,而我們這里是為了實現DR轉發,不能讓他進行響應,我們需要對RIP的端口信息進行隱藏。
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore #忽略其他端口發來的請求信息
echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce #不廣播自己的端口信息
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
ifconfig eth0 192.168.16.2/24 up
ifconfig lo:0 172.16.16.7 netmask 255.255.255.255 broadcast 172.16.16.7
route add -host 172.16.16.7 dev lo:0 響應的信息通過lo:0端口 ,為了使響應的IP地址為VI
ifconfig lo:1 172.16.16.8 netmask 255.255.255.255 broadcast 172.16.16.8
route add -host 172.16.16.8 dev lo:1
|
3)配置RIP2服務
1
2
3
4
5
6
7
8
9
|
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore #忽略其他端口發來的請求信息
echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce #不廣播自己的端口信息
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
ifconfig eth0 192.168.16.3/24 up
ifconfig lo:0 172.16.16.7 netmask 255.255.255.255 broadcast 172.16.16.7
route add -host 172.16.16.7 dev lo:0 響應的信息通過lo:0端口 ,為了使響應的IP地址為VI
ifconfig lo:1 172.16.16.8 netmask 255.255.255.255 broadcast 172.16.16.8
route add -host 172.16.16.8 dev lo:1
|
4)配置master
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
|
global_defs
{
notification_email
{
linuxedu@foxmail.commageedu@126.com
}
notification_email_from kanotify@magedu.com
smtp_connect_timeout 3smtp_server 127.0.0.1
router_id LVS_DEVEL
}
vrrp_script chk_schedown
{
script “[[ -f /etc/keepalived/down ]] && exit 1 || exit 0”
#創建down文件權重減2
interval 2
weight -2
}
vrrp_instance VI_1
{
interface eth0
state MASTER #此節點為主節點
priority 101
virtual_router_id 51
garp_master_delay 1
authentication
{
auth_type PASS
auth_pass password
}
track_interface
{
eth0
}
virtual_ipaddress
{
172.16.16.7/16 dev eth0 label eth0:0 #配置對外的VIP地址 }
track_script
{
chk_schedown
}
}
vrrp_instance VI_2
{
interface eth0
state BACKUP #此節點為被節點
priority 100
virtual_router_id 50
garp_master_delay 1
authentication {
auth_type PASS
auth_pass 12345678
}
track_interface {
eth0
}
virtual_ipaddress {
172.16.16.8/16 dev eth0 label eth0:1 #配置對外的VIP地址
}
track_script {
chk_schedown
}
}
virtual_server 172.16.16.7 80 #配置一個VIP 工作在TCP的80端口上
{
delay_loop 6 #lb_algo rr #負載均衡的調度算法
lb_kind DR #工作在DR模型上
persistence_timeout 50 #是否啟用IPVS持久連接
protocol TCP #采用的是TCP協議
# sorry_server 192.168.16.2 1358 #所有服務掛了 ,出現的提示頁面.要在這臺服務器上開啟http服務
real_server 192.168.16.2 80 #后面RIP地址
{
weight 1 #權重
HTTP_GET
{
url
{
path /
status_code 200 #取得主頁面的狀態,狀態碼為200就意味著請求成功;也可寫入md5碼,但要制定靜態碼
}
connect_timeout 3 #每次測試3秒
nb_get_retry 3 #測試次數
delay_before_retry 3 #測試失敗在測試3次
}
}
real_server 192.168.16.3 80
{
weight 1
HTTP_GET
{
url
{
path /
status_code 200
}
connect_timeout 3nb_get_retry 3delay_before_retry 3
}
}
}
virtual_server 172.16.16.8 80 #配置一個VIP 工作在TCP的80端口上
{
delay_loop 6 #
lb_algo rr #負載均衡的調度算法
lb_kind DR #工作在DR模型上
#persistence_timeout 50 #是否啟用IPVS持久連接,這項要注銷.連接50S才會切換
protocol TCP #采用的是TCP協議
# sorry_server 192.168.16.2 1358 #所有服務掛了 ,出現的提示頁面.要在這臺服務器上開啟http服務
real_server 192.168.16.2 80 #后面RIP地址
{
weight 1 #權重
HTTP_GET
{
url
{
path /
status_code 200 #取得主頁面的狀態,狀態碼為200就意味著請求成功;也可寫入md5碼,但要制定靜態碼
}
connect_timeout 3 #每次測試3秒
nb_get_retry 3 #測試次數
delay_before_retry 3 #測試失敗在測試3次
}
}
real_server 192.168.16.3 80
{
weight 1
HTTP_GET
{
url
{
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
|
5)配置backup
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
global_defs
{
notification_email
{
linuxedu@foxmail.commageedu@126.com
}
notification_email_from kanotify@magedu.com
smtp_connect_timeout 3smtp_server 127.0.0.1
router_id LVS_DEVEL
}
vrrp_script chk_schedown
{
script “[[ -f /etc/keepalived/down ]] && exit 1 || exit 0”
#創建down文件權重減2
interval 2
weight -2
}
vrrp_instance VI_1
{
interface eth0
state BACKUP #此節點為被節點
priority 100
virtual_router_id 51
garp_master_delay 1
authentication
{
auth_type PASS
auth_pass password
}
track_interface
{
eth0
}
virtual_ipaddress
{
172.16.16.7/16 dev eth0 label eth0:0 #配置對外的VIP地址 }
track_script
{
chk_schedown
}
}
vrrp_instance VI_2
{
interface eth0
state MASTER #此節點為主節點
priority 101
virtual_router_id 50
garp_master_delay 1
authentication {
auth_type PASS
auth_pass 12345678
}
track_interface {
eth0
}
virtual_ipaddress {
172.16.16.8/16 dev eth0 label eth0:1 #配置對外的VIP地址
}
track_script {
chk_schedown
}
}
virtual_server 172.16.16.7 80 #配置一個VIP 工作在TCP的80端口上
{
delay_loop 6 #lb_algo rr #負載均衡的調度算法
lb_kind DR #工作在DR模型上
persistence_timeout 50 #是否啟用IPVS持久連接
protocol TCP #采用的是TCP協議
# sorry_server 192.168.16.2 1358 #所有服務掛了 ,出現的提示頁面.要在這臺服務器上開啟http服務
real_server 192.168.16.2 80 #后面RIP地址
{
weight 1 #權重
HTTP_GET
{
url
{
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.16.3 80
{
weight 1
HTTP_GET
{
url
{
path /
status_code 200
}
connect_timeout 3nb_get_retry 3delay_before_retry 3
}
}
}
virtual_server 172.16.16.8 80 #配置一個VIP 工作在TCP的80端口上
{
delay_loop 6
lb_algo rr
lb_kind DR
#persistence_timeout 50
protocol TCP
# sorry_server 192.168.16.2 1358
real_server 192.168.16.2 80 #后面RIP地址
{
weight 1 #權重
HTTP_GET
{
url
{
path /
status_code 200
}
connect_timeout 3 #每次測試3秒
nb_get_retry 3 #測試次數
delay_before_retry 3 #測試失敗在測試3次
}
}
real_server 192.168.16.3 80
{
weight 1
HTTP_GET
{
url
{
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
|
5)啟動keepalive
五:keepalive+nginx 實現nginx的高可用
keepalive+nginx介紹
keepalive通過VRRP協議可以讓兩個或多個路由器實現接口地址漂移,達到多個設備對外地址一致性,進入讓用戶無法感知設備出現故障帶來的無法訪問服務的情況。
keepalive最初設計為lvs所設計,keepalive內置就可以配置lvs的所有功能,自動判斷lvs出現故障的情況下,地址漂移到備用lvs上,自動判斷后端服務器集群出現故障,從lvs列表中移除該服務器集群。
keepalive+lvs |
檢測lvs故障 |
處理方式 |
lvs1出現故障 |
每隔1秒發送通告報文 |
VIP漂移至lvs2 |
后端服務器集群故障 |
自定義檢測后端服務器提供的服務 |
從ipvsadm列表中移除集群中的服務器節點 |
然而在nginx上,我們需要keepalive提供的功能為,當nginx前端調度器出現故障,可以把VIP地址漂移到另一臺備用的nginx上?;虻絥ginx服務處于關閉狀態,可自動降低優先級,把VIP地址漂移到備用nginx上。
keepalive+nginx |
檢測方式 |
處理方式 |
nginx服務器故障 |
每隔1秒發送通告報文 |
VIP漂移至備用nginx |
nginx服務故障 |
自定義腳本檢測nginx服務是否運行 |
降低主節點優先級達到VIP漂移至nginx |
后端服務器集群故障 |
keepalive無法判斷 |
需要nginx提供的策略去判斷 |
總結:keepalive+nginx
keepalive+nginxs實現的只能是使用VIP地址在nginx上漂移,別無其他作用,需要檢測后端群集是否正常需要nginx提供的策略去判斷,所以以下案例只能測試在nginx出現故障,或nginx進程停止運行后,能不能實現VIP漂移,需要測試集群出現故障,需要nginx的策略配置,在此案例中不詳細介紹,參考nginx代理群集案例。
實驗拓撲圖:
實驗環境介紹
服務器集群 |
集群節點 |
角色 |
IP配置 |
nginx高可用集群 |
nginx-1 |
主節點 |
10.1.16.78 |
nginx-1 |
備用節點 |
10.1.16.79 |
|
web負載均衡集群 |
http-1 |
提供web頁面1 |
10.1.16.68 |
http-2 |
提供web頁面2 |
10.1.16.69 |
|
web服務VIP 10.1.16.144 |
※·http-1配置
(配置一個簡單的web站點,并啟動服務) yum -y install httpd echo “This is my master web site : http://10.1.16.68” > /var/www/html/index.html service httpd start 測試web1頁面是否正常: [root@http_1 ~]#curl 10.1.16.68 This is my master web site : http://10.1.16.68
※·http-2配置
(配置一個簡單的web站點,并啟動服務)
yum -y install httpd echo “This is my master web site : http://10.1.16.68” > /var/www/html/index.html service httpd start 測試web2頁面是否正常 [root@http_1 ~]#curl 10.1.16.69 This is my master web site : http://10.1.16.69※·nginx-1代理配置
yum -y install nginx-1.10.0-1.el7.ngx.x86_64.rpm
vim /etc/nginx/nginx.conf
http {
...................... upstream webserver { server 10.1.16.68:80; server 10.1.16.69:80; } ................................ include /etc/nginx/conf.d/*.conf; } vim /etc/nginx/conf.d/default.conf server { listen 80; server_name localhost; ............................. location / { index index.html index.htm; proxy_pass http://webserver; } ............................※·nginx-2代理配置
yum -y install nginx-1.10.0-1.el7.ngx.x86_64.rpm
vim /etc/nginx/nginx.conf
http {
...................... upstream webserver { server 10.1.16.68:80; server 10.1.16.69:80; } ................................ include /etc/nginx/conf.d/*.conf; } vim /etc/nginx/conf.d/default.conf server { listen 80; server_name localhost; ............................. location / { index index.html index.htm; proxy_pass http://webserver; } ............................※·nginx-1的keepalive配置(主節點)
! Configuration File for keepalivedglobal_defs { notification_email { root@localhost } notification_email_from keepnainx@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id nginx_1 vrrp_mcast_group4 224.0.100.16 } vrrp_script chk_nginx_down { script "killall -0 nginx && exit 0 || exit 1" interval 1 weight -5 } vrrp_instance nginx_ha { state MASTER interface eno16777736 virtual_router_id 44 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 123456 } virtual_ipaddress { 10.1.16.144 dev eno16777736 label eno16777736:0 } track_script { chk_nginx_down}※·小結
keepalive和lvs結合非常的好用,可以檢查后端集群的web健康狀態,動態的在ipvs中刪除或添加集群中的服務器,keekalive和lvs結合非常緊密,可以通過自身管理lvs的調度規則。keeplive和nginx的配置,可以實現nginx的高可用,實現的方式為VIP地址的動態轉移,但是無法判斷后端的群集中服務器的健康狀態,需要nginx自身的規則去管理。通過keeplive的腳本監控功能,可以管理本機上相關的nginx進程是否正常運行。 通過keepalive與nginx的實驗,keepalive實現其他服務的高可用也是沒有問題的,通過相關的腳本可以監控服務的健康狀態。原創文章,作者:liudehua666,如若轉載,請注明出處:http://www.www58058.com/75724