keepalived 詳解

前言:


        keepalived是vrrp協議的軟件實現,原生設計目的爲了提供高可用ipvs服務。現已成爲爲主流調度器提供冗餘(雙機熱備),避免單點故障提高高可用性的一件利器。

索引:


1. 主要功能

2. HA Cluster 配置準備:

3. 程序組成

4. 主配置文件結構

5. 實現簡單keepalive地址漂移配置(主從)

6. 實現負載分攤(雙主)配置

7. keepalived 結合Ipvs

8. keepalived調用腳本進行資源監控

9.keepalived同步組



1.主要功能:


① vrrp協議完成地址流動(即爲調度器做冗餘,避免單點故障提高高可用性)

② 爲vip地址所在的節點生成ipvs規則(在配置文件中預先定義)

③ 爲ipvs集羣的各RS做健康狀態檢測

④ 基於腳本調用接口通過執行腳本完成腳本中定義的功能,進而影響集羣事務,以此支持nginx、 haproxy等服務

Keepalived組成:

473da95330efb1b3c75b0f3f448512cd.png

2. HA Cluster 配置準備:


(1) 各節點時間必須同步   ntp(centos 6), chrony(centos 7)

vim  /etc/ntp.conf

server 同步服務器IP  ibrust  #t添加一條

(2) 確保iptables及selinux不會成爲阻礙

(3) 各節點之間可通過主機名互相通信(對KA並非必須)

建議使用/etc/hosts文件實現

(4) 各節點之間的root用戶可以基於密鑰認證的ssh服務完

成互相通信(對KA並非必須)

方法:

ssh-keygen  

#生成祕鑰。第一次提示存放祕鑰路徑,默認~/.ssh/id_rsa回車就好。後兩次是否加密祕

鑰,實驗方便直接回車不加密,安全性考慮應加密。

cd .ssh

ssh-copy-id  目標主機名或IP  #默認發送公鑰,到目標主機後改名爲authorized_keys

3. 程序組成


keepalived安裝配置:

CentOS 6.4+ Base源

    主配置文件: /etc/keepalived/keepalived.conf

    主程序文件: /usr/sbin/keepalived

    Unit File: /usr/lib/systemd/system/keepalived.service

    Unit File的環境配置文件: /etc/sysconfig/keepalived

    配置範例:/usr/share/doc/keeplived-1.2.13/samples

配置日誌:

    vim /etc/sysconfig/keepalived

    KEEPALIVED_OPTIONS="-D -S 2"

    vim /etc/rsyslog.conf

    local2.*          /var/log/keepalived.log

4. 主配置文件結構(三大塊)



cat /etc/keepalived/keepalived.conf


GLOBAL CONFIGURATION  #定義郵件通知相關,同組調度器間組播配置

        Global definitions

        Static routes/addresses

VRRPD CONFIGURATION

       VRRP synchronization group(s): vrrp同步組

       VRRP instance(s):即一個vrrp虛擬 路由器

LVS CONFIGURATION

       Virtual server group(s)

       Virtual server(s): ipvs集羣的vs和rs

5. 實現簡單keepalive地址漂移配置(主從)


5.1 實驗拓撲

59f6a012dfa65f660e33e42b030ef6e6.png

5.2 配置6m1

cd /etc/keepalived

cp keepalived.conf{,.bak}

vim keepalived.conf

global_defs {

  notification_email {

    root@localhost    #發生故障給哪些郵箱發郵件通知

  }

  notification_email_from 6m1@localhost  #從哪個郵箱發出

  smtp_server 127.0.0.1  #郵件服務器

  smtp_connect_timeout 30

  router_id 6m1  #當前調度器主機名(可自定義)

  vrrp_mcast_group4 224.100.100.43  #自定義同組調度器直接組播地址

}


vrrp_instance VI_1 {

   state MASTER

   interface eth0

   virtual_router_id 51 #虛擬路由組id自定義,同組內調度器id應相同

   priority 100         #優先級

   advert_int 2         #發送間隔

   authentication {

       auth_type PASS

       auth_pass centos  #認證密碼

    }

   virtual_ipaddress {

       172.18.43.77/24  #vip

   }


   track_interface {  #當eth0出現故障時,eth1接替eth0工作

   eth0

   eth1

    }

}

5.3 配置6m2

修改同組內另一臺調度器配置,不同的配置項:

router_id 6m2

state BACKUP

priority 90

5.4 測試

兩臺主機啓動服務,抓包觀察雙方組播通信過程:

d6ae117b6317be11fdfeba3d78f11f93.png

可看到6m1主機一直髮送自己的優先級,宣稱自己的MASTER地位。6m2優先級小於100實力沒人家強大,迫於淫威所以不發送信息。

將6m1服務停止,繼續觀察:

95c5d9e937b79056dbab6ee51f5969ae.png

首先6m1發送prio=0表示自己放棄MASTER的地位,此時6m2優先級最高開始宣稱主權。

另開一臺主機ping 172.18.43.77可發現只有兩臺調度器同時服務停掉的情況下才會出現不通的狀況,從側面表現出了高可用的特性

5.5 腳本方式實現通知功能

兩臺服務器自定義通知腳本,並加執行權限:

e386c435d75584cd6d75eec4ce9c6a17.png

修改配置文件:

在虛擬路由器配置實例中添加如圖三條配置

537098ef47e52423144d2bb889ed859e.png

測試:

將6m1停止服務後,6m2會收到自己接任master的郵件

d7ceb8d77241d70932bb46d4a20aede6.png

6. 實現負載分攤(雙主)配置


實驗目的:路由器的一個接口上創建多個虛擬路由器,使得一個實體路由器在一個虛擬路由器中作爲master路由器,同時在其他的虛擬路由器中作爲backup路由器。多臺路由器應對不同業務分飾兩角,同時承擔業務實現負載均衡。

d62e3a92ca31539b844c12d1142d054c.png

6.1 修改6m1配置文件

在實例1下新增實例2

52e7236b937ec92afe8d792375e9a367.png

6.2 修改6m2配置文件

新增實例2與6m1相比修改內容如下:

state MASTER

priority     100

7. keepalived 結合Ipvs


7.1keepalived.conf中關於IPVS配置段結構:

virtual_server IP port |

virtual_server fwmark int

{

      ...

      real_server {

      ...

}

      ...

}

7.2 常用配置參數

delay_loop <INT>:#服務輪詢的時間間隔

lb_algo rr|wrr|lc|wlc|lblc|sh|dh:#定義調度方法

lb_kind NAT|DR|TUN:#集羣的類型

persistence_timeout <INT>:#持久連接時長

protocol TCP:#服務協議,僅支持TCP

sorry_server <IPADDR> <PORT>:#所有RS故障時,備用服務器地址

real_server <IPADDR> <PORT>

{

   weight <INT> RS權重

   notify_up <STRING>|<QUOTED-STRING> RS上線通知腳本

   notify_down <STRING>|<QUOTED-STRING> RS下線通知腳本

   HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK

   { ... }:#定義當前主機的健康狀態檢測方法

}

7.3 KeepAlived應用層配置檢測

HTTP_GET|SSL_GET {

 url {

    path <URL_PATH>:  #定義要監控的URL

    status_code <INT>:  #判斷上述檢測機制爲健康狀態的響應碼

    digest <STRING>:    #判斷爲健康狀態的響應的內容的校驗碼

     }

connect_timeout <INTEGER>:#連接請求的超時時長

nb_get_retry <INT>:                #重試次數

delay_before_retry <INT>:      #重試之前的延遲時長

connect_ip <IP ADDRESS>:  #向當前RS哪個IP地址發起健康狀態檢測請求

connect_port <PORT>:           #向當前RS的哪個PORT發起健康狀態檢測請求

bindto <IP ADDRESS>:          #發出健康狀態檢測請求時使用的源地址

bind_port <PORT>:                #發出健康狀態檢測請求時使用的源端口

7.4 實驗:實現keepalive結合DR模型ipvs高可用調度

實驗拓撲:

cfaa144d1bea5bac984f676ac7aaed32.png

① 後端真實服務器分別安裝http,配置DR模型腳本

腳本如下:

#!/bin/bash

#

vip=172.18.43.77

mask='255.255.255.255'

dev=lo:1

rpm -q httpd &> /dev/null || yum -y install httpd &>/dev/null

service httpd start &> /dev/null && echo "The httpd Server is Ready!"

echo "<h1>`hostname`</h1>" > /var/www/html/index.html


case $1 in

start)

   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/all/arp_announce

   echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

   ifconfig $dev $vip netmask $mask broadcast $vip up

   route add -host $vip dev $dev

   echo "The RS Server is Ready!"

   ;;

stop)

   ifconfig $dev down

   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/all/arp_announce

   echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce

   echo "The RS Server is Canceled!"

   ;;

*)

   echo "Usage: $(basename $0) start|stop"

   exit 1

   ;;

esac

分別執行腳本:

8fe07ebed18658257014583458ce920b.png

② 分別配置keepalived

vim  /etc/keepalived/keepalived.conf


virtual_server 172.18.43.77 80 {

   delay_loop 6

   lb_algo wrr

   lb_kind DR

   protocol TCP


   real_server 172.18.43.71 80 {

       weight 1

       HTTP_GET {

           url {

             path /index.html

             status_code 200

          }

           connect_timeout 3

           nb_get_retry 3

           delay_before_retry 3

       }

   }

   real_server 172.18.43.72 80 {

       weight 1

       HTTP_GET {

           url {

             path /index.html

             status_code 200

          }

           connect_timeout 3

           nb_get_retry 3

           delay_before_retry 3

       }

   }

}

③ 前端分別安裝ipvsadm,重載keepalived,查看ipvs策略:

b53658f75e333a9ec080b5bc7bd890bb.png

④ 測試

76d8a7b8d5b66f97389f01cbeb20c484.png


8. keepalived調用腳本進行資源監控


8.1 功能實現:

keepalived調用外部的輔助腳本進行資源監控,並根據監控的結果狀態能實現優先動態調整

vrrp_script:自定義資源監控腳本, vrrp實例根據腳本返回值(返回非0值執行下面腳本內容),公共定義,可被多個實例調用,定義在vrrp實例之外

track_script:調用vrrp_script定義的腳本去監控資源,定義在實例之內,調用事先定義的vrrp_script

8.2 配置示例:

分兩步: (1) 先定義一個腳本; (2) 實例中調用此腳本

vrrp_script <SCRIPT_NAME> {

   script ""

   interval INT

   weight -INT

}

track_script {

   SCRIPT_NAME_1

   SCRIPT_NAME_2

}

8.3 實驗:

(1) 先定義一個腳本

    見附件:定義腳本

(2) 實例中調用此腳本

    見附件:調用腳本


9.keepalived同步組


使用場景:LVS NAT模型VIP和DIP需要同步,需要同步組

示例:

    見附件:同步組







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章