===============================
高性能集群軟件-Keepalived
===============================
keepalived 介紹
keepalived 是 Linux下一個(gè)輕量級(jí)的高可用解決方案
keepalived 主要通過(guò)虛擬路由冗余(VRRP)來(lái)實(shí)現(xiàn)高可用功能
優(yōu)點(diǎn):部署及使用簡(jiǎn)單,只需一個(gè)配置文件即可完成
功能:1. 服務(wù)器狀態(tài)檢測(cè)和故障隔離功能 2. HA(High Available)cluster
keepalived 發(fā)展
keepalived起初是為L(zhǎng)VS(Linux Virtual System)設(shè)計(jì),專門(mén)監(jiān)控集群系統(tǒng)中各個(gè)服務(wù)節(jié)點(diǎn)的狀態(tài)
根據(jù)TCP/IP參考模型 第三、第四、第五層交換機(jī)制檢測(cè)每個(gè)服務(wù)節(jié)點(diǎn)的狀態(tài)
e.g: keepalived檢測(cè)WEB服務(wù)器的狀態(tài)
如果一臺(tái)WEB服務(wù)器死機(jī)/工作出現(xiàn)故障,keepalived檢測(cè)到此狀況后會(huì)將故障服務(wù)器從系統(tǒng)中剔除,
直至該服務(wù)器工作正常后keepalived自動(dòng)將該服務(wù)器加入到服務(wù)器群中.
以上工作keepalived自動(dòng)完成,無(wú)需人工干涉,人工干預(yù)僅是修復(fù)出現(xiàn)故障的服務(wù)節(jié)點(diǎn)
keepalived 后續(xù)加入了VRRP功能
VRRP(Virtaul Router Redunadancy Protocol,虛擬路由器冗余協(xié)議)
目的:解決靜態(tài)路由出現(xiàn)的單點(diǎn)故障問(wèn)題,實(shí)現(xiàn)網(wǎng)絡(luò)不間斷穩(wěn)定運(yùn)行
VRRP 協(xié)議與工作原理
引入VRRP概念

說(shuō)明:圖片來(lái)源百度百科;左側(cè)圖片為局域網(wǎng)組網(wǎng);右側(cè)圖片為VRRP組網(wǎng)
局域網(wǎng)組網(wǎng) e.g:
網(wǎng)絡(luò)內(nèi)的所有主機(jī)會(huì)設(shè)置一條默認(rèn)網(wǎng)關(guān)(10.100.10.1),當(dāng)主機(jī)發(fā)出的目的地址不在本網(wǎng)段(10.100.10.0/24)的報(bào)文,通過(guò)默認(rèn)網(wǎng)關(guān)發(fā)往路由器A,從而實(shí)現(xiàn)主機(jī)與外部網(wǎng)絡(luò)的通信
該組網(wǎng)缺點(diǎn):當(dāng)路由器A壞掉時(shí),本網(wǎng)段內(nèi)通過(guò)以RA為默認(rèn)網(wǎng)關(guān)下一跳的主機(jī)將斷掉與外界的通信,產(chǎn)生單點(diǎn)故障
VRRP組網(wǎng) e.g:
RA:Master 活動(dòng)路由器 10.100.10.2
RB:Backup 備份路由器 10.100.10.3
VRIP : 虛擬路由器IP 10.100.10.1
VRRP將局域網(wǎng)中的一組路由器【 RA和RB】組成一個(gè)虛擬路由器------>>>備份組
虛擬路由器擁有自己的IP地址 10.100.10.1
局域網(wǎng)內(nèi)的主機(jī)僅知道虛擬路由器IP地址為10.100.10.1,不知道具體的Master與Backup路由器IP
局域網(wǎng)內(nèi)的主機(jī)將默認(rèn)網(wǎng)關(guān)下一跳的地址設(shè)置為該虛擬路由器IP地址,通過(guò)該地址與其他網(wǎng)絡(luò)進(jìn)行通信
該組網(wǎng)優(yōu)點(diǎn):當(dāng)備份組內(nèi)的Master路由器DOWN掉,會(huì)進(jìn)行選舉策略選出一個(gè)新的Master路由器,繼續(xù)往網(wǎng)絡(luò)內(nèi)的主機(jī)提供路由服務(wù),從而實(shí)現(xiàn)網(wǎng)絡(luò)內(nèi)的主機(jī)不間斷地與外部網(wǎng)絡(luò)進(jìn)行通信
VRRP 協(xié)議
VRRP:解決局域網(wǎng)中配置靜態(tài)網(wǎng)關(guān)出現(xiàn)單點(diǎn)失效的路由協(xié)議
設(shè)計(jì)目標(biāo):網(wǎng)絡(luò)發(fā)生故障時(shí)透明地進(jìn)行設(shè)備切換而不影響主機(jī)間的數(shù)據(jù)通信
VRRP 工作原理
VRRP協(xié)議將兩臺(tái)或多臺(tái)路由器設(shè)備虛擬成一個(gè)虛擬路由器,對(duì)外提供虛擬路由器IP(一個(gè)或多個(gè))
而在路由器組內(nèi)部,如果實(shí)際擁有這個(gè)對(duì)外IP的路由器如果工作正常的話就是MASTER, 或者是通 過(guò)算法選舉產(chǎn)生
MASTER實(shí)現(xiàn)針對(duì)虛擬路由器IP的各種網(wǎng)絡(luò)功能,如ARP請(qǐng)求,ICMP,以及數(shù)據(jù)的轉(zhuǎn)發(fā)等
其他設(shè)備不擁有該IP,狀態(tài)是BACKUP,除了接收MASTER的VRRP狀態(tài)通告信息外,不執(zhí)行對(duì)外 的網(wǎng)絡(luò)功能
當(dāng)主機(jī)失效時(shí),BACKUP將接管原先MASTER的網(wǎng)絡(luò)功能
如何判定多個(gè)路由器在同一組虛擬路由器中?
VRID:每個(gè)虛擬路由器都有一個(gè)唯一標(biāo)識(shí)(VRID是一個(gè)0~255的正整數(shù))
配置VRRP協(xié)議時(shí)需要配置每個(gè)路由器的虛擬路由器ID(VRID)和優(yōu)先權(quán)值
使用VRID將路由器進(jìn)行分組,具有相同VRID值的路由器為同一個(gè)組
BACKUP 為什么沒(méi)有發(fā)生搶占?
VRRP通告:它使用IP多播數(shù)據(jù)包進(jìn)行封裝,組地址為224.0.0.18,發(fā)布范圍只限于同一局域網(wǎng)內(nèi)
在一個(gè)虛擬路由器中,只有處于MASTER角色的路由器會(huì)一直發(fā)送VRRP通告信息
處于BACKUP狀態(tài)的路由器只接收MASTER發(fā)過(guò)來(lái)的報(bào)文信息,用來(lái)監(jiān)控MASTER運(yùn)行狀態(tài), 除非它的優(yōu)先級(jí)比MASTER更高
什么時(shí)候發(fā)生選舉?
當(dāng)MASTER不可用時(shí),BACKUP無(wú)法收到MASTER發(fā)過(guò)來(lái)的報(bào)文信息
認(rèn)定MASTER出現(xiàn)故障,然后多臺(tái)BACKUP就開(kāi)始進(jìn)行選舉
Master選舉
虛擬路由器IP=路由器本身配置IP
該路由器始終將是MASTER;IP地址所有者自動(dòng)具有最高優(yōu)先級(jí):255
優(yōu)先級(jí)選舉主控路由器(優(yōu)先級(jí)范圍是0—255)
優(yōu)先級(jí)0一般用在IP地址所有者主動(dòng)放棄主控者角色時(shí)使用??膳渲玫膬?yōu)先級(jí)范圍為1—254
優(yōu)先級(jí)相等,則比較路由器的實(shí)際IP,IP值較大的優(yōu)先權(quán)高
VRRP 應(yīng)用實(shí)例
+-----------+ +-----------+
| Rtr1 | | Rtr2 |
|(MR VRID=1)| |(BR VRID=1)|
|(BR VRID=2)| |(MR VRID=2)|
VRID=1 +-----------+ +-----------+ VRID=2
IP A ---------->* *<---------- IP B
| |
| |
------------------+------------+-----+--------+--------+--------+--
^ ^ ^ ^
| | | |
(IP A) (IP A) (IP B) (IP B)
| | | |
+--+--+ +--+--+ +--+--+ +--+--+
| H1 | | H2 | | H3 | | H4 |
+-----+ +-----+ +--+--+ +--+--+
Legend:
---+---+---+-- = Ethernet, Token Ring, or FDDI
H = Host computer
MR = Master Router
BR = Backup Router
* = IP Address
(IP) = default router for hosts
+ VRID 1 | Rtr1(Master) | Rtr2(Backup) + 正常情況下 H1與H2走R1;反之 走R2
-------------------------------------------------------------------------------------------------------------
+ VRID 2 | Rtr1(Backup) | Rtr2 (Master) + 正常情況下 H3與H4走R2;反之 走R1
------------------------------------------------------------------------------------------------------------
Keepalived 工作原理
根據(jù)TCP/IP參考模型各層所能實(shí)現(xiàn)的功能,Keepalived運(yùn)行機(jī)制如下:
網(wǎng)絡(luò)層
協(xié)議:
IP(Internet Protocol網(wǎng)際協(xié)議)
ARP(Address Resolution Protoco 地址轉(zhuǎn)換協(xié)議)
RARP(Reverse Address Resolution Protocol 反向地址轉(zhuǎn)換協(xié)議 )
ICMP(Internet Control Message Protocol 網(wǎng)絡(luò)控制報(bào)文協(xié)議)
常用:
通過(guò)ICMP協(xié)議向服務(wù)器集群中的每個(gè)節(jié)點(diǎn)發(fā)送一個(gè)ICMP的數(shù)據(jù)包(類似ping實(shí)現(xiàn))
如果某個(gè)節(jié)點(diǎn)沒(méi)有返回響應(yīng)數(shù)據(jù)包,那么認(rèn)為此節(jié)點(diǎn)發(fā)生了故障
keepalived將報(bào)告該節(jié)點(diǎn)失效,并從服務(wù)器集群中剔除故障節(jié)點(diǎn)
傳輸層
協(xié)議:
TCP (傳輸控制協(xié)議)(三次握手、安全可靠)
UDP (用戶數(shù)據(jù)協(xié)議)
------------------------------------------------------------------------------------
TCP提供可靠的數(shù)據(jù)傳輸服務(wù)、IP地址和端口,代表TCP的一個(gè)連接端
獲取TCP服務(wù),需要在發(fā)送機(jī)的一個(gè)端口上和接收機(jī)上一個(gè)端口上建立連接
-------------------------------------------------------------------------------------
常用:利用TCP協(xié)議的端口連接和掃描技術(shù)來(lái)判斷集群節(jié)點(diǎn)是否正常
e.g: SSH服務(wù)默認(rèn)22端口,WEB服務(wù)器80端口····Keepalived在傳輸層探測(cè)某端口沒(méi)有響應(yīng)數(shù)據(jù)
判定端口異常,強(qiáng)制將此端口對(duì)應(yīng)的節(jié)點(diǎn)從服務(wù)器及群組中移除
應(yīng)用層
協(xié)議:
FTP、TELNET、SMTP、DNS ····
-----------------------------------------------------------------------
用戶可以通過(guò)自定義Keepalived的工作方式
-----------------------------------------------------------------------
e.g:用戶編輯程序運(yùn)行Keepalived,而Keepalived 根據(jù)用戶設(shè)定檢測(cè)各種程序或服務(wù)是否允許正常
keepalived 結(jié)構(gòu)體系

keepalived 安裝
?實(shí)驗(yàn)需求:
*安裝keepalived(僅安裝)
?實(shí)驗(yàn)實(shí)現(xiàn):?
*服務(wù)器:CentOS 6.5-minimal
*?軟 件:Keepalived ( V_1.2.19 )
?安裝過(guò)程:
>>>下載安裝包并解壓,查看相關(guān)參數(shù)
[root@lucia tmp]# wget http://www.keepalived.org/software/keepalived-1.2.19.tar.gz # 下載Keepalived安裝包
[root@lucia tmp]# tar -zxf keepalived-1.2.19.tar.gz #解壓安裝包
[root@lucia tmp]# cd keepalived-1.2.19
[root@lucia keepalived-1.2.19]# ./configure --help #查看confiure編譯參數(shù)
#================================================
# 指定安裝在/etc/ {--sysconfdir=/etc}
# 指定使用內(nèi)核源碼中的頭文件 {--with-kernel-dir}
# 注:使用LVS時(shí),需要用到"--with-kernel-dir"
#===============================================
>>>編譯安裝
[root@lucia keepalived-1.2.19]# [ -z /usr/src/kernels/ ] && yum -y install kernel-headers kernel-devel || echo "The kernel file already exists"
The kernel file already exists
#===========================
# 判斷kernels目錄是否存在文件
#===========================
[root@lucia keepalived-1.2.19]# ./configure --sysconfdir=/etc/ --with-kernel-dir=/usr/src/kernels/2.6.32-573.12.1.el6.x86_64
#============================================================================
# ./configure 對(duì)即將安裝的軟件進(jìn)行配置,檢查當(dāng)前的環(huán)境是否滿足要安裝軟件的依賴關(guān)系
#============================================================================
configure: error: in `/tmp/keepalived-1.2.19':
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details
#============================================================================
# 報(bào)錯(cuò):gcc編譯器沒(méi)有安裝
# [root@lucia keepalived-1.2.19]# yum -y install gcc
#=============================================================================
繼續(xù)返回上一步預(yù)安裝./configure
[root@lucia keepalived-1.2.19]# ./configure --sysconfdir=/etc/ --with-kernel-dir=/usr/src/kernels/2.6.32-573.12.1.el6.x86_64
configure: error:
!!! OpenSSL is not properly installed on your system. !!!
!!! Can not include OpenSSL headers files. !!!
#=========================================================================
# 報(bào)錯(cuò):OpenSSL 沒(méi)有安裝
# [root@lucia keepalived-1.2.19]# yum -y install openssl*
#=========================================================================
./configure 成功后,顯示是Keepalived 輸出的加載模塊信息
Keepalived configuration
------------------------
Keepalived version : 1.2.19
Compiler : gcc
Compiler flags : -g -O2
Extra Lib : -lssl -lcrypto -lcrypt
Use IPVS Framework : Yes
IPVS sync daemon support : Yes
IPVS use libnl : No
fwmark socket support : Yes
Use VRRP Framework : Yes
Use VRRP VMAC : Yes
SNMP support : No
SHA1 support : No
Use Debug flags : No
[root@lucia keepalived-1.2.19]# make && make install #編譯&&安裝
[root@lucia keepalived-1.2.19]# ln -s /usr/local/sbin/keepalived /sbin/ #軟鏈接到系統(tǒng)使用的管理程序目錄中
[root@lucia keepalived-1.2.19]# chkconfig --add keepalived #添加到系統(tǒng)服務(wù)
[root@lucia keepalived-1.2.19]# chkconfig --level 35 keepalived on #添加到開(kāi)機(jī)啟動(dòng)
? Keepalived 配置詳解
[root@lucia keepalived-1.2.19]# cd /etc/keepalived/
[root@lucia keepalived-1.2.19]# ls
keepalived.conf samples
# ================================================================
# Keepalived 配置文件路徑為/etc/keepalived/keepalived.conf
# samples 目錄下存放著keepalived配置的示例
# ================================================================
#============================================================
# keepalived.conf 配置
#------------------------------------------------------------
# 1、Keepalived 配置文件以block形式組織,每個(gè)塊內(nèi)容都包含在{}
# 2、“#” “!” 開(kāi)頭行為注釋
# 3、keepalived 配置為三類:
# 全局配置:對(duì)整個(gè)keepalived都生效的配置
# VRRPD 配置:核心配置,主要實(shí)現(xiàn)keepalived高可用功能
# LVS配置
#============================================================
! Configuration File for keepalived
########################
# 全局配置
########################
global_defs { # global_defs 全局配置標(biāo)識(shí)
------------------------------------------
notification_email { # notification_email用于設(shè)置報(bào)警郵件地址
acassen@firewall.loc # 可以設(shè)置多個(gè),每行一個(gè)
failover@firewall.loc # 設(shè)置郵件報(bào)警,需開(kāi)啟本機(jī)Sendmail 服務(wù)
sysadmin@firewall.loc # yum -y install mailx sendmail
} ----------------------------------------------
notification_email_from Alexandre.Cassen@firewall.loc # 設(shè)置郵件發(fā)送地址
smtp_server 192.168.200.1 # 設(shè)置郵件的smtp server地址
smtp_connect_timeout 30 # 設(shè)置連接smtp sever超時(shí)時(shí)間
router_id LVS_DEVEL # 表示運(yùn)行keepalived服務(wù)器標(biāo)識(shí),發(fā)郵件時(shí)顯示在郵件主題中的信息
}
######################
# VRRPD配置
######################
vrrp_instance VI_1 { # VRRPD 配置標(biāo)識(shí) VI_1是實(shí)例名稱
state MASTER # 指定Keepalvied角色 MASTER表示此主機(jī)為主服務(wù)器 BACKUP則是表示為備用服務(wù)器
interface eth0 # 指定 HA 監(jiān)測(cè)網(wǎng)絡(luò)的接口
virtual_router_id 51 # 虛擬路由標(biāo)識(shí),標(biāo)識(shí)為數(shù)字,同一個(gè)VRRP實(shí)例使用唯一的標(biāo)識(shí),即可表示在同一個(gè)vrrp_instance下 MASTER_ID = BACKUP_ID
priority 100 # 定義節(jié)點(diǎn)優(yōu)先級(jí),數(shù)字越大表示節(jié)點(diǎn)的優(yōu)先級(jí)越高,同一個(gè)VRRP_instance下,MASTE_PRIORITY > BACKUP_PRIORITY
advert_int 1 # 設(shè)定MASTER與BACKUP主機(jī)質(zhì)檢同步檢查的時(shí)間間隔,單位為秒
authentication { # 設(shè)定節(jié)點(diǎn)間通信驗(yàn)證類型和密碼,驗(yàn)證類型主要有PASS和AH兩種
auth_type PASS # 同一個(gè)vrrp_instance,MASTER驗(yàn)證密碼和BACKUP保持一致
auth_pass 1111
}
virtual_ipaddress { # 設(shè)置虛擬IP地址 (VIP),又叫做漂移IP地址
192.168.200.16
192.168.200.17
192.168.200.18
}
#-------------------------------------------------------------------------------
# 問(wèn):為什么叫漂移IP地址?
# 答:當(dāng)Keepalived切換到MASTER狀態(tài)時(shí),IP地址會(huì)自動(dòng)添加到系統(tǒng)中
# 當(dāng)Keepalvied切換到BACKUP狀態(tài)時(shí),IP地址將自動(dòng)從系統(tǒng)中刪除
#
# keepalived通過(guò)“ip address add”命令的形式將VIP添加到系統(tǒng)
# 通過(guò)“ip add”查看系統(tǒng)中添加的VIP地址
#--------------------------------------------------------------------------------
}
######################
# LVS配置
######################
virtual_server 192.168.200.100 443 { # virtual_server LVS配置標(biāo)識(shí)
# 格式:virtual_server VIP port [IP 和 port 之間空格隔開(kāi)]
delay_loop 6 # 設(shè)置健康檢查時(shí)間間隔,單位為秒
lb_algo rr # 設(shè)置負(fù)載調(diào)度算法,可用的調(diào)度算法有:rr、wlc、lc、lblc、sh、dh等
lb_kind NAT # 設(shè)置LVS實(shí)現(xiàn)負(fù)載均衡的機(jī)制,有NAT、TUN和DR三種模式可選
nat_mask 255.255.255.0 # NAT子網(wǎng)掩碼
persistence_timeout 50 # 會(huì)話保持時(shí)間
protocol TCP # 指定轉(zhuǎn)發(fā)協(xié)議類型
#----------------------------------------------------------------------------------------------------
# persistence_timeout 會(huì)話保持時(shí)間對(duì)動(dòng)態(tài)網(wǎng)頁(yè)非常有用,為集群系統(tǒng)中的seesion共享提供了一個(gè)很好的解決方案
# 用戶的請(qǐng)求會(huì)一直分發(fā)到某個(gè)服務(wù)節(jié)點(diǎn),直至超過(guò)這個(gè)會(huì)話的保持時(shí)間(指最大無(wú)響應(yīng)超時(shí)時(shí)間)
# =[用戶操作動(dòng)態(tài)頁(yè)面如果在50s沒(méi)有執(zhí)行任何操作則被分發(fā)到另外的節(jié)點(diǎn)]
#----------------------------------------------------------------------------------------------------
real_server 192.168.201.100 443 { # 設(shè)置real server段開(kāi)始的標(biāo)識(shí) [ IP為真實(shí)IP地址]
# 格式:real_server realIP port [IP 和 port 之間空格隔開(kāi)]
-----------------------------------------------------------------
weight 1 # 用于配置real server節(jié)點(diǎn)的權(quán)值,權(quán)值大小用數(shù)字表示,數(shù)字越大,權(quán)值越高
# 設(shè)置權(quán)值大小可以為不同性能的服務(wù)器分配不同的負(fù)載
------------------------------------------------------------------
SSL_GET { # 健康檢查 SSL_GET
url { # 指定SSL檢查的URL信息,可以指定多個(gè)
path /index.html # 后跟詳細(xì)的URL路徑
digest ff20ad2481f97b1754ef3e12ecd3a9cc # SSL檢查后的摘要信息,可以通過(guò)genhash命令工具獲取
#-----------------------------------------------------------------
# [root@lucia keepalived]# genhash -s 192.168.201.100 -p 80 -u /index.html
#-----------------------------------------------------------------
}
url {
path /mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd
}
connect_timeout 3 # 表示無(wú)響應(yīng)超時(shí)時(shí)間,單位為秒
nb_get_retry 3 # 表示重試次數(shù)
delay_before_retry 3 # 表示充實(shí)間隔
}
}
}
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 # 備份節(jié)點(diǎn),在所有real serer失效后,啟用備份節(jié)點(diǎn)
}