keepalived 實(shí)現(xiàn)高可用

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
[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
001.png
  • master 關(guān)閉keepalived
002.png
  • 查看 backup 的ip
003.png

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末芬失,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子匾灶,更是在濱河造成了極大的恐慌棱烂,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阶女,死亡現(xiàn)場(chǎng)離奇詭異颊糜,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)秃踩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門衬鱼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人憔杨,你說(shuō)我怎么就攤上這事鸟赫。” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵抛蚤,是天一觀的道長(zhǎng)台谢。 經(jīng)常有香客問(wèn)我,道長(zhǎng)霉颠,這世上最難降的妖魔是什么对碌? 我笑而不...
    開封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮蒿偎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘怀读。我一直安慰自己诉位,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開白布菜枷。 她就那樣靜靜地躺著苍糠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪啤誊。 梳的紋絲不亂的頭發(fā)上岳瞭,一...
    開封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音蚊锹,去河邊找鬼瞳筏。 笑死,一個(gè)胖子當(dāng)著我的面吹牛牡昆,可吹牛的內(nèi)容都是我干的姚炕。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼丢烘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼柱宦!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起播瞳,我...
    開封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤掸刊,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后赢乓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體忧侧,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年骏全,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了苍柏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡姜贡,死狀恐怖试吁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤熄捍,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布烛恤,位于F島的核電站,受9級(jí)特大地震影響余耽,放射性物質(zhì)發(fā)生泄漏缚柏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一碟贾、第九天 我趴在偏房一處隱蔽的房頂上張望币喧。 院中可真熱鬧,春花似錦袱耽、人聲如沸杀餐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)史翘。三九已至,卻和暖如春冀续,著一層夾襖步出監(jiān)牢的瞬間琼讽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工洪唐, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留钻蹬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓桐罕,卻偏偏與公主長(zhǎng)得像脉让,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子功炮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348