1. 程式人生 > >keepalived vip漂移基本原理及選舉算法

keepalived vip漂移基本原理及選舉算法

認證 emca 如何 虛擬ip 目的 環境 priority 運行 imp

keepalived可以將多個無狀態的單點通過虛擬IP(以下稱為VIP)漂移的方式搭建成一個高可用服務,常用組合比如 keepalived+nginx,lvs,haproxy和memcached等。它的實現基礎是VRRP協議,包括核心的MASTER競選機制都是在VRRP協議所約定的。

一、配置說明:
keepalived的配置位於/etc/keepalived/keepalived.conf,配置文件格式包含多個必填/可選的配置段,部分重要配置含義如下:
global_defs: 全局定義塊,定義主從切換時通知郵件的SMTP配置。
vrrp_instance: vrrp實例配置。
vrrp_script: 健康檢查腳本配置。

細分下去,vrrp_instance配置段包括:
state: 實例角色。分為一個MASTER和一(多)個BACKUP。
virtual_router_id: 標識該虛擬路由器的ID,有效範圍為0-255。
priority: 優先級初始值,競選MASTER用到,有效範圍為0-255。
advert_int: VRRP協議通告間隔。
interface: VIP所綁定的網卡,指定處理VRRP多播協議包的網卡。
mcast_src_ip: 指定發送VRRP協議通告的本機IP地址。
authentication: 認證方式。
virtual_ipaddress: VIP。
track_script: 健康檢查腳本。

vrrp_script配置段包括:
script: 一句指令或者一個腳本文件,需返回0(成功)或非0(失敗),keepalived以此為依據判斷其監控的服務狀態。
interval: 健康檢查周期。
weight: 優先級變化幅度。
fall: 判定服務異常的檢查次數。
rise: 判定服務正常的檢查次數。

這裏有MASTER和BACKUP的參考配置。

二、選舉算法
keepalived中優先級高的節點為MASTER。MASTER其中一個職責就是響應VIP的arp包,將VIP和mac地址映射關系告訴局域網內其 他主機,同時,它還會以多播的形式(目的地址224.0.0.18)向局域網中發送VRRP通告,告知自己的優先級。網絡中的所有BACKUP節點只負責 處理MASTER發出的多播包,當發現MASTER的優先級沒自己高,或者沒收到MASTER的VRRP通告時,BACKUP將自己切換到MASTER狀 態,然後做MASTER該做的事:1.響應arp包,2.發送VRRP通告。

MASTER和BACKUP節點的優先級如何調整?
首先,每個節點有一個初始優先級,由配置文件中的priority配置項指定,MASTER節點的priority應比BAKCUP高。運行過程中keepalived根據vrrp_script的weight設定,增加或減小節點優先級。規則如下:

1. 當weight > 0時,vrrp_script script腳本執行返回0(成功)時優先級為priority + weight, 否則為priority。當BACKUP發現自己的優先級大於MASTER通告的優先級時,進行主從切換。
2. 當weight < 0時,vrrp_script script腳本執行返回非0(失敗)時優先級為priority + weight, 否則為priority。當BACKUP發現自己的優先級大於MASTER通告的優先級時,進行主從切換。 3. 當兩個節點的優先級相同時,以節點發送VRRP通告的IP作為比較對象,IP較大者為MASTER。 以上文中的配置為例: HOST1: 10.15.8.100, priority=91, MASTER(default) HOST2: 10.15.8.101, priority=90, BACKUP VIP: 10.15.8.102 weight = 2 抓包命令: tcpdump -nn vrrp 示例一:HOST1和HOST2上keepalived和nginx均正常。

1
2
3
4
16:33:07.697281 IP 10.15.8.100 > 224.0.0.18: VRRPv2, Advertisement, vrid 102, 
prio 93, authtype simple, intvl 1s, length 20
16:33:08.697588 IP 10.15.8.100 > 224.0.0.18: VRRPv2, Advertisement, vrid 102, 
prio 93, authtype simple, intvl 1s, length 20

此時HOST1優先級為priority + weight = 93,HOST2優先級為priority + weight = 92,HOST1仍為MASTER。

示例二:關閉HOST1上的nginx。

1
2
3
4
5
6
7
8
16:33:09.697928 IP 10.15.8.100 > 224.0.0.18: VRRPv2, Advertisement, vrid 102, 
prio 93, authtype simple, intvl 1s, length 20
16:33:10.698285 IP 10.15.8.100 > 224.0.0.18: VRRPv2, Advertisement, vrid 102, 
prio 91, authtype simple, intvl 1s, length 20
16:33:10.698482 IP 10.15.8.101 > 224.0.0.18: VRRPv2, Advertisement, vrid 102, 
prio 92, authtype simple, intvl 1s, length 20
16:33:11.699441 IP 10.15.8.101 > 224.0.0.18: VRRPv2, Advertisement, vrid 102, 
prio 92, authtype simple, intvl 1s, length 20

HOST1上的nginx關閉後,killall -0 nginx返回非0,HOST1通告的優先級為priority = 91,HOST2的優先級為priority + weight = 92,HOST2搶占成功,被選舉為MASTER。相關日誌可tail /var/log/messages。

由此可見,主從的優先級初始值priority和變化量weight設置非常關鍵,配錯的話會導致無法進行主從切換。比如,當MASTER初始值定 得太高,即使script腳本執行失敗,也比BACKUP的priority + weight大,就沒法進行VIP漂移了。所以priority和weight值的設定應遵循: abs(MASTER priority - BAKCUP priority) < abs(weight)。 另外,當網絡中不支持多播(例如某些雲環境),或者出現網絡分區的情況,keepalived BACKUP節點收不到MASTER的VRRP通告,就會出現腦裂(split brain)現象,此時集群中會存在多個MASTER節點。

轉載:http://fengchj.com/?p=2156

keepalived vip漂移基本原理及選舉算法