VRRP協議及Keepalived原理使用
VRRP 協議即 Virtual Router Redundancy Protocol,虛擬路由器冗余協議, 為了解決局域網內默認網關單點失效的問題.
VRRP 將局域網內的一組路由器組成一個虛擬路由器組,每個路由器都有自己的局域網地址, 根據設置的優先級最高決定那個是master路由器,
然后網關地址賦給該主路由器, 該主路由器定時發送VRRP報文向虛擬路由器組公布健康狀況, 備份的路由器根據柏愛文判斷Master路由器是否工作正常,從而決定是否要接替它. VRRP說白了就是實現IP地址漂移的,是一種容錯協議。在下圖中,Router A(10.100.10.1)、Router B(10.100.10.2)和Router C(10.100.10.3) 組成一個虛擬路由器。各虛擬路由器都有自己的IP地址。局域網內的主機將虛擬路由器設置為缺省網關。 Router A、Router B和Router C中優先級最高的那台路由器作為Master路由器,比如A,承擔網關的功能。局域網內的服務 只知道這台主master路由器A的存在,將自己缺省路由下一跳地址設置為該路由的ip地址10.100.10.1, 其余兩台路由器作為Backup路由器。當master路由器出故障后, backup路由器會根據優先級重新選舉出新的master路由器承擔網關功能。Master路由器周期性地發送VRRP報文, 在虛擬路由器中公布其配置信息(優先級等)和工作狀況。Backup路由器通過接收到VRRP報文的情況來判斷Master路由器是否工作工常。
而keepalived 使用的就是VRRP協議, 不過它作用在多台主機上, 而不是路由器組上. 比如我們現在准備搭建的配置: 主機: 192.168.0.7 從機: 192.168.0.8 vip虛擬主機: 192.168.0.12 訪問的時候我們的地址都填 192.168.0.12, 由它決定目前綁定在那個網卡上就由那台機器進行服務, 如果剛好服務的這台機器掛了,它就會綁定到下一台正常的機器的網卡上去,由新機器處理請求,由此實現高可用和避免單點故障. |--- 13 web機 |---- 07轉發(ng) ---- |--- 14 go程序 | |--- 15 php-cgi 請求 --> 12-| | |---- 08 (時刻待命取代07) (1)keepalived簡介 keepalived使用的是VRRP協議方式。簡單的說就是,Keepalived的目的是模擬路由器的高可用,Heartbeat或Corosync的目的是實現Service的高可用。 keepalived是模塊化設計,不同模塊負責不同的功能,下面是keepalived的組件 : @1. core 模塊 是keepalived的核心,負責主進程的啟動和維護,全局配置文件的加載解析等 。 @2. check模塊 負責healthchecker(健康檢查),包括了各種健康檢查方式,以及對應的配置的解析包括LVS的配置解析 。 @3. vrrp模塊 VRRPD子進程,VRRPD子進程就是來實現VRRP協議的 。 @4. libipfwc模塊 iptables(ipchains)庫,配置LVS會用到 。 @5. libipvs* 模塊 配置LVS會用到 。 備注:keepalived和LVS完全是兩碼事,只不過他們各負其責相互配合而已。 keeplived 是檢測機器的健康狀況, 發現病體機器將其移除, lvs 是實現多台機器都均衡處理請求.
keepalived 開始搭建
在主從機器上各自安裝好keeepalived 下載鏈接: http://www.keepalived.org/download.html 或者 wget http://www.keepalived.org/software/keepalived-2.0.2.tar.gz 然后解壓進入目錄執行安裝三板斧 ./configure --prefix=/usr/local/keepalived && make && make install
編輯配置文件
mkdir /etc/keepalived -p #新建配置目錄
#復制默認配置到/etc/keepalived 目錄去(別拼錯,否則默認加載失敗的,到時程序都起不來就只能用-f指定配置路徑了)
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
然后編輯配置文件 vim /usr/local/etc/keepalived/keepalived.conf 內容如下:(只保留這兩節即可,其他的是lvs的配置的,暫時去掉) ! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id NodeA #節點名,唯一,08可以叫NodeB #vrrp_strict #把這王八蛋注釋掉,不然嚴格遵守vvrp協議,訪問不了vip的 vrrp_skip_check_adv_addr vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_instance VI_1 { state MASTER #名字唯一,主機07填MASTER,從機08填BACKUP interface eth0 #網卡名,跟你機器對應上 virtual_router_id 51 #主從機器保持統一 priority 150 #設置主機的值大於從機即可 advert_int 1 authentication { auth_type PASS auth_pass 1111 #不動 } virtual_ipaddress { 192.168.0.12/24 #你要的虛擬ip的地址,自己填一個,別填已經使用的即可.(填不填子網號24看你,本人親測有沒有都ok,之所以填寫是因為執行ip a 查看到eth0網卡上也有192.168.0.7/24 字樣) } } 上面各自按照要求都配置好后執行啟動: /usr/local/keepalived/sbin/keepalived -D 如果指定配置文件路徑可以使用-f: /usr/local/keepalived/sbin/keepalived -D -f /tmp/keepalived.conf
查看運行
@1.使用ip a 命令查看網卡綁定的詳細信息, ifconfig只會顯示默認的那個,不顯示其他的綁定 [root@07 keepalived]# ip a eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:1c:42:dc:15:9a brd ff:ff:ff:ff:ff:ff inet 192.168.0.7/24 brd 192.168.0.255 scope global eth0 valid_lft forever preferred_lft forever inet 192.168.0.12/24 scope global secondary eth0 <--- 看12也在這個網卡下 valid_lft forever preferred_lft forever inet6 fe80::21c:42ff:fedc:159a/64 scope link valid_lft forever preferred_lft forever @2. 兩台主機的keepalived都檢查運行后, 在192.168.0.3 上(或局域網內的任意一台機器上)運行下 arp -an (掃描查看以太網內所有主機的mac信息) PS:不要在主從機上執行, 因為不完整,不會顯示vip的信息的 ➜ ~ arp -an ? (192.168.0.1) at a4:56:2:92:c2:73 on en0 ifscope [ethernet] ? (192.168.0.7) at 0:1c:42:dc:15:9a on en0 ifscope [ethernet] ? (192.168.0.8) at 0:1c:42:c0:7a:40 on en0 ifscope [ethernet] ? (192.168.0.12) at 0:1c:42:dc:15:9a on en0 ifscope [ethernet] ? (224.0.0.251) at 1:0:5e:0:0:fb on en0 ifscope permanent [ethernet] ? (239.255.255.250) at 1:0:5e:7f:ff:fa on en0 ifscope permanent [ethernet] 可看到 12機器后面的mac地址跟07的是一樣的, 這說明192.168.0.12這個vip也綁定到跟07一個共同網卡上了. 然后在07上查看日志, keepalived 日志在 /var/log/message 里 [root@07 keepalived]# tail -f /var/log/messages Jun 15 16:28:20 07 Keepalived_vrrp[1716]: Sending gratuitous ARP on eth0 for 192.168.0.12 Jun 15 16:28:20 07 Keepalived_vrrp[1716]: Sending gratuitous ARP on eth0 for 192.168.0.12 Jun 15 16:28:20 07 Keepalived_vrrp[1716]: Sending gratuitous ARP on eth0 for 192.168.0.12 Jun 15 16:28:20 07 Keepalived_vrrp[1716]: Sending gratuitous ARP on eth0 for 192.168.0.12 由上提示意思是 各位以太網小伙伴們注意了 192.168.0.12 的mac地址在我的網卡上,你們來這找它啊! 如果都OK 了, 那么在以太網內任意機器上 ping 一下vip地址, 如果能ping通, 並且主從機也能ping通, 基本就沒問題了. [root@08 keepalived]# ping 192.168.0.12 PING 192.168.0.12 (192.168.0.12) 56(84) bytes of data. 64 bytes from 192.168.0.12: icmp_seq=1 ttl=64 time=0.327 ms 64 bytes from 192.168.0.12: icmp_seq=2 ttl=64 time=0.577 ms
運行測試
然后在主從機器上各自搭建ng+php訪問, curl http://192.168.0.8/index.php 的輸出內容為 "i am 08"; curl http://192.168.0.7/index.php 的輸出內容為 "i am 07"; 都能訪問的話, 用vip地址來訪問, 因為現在vip綁定的是07的網卡,因此應該也輸出"i am 07" curl http://192.168.0.12/index.php #輸出 "i am 07" , 非常成功. 現在我把07機器關掉, 再其他機器上用arp -an 查看局域網內的mac信息 ➜ ~ arp -an ? (192.168.0.1) at a4:56:2:92:c2:73 on en0 ifscope [ethernet] ? (192.168.0.7) at 0:1c:42:dc:15:9a on en0 ifscope [ethernet] ? (192.168.0.8) at 0:1c:42:c0:7a:40 on en0 ifscope [ethernet] ? (192.168.0.12) at 0:1c:42:c0:7a:40 on en0 ifscope [ethernet] ? (224.0.0.251) at 1:0:5e:0:0:fb on en0 ifscope permanent [ethernet] ? (239.255.255.250) at 1:0:5e:7f:ff:fa on en0 ifscope permanent [ethernet] 對比下上面的,發現12地址的mac信息, 立馬綁定成跟08的mac地址一樣了, 說明現在它們共用網卡了,避免了單點故障. 再次訪問 ➜ ~ curl http://192.168.0.12/index.php i am 08 ... vip成功轉移到192.168.0.8這台機器上,於是keepalived成功了.
--> PS: 一旦ping不通(dns的問題我不管)首先把看下是否去掉了配置文件里的 vrrp_strict [它表嚴格執行vvrp協議,還不行再把防火牆搞掉], 否則搞死你半天都不知咋回事.
在有“vrrp_strict”的時候,就會有下面的iptables規則: [root@centos ~]# iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination DROP all -- 0.0.0.0/0 192.168.111.130 把這個選項去掉了之后,重新啟動keepalived就完全沒有了。
附上即是通知以太網內vip更新mac信息的指令
說不定arp開啟了緩存, 你ping不通的原因可能也是這個, 因此主動向局域網內的成員推送12這台新增vip的mac信息 arping -c 5 -U -I eth0 192.168.1.12 -c 表示要發多少個廣播包。 -U 非請求模式,更新同網段設備上的arp緩存。 -I 通過哪個接口發送數據包,這個會使用到這個網卡的mac的地址。