簡介:
vrrp, virtual routing redundant protocol, 虛擬路由協議, 是為了解決局域網中配置靜態網關出現單點失敗現象的路由協議; 設計目標時是支持特定情況下IP數據流量失敗轉移不會引起混亂, 允許主機使用單路由器, 以及及時在實際第一跳路由器使用失敗的情形下, 仍然能夠維護路由器間的連通性. keepalived的是vrrp協議的軟件實現; 作用是檢測服務器的狀態, 如果有一臺web服務器死機, 或工作出現故障, keepalived將檢測到, 并將有故障的服務器從系統中剔除, 同時使用其他服務器代替該服務器的工作, 當服務器工作正常后keepalived自動將服務器加入到服務器集群中, 這些工作全都自動完成, 不需要人工干涉, 需要人工做的只是修復故障的服務器.
keepalived的安裝前提:
(1) 各節點時間必須同步;
(2) 確保iptables及selinux不會成為阻礙;
(3) 各節點之間可通過主機名互相通信(對KA并非必須);
建議使用/etc/hosts文件實現;
(4) 各節點之間的root用戶可以基于密鑰認證的ssh服務完成互相通信;
keepalived的安裝配置
程序環境:
配置文件:/etc/keepalived/keepalived.conf
主程序:/usr/sbin/keepalived
Unit File:keepalived.service
配置文件組件部分:
TOP HIERACHY GLOBAL CONFIGURATION Global definitions Static routes/addresses VRRPD CONFIGURATION VRRP synchronization group(s) VRRP instance(s) LVS CONFIGURATION Virtual server group(s) Virtual server(s)
配置語法
1. 配置虛擬路由器
vrrp_instance <STRING> { .... }
專用參數:
state MASTER|BACKUP #當前節點在此虛擬路由器上的初始狀態;只能有一個是MASTER,余下的都應該為BACKUP; interface IFACE_NAME #綁定為當前虛擬路由器使用的物理接口; virtual_router_id VRID #當前虛擬路由器的惟一標識,范圍是0-255; priority 100 #當前主機在此虛擬路徑器中的優先級;范圍1-254; advert_int 1 #vrrp通告的時間間隔; authentication { auth_type AH|PASS auth_pass <PASSWORD> } virtual_ipaddress { <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL> 192.168.200.17/24 dev eth1 192.168.200.18/24 dev eth2 label eth2:1 } track_interface { eth0 eth1 ... } #配置要監控的網絡接口,一旦接口出現故障,則轉為FAULT狀態; nopreempt #定義工作模式為非搶占模式; preempt_delay 300 #搶占式模式下,節點上線后觸發新選舉操作的延遲時長; #定義通知腳本 notify_master <STRING>|<QUOTED-STRING> #當前節點成為主節點時觸發的腳本; notify_backup <STRING>|<QUOTED-STRING> #當前節點轉為備節點時觸發的腳本; notify_fault <STRING>|<QUOTED-STRING> #當前節點轉為“失敗”狀態時觸發的腳本; notify <STRING>|<QUOTED-STRING> #通用格式的通知觸發機制,一個腳本可完成以上三種狀態的轉換時的通知
2. 虛擬服務器
配置參數
virtual_server IP port | virtual_server fwmark int { ... real_server { ... } ... }
常用參數
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> #備用服務器地址 real_server <IPADDR> <PORT> { weight <INT> 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 <URL_PATH> #定義要監控的URL status_code <INT> #判斷上述檢測機制為健康狀態的響應碼 digest <STRING> #判斷上述檢測機制為健康狀態的響應的內容的校驗碼 } 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> #發出健康狀態檢測請求時使用的源端口 connect_timeout <INTEGER> #連接請求的超時時長 } TCP_CHECK { connect_ip <IP ADDRESS> #向當前RS的哪個IP地址發起健康狀態檢測請求 connect_port <PORT> #向當前RS的哪個PORT發起健康狀態檢測請求 bindto <IP ADDRESS> #發出健康狀態檢測請求時使用的源地址 bind_port <PORT> #發出健康狀態檢測請求時使用的源端口 connect_timeout <INTEGER> #連接請求的超時時長 }
配置示例
示例一: 單主模型
前提:
1. 在兩臺server上添加/etc/hosts解析文件
2. 建立ssh的連接
步驟:
在node1上生成自己的公鑰
ssh-keygen -t rsa -P ''
將自己的公鑰拷貝給node2
ssh-copy-id -i .ssh/id_rsa.pub root@node2
同樣的在node2上建立與node1的連接
4. 確定ssh通信是否成功, 同時確定時間是否完全同步
date && ssh node2 'date'
若不能同步, 使用ntpdate TIME_SERVER_IP同步
直到時間完全同步為止
配置文件
global_defs { notification_email { root@localhost } notification_email_from keepalived@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id node1 vrrp_mcast_group4 224.0.100.19 #需要打開多播, # ip link set dev eno16777736 multicast on } vrrp_instance VI_1 { state MASTER interface eno16777736 virtual_router_id 15 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 12345678 } virtual_ipaddress { 10.1.52.123/24 dev 16777736 } }
配置完之后, 實驗, 當兩個同時啟動, IP地址主節點上, 當主節點的服務停止后, 備用節點將IP地址拿到; 當主節點的服務啟動后, 又把IP地址搶回來.
示例二: 雙主模型
global_defs { notification_email { root@localhost } notification_email_from keepalived@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_mcast_group4 224.0.52.19 } vrrp_instance VI_1 { state MASTER interface eno16777736 virtual_router_id 167 #兩個虛擬路由ID要不同 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 536ecfc2 } virtual_ipaddress { 10.1.52.234/16 dev eno16777736 } } vrrp_instance VI_2 { state BACKUP interface eno16777736 virtual_router_id 168 #與上邊的虛擬路由要不同 priority 98 advert_int 1 authentication { auth_type PASS auth_pass b823e7f0 } virtual_ipaddress { 10.1.52.235/16 dev eno16777736 } }
首先啟動第一個節點, 能夠拿到兩個IP, 當第二節點也啟動后, 將備用IP搶奪過去; 第一個節點服務停止后, 第二個節點能夠將另外一個IP地址也拿到;
示例三: 基于lvs-dr模型的keepalived單主實踐
規劃:
10.1.52.2和10.1.52.3當做RS主機, 安裝httpd, 搭建lvs-dr.
10.1.52.11和10.1.51.22提供負載均衡
RS配置腳本
#!/bin/bash # vip='10.1.52.123' vport='80' netmask='255.255.255.255' iface='lo:0' 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 $iface $vip netmask $netmask broadcast $vip up route add -host $vip dev $iface ;; stop) ifconfig $iface 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 esac
提供負載均衡主機的keepalived配置文件
global_defs { notification_email { root@localhost } notification_email_from keepalived@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_mcast_group4 224.0.52.19 } vrrp_instance VI_1 { state MASTER interface eno16777736 virtual_router_id 167 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 536ecfc2 } virtual_ipaddress { 10.1.52.123/16 dev eno16777736 } } virtual_server 10.1.52.123 80 { delay_loop 3 virtual_server 10.1.52.123 80 { delay_loop 3 lb_algo rr lb_kind DR protocol TCP real_server 10.1.52.2 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 1 nb_get_retry 3 delay_before_retry 1 } } real_server 10.1.52.3 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 1 nb_get_retry 3 delay_before_retry 1 } } }
示例四: 基于lvs-dr模型的雙主實踐
規劃:
10.1.52.2和10.1.52.3當做RS主機, 安裝httpd, 搭建lvs-dr.
10.1.52.11和10.1.51.22提供負載均衡
RS配置腳本
#!/bin/bash # vip_1='10.1.52.123' vip_2='10.1.52.124' vport='80' netmask='255.255.255.255' iface_1='lo:0' iface_2='lo:1' 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 ${iface_1} ${vip_1} netmask $netmask broadcast ${vip_1} up route add -host ${vip_1} dev ${iface_1} ifconfig ${iface_2} ${vip_2} netmask $netmask broadcast ${vip_2} up route add -host ${vip_2} dev ${iface_2} ;; stop) ifconfig $iface_1 down ifconfig $iface_2 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 esac
其中一臺keepalived服務的配置示例
global_defs { notification_email { root@localhost } notification_email_from keepalived@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_mcast_group4 224.0.52.19 } vrrp_instance VI_1 { state MASTER interface eno16777736 virtual_router_id 167 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 536ecfc2 } virtual_ipaddress { 10.1.52.123/16 dev eno16777736 } } virtual_server 10.1.52.123 80 { delay_loop 3 lb_algo rr lb_kind DR protocol TCP real_server 10.1.52.2 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 1 nb_get_retry 3 delay_before_retry 1 } } real_server 10.1.52.3 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 1 nb_get_retry 3 delay_before_retry 1 } } } vrrp_instance VI_2 { state BACKUP interface eno16777736 virtual_router_id 163 priority 98 advert_int 1 authentication { auth_type PASS auth_pass 536ecfc2 } virtual_ipaddress { 10.1.52.124/16 dev eno16777736 } } virtual_server 10.1.52.124 80 { delay_loop 3 lb_algo rr lb_kind DR protocol TCP real_server 10.1.52.2 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 1 nb_get_retry 3 delay_before_retry 1 } } real_server 10.1.52.3 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 1 nb_get_retry 3 delay_before_retry 1 } } }
原創文章,作者:black_fish,如若轉載,請注明出處:http://www.www58058.com/56582