keepalived
VRRP協議
VRRP(virtual route Redundancy Protocol),虛擬路由冗餘協議。因爲每個設備的都只有一個默認網關指向,一旦這個默認指向的網關處理問題。我們就需要重新設定默認網關的指向。VRRP就是解決這個問題出現,VRRP協議是將一組路由劃分起來。在這組路由器中只設置一個虛擬IP和虛擬MAC地址,然後根據設定的規則在這組路由器中轉移。每個路由器都有各自網卡和IP地址,同時在主路由上有VIP(飄移IP)。在這組路由中,通過投票選舉的方式選出主路由。在故障工作過程中會一直向備用路由器通過組播方式發送自己健康工作的信息,一旦主路由出現故障,健康信息不會在發送。這是備用路由就會將VIP啓用起來,同時發送一條免費IP報文,並且採取自發自應的方式。宣告自己獲取IP,這樣在後端其他主機不知情的情況下,完成了IP漂移。
術語 | 解釋 |
---|---|
VRID | virtual router ID,虛擬路由標識。 |
MASTER | 虛擬路由器中承擔報文轉發的任務的路由器。 |
BACKUP | MASTER路由器出現問題,能夠代替MASTER主機承擔報文轉發任務的路由器。 |
虛擬IP地址 | 一個虛擬路由器可以有一個或者多個虛擬IP地址。 |
虛擬MAC地址 | 一個虛擬路由器只有一個MAC地址,虛擬 MAC 地址的格式爲 00-00-5E-00-01-{VRID}。 |
優先級 | VRRP根據優先級來確定虛擬路由器中每臺路由器的地位 |
非搶佔方式 | 如果 Backup 路由器工作在非搶佔方式下,則只要 Master 路由器沒有出現故障, Backup路由器即使隨後被配置了更高的優先級也不會成爲Master路由器。一旦MASTER出現問題,BACKUP承擔分發任務後,即使MASTER主機恢復,也不會再搶回分發的任務。 |
keepalived簡介
keepalive是Linux下一個輕量級的高可用方案解決。衆所周知的LVS解決負載均衡的問題,但是因爲Director是單主機存在。因此容易出現SPOF(sing point of failure:單點故障),因此keepalived最初的設計就是爲了解決lvs的SPOF誕生的。在隨後的發展過程中,keepalived又添加了VRRP(virtual router redundancy protocol),解決靜態路由出現的單點故障問題,可以保證網絡不間斷的穩定運行。
keepalived的組成,如圖所示
(1)WatchDog:檢測Checker和VRRP進程。
(2)Checker:實現對服務器運行狀態的檢測和故障隔離。
(3)VRRP Stack:通過此模塊再結合lvs負載均衡軟件即可部署一個高性能的負載均衡的集羣系統。
(4)IPVS wrapper:這是IPVS功能的一個實現。IPVS wrapper模塊可以講設置好的IPVS規則發送到內核空間,並提交給IPVS模塊,最終實現IPVS模塊的負載均衡功能。
(5)Netlink Reflector:用來實現高可用集羣中的Failover時虛擬IP(VIP)的設置和切換。Netlink Reflector的所有請求最後都發送到內核空間層Netlink模塊完成。
keepalived的安裝的及配置文件詳解
1.yum 安裝
從CentOS 6.4開始keepalived被紅帽官方收入之yum原base倉庫。之前在epel源中。yum install -y keepalived
2.源碼編譯:
#需現在http://www.keepalived.org上獲取源碼。 tar xf keepalived-1.2.24.tar.gz ./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/3.10.0-327.36.2.el7.x86_64/#因爲lvs是工作在內核當中,keepalived中的lvs功能就需要讀取內核源碼的頭文件。若不需要使用lvs功能此選項,省略即可。make&&make install
3.配置文件
/etc/keepalived/keepalived.conf
配置文件分爲全局配置段,VRRPD配置段,LVS配置段。
全局配置段如下:
global_defs { notification_email { [email protected] ... } notification_email_from [email protected] smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id my_hostname vrrp_mcast_group4 224.0.0.18 vrrp_mcast_group6 ff02::12 enable_traps } notification_email #用於設置報警郵箱地址,可以設置多個每行一個。 notification_email_from #設置用於發送報警的郵箱地址。 smtp_server 127.0.0.1 #用於設置郵箱的IP地址 smtp_connect_timeout 30 #用於設置連接smtp server 的超時時間。 router_id #表示運行keepalived服務器的一個標識,是發送郵件時顯示在郵件主機中的信息
VRRP設置段
vrrp_sync_group VG_1 { group { inside_network outside_network ... }n notify_master /path/to_master.sh notify_backup /path/to_backup.sh notify_fault "/path/fault.sh VG_1" notify /path/notify.sh smtp_alert }group #同步組,此項功能不常用。notify_master #指定Keepalived進入MASTER狀態時執行的腳本。notify_backup #指定Keepalived進入backup狀態時執行的腳本。notify_falut #指定Keepalived進入fault狀態時執行的腳本。notify_stop #指定Keepalived程序終止狀態時執行的腳本。vrrp_instance <String> { state MASTER|BACKUP 當前節點在此虛擬路由器中的初始狀態; interface eth0 VRRP實例工作的網絡接口 virtual_router_id 虛擬路由器ID,範圍0-255 priority 100 當前物理節點在此虛擬路由器中的優先級 advert_int # 用於設定MASTER與BACKUP主機之間同步檢查的時間間隔,單位是秒。 mcast_src_ip 用於設置發送多播包的地址,若不設置,將使用interface設置的網卡的接口的IP地址。 garp_master_delay 用於設定在切換到MASTER狀態後延時進行Gratuitous arp請求 track_interface 用於設定一些額外的網絡監控接口,其中任何一個接口出現故障,keepalived都會進入fault狀態。 authentication{ 認證方式 auth_type PASS 簡單密碼 auth_pass 1111 (改爲隨機,字符串.不能超過8位,openssl rand -hex 4 ) } virtual_ipaddress{(定義虛擬IP) 192.168.200.16 (虛擬路由IP,VIP,) 格式: <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL> } nopreempt 非搶佔模式 preempt_delay 搶佔延遲,用於設置搶佔延遲的時間,單位爲秒。
Virtual server參數
virtual_server #設置虛擬服務器開始的標識,後面接虛擬IP地址和服務端口,IP與端口用空格隔開。lb_algo rr|wrr|lc|wlc|lblc|sh|dh #定義負責均衡調度方法delay_loop <INT> #定義服務輪詢時間間隔lb_kind NAT|DR|TUN persistence_timeout <INT> #持久連接時長,有了這個功能,用戶的請求會一直分發到某個服務節點persistence_granularity #此選項配合persistence_timeout一同使用,表示持久連接的粒度。默認爲255.255.255.255,如果改爲255.255.255.0,那麼客服端IP所在的整個網段的請求都會分配到同一個Real Serverprotocol TCP #服務協議ha_suspend #節點從MASTER切換到BACKUP時,暫時不啓用Real Server節點的健康檢查。virtualhost 在通過HTTP_GET/SSL_GET做健康檢測時,指定的Web服務器的虛擬主機地址。 sorry_server <IPADDR> <PORT> #所有RS均故障時,提供say sorry的服務器;real_server <IPADDR> <PORT>{ weight #權重 inhibit_on_failure:表示再real server節點失效後,把它的weight值設置爲0,而不是從IPVS中刪除。 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 <STRING> #健康狀態檢測時請求的資源的URL digest <STRING> #基於獲取內容摘要碼進行健康狀態判定 status_code <INT> #基於狀態碼進行健康狀態判定 } nb_get_retry <INT> #嘗試的次數delay_before_retry <INT> #兩次嘗試之間的時間間隔connect_ip <IP ADDRESS> #向此處指定的地址發測試請求connect_port <PORT> #向此處指定的端口發送測試請求bindto <IP ADDRESS> #指定測試請求的源IP bind_port <PORT> #指定測試請求的源PORT connect_timeout <INTEGER> #連接的超時時長}
HTTP_GET和SSL_GET檢測方式中參數解釋
url #用來指定HTTP/SSL檢查的url信息,可以指定多個URL。path #後面跟具體的URL路徑digest #SSL檢查摘要信息,這些摘要信息可以通過genhash命令獲取。 #e.g. genhash -s 192.168.32.130 -p 80 -u /index.htmlstatus_code #指定HTTP檢查返回正常狀態碼的類型。一般爲200bindto #表示通過此地址來發送請求對服務起進行檢查。
實驗:
HA Cluster的配置前提: (1) 各節點時間必須同步; ntp, chrony (2) 確保iptables及selinux不會成爲阻礙; (3) 各節點之間可通過主機名互相通信(對KA並非必須); 建議使用/etc/hosts文件實現; (4) 各節點之間的root用戶可以基於密鑰認證的ssh服務完成互相通信;(並非必須)
1.單主模型
主機名 | 主機 | IP | 模式 | VIP |
---|---|---|---|---|
node1 | centos 6.8 | 192.168.32.21 | MASTEP | 192.168.32.100 |
node2 | centos 6.8 | 192.168.32.23 | BACKUP | 192.168.32.100 |
[root@localhost ~]# iptables -F#做實驗建議將其清楚,不影響操作.[root@localhost ~]# setenforce 0#關閉selinux[root@localhost ~]# ssh-keygen -t rsa -P ''#生成公鑰和私鑰[root@localhost ~]# ssh-copy-id -i .shh/id_rsa.pub [email protected]#將公鑰拷貝至BACKUP主機[root@localhost ~]# ntpdate 10.1.0.1;ssh [email protected] ntpdate 10.1.0.1#這是本地的時間服務器2 Nov 20:21:27 ntpdate[2532]: adjust time server 10.1.0.1 offset 0.231396 sec2 Nov 20:21:28 ntpdate[3633]: adjust time server 10.1.0.1 offset 0.215564 sec [root@localhost ~]# hostname ;ssh [email protected] hostnamenode1 node2#獲取MASTER和BACKUP的主機名,然後修改各種的/etc/hosts文件,將名稱和各自主機IP對應,便於通過主機名通信。[root@localhost ~]# vim /etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6192.168.32.21 node1 node1.localdomain#添加192這行將主機名與IP對應起來[root@localhost ~]# yum install -y keepalived;ssh [email protected] yum install -y keepalived# 安裝keepalived的程序包,一下修改配置文件操作,只需要在MASTER主機上操作,然後copy至BACKUP主機上,略作修改即可[root@localhost ~]# cd /etc/keepalived/[root@localhost ~]# cp keepalived.conf{,.bak}[root@localhost ~]# vim keepalived.conf#打開配置文件很長,但是我們這裏只需要配置主備模型,virtual server配置段及其以後的配置段均無用.註釋或者刪除掉即可.這裏也不再貼出這些配置段的參數.[root@localhost keepalived]# vim keepalived.conf#前文中出現的參數這裏不再解釋#這裏MASTER中的配置文件 notification_email { root@localhost } notification_email_from [email protected] smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id node1 vrrp_mcast_group4 224.0.24.18 #發送組播地址,默認配置文件沒有,需要自行添加} vrrp_instance node1 { state MASTER interface eth3 virtual_router_id 51 priority 98 advert_int 1 authentication { auth_type PASS auth_pass 04d5479b #小於等於8位的密鑰,可以用#openssl rand -hex 8 } virtual_ipaddress { 192.168.32.100 } } [root@localhost keepalived]# scp 192.168.32.23:/etc/keepalived/keepalived.conf# 1.修改其中的state爲BACKUP# 2.修改priority的值,不能讓兩個優先級別一致# 3.修改當前使用的interface
實驗結果圖,先啓用的BACKUP主機,然後啓動的MASTER主機,vip地址會從BACKUP的主機飄逸到MASTER主機上。其他故障檢測操作這裏就不上圖片。
2.主主模型
1.主備模式存在一個缺點就浪費一臺主機作爲備用主機。因此我們可以用主主模型.
2.主主模型就是用兩臺主機,一臺主機作爲另外一臺主機備用主機。這樣兩臺主機都是各自的調度地址的MASTER就不會存在資源浪費的情況,同時也實現了高可用.
主機名 | 系統 | IP | VIP1 | 模式 | VIP2 | 模式 |
---|---|---|---|---|---|---|
node1 | CentOS 6.8 | 192.168.32.23 | 192.168.32.100 | MASTER | 192.168.32.200 | BACKUP |
node2 | CentOS 6.8 | 192.168.32.23 | 192.168.32.100 | BACKUP | 192.168.32.200 | MASTER |
#前期環境操作及環境設置與主備模型一直,因此這裏只講主主模型的配置文件附上。
[root@localhost keepalived]# vim keepalived.conf
global_defs { notification_email { root@localhost } notification_email_from [email protected] smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id node1 vrrp_mcast_group4 224.0.24.18} vrrp_instance node1 { state MASTER interface eth3 virtual_router_id 51 priority 95 advert_int 1 authentication { auth_type PASS auth_pass 04d5479b } virtual_ipaddress { 192.168.32.100/24 dev eth3 label eth3:0 } } vrrp_instance node11 { state BACKUP interface eth3 virtual_router_id 53 priority 98 advert_int 1 authentication { auth_type PASS auth_pass 0as5479b } virtual_ipaddress { 192.168.32.200/24 dev eth3 label eth3:1 }
}
[root@localhost keepalived]# scp 192.168.32.23:/etc/keepalived/keepalived.conf# 1.修改其中的各自備用的state爲BACKUP# 2.修改priority的值,不能讓兩個優先級別一致# 3.修改當前使用的interface# 4.兩臺主機的虛擬路由地址不能一樣.即virtual_router_id 不能相同。
實驗結果圖,先啓用的BACKUP主機,然後啓動的MASTER主機,vip地址會從BACKUP的主機飄逸到MASTER主機上。其他故障檢測操作這裏就不上圖片
3.keepalived啓動,停止等腳本測試。
郵件腳本實例,用主備模型進行示例。#!/bin/bash#contact='root@localhost'notify(){ mailsubject="$(hostname) to be $1,vip is removed" mailbody="$(date +'%F %T'):vrrp transition,$(hostname) changed to be $1" echo "$mailbody" | mail -s "$mailsubject" $contact}case $1 inmaster) notify master ;; backup) notify backup ;; fault) notify fault ;; *) echo "Usage : $(basename $0) {master|backup|fault}" exit 2 ;;esac接下來開始調用此腳本,只需要在全局端調用腳本即可,其他配置不需要修改。切記時間同步,不然你收不到郵件。 ]# vim /etc/keepalived/keepalived.confglobal_defs { notification_email { root@localhost } notification_email_from [email protected] smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id node1 vrrp_mcast_group4 224.0.24.18 notify_master "/etc/keepalived/testmail.sh master" notify_backup "/etc/keepalived/testmail.sh backup" notify_fault "/etc/keepalived/testmail.sh fault"}
4.搭建高可用的lvs。
#下面貼出的是主路由的配置,backup的配置這裏也不在描述怎麼修改。和前面一樣。]# yum install -y ipvsadm]# vim /etc/keepalived/keepalived.conf! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from [email protected] 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 eth3 virtual_router_id 51 priority 98 advert_int 1 authentication { auth_type PASS auth_pass d33d5328 } notify_master "/etc/keepalived/testmail.sh master" notify_backup "/etc/keepalived/testmail.sh backup" notify_falut"/etc/keepalived/testmail.sh falut" virtual_ipaddress { 192.168.32.13/24 dev eth3 label eth3:1 } } virtual_server 192.168.32.13 80 { delay_loop 3 lb_algo rr lb_kind DR nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP real_server 192.168.32.129 80 { weight 1 HTTP_GET { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } real_server 192.168.32.128 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } } [root@node2 keepalived]# ipvsadm -lnIP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.32.13:80 rr persistent 50 -> 192.168.32.128:80 Route 1 0 20 -> 192.168.32.129:80 Route 1 0 0
5.keepalived調用外部的輔助腳本進行資源監控,並根據監控的結果狀態能實現優先動態調整
#此實驗通過高可用nginx負責均衡實現,因此需要先安裝或者編譯nginx。編譯nginx時需要啓用stream模塊,因爲此實驗是通過調用stream模塊實現的。#實現此功能分爲兩步:(1) 先定義一個腳本;(2) 調用此腳本;#添加如下行啓用nginx反向代理# vim /etc/nginx/nginx.confstream { upstream srvs { server 192.168.32.128:80; server 192.168.32.129:80; hash $remote_addr consistent; } server { listen 192.168.32.13:80; proxy_pass srvs; } } vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from [email protected] smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id node1 vrrp_mcast_group4 224.0.100.19} vrrp_scripts chk_down { scripts "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" interval 1 weight -5} vrrp_script chk_nginx { script "killall -0 nginx && exit 0 || exit 1" interval 1 weight -5} vrrp_instance VI_1 { state MASTER interface eth3 virtual_router_id 51 priority 98 advert_int 1 vrrp_script chk_down vrrp_script chk_nginx authentication { auth_type PASS auth_pass d33d5328 } notify_master "/etc/keepalived/testmail.sh master" notify_backup "/etc/keepalived/testmail.sh backup" notify_falut"/etc/keepalived/testmail.sh falut" virtual_ipaddress { 192.168.32.13/24 dev eth3 label eth3:1 } }