Keepalived 配置和使用


官網地址

編譯安裝

# 安裝依賴包
[root@C7-01 ~]# yum install -y gcc openssl-devel libnl3-devel net-snmp-devel


# 解壓
[root@C7-01 ~]# tar xvf keepalived-2.2.2.tar.gz -C /usr/local/src


# 編譯安裝
[root@C7-01 ~]# cd /usr/local/src/keepalived-2.2.2/
[root@C7-01 ~]# ./configure --prefix=/opt/app/keepalived
[root@C7-01 ~]# make
[root@C7-01 ~]# make install


# 查看版本
[root@C7-01 ~]# /opt/app/keepalived/sbin/keepalived -v
Keepalived v2.2.2 (03/05,2021)

Copyright(C) 2001-2021 Alexandre Cassen, <acassen@gmail.com>

Built with kernel headers for Linux 3.10.0
Running on Linux 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020
Distro: CentOS Linux 7 (Core)

configure options: --prefix=/opt/app/keepalived

Config options:  LVS VRRP VRRP_AUTH VRRP_VMAC OLD_CHKSUM_COMPAT INIT=systemd

System options:  VSYSLOG LIBNL3 RTA_ENCAP RTA_EXPIRES RTA_PREF FRA_SUPPRESS_PREFIXLEN FRA_TUN_ID RTAX_CC_ALGO RTAX_QUICKACK RTA_VIA IFA_FLAGS NET_LINUX_IF_H_COLLISION LIBIPTC_LINUX_NET_IF_H_COLLISION LIBIPVS_NETLINK IFLA_LINK_NETNSID GLOB_BRACE GLOB_ALTDIRFUNC INET6_ADDR_GEN_MODE SO_MARK

# 安裝完會自動生成 service 文件
[root@C7-01 ~]# cat /lib/systemd/system/keepalived.service
[Unit]
Description=LVS and VRRP High Availability Monitor
After=network-online.target syslog.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/run/keepalived.pid
KillMode=process
EnvironmentFile=-/usr/local/keepalived/etc/sysconfig/keepalived
ExecStart=/usr/local/keepalived/sbin/keepalived  $KEEPALIVED_OPTIONS
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target

啟動 Keepalived

默認 Keepalived 會去 /etc/keepalived/ 路徑下去尋找配置文件,因此安裝完成后需要自己創建 /etc/keepalived/ 目錄,並將配置文件放入該目錄下,否則會報錯。也可以在 service 文件中使用 -f 選項指定配置文件的位置。

# 方式一:創建目錄和配置文件。
[root@C7-01 ~]# mkdir /etc/keepalived
[root@C7-02 ~]# cp /opt/app/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

# 方式二:修改 service 文件,指定配置文件位置。
[root@C7-01 ~]# vim /lib/systemd/system/keepalived.service
ExecStart=/opt/app/keepalived/sbin/keepalived -f /opt/app/keepalived/etc/keepalived/keepalived.conf $KEEPALIVED_OPTIONS

# 啟動 keepalived 服務

配置文件

Keepalived 的配置文件大概分為三部分組成:

  • global_defs :全局配置
  • vrrp_instance :虛擬路由配置
  • virtual_server :虛擬IP與后端真實服務IP的對應關系配置

常用配置項說明:

! Configuration File for keepalived

# 全局配置
global_defs {
   notification_email {
     wuvikr@aliyun.com		# keepalived 發生故障切換時發送郵件的目標郵箱
     root@localhost
   }
   notification_email_from wuvikr@aliyun.com	# 發郵件的地址
   smtp_server 192.168.200.1    # SMTP郵件服務器地址
   smtp_connect_timeout 30      # 郵件服務器超時時間
   router_id C7-01.wuvikr.top   # keepalived 主機唯一標識,建議使用當前主機名
   vrrp_skip_check_adv_addr     # 如果收到的通告報文和上一個報文是同一個路由,則跳過檢查,默認為檢查所有報文
   #vrrp_strict                 # 開啟vrrp嚴格模式,一般不建議使用
   vrrp_garp_interval 0         # gratuitous ARP messages 報文發送延遲,0表示不延遲
   vrrp_gna_interval 0          # unsolicited NA messages (不請自來)消息發送延遲
   vrrp_mcast_group4 224.0.0.18 # 指定組播IP地址范圍:224.0.0.0到239.255.255.255,默認值:224.0.0.18
}

# VIP 虛擬路由實例配置
vrrp_instance VI_1 {
    state MASTER                # 當前節點在此虛擬路由器上的初始狀態,狀態為MASTER或者BACKUP
    interface eth0             	# 綁定當前虛擬路由器使用的物理接口,可以不和VIP在同一個網卡
    virtual_router_id 11        # 每個虛擬路由器惟一標識,范圍:0-255,同屬一個虛擬路由器的多個 keepalived 節點此值必須相同
    priority 100                # 當前物理節點在此虛擬路由器的優先級,范圍:1-254
    advert_int 1		# vrrp通告的時間間隔,默認1s
    nopreempt			# 非搶占式
    authentication {            # 認證機制
        auth_type PASS          # 認證類型,可以是AH或PASS,AH為IPSEC認證(不推薦),PASS為簡單密碼(建議使用)
        auth_pass 111111        # 預共享密鑰,即相互認證密碼
    }
    virtual_ipaddress {         	          # 虛擬路由IP
        172.16.200.251          	          # 指定VIP,不指定網卡,默認eth0,注意:不指定/prefix,默認為32
        172.16.200.252/24 dev eth1 	          # 指定VIP的MASK和網卡
        192.168.200.102/24 dev eth2 label eth2:1  # 指定VIP的label
    }
    # 使用單播配置,按需求和上面的組播二選一即可
    unicast_src_ip 172.16.200.10	# 本機IP
    unicast_peer{
        172.16.200.20			# 指向其他Keepalived主機IP
    }
}

# LVS 負載均衡調度器配置
virtual_server 172.16.200.251 3306 {	# VS主機IP地址及其端口
    delay_loop 6			# 檢查后端服務器的時間間隔
    lb_algo rr				# 定義調度方法,rr|wrr|lc|wlc|lblc|sh|mh|dh|fo|ovf|lblcr|sed|nq
    lb_kind NAT				# LVS類型,注意要大寫, NAT|DR|TUN
    persistence_timeout 50		# 持久連接時長
    protocol TCP			# 指定服務協議,一般默認為TCP,TCP|UDP|SCTP
    sorry_server			# 所有的RS都故障時,備用服務器地址
		
    # 后端真實服務器配置
    real_server 172.16.200.251 3306 {	# RS的IP和PORT
        weight 1			# 調度權重
        notify_up			# RS上線通知腳本
        notify_down			# RS下線通知腳本
        HTTP_GET|SSL_GET {
            url {
        	 path /health.html	    # 定義要監控的URL
        	 status_code 200	    # 判斷上述檢測機制為健康狀態的響應碼,一般為 200
            }
    	    connect_timeout 2 	            # 客戶端請求的超時時長, 相當於haproxy的timeout server
            nb_get_retry 3        	    # 重試次數
    	    delay_before_retry 1            # 重試之前的延遲時長
    	    connect_ip 172.16.200.25        # 向當前RS哪個IP地址發起健康狀態檢測請求
            connect_port 80/443             # 向當前RS的哪個PORT發起健康狀態檢測請求
            bindto <IP ADDRESS>             # 向當前RS發出健康狀態檢測請求時使用的源地址
            bind_port <PORT>                # 向當前RS發出健康狀態檢測請求時使用的源端口
        }
        TCP_CHECK {
     	    connect_ip 172.16.200.25    # 向當前RS的哪個IP地址發起健康狀態檢測請求
            connect_port 3306        	# 向當前RS的哪個PORT發起健康狀態檢測請求
            bindto <IP ADDRESS>         # 發出健康狀態檢測請求時使用的源地址
     	    bind_port <PORT>            # 發出健康狀態檢測請求時使用的源端口
     	    connect_timeout <INTEGER>   # 客戶端請求的超時時長, 等於haproxy的timeout server
            nb_get_retry 3              # 重新連接次數
            delay_before_retry 3        # 重新連接間隔時間
        }
    }
}

子配置文件

keepalived 支持子配置文件,在主配置文件末尾,添加 include 語句,則可以從指定目錄中加載配置文件。

范例

include /etc/keepalived/conf.d/*.conf

開啟 Keepalived 日志

Keepalived 日志默認輸出到系統日志 /var/log/messages 文件中,可以修改配置使其輸出到一個獨立的 log 文件中。

# 修改參數文件
[root@C7-01 ~]# vim /opt/app/keepalived/etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -S 6"

# 修改系統日志文件
[root@C7-01 ~]# vim /etc/rsyslog.conf
local6.*                                                /var/log/keepalived.log

# 重啟服務
[root@C7-01 ~]# systemctl restart keepalived.service rsyslog.service

# 查看日志
[root@C7-01 ~]# tail /var/log/keepalived.log
May 12 16:22:13 posptest Keepalived_vrrp[23723]: Sending gratuitous ARP on eth0 for 172.16.200.251
May 12 16:22:13 posptest Keepalived_vrrp[23723]: Sending gratuitous ARP on eth0 for 172.16.200.251
May 12 16:22:13 posptest Keepalived_vrrp[23723]: Sending gratuitous ARP on eth0 for 172.16.200.251
May 12 16:22:13 posptest Keepalived_vrrp[23723]: Sending gratuitous ARP on eth0 for 172.16.200.251
May 12 16:22:18 posptest Keepalived_vrrp[23723]: (VI_1) Sending/queueing gratuitous ARPs on eth0 for 172.16.200.251
May 12 16:22:18 posptest Keepalived_vrrp[23723]: Sending gratuitous ARP on eth0 for 172.16.200.251
May 12 16:22:18 posptest Keepalived_vrrp[23723]: Sending gratuitous ARP on eth0 for 172.16.200.251
May 12 16:22:18 posptest Keepalived_vrrp[23723]: Sending gratuitous ARP on eth0 for 172.16.200.251
May 12 16:22:18 posptest Keepalived_vrrp[23723]: Sending gratuitous ARP on eth0 for 172.16.200.251
May 12 16:22:18 posptest Keepalived_vrrp[23723]: Sending gratuitous ARP on eth0 for 172.16.200.251

LVS 高可用

Keepalived 可以通過 virtual_server 自動將 VIP 配置成 LVS 來進行請求的調度。

范例:

這里以 MySQL 為例,實現通過 VIP 172.16.200.251 將請求調度到后端的兩個 RS 服務器 172.16.200.203、172.16.200.211上。由於選擇使用 LVS 的 DR 模型,因此需要先在本地 lo 網卡綁定 VIP,使用下面的腳本實現:

[root@c7-01 ~]# cat /etc/init.d/lvs_dr_rs.sh
#!/bin/bash
#
#********************************************************************
#Author:            Wuvikr
#QQ:                744123155
#Date:              2021-05-25
#FileName           lvs_dr_rs.sh
#URL:               http://www.wuvikr.top
#Description        The test script
#Copyright (C):     2021 All rights reserved
#********************************************************************

echo_colors() {
    echo -e "\e[1;$1m$2\e[0m"
}

trap "echo_colors 36 'Thank you for using, goodbye !'" EXIT

vip=172.16.200.251
mask=255.255.255.255
#prefix=32
dev=lo:1

case $1 in
start)
    # 禁用本地ARP請求,綁定回環地址。
    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
    
    # 在回環地址上綁定VIP,設置掩碼,與Director服務器自身IP保持通信
    /sbin/ifconfig ${dev} ${vip} netmask ${mask} up
    route add -host ${vip} dev ${dev}
    #ip addr add ${vip}/${prefix} dev $dev label ${dev}
    #ip route add ${vip} via 0.0.0.0 scope link src ${vip} dev ${dev}

    echo_colors 32 "LVS-DR Real Server starts successfully.\n"
    ;;
stop)
    /sbin/ifconfig $dev down
    /sbin/route del $vip
    #ip addr del ${vip}/${prefix} dev ${dev}
    #ip route del $vip

    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_colors 31 "LVS-DR Real Server stopped.\n"
    ;;
*)
    echo "Usage: $(basename $0) start|stop"
    exit 1
    ;;
esac

將上面的腳本加上執行權限並設置開機自動執行,最后執行上面的腳本:

# 添加執行權限
[root@c7-01 ~]# chmod +x /etc/init.d/lvs_dr_rs.sh

# 開機自啟
[root@c7-01 ~]# echo "/etc/init.d/lvs_dr_rs.sh start" >> /etc/rc.d/rc.local

# 執行腳本
[root@c7-01 ~]# /etc/init.d/lvs_dr_rs.sh start

Keepalived 配置文件如下:

vrrp_instance VIP{
    state BACKUP                # 當前節點在此虛擬路由器上的初始狀態,狀態為MASTER或者BACKUP
    interface eth0              # 綁定當前虛擬路由器使用的物理接口,可以不和VIP在同一個網卡
    virtual_router_id 111       # 每個虛擬路由器惟一標識,范圍:0-255,同屬一個虛擬路由器的多個 keepalived 節點此值必須相同
    priority 100                # 當前物理節點在此虛擬路由器的優先級,范圍:1-254
    advert_int 1                # vrrp通告的時間間隔,默認1s
    nopreempt                   # 非搶占式
    authentication {            # 認證機制
        auth_type PASS          # 認證類型,可以是AH或PASS,AH為IPSEC認證(不推薦),PASS為簡單密碼(建議使用)
        auth_pass 111111        # 預共享密鑰,即相互認證密碼
    }
    virtual_ipaddress {         # 虛擬路由IP
        172.16.200.251          # 指定VIP,不指定網卡,默認eth0,注意:不指定/prefix,默認為32
    }
}

virtual_server 172.16.200.251 3306 {  # 虛擬路由 IP 和 PORT
    delay_loop 3                      # 檢查后端服務器的時間間隔
    lb_algo rr                        # 定義調度方法,rr|wrr|lc|wlc|lblc|sh|mh|dh|fo|ovf|lblcr|sed|nq
    lb_kind DR                        # LVS類型,注意要大寫, NAT|DR|TUN
    protocol TCP                      # 指定服務協議,一般默認為TCP,TCP|UDP|SCTP

    real_server 172.16.200.203 3306 {   # RS的IP和PORT
        weight 1                        # 調度權重
        TCP_CHECK {
            nb_get_retry 3              # 重新連接次數
            delay_before_retry 3        # 重新連接間隔時間
            connect_port 3306           # 向當前RS的哪個PORT發起健康狀態檢測請求
            connect_timeout 3           # 客戶端請求的超時時長, 等於haproxy的timeout server
        }
    }
    real_server 172.16.200.211 3306 {
        weight 1
        TCP_CHECK {
            nb_get_retry 3
            delay_before_retry 3
            connect_port 3306
            connect_timeout 3
        }
    }
}

從 Keepalived 配置文件唯一的區別僅是 priority 值不一樣,配置完成后重啟 Keepalived 服務,並查看 IP :

[root@c7-01 ~]# systemctl restart keepalived.service

[root@c7-01 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet 172.16.200.251/32 scope global lo:1
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether fa:30:49:3c:12:00 brd ff:ff:ff:ff:ff:ff
    inet 172.16.200.203/24 brd 172.16.200.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet 172.16.200.251/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::d629:4b7f:837e:df98/64 scope link tentative noprefixroute dadfailed
       valid_lft forever preferred_lft forever
     
[root@c7-02 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet 172.16.200.251/32 scope global lo:1
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether fa:9a:af:7c:4b:00 brd ff:ff:ff:ff:ff:ff
    inet 172.16.200.211/24 brd 172.16.200.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::d629:4b7f:837e:df98/64 scope link tentative noprefixroute dadfailed
       valid_lft forever preferred_lft forever

使用另一台 Client 訪問一下 VIP 172.16.200.251 查看一下效果:

[root@c7-03 ~]# while true; do mysql -utest -p'Test#123.com' -h172.16.200.252 -N -s -e "select @@server_id" 2> /dev/null ; sleep 0.5 ;done
203
211
203
211

可以發現,請求被成功調度到了后面的 RS 服務器。

VRRP Script 實現應用高可用

Keepalived 利用 VRRP Script 技術,可以調用外部的輔助腳本進行資源監控,並根據監控的結果進行動態調整,從而實現其它應用的高可用性功能。

VRRP Script 配置

定義腳本

vrrp_script:自定義資源監控腳本,vrrp實例根據腳本返回值來絕對是否進行后續操作。公共定義,可被多個實例同時調用,定義在vrrp實例之外的獨立配置塊,注意,定義部分需要在調用部分的前面,否則會報錯。一般放在global_defs設置塊之后。

vrrp_script <SCRIPT_NAME> {         # 定義一個檢測腳本
    script <STRING>|<QUOTED-STRING> # script 也可以是一個簡單 shell 命令,返回值為非0時則觸發下面 OPTIONS 執行
    interval <INTEGER>              # 檢測間隔時間,單位為秒,默認1秒
    timeout <INTEGER>               # 超時時間
    weight <INTEGER:-254..254>      # 默認為0,如果設置此值為負數,當上面腳本返回值為非0時,會將此值與本節點權重相加可以降低本節點權重,即表示fall. 如果是正數,當腳本返回值為0,會將此值與本節點權重相加可以提高本節點權重,即表示 rise.通常使用負值
    fall <INTEGER>                  # 腳本幾次失敗轉換為失敗,建議設為2以上
    rise <INTEGER>                  # 腳本連續監測成功后,把服務器從失敗標記為成功的次數
    user USERNAME [GROUPNAME]       # 執行監測腳本的用戶或組
    init_fail                       # 設置默認標記為失敗狀態,監測成功之后再轉換為成功狀態
}

調用腳本

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

track_script {
		SCRIPT_1
    SCRIPT_2
}

范例: Nginx 反向代理的高可用

在兩個 Nginx 節點都配置相同的反向代理服務。

[root@Nginx01 ~]# vim /etc/nginx/nginx.conf 
http {
    upstream websrvs {
        server 10.0.0.7:80 weight=1;
        server 10.0.0.17:80 weight=1;
    }
    server {
    		listen 80;
        location /{
            proxy_pass http://websrvs/;
        }
    }
}

Keepalived 配置:

vrrp_script check_nginx {
    script "/etc/keepalived/check_nginx.sh"
    #script "/usr/bin/killall -0 nginx"
    interval 1
    weight -30
    fall 3
    rise 5
    timeout 2
}

vrrp_instance VIP_Nginx {
    state MASTER
    interface eth0
    virtual_router_id 66
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
				10.0.0.10/24 dev eth0 label eth0:1
    }
    track_interface {
    		eth0
    }
    track_script {
        check_nginx
    }
}

/etc/keepalived/check_nginx.sh 腳本內容如下:

[root@Keepalived01 ~]# cat /etc/keepalived/check_nginx.sh
#!/bin/bash
/usr/bin/killall -0 nginx || systemctl restart nginx


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM