Linux keepalived高可用集群
keepalived簡介:
keepalived是為了高可用ipvs集群而設計的,主要用作realserver的健康狀態檢測,如果有一臺web服務器死機,或工作出現故障,keepalived將檢測到,并將有故障的服務器從系統中移除,同時使用其他服務器代替該服務器的工作,當服務器工作正常后keepalived自動將服務器加入到服務器集群中,這些工作全部自動完成,不需要人工干預,需要人工做的只是修復故障的服務器。
集群類型:LB、HA、HP
SPoF: Single Point of Failure
系統可用性的公式:A=MTBF/(MTBF+MTTR)
HA Cluster實現方案:
vrrp協議的實現
vrrp:虛擬冗余路由協議;
keepalived
ais:完備HA集群;
heartbeat
corosync
keepalived保持連接:
vrrp協議:Virtual Redundant Routing Protocol 虛擬冗余路由協議
術語:
虛擬路由器:Virtual Router
虛擬路由器標識:VRID(0-255)
物理路由器:
master:主設備
backup:備用設備
priority:優先級
VIP:Virtual IP
VMAC:Virutal MAC (00-00-5e-00-01-VRID)
通告:心跳,優先級等;周期性;
搶占式,非搶占式;
安全工作:
認證:
無認證
簡單字符認證
MD5
工作模式:
主/備:單虛擬路徑器;
主/主:主/備(虛擬路徑器1),備/主(虛擬路徑器2)
keepalived:為了在Linux系統中實現vrrp協議
vrrp協議的軟件實現,原生設計的目的為了高可用ipvs服務:
vrrp協議完成地址流動;
為vip地址所在的節點生成ipvs規則(在配置文件中預先定義);
為ipvs集群的各RS做健康狀態檢測;
基于腳本調用接口通過執行腳本完成腳本中定義的功能,進而影響集群事務;
組件:
核心組件:
vrrp stack
ipvs wrapper
checkers
控制組件:配置文件分析器
IO復用器
內存管理組件
HA Cluster的配置前提:
(1) 各節點時間必須同步;
ntp, chrony
(2) 確保iptables及selinux不會成為阻礙;
(3) 各節點之間可通過主機名互相通信(對KA并非必須);
建議使用/etc/hosts文件實現;
(4) 各節點之間的root用戶可以基于密鑰認證的ssh服務完成互相通信;(并非必須)
keepalived安裝配置:
CentOS 6.4之后的版本keepalived已經收錄到base倉庫中了。
程序環境:
配置文件:/etc/keepalived/keepalived.conf
主程序:/usr/sbin/keepalived
Unit File:keepalived.service
配置文件組件部分:
TOP HIERACHY
GLOBAL CONFIGURATION
Global definitions
Static routes/addresses
VRRPD CONFIGURATION
VRRP synchronization group(s)
VRRP instance(s)
LVS CONFIGURATION
Virtual server group(s)
Virtual server(s)
單主配置示例:
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1
vrrp_mcast_group4 224.0.100.19
}
vrrp_instance VI_1 {
state BACKUP
interface eno16777736
virtual_router_id 14
priority 98
advert_int 1
authentication {
auth_type PASS
auth_pass 571f97b2
}
virtual_ipaddress {
10.1.0.91/16 dev eno16777736
}
}
配置語法:
配置虛擬路由器:
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:搶占式模式下,節點上線后觸發新選舉操作的延遲時長;
定義keepalived主備切換郵件通知腳本:
notify_master <STRING>|<QUOTED-STRING>:當前節點成為主節點時觸發的腳本;
notify_backup <STRING>|<QUOTED-STRING>:當前節點轉為備節點時觸發的腳本;
notify_fault <STRING>|<QUOTED-STRING>:當前節點轉為“失敗”狀態時觸發的腳本;
notify <STRING>|<QUOTED-STRING>:通用格式的通知觸發機制,一個腳本可完成以上三種狀態的轉換時的通知;
keepalived單、主配置實例:
定義keepalived主備切換郵件通知腳本:
雙主模型示例:
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1
vrrp_mcast_group4 224.0.100.19
}
vrrp_instance VI_1 {
state MASTER
interface eno16777736
virtual_router_id 14
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 571f97b2
}
virtual_ipaddress {
10.1.0.91/16 dev eno16777736
}
}
vrrp_instance VI_2 {
state BACKUP
interface eno16777736
virtual_router_id 15
priority 98
advert_int 1
authentication {
auth_type PASS
auth_pass 578f07b2
}
virtual_ipaddress {
10.1.0.92/16 dev eno16777736
}
}
雙主模型配置實例:
定義keepalived主備切換郵件通知腳本:
虛擬服務器:
配置參數:
virtual_server IP port |
virtual_server fwmark int
{
…
real_server {
…
}
…
}
常用參數:
delay_loop <INT>:服務輪詢的時間間隔;
lb_algo rr|wrr|lc|wlc|lblc|sh|dh:定義調度方法;
lb_kind NAT|DR|TUN:集群的類型;
persistence_timeout <INT>:持久連接時長;
protocol TCP:服務協議,僅支持TCP;
sorry_server <IPADDR> <PORT>:備用服務器地址;
real_server <IPADDR> <PORT>
{
weight <INT>
notify_up <STRING>|<QUOTED-STRING>
notify_down <STRING>|<QUOTED-STRING>
HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { … }:定義當前主機的健康狀態檢測方法;
}
HTTP_GET|SSL_GET {
url {
path <URL_PATH>:定義要監控的URL;
status_code <INT>:判斷上述檢測機制為健康狀態的響應碼;
digest <STRING>:判斷上述檢測機制為健康狀態的響應的內容的校驗碼;
}
nb_get_retry <INT>:重試次數;
delay_before_retry <INT>:重試之前的延遲時長;
connect_ip <IP ADDRESS>:向當前RS的哪個IP地址發起健康狀態檢測請求
connect_port <PORT>:向當前RS的哪個PORT發起健康狀態檢測請求
bindto <IP ADDRESS>:發出健康狀態檢測請求時使用的源地址;
bind_port <PORT>:發出健康狀態檢測請求時使用的源端口;
connect_timeout <INTEGER>:連接請求的超時時長;
}
TCP_CHECK {
connect_ip <IP ADDRESS>:向當前RS的哪個IP地址發起健康狀態檢測請求
connect_port <PORT>:向當前RS的哪個PORT發起健康狀態檢測請求
bindto <IP ADDRESS>:發出健康狀態檢測請求時使用的源地址;
bind_port <PORT>:發出健康狀態檢測請求時使用的源端口;
connect_timeout <INTEGER>:連接請求的超時時長;
}
實驗測試:
部署一個lvs-dr類型的keepalived HA單主高可用集群:
環境介紹:
測試客戶機:
client客戶機IP:192.168.3.4
搭建單主高可用集群:
keepalived HA高可用集群(1)IP:192.168.3.7
keepalived HA高可用集群(2)IP:192.168.3.5
keepalived HA 高可用集群的vip:192.168.3.6
在keepalived各節點上提供sorry_server web服務;網頁為:website maintenance
后臺網站服務器:
realserver(1)IP地址:192.168.3.2
配置httpd服務:網頁為 keepalived server 1
在lo別名網卡上配置vip地址:192.168.3.6;關閉arp_ignore和arp_announce;
realserver(2)IP地址:192.168.3.8
配置httpd服務:網頁為 keepalived server 2
在lo別名網卡上配置vip地址:192.168.3.6;關閉arp_ignore和arp_announce;
1)在real server 1 和realserver2上分別執行此腳本,配置lo別名網卡上的vip和arp_ignore、arp_announce的參數。
2)在 keepalived HA高可用集群(1)IP:192.168.3.7 配置如下內容:
3)在 keepalived HA高可用集群(2)IP:192.168.3.5 配置如下內容:
4)在客戶機上測試keepalived的輪循調度:
5)故意關閉一臺realserver web進行測試:
6)故意關閉后臺所有realserver服務,測試sorry_server web:
keepalived調用外部的輔助腳本進行資源監控,并根據監控的結果狀態能實現優先動態調整;
分兩步:(1) 先定義一個腳本;(2) 調用此腳本;
調用外部腳本對keepalived進行健康狀態檢測機制
定義在vrrp_instance實例之外:
vrrp_script <SCRIPT_NAME> { //定義腳本
script ""
interval #
weight -#
}
定義在vrrp_instance實例之內:
track_script { //調用腳本
SCRIPT_NAME_1
SCRIPT_NAME_2
…
}
實驗測試:
部署一個nginx的keepalived HA單主高可用集群:
環境介紹:
測試客戶機:
client客戶機IP:192.168.3.4
搭建單主高可用集群:
keepalived HA高可用集群(1)IP:192.168.3.7
keepalived HA高可用集群(2)IP:192.168.3.5
在keepalived兩個節點上分別配置nginx反向代理服務;
后臺網站服務器:
realserver(1)IP地址:192.168.3.2
配置httpd服務:網頁為 nginx HA server 1
realserver(2)IP地址:192.168.3.8
配置httpd服務:網頁為 nginx HA server 2
1)配置nginx keepalived HA高可用集群(1)IP:192.168.3.7
配置keepalived(1)上的nginx反向代理服務:
在nginx主配置文件http配置段中定義上游服務器組upstream
在nginx默認配置文件中定義反向代理的upstream組名稱:
2)配置nginx keepalived HA高可用集群(2)IP:192.168.3.7
nginx keepalived HA高可用集群(2)的配置過程與 nginx keepalived HA高可用集群(1)類似,唯一的區別就是在/etc/keepalived/keepalived.conf配置文件中,如下圖:
3)測試HA nginx cluster :
4)調用外部腳本 chk_dow ,使其vip地址轉移到另一個keepalived節點上:
在/etc/keepalived/目錄下創建一個文件down:
在去keepalived(2)節點查看IP a l
5)再次測試HA nginx cluster :
原創文章,作者:zhengyibo,如若轉載,請注明出處:http://www.www58058.com/60048