1. keepalived 概述
1.1 keepalived 是什么
- keepalived 常用來(lái)作為 實(shí)現(xiàn)高可用方案的軟件, 也可以管理 LVS.
- keepalived 軟件主要是通過(guò)VRRP 協(xié)議實(shí)現(xiàn)高可用功能. VRRP(Virtual Router RedundancyProctol) 是虛擬路由器榮譽(yù)協(xié)議, 用于解決靜態(tài)路由單點(diǎn)故障的問(wèn)題, 能夠保證個(gè)別節(jié)點(diǎn)宕機(jī)時(shí), 整個(gè)網(wǎng)絡(luò)可以不間斷運(yùn)行.
- keepalived 一方面可以配置管理LVS 功能, 同時(shí)也可以對(duì)LVS 下面節(jié)點(diǎn)進(jìn)行健康檢查功能, 另一方面可以實(shí)現(xiàn)系統(tǒng)網(wǎng)絡(luò)的高可用功能.
1.2 keepalived 原理
-
Keepalived 是通過(guò) VRRP 協(xié)議通信的, 所以需要先了解vrrp協(xié)議.
- VRRP 是通過(guò)一種競(jìng)選機(jī)制來(lái)講路由 任務(wù)交給某個(gè) VRRP 路由器
- VRRP 用IP多播的方式, (默認(rèn)多播地址(224.0.0.x)) 實(shí)現(xiàn)高可用對(duì) 之間的通信.
- 工作時(shí) 主節(jié)點(diǎn)在多播地址 發(fā)包, 備節(jié)點(diǎn) 收包, 當(dāng)備用節(jié)點(diǎn)收不到包時(shí), 就會(huì)啟動(dòng)接管程序, 來(lái)接管主節(jié)點(diǎn)的任務(wù), 通過(guò)優(yōu)先級(jí)競(jìng)選, 一般keepalived 管理節(jié)點(diǎn)都是一對(duì).
- VRRP 使用了加密協(xié)議加密數(shù)據(jù), 但是keepalved 官方推薦使用明文的方式配置驗(yàn)證類型 和密碼.
-
keepalived 工作原理
- keepalived 高可用對(duì)之間通過(guò) VRRP 協(xié)議通信, VRRP 通過(guò)競(jìng)選機(jī)制來(lái)確定 master/backup, master的優(yōu)先級(jí)高于 backup, 工作時(shí)會(huì)有現(xiàn)貨的所有資源, backup 節(jié)點(diǎn)處于等待狀態(tài), 當(dāng) master 掛了的時(shí)候, backup 會(huì)接管master, 然后頂替master對(duì)外提供服務(wù).
- keepalive 服務(wù)對(duì)之間, 只有作為 master 的服務(wù)會(huì)一直發(fā)送 VRRP 廣播, 告訴 backup 還活著, 當(dāng) backup 收不到 廣播包時(shí), 會(huì)啟動(dòng)驗(yàn)證服務(wù)接管資源, 保證業(yè)務(wù)連續(xù)性.
2. 部署keepalived
2.1 安裝前準(zhǔn)備
- 系統(tǒng)環(huán)境
2.2 下載keepalived
- 下載地址
- 官網(wǎng):
http://www.keepalived.org
- 官網(wǎng):
[root@node10009 src]$ ll ./keepalived-1.4.5.tar.gz
-rw-r--r-- 1 root root 749813 Jan 1 14:46 ./keepalived-1.4.5.tar.gz
[root@node10009 src]# tar zxf keepalived-1.4.5.tar.gz
[root@node10009 src]# cd keepalived-1.4.5
2.3 安裝
- 編譯安裝
[root@node10009 keepalived-1.4.5]# ./configure --prefix=/opt/app/keepalived
...
[root@node10009 keepalived-1.4.5]# make && make install
...
[root@node10009 keepalived-1.4.5]# cd /opt/app/keepalived/
[root@node10009 keepalived]# ls
bin etc sbin share
[root@node10009 keepalived]#
- 拷貝相關(guān)文件以及執(zhí)行腳本
[root@node10009 keepalived]# cp /opt/src/keepalived-1.4.5/keepalived/etc/init.d/keepalived /etc/init.d/
[root@node10009 keepalived]# cp /opt/src/keepalived-1.4.5/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@node10009 keepalived]# cp /opt/app/keepalived/etc/keepalived/keepalived.conf /etc/keeplaived/
- backup 節(jié)點(diǎn)同樣安裝
2.4 配置
- master 編輯配置文件
# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id 101
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 12345
}
virtual_ipaddress {
192.168.10.5
}
}
- backup 配置
# 與master 相似.
# 只需要修改下面兩項(xiàng)
state BACKUP
priority 50
2.5 啟動(dòng)
- 啟動(dòng)
- master 和 backup 一樣
[root@node10009 keepalived]#
[root@node10009 keepalived]# /etc/init.d/keepalived start
Starting keepalived (via systemctl): [ OK ]
[root@node10009 keepalived]#
- 查看狀態(tài)
- master
[root@node10009 keepalived]# ip addr show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:8f:4e:4a brd ff:ff:ff:ff:ff:ff
inet 192.168.10.9/24 brd 192.168.10.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.10.5/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe8f:4e4a/64 scope link
valid_lft forever preferred_lft forever
[root@node10009 keepalived]#
- backup
[root@node10011 keepalived]# ip a s ens33
3: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:81:ed:eb brd ff:ff:ff:ff:ff:ff
inet 192.168.10.11/24 brd 192.168.10.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::4dde:82c6:582c:3368/64 scope link noprefixroute
valid_lft forever preferred_lft forever
- 可以看到 master 的 ens33 網(wǎng)卡上多個(gè) VIP
2.6 測(cè)試
- master 和 backup 都啟動(dòng) nginx
- master 關(guān)閉keepalived
- 查看 backup 的ip
3. keepalived 腦裂
3.1 腦裂概述
- 在高可用(HA)系統(tǒng)中, 當(dāng)兩個(gè)節(jié)點(diǎn)的 '心跳'斷開時(shí), 會(huì)為了一個(gè)整體, 動(dòng)作協(xié)調(diào)HA系統(tǒng), 會(huì)分裂成兩個(gè)獨(dú)立個(gè)體, 由于相互失去了聯(lián)系, 都會(huì)以為 對(duì)方出現(xiàn)了故障, 兩個(gè)節(jié)點(diǎn)就會(huì)出現(xiàn)腦裂, 爭(zhēng)搶共享資源., 會(huì)發(fā)生嚴(yán)重的后果, 如: 爭(zhēng)搶服務(wù)導(dǎo)致服務(wù)無(wú)法運(yùn)行, 同時(shí)讀寫共享存儲(chǔ), 導(dǎo)致存儲(chǔ)損壞.
- 對(duì)于HA 系統(tǒng)腦裂的解決方法有:
- 添加冗余的心跳線(原本心跳在網(wǎng)線上的 廣播包), 添加 雙線, 減少腦裂幾率
- 啟動(dòng)磁盤鎖, 正在服務(wù)的一方會(huì)鎖定共享硬盤, '腦裂發(fā)生時(shí)' 讓對(duì)方無(wú)法使用硬盤,
- 設(shè)定仲裁機(jī)制, 如: 添加參考IP(網(wǎng)關(guān)IP) 當(dāng)心跳斷開時(shí), 2個(gè)節(jié)點(diǎn)會(huì)各自判斷參考ip 是否可通訊, 如果該節(jié)點(diǎn)不同則 放棄競(jìng)爭(zhēng).
3.2 腦裂產(chǎn)生的原因
- 高可用服務(wù)器之間心跳線線路發(fā)生故障, 導(dǎo)致無(wú)法正常通信.
- 心跳線壞了.
- 網(wǎng)卡相關(guān)驅(qū)動(dòng)問(wèn)題, ip 配置沖突
- 心跳線之間連接的設(shè)備故障(網(wǎng)卡即交換機(jī))
- 仲裁的機(jī)器出現(xiàn)故障
- 高可用服務(wù)器 上開啟了 防火墻規(guī)則 阻止了 心跳消息傳輸.
- 高可用服務(wù)器 心跳網(wǎng)卡地址配置不正確
- 其他服務(wù)配置不正確, 如心跳方式, 心跳廣播沖突, 軟件bug
3.3 解決方案
- 同時(shí)使用兩個(gè)心跳線路,
- 檢測(cè)到腦裂發(fā)生時(shí) 強(qiáng)行關(guān)閉一個(gè)心跳節(jié)點(diǎn), (需要特殊設(shè)備, 如 stonith, feyce)
- 對(duì)腦裂的監(jiān)控報(bào)警, 發(fā)生時(shí) 第一時(shí)間人為介入
4. keepalived 配置文件
- keepalived 僅有一個(gè)配置文件 keepalived.conf
- 主要包含會(huì)以下幾個(gè)區(qū)域:
- global_defs:
- static_ipaddress
- start_routes
- vrrp_script
- vrrp_intance
4.1 global_defs
- 配置發(fā)生故障時(shí)通知對(duì)象, 以及機(jī)器標(biāo)識(shí)
- 詳解
notification_email {}
- 配置故障發(fā)生時(shí)發(fā)送郵件對(duì)象(接受者 郵箱)
notification_email_from
- 發(fā)送郵件的 郵箱(發(fā)送者)
smpt_server
- 通知郵件的 smtp 地址
smtp_connect_timeout
- 連接 smtp 服務(wù)的超時(shí)時(shí)間
router_id LVS_DEVEL
- LVS_DEVEL 是表示備節(jié)點(diǎn)的字符串, 通诚“洌可以設(shè)置hostnanme, 會(huì)在故障時(shí)的郵件內(nèi) 用到
vrrp_strict
- 強(qiáng)制執(zhí)行嚴(yán)格的 VRRP 協(xié)議.
vrrp_garp_interval 0
- 接口發(fā)送的 ARP 報(bào)文延時(shí)時(shí)間.
vrrp_gna_interval
- 接口發(fā)送給您的未接收請(qǐng)求的 消息之間延遲時(shí)間
4.2 static_ipaddress 和 start_routes
- staitc_ipaddress和 static_routes 用于配置ip 和 route 信息, 如果機(jī)器上機(jī)器上已配置了 IP 和路由, name這兩個(gè)區(qū)域不需要配置,
- 語(yǔ)法:
static_ipaddress {
<IPADDR>[/<MASK>] [brd <IPADDR>] [dev <STRING] [scope <SCOPE>]
...
}
static_routes {
...
}
static_rules {
...
}
- 示例
static_ipaddress {
192.168.10.10/24 dev ens33 scopo global
}
satic_route {
192.168.0.0/24 via 192.168.10.1 dev ens33
}
4.3 vrrp_script
- 用來(lái)作健康檢查, 當(dāng)檢查失敗時(shí) 會(huì)啟動(dòng) vrrp_instance 的 priority(優(yōu)先級(jí)) 減少相對(duì)應(yīng)的值.
- 示例
vrrp_script check_http_port {
-- vrrp_scrpt 定義腳本, 需要指定腳本名
scritpt "/opt/shell/check_http_port.sh"
-- 定義一個(gè)腳本信息, 該腳本內(nèi)容用于 check_http_port
interval 2
-- 執(zhí)行腳本間隔時(shí)間, 單位 s
weight 10
-- 當(dāng)腳本判斷為錯(cuò)誤時(shí),會(huì)設(shè)置 優(yōu)先級(jí)(這里是10), 當(dāng)該優(yōu)先級(jí)低于 BACKUP 的優(yōu)先級(jí)時(shí), 會(huì)被BACKUP 替代.
timeout 20
-- 腳本運(yùn)行超時(shí)時(shí)間
rise 10
-- 該腳本運(yùn)行成功的話, 會(huì)提升優(yōu)先級(jí) 10,(+10)
fall 10
-- 轉(zhuǎn)換所需的成功次數(shù)....
user USERNAME [GROUPNAME]
-- 執(zhí)行腳本的user 和 group
init_fail
-- 最初狀態(tài)為該腳本是失敗狀態(tài).
}
4.4 vrrp_intance 和 vrrp_sync_group
- vrrp_intance 用于定義對(duì)外提供服務(wù)的VIP 區(qū)域相關(guān)屬性.
- vrrp_rsync_group 用來(lái)定義 vrrp_intance 組, 改組內(nèi)動(dòng)作一致
- 兩個(gè) vrrp_intance 屬于一個(gè) vrrp_rsync_group 時(shí), 如果一個(gè) vrrp_instance 發(fā)生故障切換了, 另一個(gè)也會(huì)同時(shí)切換(即使么有發(fā)生故障)
- 示例
vrrp_instance VI_1 {
-- 配置區(qū)域
state MASTER
-- 配置為 MASTER 或者 BACKUP, 表示該機(jī)器最初`狀態(tài), 如果其他機(jī)器的 優(yōu)先級(jí)高于高機(jī)器, 怎會(huì)稱為 MASTER
interface ens33
-- 綁定接口, 由 vrrp 綁定
use_vmac [<VMAC_INTERFACE>]
-- 使用 VRRP 虛擬MAC,
virtual_router_id 51
-- 用于區(qū)分多個(gè)vrrp多實(shí)例的 唯一標(biāo)識(shí), 每組服務(wù)應(yīng)當(dāng)使用 相同的 id(master 和 backup 的id 必須一致)
priority 100
-- 選舉Master 時(shí)使用的權(quán)限
advert_int 1
-- Vrrp 廣播的間隔時(shí)間,
authentication {
-- 設(shè)置認(rèn)證的方式
auth_type PASS || AH
-- PASS 表示簡(jiǎn)單明文密碼, AH 表示 IPSEC 加密
auth_pass 1234
-- 配置密碼, master 和 backup 應(yīng)當(dāng)一致
}
}
END