Keepalived高可用LVS反向代理服務(wù)器

Keepalived是什么?

Keepalived是VRRP在Linux上的一種實(shí)現(xiàn)牍蜂,以守護(hù)進(jìn)程方式運(yùn)行漾根。
能夠更具配置文件自動生成ipvs規(guī)則并對各個RS做健康狀態(tài)監(jiān)測。

VRRP:Virtual Router Redundancy Protocol鲫竞,也叫做虛擬路由冗余協(xié)議辐怕。
他的原理是將多個設(shè)備組成一個虛擬路由器。
這些設(shè)備之間會通過VRRP協(xié)議傳遞心跳信息以檢測設(shè)備是否已經(jīng)故障从绘。
他早期用于網(wǎng)絡(luò)設(shè)備冗余寄疏,防止單點(diǎn)故障。
其實(shí)通俗來說僵井,就是設(shè)備的熱備份陕截。
在故障產(chǎn)生的時候,可以省去人為地切換批什,減少故障時間农曲。

使用Keepalived之前我們需要掌握的知識

常用實(shí)現(xiàn)方案:

主備模型:
將多個服務(wù)器配置成 一個虛擬路由器,一主多備驻债。
主主模型:
組成多個虛擬路由器乳规,提供多個服務(wù)形葬。
雖然本質(zhì)上都是一主多備,但是角色分配不一樣暮的。

主備之間的工作模式:

搶占模式:優(yōu)先級荷并。
一開始定義成Master,優(yōu)先級低還是會被搶走青扔。
非搶占模式:先到先得
服務(wù)器之間不會根據(jù)優(yōu)先度動態(tài)競選成Master”
除非本王死了,要不然你一輩子都是太子“那種感覺翩伪。

Keepalived中的術(shù)語:

VRID:虛擬路由器的標(biāo)識微猖。有相同 VRID 的一組路由器構(gòu)成一個虛擬路由器。
虛擬 MAC 地址:一個虛擬由器擁有一個虛擬 MAC 地址缘屹。
虛擬 MAC 地址的格式為 00-00-5E-00-01-{VRID}凛剥。
通常情況下,虛擬路由器回應(yīng) ARP 請求使用的是虛擬 MAC 地址轻姿,
只有虛擬路由器做特殊配置的時候犁珠,才回應(yīng)接口的真實(shí) MAC 地址。
優(yōu)先級:VRRP 根據(jù)優(yōu)先級來確定虛擬路由器中每臺路由器的地位互亮。
優(yōu)先級是0-255之間的數(shù)值犁享,數(shù)字越大優(yōu)先級越高

VRRP工作過程:

1.選出一個主路由器:看優(yōu)先級;優(yōu)先級一樣就看ip,誰大誰是Master豹休。
2.發(fā)送arp欺騙的IP報文炊昆,通知其連接的設(shè)備,并開始承擔(dān)報文轉(zhuǎn)發(fā)的任務(wù)威根。
3.周期性發(fā)送心跳信息凤巨、優(yōu)先級、還有工作狀況洛搀。
因?yàn)椴豢赡芡瑫r將同一個對外的IP地址配置在兩臺路由器上面敢茁。
所以要arp欺騙報文,告訴對方自己的MAC地址給ARP表留美。

配置Keepalived高可用LVS反向代理后端Web服務(wù)器

實(shí)驗(yàn)拓?fù)洌?/strong>

KeepAlived

主機(jī)名 主機(jī)地址 安裝組件
node1 192.168.2.201,192.168.2.221 Keepalived
node2 192.168.2.202,192.168.2.222 Keepalived
node3 192.168.2.203 Apache
node4 192.168.2.204 Apache

本文中的服務(wù)器使用CentOS7.1彰檬,Keepalived-1.2.13
服務(wù)器均關(guān)閉iptables和selinux

注意:
這里我們node1和node2為什么要設(shè)置兩個ip?
因?yàn)槟阍囅胫挥幸粋€ip的話,當(dāng)node1發(fā)生故障谎砾,ip轉(zhuǎn)移到node2的時候僧叉,我們怎么訪問node1?
所以192.168.2.201用作固定訪問用棺榔,實(shí)際環(huán)境中可以是內(nèi)網(wǎng)ip地址瓶堕。
而192.168.2.221則視為keepalived可以轉(zhuǎn)移的公網(wǎng)ip。
(1)node1和node2安裝keepalived和ipvsadm
  [root@node1 ~]# yum install ipvsadm keepalived 
  [root@node2 ~]# yum install ipvsadm keepalived 
(2)修改網(wǎng)絡(luò)配置
[root@node1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eno16777736

TYPE=Ethernet
BOOTPROTO="static"
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
NAME=eno16777736
DEVICE=eno16777736
ONBOOT=yes
IPADDR="192.168.2.201"
NETMASK="255.255.255.0"
DNS1="192.168.2.1"
GATEWAY="192.168.2.1"

[root@node1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eno16777736:0

TYPE=Ethernet
BOOTPROTO="static"
NAME=eno16777736:0
ONBOOT=yes
IPADDR="192.168.2.211"
NETMASK="255.255.255.0"
DNS1="192.168.2.1"
GATEWAY="192.168.2.1"
ONPARENT=yes

[root@node1 ~]# service network restart

[root@node1 ~]# ifconfig 
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.2.201  netmask 255.255.255.0  broadcast 192.168.2.255
        inet6 fe80::250:56ff:fe3c:d757  prefixlen 64  scopeid 0x20<link>
        ether 00:50:56:3c:d7:57  txqueuelen 1000  (Ethernet)
        RX packets 125436  bytes 31500491 (30.0 MiB)
        RX errors 0  dropped 6  overruns 0  frame 0
        TX packets 234981  bytes 17023789 (16.2 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eno16777736:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.2.211  netmask 255.255.255.0  broadcast 192.168.2.255
        ether 00:50:56:3c:d7:57  txqueuelen 1000  (Ethernet)


(3)修改keepalived配置(全局配置段和主機(jī)配置段)
[root@node1 ~]# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   notification_email {
        root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_HOST1
}

vrrp_instance VI_1 {
    state MASTER
    interface eno16777736
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.2.221/24 dev eno16777736 label eno16777736:1
    }
}


vrrp_instance VI_2 {
    state BACKUP
    interface eno16777736
    virtual_router_id 52
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 2222
    }
    virtual_ipaddress {
        192.168.2.222/24 dev eno16777736 label eno16777736:2
    }
}
注意:
1.node2的配置中
  將VI_1的改為priority 99症歇,state BACKUP郎笆,
  將VI_2的改為priority 100谭梗,state MASTER!M痱尽激捏!
也就是說,
  VI_1中凄吏,node1的優(yōu)先度是100的MASTER远舅,node2則是優(yōu)先度99的BACKUP
  VI_2中,node1的優(yōu)先度是99的BACKUP痕钢,node2則是優(yōu)先度是100的MASTER
2.這里一個VI就是一個虛擬路由器图柏,所以這里有兩個VI,所以組成了兩個虛擬路由器任连。
這樣是為了可以實(shí)現(xiàn)雙主蚤吹,不會讓備份主機(jī)處于空閑而造成浪費(fèi)。

在這一步完成之后随抠,我們就可以先保存一下裁着,然后重啟Keepalived服務(wù)了。
因?yàn)槭堑谝淮喂八覀兿确珠_來配置二驰,不用到時候配置了LVS的參數(shù)再重啟。
這樣更加容易排錯秉沼。要不然诸蚕,lvs的配置有錯誤,這里的配置也有錯誤氧猬,就很混亂背犯。

此時檢驗(yàn)keepalived是否工作正常的方法:
通過關(guān)閉node1上面的keepalived,看看192.168.2.221會不會轉(zhuǎn)移到node2上面盅抚。
同樣漠魏,關(guān)閉node2上面的keepalived,看看node2的ip192.168.2.222會不會轉(zhuǎn)移到node1上妄均。

(3)還是同一個配置文件,這次修改LVS相關(guān)配置(LVS配置段)柱锹。
virtual_server 192.168.2.221 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    protocol TCP

    sorry_server 127.0.0.1 80

    real_server 192.168.2.203 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }

    real_server 192.168.2.204 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

virtual_server 192.168.2.222 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    protocol TCP

    sorry_server 127.0.0.1 80

    real_server 192.168.2.203 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }

    real_server 192.168.2.204 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

                                                                  

這個配置主要用于自動生成lvs規(guī)則。
這里定義了兩個lvs的Director規(guī)則丰包,每個VirtualServer后面都定義RealServer禁熏。
這里我們做了一個雙主的模型,也就是lvs1和lvs2都工作邑彪。
假如lvs1故障琳要,lvs1的ip就會轉(zhuǎn)移到lvs2上顿仇。
假如lvs2故障撞牢,lvs1的ip就會轉(zhuǎn)移到lvs1上。

重啟keepalived之后查看效果(node1)
[root@bc ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.2.221:80 rr 
  -> 192.168.2.203:80             Route   1      0          0         
  -> 192.168.2.204:80             Route   1      0          0         
TCP  192.168.2.222:80 rr 
  -> 192.168.2.203:80             Route   1      0          0         
  -> 192.168.2.204:80             Route   1      0          0  

此時node1只有192.168.2.221的ip矩动,所以只有上面的生效。

(4)node3和node4的配置

我們將它寫成一個腳本释漆,目標(biāo)是為了將LVS1的VIP和LVS2的VIP分別配置在lo:0和lo:1上面
接受start參數(shù)的時候悲没,做arp限制;接受stop參數(shù)的時候男图,取消限制示姿。
這樣做是為了,當(dāng)兩個VIP都切換過來的時候逊笆,可以進(jìn)行響應(yīng)栈戳。

[root@node3 ~]# vim RealServer.sh 

#!/bin/bash

usage(){
        echo "This Script is design for setting the arp argument for lvs-dr RealServer"
        echo "Usage:`basename $0` start|stop"
}

case $1 in
        start)
                echo "1" > /proc/sys/net/ipv4/ip_forward
                echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
                echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
                echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
                echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
                ifconfig lo:0 192.168.2.221/32 broadcast 192.168.2.221 up
                ifconfig lo:1 192.168.2.222/32 broadcast 192.168.2.222 up
                route add -host 192.168.2.221 dev lo:0
                route add -host 192.168.2.222 dev lo:1
                ;;
        stop)
                echo "0" > /proc/sys/net/ipv4/ip_forward
                echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce
                echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore
                echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore
                echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce
                ifconfig lo:0 192.168.2.221/32 broadcast 192.168.2.221 down
                ifconfig lo:1 192.168.2.222/32 broadcast 192.168.2.222 down
                route del -host 192.168.2.221 dev lo:0
                route del -host 192.168.2.222 dev lo:1
                ;;
        *)
                usage
                ;;
esac

(5)測試方法

由于這一步十分難做演示,所以說一下主要的步驟览露。
當(dāng)node1使用systemctl stop keepalived.service的時候,
使用192.168.2.221會轉(zhuǎn)移到node2譬胎,瀏覽器依然可以使用192.168.2.221訪問node3和node4
同時使用192.168.2.222依然可以訪問node3和node4差牛,不影響node2的正常運(yùn)作。

當(dāng)node2使用systemctl stop keepalived.service的時候堰乔,
使用192.168.2.221依然可以訪問node3和node4偏化,不影響node1的正常運(yùn)作。
同時192.168.2.222此時會轉(zhuǎn)移到node1镐侯,瀏覽器依然可以使用192.168.2.221訪問node3和node4

所以你怎么刷侦讨,或者關(guān)掉任意一個LVS,都可以用192.168.2.221和192.168.2.222這兩個ip訪問后端兩臺主機(jī)苟翻。

注意:
因?yàn)檫@里為了顯示效果韵卤,使用了IP訪問。使用IP訪問的時候崇猫,假如有多臺虛擬主機(jī)沈条,一定會默認(rèn)訪問第一個。
上面的Keepalived配置的ACTIVE/ACTIVE模式诅炉,一般是httpd配置放兩個虛擬主機(jī)網(wǎng)站蜡歹。

這樣用域名訪問網(wǎng)站的時候,假如指向同一個IP的時候涕烧,也能顯示不同的網(wǎng)站月而。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市议纯,隨后出現(xiàn)的幾起案子父款,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铛漓,死亡現(xiàn)場離奇詭異溯香,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)浓恶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門玫坛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人包晰,你說我怎么就攤上這事湿镀。” “怎么了伐憾?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵勉痴,是天一觀的道長。 經(jīng)常有香客問我树肃,道長蒸矛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任胸嘴,我火速辦了婚禮雏掠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘劣像。我一直安慰自己乡话,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布耳奕。 她就那樣靜靜地躺著绑青,像睡著了一般。 火紅的嫁衣襯著肌膚如雪屋群。 梳的紋絲不亂的頭發(fā)上闸婴,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機(jī)與錄音芍躏,去河邊找鬼掠拳。 笑死,一個胖子當(dāng)著我的面吹牛纸肉,可吹牛的內(nèi)容都是我干的溺欧。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼柏肪,長吁一口氣:“原來是場噩夢啊……” “哼姐刁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起烦味,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤聂使,失蹤者是張志新(化名)和其女友劉穎壁拉,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體柏靶,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡弃理,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了屎蜓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痘昌。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖炬转,靈堂內(nèi)的尸體忽然破棺而出辆苔,到底是詐尸還是另有隱情,我是刑警寧澤扼劈,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布驻啤,位于F島的核電站,受9級特大地震影響荐吵,放射性物質(zhì)發(fā)生泄漏骑冗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一先煎、第九天 我趴在偏房一處隱蔽的房頂上張望贼涩。 院中可真熱鬧,春花似錦榨婆、人聲如沸磁携。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至闷供,卻和暖如春烟央,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背歪脏。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工疑俭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人婿失。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓钞艇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親豪硅。 傳聞我的和親對象是個殘疾皇子哩照,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容