1. 程式人生 > >keepalived實現服務高可用

keepalived實現服務高可用

keepalived高可用

環境說明
    系統: centos 7.4
    軟件: keepalived: 1.3.5  nginx: 1.12.2  tcpdump工具
    主機:192.168.9.222  192.168.9.223 
    vip地址: 192.168.9.151

keepalived說明

  Keepalived軟件主要是通過VRRP協議實現高可用功能的。VRRP是Virtual Router RedundancyProtocol(虛擬路由器冗余協議)的縮寫,VRRP出現的目的就是為了解決靜態路由單點故障問題的,它能夠保證當個別節點宕機時,整個網絡可以不間斷地運行。

1、keepalived服務的三個重要功能

  管理LVS負載均衡軟件
  實現LVS集群節點的健康檢查中
  作為系統網絡服務的高可用性(failover)

1.2、Keepalived高可用故障轉移原理

  keepalived高可用服務對主機之間的故障切換轉移是通過vrrp (虛擬路由冗余協議)來實現的, 當keepalived主正常工作時,主節點會不停的備節點發送(多播)心跳信息證明還存活,當主web發送故障就無法發送心跳信息,這裏keeplaived會將資源vip切換到備節點,但當主節點又活過來之後,備節點會釋放自己的資源給主節點,恢復原來的角色。

1.3、keepalived工作原理

keepalived是通過vrrp協議進行通信的,我們首先需要先了解一下vrrp協議的信息
    1)vrrp 虛擬路由冗余協議,vrrp最早是為了解決路由單機故障而出現;
    2)vrrp是通過一種竟選協議機制來將路由任務交給某臺vrrp rs的;
    3)vrrp是通過多播的方式實現高可用對之間通信;
    4)備節點可以有多個通過優先級競選,但一般keepalived系統運維工作都是一對;避免競爭產生的問題;
    5)vrrp使用了加密協議加密數據,但keepalived官方目前還是推薦用明文的方式配置認證類型和密碼

2、安裝及配置

2.1、keepalived安裝

# 安裝keepalived   這裏兩臺機器都需要安裝
Host# yum -y install keepalived libnl3-devel ipset-devel nginx 

# 查看安裝的相關包
Host# rpm -ql keepalived
/etc/keepalived
/etc/keepalived/keepalived.conf
/etc/sysconfig/keepalived
/usr/bin/genhash
/usr/lib/systemd/system/keepalived.service
/usr/libexec/keepalived
/usr/sbin/keepalived

默認配置說明

Host # cat keepalived.conf 
! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   # 從這往上是配置郵件信息的

   router_id LVS_DEVEL          # 用於標識本節點的名稱
   vrrp_skip_check_adv_addr 默認是不跳過檢查。檢查收到的VRRP通告中的所有地址可能會比較耗時,設置此命令的意思是,如果通告與接收的上一個通告來自相同的master路由器,則不執行檢查(跳過檢查)。   
   vrrp_strict              #嚴格執行VRRP協議規範,此模式不支持節點單播
   vrrp_garp_interval 0     # 接口發送ARP之間的延遲
   vrrp_gna_interval 0      # 
}

vrrp_instance VI_1 {
    state MASTER            # 狀態有兩個 MASTER 主 | BACKUP 從  
    interface eth0          # 對外的網卡接口,ifconfig 或者ip addr show可查看
    virtual_router_id 51    # 虛擬路由id,每個節點設置必須一樣,相同的ID為一組
    priority 100            # 優先級
    advert_int 1            # 主往從發送多播消息的間隔時長
    authentication {        # 認證信息
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {     # 虛擬ip 可以多個,但建議一個就OK了
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}

virtual_server 192.168.200.100 443 {    # 虛擬服務器地址 IP 對外提供服務的端口
    delay_loop 6        # 健康檢查時長 單位秒
    lb_algo rr          # 負載均衡算法 一般是 rr但 wlc 
    lb_kind NAT         # 負載均衡轉發規則,一般用dr,nat調度器會有瓶頸問題
    persistence_timeout 50  # http服務會話時長 單位秒
    protocol TCP        # 協議 tcp

    real_server 192.168.201.100 443 {   # 真實的對外提供服務的地址跟IP
        weight 1    # 權重 權重越高轉發優先級越高
        SSL_GET {        # HTTP_GET | SSL_GET | TCP_CHECK
            url {
                path /index.html
                digest e93e7f6cfbc7c343707f21e2f681dd31
            }
            connect_timeout 3   # 服務連接端口
            nb_get_retry 3      # 服務連接失敗重試次數
            delay_before_retry 3    # 重試連接間隔 單位 秒
        }
    }
}

相關拓展:" rel="nofollow">關於HTTP_GET | SSL_GET | TCP_CHECK 用法

2.2、配置

真實使用配置 
! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id keepalived
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER
    interface ens160
    virtual_router_id 222
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.9.151
    }
}

virtual_server 192.168.9.151 80 {
    delay_loop 60
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP

    real_server 192.168.9.222 8080 {       兩臺真實主機
        weight 1
        HTTP_GET {
            url {
              path /
              digest 0b03c354bbc6af44b42712a6f6497dc8
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.9.223 8080 {
        weight 1
        HTTP_GET {
            url {
              path /
              digest 78d47efe7fe7916ee20e034bfe24c5b7
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

keepalived]# genhash -s 192.168.9.222 -p 8080 -u /index.html
MD5SUM = 0b03c354bbc6af44b42712a6f6497dc8

將這個獲取到的值填到 digest xxxxxxxxxxxxxx中

Host# scp keepalived.conf [email protected]:/etc/keepalived/
備節點保需要更改一下接口地址、優先級、狀態為BACKUP備節點 其它跟主節點保持一致
vrrp_instance VI_1 {
    state BACKUP
    interface ens160
    virtual_router_id 222
    priority 90

兩邊都啟動nginx跟keepalived   systemctl start keepalive  systemctl start nginx

啟動Keepalived 查看接口地址
keepalived]# ip addr show | grep en
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    inet 192.168.9.222/24 brd 192.168.9.255 scope global ens160
    inet 192.168.9.151/32 scope global ens160

2.3、檢查

此時這裏可以看到主通過Http-get獲取這個地址是否有效,
Host# tcpdump -i ens160 dst 192.168.9.223 and port 8080

技術分享圖片

此時我們在查看 nginx的日誌,發現這裏每秒也有一條記錄在查詢。
技術分享圖片

這裏delay_loop 6 太短了 我們修改一下改成60秒一次
技術分享圖片

此時通過tcpdump可以抓取到主一直在往這個組播地址 每次一秒發送一個包

Host# tcpdump -i ens160 dst 224.0.0.18

技術分享圖片

FAQ

缺少這個組件: https://bugzilla.redhat.com/show_bug.cgi?id=1477572
libipset.so.3: cannot open shared object file: No such file or directory
解決: yum -y install libnl3-devel ipset-devel

keepalived實現服務高可用