前言:html
keepalived是vrrp協議的軟件實現,原生設計目的爲了提供高可用ipvs服務。現已成爲爲主流調度器提供冗餘(雙機熱備),避免單點故障提升高可用性的一件利器。前端
索引:linux
1. 主要功能nginx
2. HA Cluster 配置準備:vim
3. 程序組成後端
4. 主配置文件結構centos
5. 實現簡單keepalive地址漂移配置(主從)安全
6. 實現負載分攤(雙主)配置bash
7. keepalived 結合Ipvs服務器
8. keepalived調用腳本進行資源監控
9.keepalived同步組
1.主要功能:
① vrrp協議完成地址流動(即爲調度器作冗餘,避免單點故障提升高可用性)
② 爲vip地址所在的節點生成ipvs規則(在配置文件中預先定義)
③ 爲ipvs集羣的各RS作健康狀態檢測
④ 基於腳本調用接口經過執行腳本完成腳本中定義的功能,進而影響集羣事務,以此支持nginx、 haproxy等服務
Keepalived組成:
2. HA Cluster 配置準備:
(1) 各節點時間必須同步 ntp(centos 6), chrony(centos 7)
vim /etc/ntp.conf server 同步服務器IP ibrust #t添加一條 |
(2) 確保iptables及selinux不會成爲阻礙
(3) 各節點之間可經過主機名互相通訊(對KA並不是必須)
建議使用/etc/hosts文件實現
(4) 各節點之間的root用戶能夠基於密鑰認證的ssh服務完
成互相通訊(對KA並不是必須)
方法:
ssh-keygen #生成祕鑰。第一次提示存放祕鑰路徑,默認~/.ssh/id_rsa回車就好。後兩次是否加密祕 鑰,實驗方便直接回車不加密,安全性考慮應加密。 cd .ssh ssh-copy-id 目標主機名或IP #默認發送公鑰,到目標主機後更名爲authorized_keys |
3. 程序組成
keepalived安裝配置:
CentOS 6.4+ Base源
主配置文件: /etc/keepalived/keepalived.conf
主程序文件: /usr/sbin/keepalived
Unit File: /usr/lib/systemd/system/keepalived.service
Unit File的環境配置文件: /etc/sysconfig/keepalived
配置範例:/usr/share/doc/keeplived-1.2.13/samples
配置日誌:
vim /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -S 2"
vim /etc/rsyslog.conf
local2.* /var/log/keepalived.log
4. 主配置文件結構(三大塊)
cat /etc/keepalived/keepalived.conf GLOBAL CONFIGURATION #定義郵件通知相關,同組調度器間組播配置 Global definitions Static routes/addresses VRRPD CONFIGURATION VRRP synchronization group(s): vrrp同步組 VRRP instance(s):即一個vrrp虛擬 路由器 LVS CONFIGURATION Virtual server group(s) Virtual server(s): ipvs集羣的vs和rs |
5. 實現簡單keepalive地址漂移配置(主從)
5.1 實驗拓撲
5.2 配置6m1
cd /etc/keepalived
cp keepalived.conf{,.bak}
vim keepalived.conf
global_defs { notification_email { root@localhost #發生故障給哪些郵箱發郵件通知 } notification_email_from 6m1@localhost #從哪一個郵箱發出 smtp_server 127.0.0.1 #郵件服務器 smtp_connect_timeout 30 router_id 6m1 #當前調度器主機名(可自定義) vrrp_mcast_group4 224.100.100.43 #自定義同組調度器直接組播地址 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 #虛擬路由組id自定義,同組內調度器id應相同 priority 100 #優先級 advert_int 2 #發送間隔 authentication { auth_type PASS auth_pass centos #認證密碼 } virtual_ipaddress { 172.18.43.77/24 #vip } track_interface { #當eth0出現故障時,eth1接替eth0工做 eth0 eth1 } } |
5.3 配置6m2
修改同組內另外一臺調度器配置,不一樣的配置項:
router_id 6m2
state BACKUP
priority 90
5.4 測試
兩臺主機啓動服務,抓包觀察雙方組播通訊過程:
可看到6m1主機一直髮送本身的優先級,宣稱本身的MASTER地位。6m2優先級小於100實力沒人家強大,迫於淫威因此不發送信息。
將6m1服務中止,繼續觀察:
首先6m1發送prio=0表示本身放棄MASTER的地位,此時6m2優先級最高開始宣稱主權。
另開一臺主機ping 172.18.43.77可發現只有兩臺調度器同時服務停掉的狀況下才會出現不通的情況,從側面表現出了高可用的特性。
5.5 腳本方式實現通知功能
兩臺服務器自定義通知腳本,並加執行權限:
修改配置文件:
在虛擬路由器配置實例中添加如圖三條配置
測試:
將6m1中止服務後,6m2會收到本身接任master的郵件
6. 實現負載分攤(雙主)配置
實驗目的:路由器的一個接口上建立多個虛擬路由器,使得一個實體路由器在一個虛擬路由器中做爲master路由器,同時在其餘的虛擬路由器中做爲backup路由器。多臺路由器應對不一樣業務分飾兩角,同時承擔業務實現負載均衡。
6.1 修改6m1配置文件
在實例1下新增實例2
6.2 修改6m2配置文件
新增實例2與6m1相比修改內容以下:
state MASTER
priority 100
7. keepalived 結合Ipvs
7.1keepalived.conf中關於IPVS配置段結構:
virtual_server IP port | virtual_server fwmark int { ... real_server { ... } ... } |
7.2 經常使用配置參數
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>:#全部RS故障時,備用服務器地址 real_server <IPADDR> <PORT> { weight <INT> RS權重 notify_up <STRING>|<QUOTED-STRING> RS上線通知腳本 notify_down <STRING>|<QUOTED-STRING> RS下線通知腳本 HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ... }:#定義當前主機的健康狀態檢測方法 } |
7.3 KeepAlived應用層配置檢測
HTTP_GET|SSL_GET { url { path <URL_PATH>: #定義要監控的URL status_code <INT>: #判斷上述檢測機制爲健康狀態的響應碼 digest <STRING>: #判斷爲健康狀態的響應的內容的校驗碼 } connect_timeout <INTEGER>:#鏈接請求的超時時長 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>: #發出健康狀態檢測請求時使用的源端口 |
7.4 實驗:實現keepalive結合DR模型ipvs高可用調度
實驗拓撲:
① 後端真實服務器分別安裝http,配置DR模型腳本
腳本以下:
#!/bin/bash # vip=172.18.43.77 mask='255.255.255.255' dev=lo:1 rpm -q httpd &> /dev/null || yum -y install httpd &>/dev/null service httpd start &> /dev/null && echo "The httpd Server is Ready!" echo "<h1>`hostname`</h1>" > /var/www/html/index.html case $1 in start) echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce ifconfig $dev $vip netmask $mask broadcast $vip up route add -host $vip dev $dev echo "The RS Server is Ready!" ;; stop) ifconfig $dev down echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce echo "The RS Server is Canceled!" ;; *) echo "Usage: $(basename $0) start|stop" exit 1 ;; esac |
分別執行腳本:
② 分別配置keepalived
vim /etc/keepalived/keepalived.conf
virtual_server 172.18.43.77 80 { delay_loop 6 lb_algo wrr lb_kind DR protocol TCP real_server 172.18.43.71 80 { weight 1 HTTP_GET { url { path /index.html status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 172.18.43.72 80 { weight 1 HTTP_GET { url { path /index.html status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } } |
③ 前端分別安裝ipvsadm,重載keepalived,查看ipvs策略:
④ 測試
8. keepalived調用腳本進行資源監控
8.1 功能實現:
① keepalived調用外部的輔助腳本進行資源監控,並根據監控的結果狀態能實現優先動態調整
② vrrp_script:自定義資源監控腳本, vrrp實例根據腳本返回值(返回非0值執行下面腳本內容),公共定義,可被多個實例調用,定義在vrrp實例以外
③ track_script:調用vrrp_script定義的腳本去監控資源,定義在實例以內,調用事先定義的vrrp_script
8.2 配置示例:
分兩步: (1) 先定義一個腳本; (2) 實例中調用此腳本
vrrp_script <SCRIPT_NAME> { script "" interval INT weight -INT } track_script { SCRIPT_NAME_1 SCRIPT_NAME_2 } |
8.3 實驗:
(1) 先定義一個腳本
見附件:定義腳本
(2) 實例中調用此腳本
見附件:調用腳本
9.keepalived同步組
使用場景:LVS NAT模型VIP和DIP須要同步,須要同步組
示例:
見附件:同步組