Keepalived原理介紹和配置實踐

前言

本文主要講述Keepalived原理介紹和配置實踐html

Keepalived原理介紹和配置實踐

更新歷史

2019年09月03日 - 拆分LVS-Keepalived中Keepalived
2019年08月23日 - 更新LVS/NAT、LVS/DR、LVS/TUN三種模式的原理和配置實踐
2018年12月03日 - 精簡和更新配置步驟
2018年07月31日 - 初稿前端

閱讀原文 - https://wsgzao.github.io/post...node

擴展閱讀mysql

LVS - http://www.linuxvirtualserver...
Keepalived - http://www.keepalived.org/linux


ReadMe

參考文章

Keepalived - http://www.keepalived.org/doc/
The Keepalived Solution - http://www.linuxvirtualserver...
LVS和Keepalived官方中文手冊PDF - https://pan.baidu.com/s/1s0P6...nginx

相關術語

如下術語涉及LVS三種工做模式的原理
  • LB (Load Balancer 負載均衡)
  • HA (High Available 高可用)
  • Failover (失敗切換)
  • Cluster (集羣)
  • LVS (Linux Virtual Server Linux 虛擬服務器)
  • DS (Director Server),指的是前端負載均衡器節點
  • RS (Real Server),後端真實的工做服務器
  • VIP (Virtual IP),虛擬的IP地址,向外部直接面向用戶請求,做爲用戶請求的目標的 IP 地址
  • DIP (Director IP),主要用於和內部主機通信的 IP 地址
  • RIP (Real Server IP),後端服務器的 IP 地址
  • CIP (Client IP),訪問客戶端的 IP 地址

負載均衡(LB)

負載均衡實現方法有兩種:硬件實現和軟件實現

硬件比較常見的有:git

  1. F5 Big-IP
  2. Citrix Netscaler

軟件比較常見的有:github

  1. LVS(Linux Virtual Server)
  2. HAProxy
  3. Nginx

LVS特色是:web

  1. 首先它是基於4層的網絡協議的,抗負載能力強,對於服務器的硬件要求除了網卡外,其餘沒有太多要求;
  2. 配置性比較低,這是一個缺點也是一個優勢,由於沒有可太多配置的東西,大大減小了人爲出錯的概率;
  3. 應用範圍比較廣,不只僅對web服務作負載均衡,還能夠對其餘應用(mysql)作負載均衡;
  4. LVS架構中存在一個虛擬IP的概念,須要向IDC多申請一個IP來作虛擬IP。

Nginx負載均衡器的特色是:redis

  1. 工做在網絡的7層之上,能夠針對http應用作一些分流的策略,好比針對域名、目錄結構;
  2. Nginx安裝和配置比較簡單,測試起來比較方便;
  3. 也能夠承擔高的負載壓力且穩定,通常能支撐超過上萬次的併發;
  4. Nginx能夠經過端口檢測到服務器內部的故障,好比根據服務器處理網頁返回的狀態碼、超時等等,而且會把返回錯誤的請求從新提交到另外一個節點,不過其中缺點就是不支持url來檢測;
  5. Nginx對請求的異步處理能夠幫助節點服務器減輕負載;
  6. Nginx能支持http和Email,這樣就在適用範圍上面小不少;
  7. 默認有三種調度算法: 輪詢、weight以及ip_hash(能夠解決會話保持的問題),還能夠支持第三方的fair和url_hash等調度算法;

HAProxy的特色是:

  1. HAProxy是工做在網絡7層之上;
  2. 支持Session的保持,Cookie的引導等;
  3. 支持url檢測後端的服務器出問題的檢測會有很好的幫助;
  4. 支持的負載均衡算法:動態加權輪循(Dynamic Round Robin),加權源地址哈希(Weighted Source Hash),加權URL哈希和加權參數哈希(Weighted Parameter Hash);
  5. 單純從效率上來說HAProxy更會比Nginx有更出色的負載均衡速度;
  6. HAProxy能夠對Mysql進行負載均衡,對後端的DB節點進行檢測和負載均衡。

keepalived簡介

Keepalived 是運行在lvs之上,是一個用於作雙機熱備(HA)的軟件,它的主要功能是實現真實機的故障隔離及負載均衡器間的失敗切換,提升系統的可用性。

運行原理

keepalived經過選舉(看服務器設置的權重)挑選出一臺熱備服務器作MASTER機器,MASTER機器會被分配到一個指定的虛擬ip,外部程序可經過該ip訪問這臺服務器,若是這臺服務器出現故障(斷網,重啓,或者本機器上的keepalived crash等),keepalived會從其餘的備份機器上重選(仍是看服務器設置的權重)一臺機器作MASTER並分配一樣的虛擬IP,充當前一臺MASTER的角色。

選舉策略

選舉策略是根據VRRP協議,徹底按照權重大小,權重最大(0~255)的是MASTER機器,下面幾種狀況會觸發選舉

  1. keepalived啓動的時候
  2. master服務器出現故障(斷網,重啓,或者本機器上的keepalived crash等,而本機器上其餘應用程序crash不算)
  3. 有新的備份服務器加入且權重最大

keepalived的配置文件說明

Keepalived 是運行在lvs之上,它的主要功能是實現RealServer(真實服務器)的故障隔離及Director(負載均衡器)間的FailOver(失敗切換).

  • keepalived 是lvs的擴展項目,所以它們之間具有良好的兼容性
  • 對RealServer的健康檢查,實現對失效機器/服務的故障隔離
  • 負載均衡器之間的失敗切換 failover

全局定義

全局配置又包括兩個子配置

  1. 全局定義(global definition)
  2. 靜態路由配置(static ipaddress/routes)
# 全局定義(global definition) 
global_defs {                      
   notification_email {      
   acassen@firewall.loc     
   failover@firewall.loc
   sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc   
   smtp_server 192.168.200.1                         
   smtp_connect_timeout 30                                  
   router_id LVS_DEVEL     
}
notification_email: 表示keepalived在發生諸如切換操做時須要發送email通知以及email發送給哪些郵件地址郵件地址能夠多個每行一個
notification_email_from admin@example.com: 表示發送通知郵件時郵件源地址是誰
smtp_server 127.0.0.1: 表示發送email時使用的smtp服務器地址這裏能夠用本地的sendmail來實現
smtp_connect_timeout 30: 鏈接smtp鏈接超時時間
router_id node1: 機器標識,一般配置主機名

# 靜態地址和路由配置範例
static_ipaddress {
    192.168.1.1/24 brd + dev eth0 scope global
    192.168.1.2/24 brd + dev eth1 scope global
}
static_routes {
    src $SRC_IP to $DST_IP dev $SRC_DEVICE
    src $SRC_IP to $DST_IP via $GW dev $SRC_DEVICE
}
這裏實際上和系統裏面命令配置IP地址和路由同樣例如
192.168.1.1/24 brd + dev eth0 scope global 至關於: ip addr add 192.168.1.1/24 brd + dev eth0 scope global
就是給eth0配置IP地址路由同理,通常這個區域不須要配置
這裏實際上就是給服務器配置真實的IP地址和路由的在複雜的環境下可能須要配置通常不會用這個來配置咱們能夠直接用vi /etc/sysconfig/network-script/ifcfg-eth1來配置切記這裏可不是VIP不要搞混淆了切記切記

VRRPD配置

包括三個類:

  1. VRRP同步組(synchroization group)
  2. VRRP實例(VRRP Instance)
  3. VRRP腳本
# VRRP同步組(synchroization group)配置範例
vrrp_sync_group VG_1 {   //注意vrrp_sync_group  後面可自定義名稱如lvs_httpd ,httpd
group {
http
mysql
}
notify_master /path/to/to_master.sh
notify_backup /path_to/to_backup.sh
notify_fault "/path/fault.sh VG_1"
notify /path/to/notify.sh
smtp_alert 
}
其中http和mysql是實例名和下面的實例名一致
notify_master /path/to/to_master.sh //表示當切換到master狀態時要執行的腳本
notify_backup /path_to/to_backup.sh //表示當切換到backup狀態時要執行的腳本
notify_fault "/path/fault.sh VG_1"  // keepalived出現故障時執行的腳本
notify /path/to/notify.sh  
smtp_alert           //表示切換時給global defs中定義的郵件地址發送郵件通知

# VRRP實例(instance)配置範例
vrrp_instance http {  //注意vrrp_instance 後面可自定義名稱如lvs_httpd ,httpd
state MASTER
interface eth0
dont_track_primary
track_interface {
eth0
eth1
}
mcast_src_ip <IPADDR>
garp_master_delay 10
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
autp_pass 1234
}
virtual_ipaddress {
#<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPT> label <LABEL>
192.168.200.17/24 dev eth1
192.168.200.18/24 dev eth2 label eth2:1
}
virtual_routes {
# src <IPADDR> [to] <IPADDR>/<MASK> via|gw <IPADDR> dev <STRING> scope <SCOPE> tab
src 192.168.100.1 to 192.168.109.0/24 via 192.168.200.254 dev eth1
192.168.110.0/24 via 192.168.200.254 dev eth1
192.168.111.0/24 dev eth2
192.168.112.0/24 via 192.168.100.254
}
nopreempt
preemtp_delay 300
debug
}

state: state指定instance(Initial)的初始狀態就是說在配置好後這臺 服務器的初始狀態就是這裏指定的但這裏指定的不算仍是得要經過競選經過優先級來肯定裏若是這裏設置爲master但如若他的優先級不及另一臺 那麼這臺在發送通告時會發送本身的優先級另一臺發現優先級不如本身的高那麼他會就回搶佔爲master

interface: 實例綁定的網卡由於在配置虛擬VIP的時候必須是在已有的網卡上添加的

dont track primary: 忽略VRRP的interface錯誤

track interface: 跟蹤接口設置額外的監控裏面任意一塊網卡出現問題都會進入故障(FAULT)狀態例如用nginx作均衡器的時候內網必須正常工做若是內網出問題了這個均衡器也就沒法運做了因此必須對內外網同時作健康檢查

mcast src ip: 發送多播數據包時的源IP地址這裏注意了這裏實際上就是在那個地址上發送VRRP通告這個很是重要必定要選擇穩定的網卡端口來發送這裏至關於heartbeat的心跳端口若是沒有設置那麼就用默認的綁定的網卡的IP也就是interface指定的IP地址

garp master delay: 在切換到master狀態後延遲進行免費的ARP(gratuitous ARP)請求,默認5s

virtual router id: 這裏設置VRID這裏很是重要相同的VRID爲一個組他將決定多播的MAC地址

priority 100: 設置本節點的優先級優先級高的爲master

advert int: 設置MASTER與BACKUP負載均衡之間同步即主備間通告時間檢查的時間間隔,單位爲秒,默認1s

virtual ipaddress: 這裏設置的就是VIP也就是虛擬IP地址他隨着state的變化而增長刪除當state爲master的時候就添加當state爲backup的時候刪除這裏主要是有優先級來決定的和state設置的值沒有多大關係這裏能夠設置多個IP地址

virtual routes: 原理和virtual ipaddress同樣只不過這裏是增長和刪除路由

lvs sync daemon interface: lvs syncd綁定的網卡,相似HA中的心跳檢測綁定的網卡

authentication: 這裏設置認證

auth type: 認證方式能夠是PASS或AH兩種認證方式

auth pass: 認證密碼

nopreempt: 設置不搶佔master,這裏只能設置在state爲backup的節點上並且這個節點的優先級必須別另外的高,好比master由於異常將調度圈交給了備份serve,master serve檢修後沒問題,若是不設置nopreempt就會將調度權從新奪回來,這樣就容易形成業務中斷問題

preempt delay: 搶佔延遲多少秒,即延遲多少秒後競選master

debug:debug級別

notify master:和sync group這裏設置的含義同樣能夠單獨設置例如不一樣的實例通知不一樣的管理人員http實例發給網站管理員mysql的就發郵件給DBA

# VRRP腳本
# 以下所示爲相關配置示例
vrrp_script check_running {
   script "/usr/local/bin/check_running"
   interval 10
   weight 10
}

vrrp_instance http {
   state BACKUP
   smtp_alert
   interface eth0
   virtual_router_id 101
   priority 90
   advert_int 3
   authentication {
   auth_type PASS
   auth_pass whatever
   }
   virtual_ipaddress {
   1.1.1.1
   }
   track_script {
   check_running 
   }
}
# 首先在vrrp_script區域定義腳本名字和腳本執行的間隔和腳本執行的優先級變動,以下所示:
vrrp_script check_running {
            script "/usr/local/bin/check_running"
            interval 10     #腳本執行間隔
            weight 10       #腳本結果致使的優先級變動10表示優先級+10-10則表示優先級-10
            }
# 而後在實例(vrrp_instance)裏面引用有點相似腳本里面的函數引用同樣先定義後引用函數名
track_script {
      check_running 
}

注意:
VRRP腳本(vrrp_script)和VRRP實例(vrrp_instance)屬於同一個級別
keepalived會定時執行腳本並對腳本執行的結果進行分析,動態調整vrrp_instance的優先級。通常腳本檢測返回的值爲0,說明腳本檢測成功,若是爲非0數值,則說明檢測失敗
若是腳本執行結果爲0,而且weight配置的值大於0,則優先級相應的增長, 若是weight爲非0,則優先級不變
若是腳本執行結果非0,而且weight配置的值小於0,則優先級相應的減小, 若是weight爲0,則優先級不變
其餘狀況,維持本來配置的優先級,即配置文件中priority對應的值。
這裏須要注意的是:
1) 優先級不會不斷的提升或者下降
2) 能夠編寫多個檢測腳本併爲每一個檢測腳本設置不一樣的weight
3) 無論提升優先級仍是下降優先級,最終優先級的範圍是在[1,254],不會出現優先級小於等於0或者優先級大於等於255的狀況
這樣能夠作到利用腳本檢測業務進程的狀態,並動態調整優先級從而實現主備切換。

virtual_server 虛擬主機配置

關於keeplived的虛擬主機配置有三種以下所示
virtual server IP port
virtual server fwmark int
virtual server group string

以經常使用的第一種爲例
virtual_server 192.168.1.2 80
含義:設置一個virtual server: VIP:Vport

delay_loop 3
含義:設置service polling的delay時間即服務輪詢的時間間隔

lb_algo rr|wrr|lc|wlc|lblc|sh|dh
含義:設置LVS調度算法

lb_kind NAT|DR|TUN
含義:設置LVS集羣模式

persistence_timeout 120
含義:設置會話保持時間秒爲單位即以用戶在120秒內被分配到同一個後端realserver,超過此時間就從新分配

persistence_granularity <NETMASK>
含義:設置LVS會話保持粒度ipvsadm中的-M參數默認是0xffffffff即每一個客戶端都作會話保持

protocol TCP
含義:設置健康檢查用的是TCP仍是UDP

ha_suspend
含義:suspendhealthchecker’s activity

virtualhost <string>
含義:HTTP_GET作健康檢查時檢查的web服務器的虛擬主機即host頭

sorry_server <IPADDR> <PORT>
含義:設置backupserver就是當全部後端realserver節點都不可用時就用這裏設置的也就是臨時把全部的請求都發送到這裏

real_server <IPADDR> <PORT>
含義:設置後端真實節點主機的權重等設置主要後端有幾臺這裏就要設置幾個

weight 1
含義:設置給每臺的權重0表示失效(不知給他轉發請求知道他恢復正常)默認是1

inhibit_on_failure
含義:表示在節點失敗後把他權重設置成0而不是衝IPVS中刪除

notify_up <STRING> | <QUOTED-STRING>
含義:設置檢查服務器正常(UP)後要執行的腳本
notify_down <STRING> | <QUOTED-STRING>
含義:設置檢查服務器失敗(down)後要執行的腳本

注:keepalived檢查機制說明
keepalived健康檢查方式有:HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK幾種以下所示

#HTTP/HTTPS方式 
HTTP_GET|SSL_GET {      #設置健康檢查方式

url {                   #設置要檢查的URL能夠有多個
path /                  #設置URL具體路徑
digest <STRING>         #檢查後的摘要信息這些摘要信息能夠經過genhash命令工具獲取                                   
status_code 200         #設置返回狀態碼
}
connect_port 80         #設置監控檢查的端口
bindto  <IPADD>         #設置健康檢查的IP地址
connect_timeout   3     #設置鏈接超時時間
nb_get_retry  3         #設置重連次數
delay_before_retry  2   #設置重連間隔
} 

#TCP方式  
TCP_CHECK     {
connect_port 80         #設置監控檢查的端口
bindto  <IPADD>         #設置健康檢查的IP地址
connect_timeout   3     #設置鏈接超時時間
nb_get_retry  3         #設置重連次數
delay_before_retry  2   #設置重連間隔
}
#SMTP方式 (這個能夠用來給郵件服務器作集羣)
SMTP_CHECK {
host {
connect_ip <IP ADDRESS>
connect_port <PORT>     #默認檢查25端口
14 KEEPALIVED
bindto <IP ADDRESS>
}
connect_timeout <INTEGER>
retry <INTEGER>
delay_before_retry <INTEGER>
helo_name <STRING>|<QUOTED-STRING>
} 

#MISC方式 這個能夠用來檢查不少服務器只須要本身會些腳本便可
MISC_CHECK {
misc_path <STRING>|<QUOTED-STRING>  #外部程序或腳本
misc_timeout <INT>                  #腳本或程序執行超時時間
misc_dynamic                                              
#這個就很好用了能夠很是精確的來調整權重是後端天天服務器的壓力都能均衡調配這個主要是經過執行的程序或腳本返回的狀態代碼來動態調整weight值使權重根據真實的後端壓力來適當調整不過這須要有過硬的腳本功夫才行哦
#返回0健康檢查沒問題不修改權重
#返回1健康檢查失敗權重設置爲0
#返回2-255健康檢查沒問題可是權重卻要根據返回代碼修改成返回碼-2例如若是程序或腳本執行後返回的代碼爲200#那麼權重這回被修改成 200-2
}

以上就是keepalived的配置項說明雖然配置項不少但不少時候不少配置項保持默認便可,如下是默認配置文件,方便你們作個對比參考

[root@sg-gop-10-65-32-140 wangao]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}

virtual_server 192.168.200.100 443 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.201.100 443 {
        weight 1
        SSL_GET {
            url {
              path /
              digest ff20ad2481f97b1754ef3e12ecd3a9cc
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

virtual_server 10.10.10.2 1358 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    sorry_server 192.168.200.200 1358

    real_server 192.168.200.2 1358 {
        weight 1
        HTTP_GET {
            url {
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.200.3 1358 {
        weight 1
        HTTP_GET {
            url {
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            url {
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

virtual_server 10.10.10.3 1358 {
    delay_loop 3
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.200.4 1358 {
        weight 1
        HTTP_GET {
            url {
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.200.5 1358 {
        weight 1
        HTTP_GET {
            url {
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

最簡單的Keepalived HA配置實例

# 安裝keepalived,ipvsadm
yum install keepalived -y

# 若是開啓防火牆,請添加VRRP白名單
-A INPUT -p vrrp -j ACCEPT
-A INPUT -p igmp -j ACCEPT
-A INPUT -d 224.0.0.18 -j ACCEPT

# 編輯keepalived配置文件,master和backup節點配置文件同樣
vi /etc/keepalived/keepalived.conf

vrrp_sync_group VI_GOP_NC1_HA {
    group {
        VI_GOP_NC1_HA_PRI
    }
}

vrrp_instance VI_GOP_NC1_HA_PRI {
    state BACKUP
    interface bond0
    virtual_router_id 139
    priority 100
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.65.33.139/23 dev bond0
    }
}

# 手動啓動節點即爲master
service keepalived start

若是須要配合自定義腳本監控使用,能夠參考Redis 主從同步配置實踐

LVS和Keepalived系列

LVS和Keepalived的原理介紹和配置實踐
LVS原理介紹和配置實踐
Keepalived原理介紹和配置實踐
LVS-NAT原理介紹和配置實踐
LVS-DR原理介紹和配置實踐
LVS-TUN原理介紹和配置實踐

相關文章
相關標籤/搜索