官網(wǎng):http://www.keepalived.org/

core:是keepalived的核心,復(fù)雜主進(jìn)程的啟動(dòng)和維護(hù),全局配置文件的加載解析等
check:負(fù)責(zé)healthchecker(健康檢查),包括了各種健康檢查方式,以及對(duì)應(yīng)的配置的解析包括LVS的配置解析
vrrp:VRRPD子進(jìn)程,VRRPD子進(jìn)程就是來實(shí)現(xiàn)VRRP協(xié)議的
libipfwc:iptables(ipchains)庫,配置LVS會(huì)用到
libipvs*:配置LVS會(huì)用到
注意,keepalived和LVS完全是兩碼事,只不過他們各負(fù)其責(zé)相互配合而已
keepalived啟動(dòng)后會(huì)有三個(gè)進(jìn)程
父進(jìn)程:內(nèi)存管理,子進(jìn)程管理等等
子進(jìn)程:VRRP子進(jìn)程
子進(jìn)程:healthchecker子進(jìn)程
兩個(gè)子進(jìn)程都被系統(tǒng)WatchDog看管,兩個(gè)子進(jìn)程各自復(fù)雜自己的事,healthchecker子進(jìn)程復(fù)雜檢查各自服務(wù)器的健康程度,例如HTTP,LVS等等,如果healthchecker子進(jìn)程檢查到MASTER上服務(wù)不可用了,就會(huì)通知本機(jī)上的兄弟VRRP子進(jìn)程,讓他刪除通告,并且去掉虛擬IP,轉(zhuǎn)換為BACKUP狀態(tài)
工作原理以下內(nèi)容來自網(wǎng)絡(luò)
keepalived工作在 Layer3,4,7;工作在TCP/IP協(xié)議棧的IP層,TCP層,及應(yīng)用層,原理分別如下:
Layer3:Keepalived使用Layer3的方式工作式時(shí),Keepalived會(huì)定期向服務(wù)器群中的服務(wù)器發(fā)送一個(gè)ICMP的數(shù)據(jù)包(既我們平時(shí)用的Ping程序),如果發(fā)現(xiàn)某臺(tái)服務(wù)的IP地址沒有激活,Keepalived便報(bào)告這臺(tái)服務(wù)器失效,并將它從服務(wù)器群中剔除,這種情況的典型例子是某臺(tái)服務(wù)器被非法關(guān)機(jī)。Layer3的方式是以服務(wù)器的IP地址是否有效作為服務(wù)器工作正常與否的標(biāo)準(zhǔn)。
Layer4:如果您理解了Layer3的方式,Layer4就容易了。Layer4主要以TCP端口的狀態(tài)來決定服務(wù)器工作正常與否。如web server的服務(wù)端口一般是80,如果Keepalived檢測(cè)到80端口沒有啟動(dòng),則Keepalived將把這臺(tái)服務(wù)器從服務(wù)器群中剔除。
Layer7:Layer7就是工作在具體的應(yīng)用層了,比Layer3,Layer4要復(fù)雜一點(diǎn),在網(wǎng)絡(luò)上占用的帶寬也要大一些。Keepalived將根據(jù)用戶的設(shè)定檢查服務(wù)器程序的運(yùn)行是否正常,如果與用戶的設(shè)定不相符,則Keepalived將把服務(wù)器從服務(wù)器群中剔除。
環(huán)境- os: centos 6.4 x86_64
- keepalived version: 1.2.7-3
centos 6.4之后官方的yum里已經(jīng)提供了keepalived的RPM包,所以直接yum安裝即可
yum install -y keepalived
cd /etc/keepalived/
cp keepalived.conf keepalived.conf.bak
主要包括三部分:
花括號(hào)“{}”。用來分隔定義塊,因此必須成對(duì)出現(xiàn)。如果寫漏了,keepalived運(yùn)行時(shí),不會(huì)得到預(yù)期的結(jié)果。由于定義塊內(nèi)存在嵌套關(guān)系,因此很容易遺漏結(jié)尾處的花括號(hào),這點(diǎn)要特別注意。
- 全局定義塊global_defs {
notification_email { #指定keepalived在發(fā)生切換時(shí)需要發(fā)送email到的對(duì)象,一行一個(gè),建議不用,用其他監(jiān)控方案代替
liutiansi@gmail.com
}
notification_email_from Alexandre.Cassen@firewall.loc #指定發(fā)件人
smtp_server 127.0.0.1 #指定smtp服務(wù)器地址
smtp_connect_timeout 3 #指定smtp連接超時(shí)時(shí)間
router_id LVS_DEVEL #運(yùn)行keepalived機(jī)器的一個(gè)標(biāo)識(shí),在一個(gè)網(wǎng)絡(luò)內(nèi),它應(yīng)該是唯一的
}
#監(jiān)控haproxy 進(jìn)程
vrrp_script chk_haproxy { # Requires keepalived-1.1.13
script "killall -0 haproxy" # widely used idiom
interval 2 # check every 2 seconds
weight 2 # add 2 points of prio if OK weight -2 #經(jīng)測(cè)試keepalived 1.17版本加這個(gè)配置不能切換,最新版本1.21加上這個(gè)則可以
}
vrrp_sync_group VG_1{ #監(jiān)控多個(gè)網(wǎng)段的實(shí)例group,每個(gè)實(shí)例group必須包含一個(gè)vrrp實(shí)例
group {
inside_network #實(shí)例名,確定失敗切換(FailOver)包含的路由實(shí)例個(gè)數(shù)。即在有2個(gè)負(fù)載均衡器的場(chǎng)景,
#一旦某個(gè)負(fù)載均衡器失效,需要自動(dòng) 切換到另外一個(gè)負(fù)載均衡器的實(shí)例是哪些
outside_network
}
notify_master /path/xx.sh #指定當(dāng)切換到master時(shí),執(zhí)行的腳本
netify_backup /path/xx.sh #指定當(dāng)切換到backup時(shí),執(zhí)行的腳本
notify_fault "path/xx.sh VG_1" #故障時(shí)執(zhí)行的腳本
notify /path/xx.sh
smtp_alert #使用global_defs中提供的郵件地址和smtp服務(wù)器發(fā)送郵件通知
}
#Vrrp實(shí)例vrrp_instance.實(shí)例名出自實(shí)例組group所包含的那些名字
vrrp_instance inside_network {
state BACKUP #實(shí)例狀態(tài)state.只有MASTER和BACKUP兩種狀態(tài),并且需要大寫這些單詞。其中MASTER為工作狀態(tài),BACKUP為備用狀態(tài)。
#當(dāng)MASTER所在的服務(wù)器失效時(shí),BACKUP所在的系統(tǒng)會(huì)自動(dòng)把它的狀態(tài)有BACKUP變換成MASTER;
#當(dāng)失效的MASTER所在的系統(tǒng)恢復(fù)時(shí),BACKUP從MASTER恢復(fù)到BACKUP狀態(tài)。
#主備的靠priority決定
#nopreempt #設(shè)置為不搶占 注:這個(gè)配置只能設(shè)置在backup主機(jī)上,而且這個(gè)主機(jī)優(yōu)先級(jí)要比另外一臺(tái)高
interface eth0 #設(shè)置實(shí)例綁定的網(wǎng)卡,即VIP所在的網(wǎng)卡,因?yàn)樵谂渲锰摂MIP的時(shí)候必須是在已有的網(wǎng)卡上添加的
dont_track_primary #忽略vrrp的interface錯(cuò)誤(默認(rèn)不設(shè)置)
track_interface{ #設(shè)置額外的監(jiān)控,里面那個(gè)網(wǎng)卡出現(xiàn)問題都會(huì)切換,一般都會(huì)對(duì)內(nèi)外網(wǎng)卡同時(shí)進(jìn)行監(jiān)控
eth0
eth1
}
mcast_src_ip #發(fā)送多播包的地址,如果不設(shè)置默認(rèn)使用綁定網(wǎng)卡的primary ip
garp_master_delay #在切換到master狀態(tài)后,延遲進(jìn)行g(shù)ratuitous ARP請(qǐng)求
virtual_router_id 50 #虛擬路由標(biāo)識(shí) ,可通過 #tcpdump vrrp 查看.這個(gè)標(biāo)識(shí)是一個(gè)數(shù)字,并且同一個(gè)vrrp實(shí)例使用唯一的標(biāo)識(shí)。
#即同一個(gè)vrrp_instance,MASTER和BACKUP的virtual_router_id是一致的,同時(shí)在整個(gè)vrrp內(nèi)是唯一的。
priority 99 #優(yōu)先級(jí):這是一個(gè)數(shù)字,數(shù)值愈大,優(yōu)先級(jí)越高。在同一個(gè)vrrp_instance里,MASTER的優(yōu)先級(jí)高于BACKUP
advert_int 1 #同步通知間隔:MASTER與BACKUP負(fù)載均衡器之間同步檢查的時(shí)間間隔,單位為秒。
preempt_delay #搶占延時(shí),默認(rèn)5分鐘,通過這種方式防止意外的切換導(dǎo)致角色的切換
debug #開啟debug,默認(rèn)可以不開啟
authentication { #設(shè)置認(rèn)證
auth_type PASS #類型主要有PASS、AH兩種,通常使用的類型為PASS
auth_pass 111111 #驗(yàn)證密碼為明文,同一vrrp實(shí)例MASTER與BACKUP 使用相同的密碼才能正常通信。
}
virtual_ipaddress { #虛擬IP,即VIP,可以有多個(gè)地址,每個(gè)地址占一行,不需要指定子網(wǎng)掩碼
#注意:如果lvs+keepalived場(chǎng)景中,這個(gè)ip必須與我們?cè)趌vs客戶端設(shè)定的vip相一致
192.168.202.200
}
virtual_routes { #設(shè)置默認(rèn)路由
# 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
}
preempt delay #搶占延遲
}
virtual_server 192.168.202.200 23 { # 這個(gè)ip后面一個(gè)空格,然后加上端口號(hào)。定義一個(gè)vip,可以實(shí)現(xiàn)多個(gè)tcp端口的負(fù)載均衡功能
delay_loop 6 #健康檢查時(shí)間間隔,單位是秒
lb_algo rr #負(fù)載均衡調(diào)度算法(rr|wrr|lc|wlc|lblc|sh|dh),比較常見的是rr和nlc
lb_kind DR #負(fù)載均衡轉(zhuǎn)發(fā)規(guī)則(NAT|DR|TUN)
persistence_timeout 50 #會(huì)話保持時(shí)間,單位是s,此選項(xiàng)用來提供保持會(huì)話功能
protocol TCP #使用的協(xié)議,TCP和UDP
persistence_granularity <NETMASK> #lvs會(huì)話保持粒度
virtualhost <string> #檢查的web服務(wù)器的虛擬主機(jī)(host:頭)
sorry_server<IPADDR> <port> #備用機(jī),所有realserver失效后啟用,利用這個(gè)sorry server提供一個(gè)優(yōu)雅的維護(hù)頁面
real_server 192.168.200.5 23 { #也即服務(wù)器池。Real_server的值包括ip地址和端口號(hào)。多個(gè)連續(xù)的真實(shí)ip
weight 1 #權(quán)重值是一個(gè)數(shù)字,數(shù)值越大,權(quán)重越高。
#使用不同的權(quán)重值的目的在于為不同性能的機(jī)器分配不同的負(fù)載,性能較好的機(jī)器,負(fù)載分擔(dān)大些;
#反之,性能差的機(jī)器,則分擔(dān)較少的負(fù)載,這樣就可以合理的利用不同性能的機(jī)器資源。
inhibit_on_failure #在服務(wù)器健康檢查失效時(shí),將其設(shè)為0,而不是直接從ipvs中刪除
notify_up <string> | <quoted-string> #在檢測(cè)到server up后執(zhí)行腳本
notify_down <string> | <quoted-string> #在檢測(cè)到server down后執(zhí)行腳本
TCP_CHECK {
connect_timeout 3 #連接超時(shí)時(shí)間
nb_get_retry 3 #重連次數(shù)
delay_before_retry 3 #重連間隔時(shí)間
connect_port 23 #健康檢查的端口的端口
bindto <ip>
}
HTTP_GET | SSL_GET{
url{ #檢查url,可以指定多個(gè)
path /
digest <string> #檢查后的摘要信息
status_code 200 #檢查的返回狀態(tài)碼
}
connect_port <port>
bindto <IPADD>
connect_timeout 5
nb_get_retry 3
delay_before_retry 2
}
SMTP_CHECK{
host{
connect_ip <IP ADDRESS>
connect_port <port> #默認(rèn)檢查25端口
bindto <IP ADDRESS>
}
connect_timeout 5
retry 3
delay_before_retry 2
helo_name <string> | <quoted-string> #smtp helo請(qǐng)求命令參數(shù),可選
}
MISC_CHECK{
misc_path <string> | <quoted-string> #外部腳本路徑
misc_timeout #腳本執(zhí)行超時(shí)時(shí)間
misc_dynamic #如設(shè)置該項(xiàng),則退出狀態(tài)碼會(huì)用來動(dòng)態(tài)調(diào)整服務(wù)器的權(quán)重
#返回0 正常,不修改;返回1,檢查失敗,權(quán)重改為0;返回2-255,正常,權(quán)重設(shè)置為:返回狀態(tài)碼-2
}
}
通過RPM安裝的直接利用腳本
/etc/init.d/keepalivedstart
keepalived啟動(dòng)信息可以從日志中看到
tail-f/var/log/message
實(shí)例: 1、角色自動(dòng)切換以及事件通知角色的自動(dòng)切換,原理是在global選項(xiàng)中定義一段腳本,在vrrp_instance中進(jìn)行引用,觸發(fā)了腳本,自動(dòng)調(diào)整priority達(dá)到選舉變更角色的目的
#global選項(xiàng)中加上如下的判定條件
vrrp_script change_role {
script "[[ -e /tmp/ChangeRole ]] && exit 1 || exit 0" #這里緊緊是一條shell命令,也可以是一個(gè)腳本
interval 1
weight -5 #自動(dòng)調(diào)整優(yōu)先級(jí)-5
}
#vrrp_instance實(shí)例中引用
track_script {
change_role
}
#只要當(dāng)/tmp/ChangeRole出現(xiàn)的時(shí)候,優(yōu)先級(jí)自動(dòng)-5,小于backup,選舉的時(shí)候就會(huì)更換角色
#要監(jiān)控某項(xiàng)服務(wù)例如nginx
vrrp_script chk_nginx {
script "killall -0 nginx"
interval 1
weight -2
}
#vrrp_instance中進(jìn)行引用
track_script {
chk_maintainace chk_nginx
}
角色轉(zhuǎn)換的時(shí)候進(jìn)行通知,結(jié)合上面進(jìn)行角色更替時(shí)候發(fā)送郵件,這里仍舊不推薦,可以使用zabbix或者是nagios進(jìn)行報(bào)警
#vrrp_instance實(shí)例塊中定義
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
#發(fā)送郵件的前提是global中關(guān)于smtp的定義已經(jīng)定義好
以下為一個(gè)簡(jiǎn)易通知腳本
#!/bin/bash
VIP=172.16.1.10
contact=\'root@localhost\'
notify() {
mailsubject="`hostname` to be $1: $VIP floating"
mailbody="`date \'+%F %H:%M:%S\'`: vrrp transition, `hostname` changed to be $1"
echo $mailbody | mail -s "$mailsubject" $contact
}
case "$1" in
master)
notify master exit 0
;;
backup)
notify backup exit 0
;;
fault)
notify fault exit 0
;;
*)
echo \'Usage: `basename $0` {master | backup | fault}\'
exit 1
;;
esac
virtual_server 172.16.100.1 80 {
delay_loop 5
lb_algo rr
lb_kind NAT
nat_mask 255.255.255.0
protocol TCP
real_server 172.16.100.10 80 {
weight 1
HTTP_GET {
url {
path /
state_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 172.16.100.20 80 {
weight 1
HTTP_GET {
url {
path /
state_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
實(shí)現(xiàn)master/master雙主,原理其實(shí)就是只要定義不同的vrrp_instance來實(shí)現(xiàn)
#部分配置文件如下
vrrp_instance VI_1 {
state MASTER
interface eth1
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
172.16.1.10/24 dev eth1
}
}
vrrp_instance VI_2 {
state BACKUP
interface eth1
virtual_router_id 52
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
172.16.100.10/24 dev eth1
}
}
同樣在另一個(gè)keepalived節(jié)點(diǎn)上兩者vrrp_instance的實(shí)例角色恰好相反,這樣即可實(shí)現(xiàn)master/master模型
本文名稱:keepalived-2-配置文件詳解
轉(zhuǎn)載源于:http://www.yijiale78.com/article2/cpdgoc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、自適應(yīng)網(wǎng)站、網(wǎng)站收錄、網(wǎng)站導(dǎo)航、企業(yè)建站、網(wǎng)站維護(hù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)