本文主要講述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
Keepalived - http://www.keepalived.org/doc/
The Keepalived Solution - http://www.linuxvirtualserver...
LVS和Keepalived官方中文手冊PDF - https://pan.baidu.com/s/1s0P6...nginx
如下術語涉及LVS三種工做模式的原理
負載均衡實現方法有兩種:硬件實現和軟件實現
硬件比較常見的有:git
軟件比較常見的有:github
LVS特色是:web
Nginx負載均衡器的特色是:redis
HAProxy的特色是:
Keepalived 是運行在lvs之上,是一個用於作雙機熱備(HA)的軟件,它的主要功能是實現真實機的故障隔離及負載均衡器間的失敗切換,提升系統的可用性。
keepalived經過選舉(看服務器設置的權重)挑選出一臺熱備服務器作MASTER機器,MASTER機器會被分配到一個指定的虛擬ip,外部程序可經過該ip訪問這臺服務器,若是這臺服務器出現故障(斷網,重啓,或者本機器上的keepalived crash等),keepalived會從其餘的備份機器上重選(仍是看服務器設置的權重)一臺機器作MASTER並分配一樣的虛擬IP,充當前一臺MASTER的角色。
選舉策略是根據VRRP協議,徹底按照權重大小,權重最大(0~255)的是MASTER機器,下面幾種狀況會觸發選舉
Keepalived 是運行在lvs之上,它的主要功能是實現RealServer(真實服務器)的故障隔離及Director(負載均衡器)間的FailOver(失敗切換).
全局配置又包括兩個子配置
# 全局定義(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不要搞混淆了切記切記
包括三個類:
# 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的狀況
這樣能夠作到利用腳本檢測業務進程的狀態,並動態調整優先級從而實現主備切換。
關於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,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-NAT原理介紹和配置實踐
LVS-DR原理介紹和配置實踐
LVS-TUN原理介紹和配置實踐