前言
在之前的學習中,學習了通過LVS構建4層負載均衡集群和通過Nginx的反向代理構建7層負載均衡磁滚,了解到負載均衡是由調(diào)度服務基于調(diào)度算法把請求平攤到后端的服務器中谆甜,可見,調(diào)度器的作用可是相當重要的就漾,當一個負載均衡集群中,調(diào)度器發(fā)生故障不能提供服務時念搬,整個集群將會失效,所以需要對調(diào)度器做高可用摆出,保證當調(diào)度器出現(xiàn)故障時朗徊,由其他服務器負責調(diào)度任務。其中高可用實現(xiàn)方案中偎漫,可以使用VRRP協(xié)議來實現(xiàn)冗余達到高可用目的爷恳。
VRRP協(xié)議
VRRP協(xié)議是為消除在靜態(tài)缺省路由環(huán)境下的缺省路由器單點故障引起的網(wǎng)絡失效而設計的主備模式的協(xié)議,使得在發(fā)生故障而進行設備功能切換時可以不影響內(nèi)外數(shù)據(jù)通信象踊,不需要再修改內(nèi)部網(wǎng)絡的網(wǎng)絡參數(shù)温亲。VRRP協(xié)議需要具有IP地址備份棚壁,優(yōu)先路由選擇,減少不必要的路由器間通信等功能栈虚。
VRRP的幾個術語
- 虛擬路由器:
由一個Master路由器和多個Backup路由器組成袖外。主機將虛擬路由器當作默認網(wǎng)關。
- 虛擬路由器標識 VRID
虛擬路由器的標識魂务。由相同VRID的一組路由器構成一個虛擬路由器曼验。 - Master路由器:
虛擬路由器中承擔報文轉(zhuǎn)發(fā)任務的路由器。
- Backup路由器:
Master路由器出現(xiàn)故障時粘姜,能夠代替Master路由器工作的路由器鬓照。
- 虛擬IP地址:
虛擬路由器的IP地址。一個虛擬路由器可以擁有一個或多個IP地址孤紧。
- 優(yōu)先級:
VRRP根據(jù)優(yōu)先級來確定虛擬路由器中每臺路由器的地位豺裆。
- 虛擬MAC地址:
一個虛擬路由器擁有一個虛擬MAC地址。虛擬MAC地址的格式為00-00-5E-00-01-{VRID}号显。通常情況下臭猜,虛擬路由器回應ARP請求使用的是虛擬MAC地址,只有虛擬路由器做特殊配置的時候咙轩,才回應接口的真實MAC地址获讳。
VRRP的基礎
在VRRP虛擬結構中,虛擬路由器是通過"MAC+VRID"的形式來標識的活喊,如"00-00-5E-00-01-{VRID}"丐膝。在VRRP同一虛擬路由,MASTER和BACKUP路由器的VRID是一致的
VRRP結構中路由器之間的通信是通過IP多播的方式實現(xiàn)的(也可以配置為其它通信方式)钾菊。要想保持自己一直時MASTER身份帅矗, 則在間隔時間往多播地址發(fā)送VRRP狀態(tài)消息,可以理解為心跳包煞烫,告訴BACKUP自己還或者浑此,當BACKUP路由器收不到MASTER的心跳包時,則認為MASTER宕機滞详,會重新選舉一個MASTER凛俱。
keepalived
簡介
Keepalived在設計之初就是LVS的一個輔助工具,因此它和LVS的兼容性非常好料饥,能對后端的RS作健康檢查蒲犬,當后端的RS宕機,能在該RS從集群中剔除岸啡。也能高可用IPVS服務原叮。Keepalived基于vrrp協(xié)議完成地址流動,能為當前虛擬路由地址所在的節(jié)點生成ipvs規(guī)則,還能基于腳本調(diào)用接口通過執(zhí)行腳本完成腳本中定義的功能奋隶。
keepalived架構
架構圖:
組件說明:
checkers:用于檢查后端RS的健康狀態(tài)擂送,并且也能管理后端RS,該組件使用獨立的子進程負責唯欣,由父進程管理嘹吨。
VRRPstack:基于VRRP協(xié)議實現(xiàn)高可用的組件,它能夠提供故障轉(zhuǎn)移功能黍聂,并且能單獨使用躺苦,即不對后端做健康檢查,運行為一個獨立的子進程由父進程管理
System Call:提供讀取自定義腳本的功能
IPVS wrapper:能夠讀取配置文件的規(guī)則产还,通過系統(tǒng)調(diào)用直接管理ipvs
Netlink Reflector:用于管理和檢查VIP地址
Watch Dog:用于檢查Checkers和VRRPstack進程
安裝Keepalived
在base倉庫已經(jīng)包含了Keepalived程序包匹厘,直接安裝即可。
[root@nginx_proxy ~]# yum install keepalived -y
[root@nginx_proxy ~]# rpm -ql keepalived
/etc/keepalived
/etc/keepalived/keepalived.conf #keepalived的配置文件
/etc/sysconfig/keepalived #一些keepalived的選項參數(shù)設置脐区,例如對日志的記錄選項
/usr/bin/genhash #keepalive能對TCP的返回內(nèi)容做哈希檢查愈诚,這個程序是計算哈希的
/usr/lib/systemd/system/keepalived.service #unit file
/usr/libexec/keepalived
/usr/sbin/keepalived #keepalived的程序
修改keepalived的輸出日志文件
keepalived的日志默認輸出到/var/log/messages,可以設置輸出為一個單獨文件牛隅。
首先對/etc/sysconfig/keepalived這個文件的選項作修改
KEEPALIVED_OPTIONS="-D -S 0" #-D -S 0 即把詳細的日志信息記錄到本地syslog local 0 這個設備上面
然后修改rsyslog的配置文件/etc/rsyslog.conf炕柔,添加該設備記錄日志的級別和路徑。
添加local 0 設置的日志路徑
#keepalive log messages
local0.* /var/log/keepalived.log
重啟rsyslog
[root@nginx_proxy ~]# systemctl restart rsyslog
Keepalived的配置文件詳解
Keepalived的配置文件分為3部分:
全局配置媒佣,配置對全局都生效
VRRP部分匕累,即高可用部分,vrrp部分的配置文件主要影響VRRP STACK組件
配置詳解:
global_defs { #全局部分基本都是定義郵件報警設置
notification_email { #定義報警郵件的收件箱
acassen@firewall.loc #收件人地址
}
notification_email_from Alexandre.Cassen@firewall.loc #報警郵件的發(fā)件人
smtp_server 192.168.200.1 #Smtp的服務器
smtp_connect_timeout 30 #連接超時時間
router_id LVS_DEVEL #標識keepalived服務器的字符串默伍,實現(xiàn)高可用時需要使用它標識節(jié)點
vrrp_strict #執(zhí)行嚴格的VRRP協(xié)議遵從性
vrrp_mcast_group4 224.0.0.18 # 設置ipv4的組播地址
}
#定義vrrp虛擬路由器(實例)欢嘿。一個配置文件中可以實現(xiàn)多實例。
vrrp_instance <STRING> {
....
}
專用參數(shù):
state MASTER|BACKUP #義實例的角色狀態(tài)是master還是backup
interface IFACE_NAME #綁定的網(wǎng)卡接口也糊,即用于發(fā)送接受VRRP協(xié)議的接口
virtual_router_id VRID #同組實例中VRID必須一樣炼蹦,取值范圍0-255
priority 100 #表示當前主機在此實例中的優(yōu)先級,范圍1-254狸剃;
advert_int 1 #VRRP協(xié)議報文的通告間隔
authentication { #定義vrrp的認證掐隐,防止濫竽充數(shù)
auth_type AH|PASS #簡單的PASS認證
auth_pass <PASSWORD> #不超過8位,超過8位則取前8位
}
virtual_ipaddress { #定義流動IP钞馁,綁定在網(wǎng)卡上
<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 { #配置要監(jiān)控的網(wǎng)絡接口虑省,一旦接口出現(xiàn)故障,則轉(zhuǎn)為FAULT狀態(tài)僧凰;
eth0
eth1
...
}
nopreempt #定義主機處在非搶占模式下
preempt_delay 300 #搶占式模式下探颈,節(jié)點上線后觸發(fā)新選舉操作的延遲時長;
定義通知腳本:
notify_master <STRING>|<QUOTED-STRING> #當前節(jié)點轉(zhuǎn)為master時觸發(fā)的腳本
notify_backup <STRING>|<QUOTED-STRING> #當此節(jié)點轉(zhuǎn)為backup時觸發(fā)的腳本
notify_fault <STRING>|<QUOTED-STRING> #當前節(jié)點轉(zhuǎn)為“失敗”狀態(tài)時觸發(fā)的腳本允悦;
notify <STRING>|<QUOTED-STRING> #通用格式的通知觸發(fā)機制,一個腳本可完成以上三種狀態(tài)的轉(zhuǎn)換時的通知;
-------分割線隙弛,上面是定義VRRP的高可用架馋,實現(xiàn)地址流動,下面是定義ipvs負載規(guī)則-------
#LVS 虛擬服務的定義
虛擬服務器:
配置參數(shù):
virtual_server IP port 或者
virtual_server fwmark int
{
...
real_server {
...
}
...
}
常用參數(shù):
delay_loop <INT> #對后端健康檢查的間隔全闷;
lb_algo rr|wrr|lc|wlc|lblc|sh|dh #調(diào)度算法
lb_kind NAT|DR|TUN #集群的類型叉寂;
persistence_timeout <INT> #持久連接的時長
protocol TCP #服務類型,只支持TCP
sorry_server <IPADDR> <PORT> #當所有的后端都宕機時总珠,由哪臺服務器繼續(xù)提供服務
real_server <IPADDR> <PORT> #定義后端Real server
{
weight <INT> #權重
notify_up <STRING>|<QUOTED-STRING> #當出現(xiàn)匹配字符串時屏鳍,就認為服務是up的
notify_down <STRING>|<QUOTED-STRING> #當出現(xiàn)匹配字符串時,就認為服務是down的
HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ... } #定義當前主機的健康狀態(tài)檢測方法局服;
}
HTTP_GET|SSL_GET { #定義應用層檢測
url {
path <URL_PATH> #定義要監(jiān)控的URL
status_code <INT> #定義以什么狀態(tài)碼作為正常钓瞭。
digest <STRING> #判斷上述檢測機制為健康狀態(tài)的響應的內(nèi)容的校驗碼;
}
nb_get_retry <INT> #重試次數(shù)淫奔;
delay_before_retry <INT> #在重試前山涡,等待多長時間
connect_ip <IP ADDRESS> #連接RS的哪個IP
connect_port <PORT> #連接RS的哪個端口
bindto <IP ADDRESS> #使用哪個地址作為源IP
bind_port <PORT> #使用哪個端口作為源端口
connect_timeout <INTEGER> #連接請求的超時時長;
}
TCP_CHECK {
connect_ip <IP ADDRESS> #向當前RS的哪個IP地址發(fā)起健康狀態(tài)檢測請求
connect_port <PORT> #向當前RS的哪個PORT發(fā)起健康狀態(tài)檢測請求
bindto <IP ADDRESS> #發(fā)出健康狀態(tài)檢測請求時使用的源地址唆迁;
bind_port <PORT> #發(fā)出健康狀態(tài)檢測請求時使用的源端口鸭丛;
connect_timeout <INTEGER> #連接請求的超時時長;
}