CentOS 7下Keepalived + HAProxy 搭建配置詳解


第一步:准備

1. 簡介

  本文搭建的是利用 Keepalived 實現 HAProxy 的熱備方案,即兩台主機上的 HAProxy 實例同時運行,其中全總較高的實例為 MASTER,MASTER出現異常時,另一台主機上的實例自動接管所有的流量。

  在運行着 HAProxy 實例的兩台主機上分別運行着 Keepalived 實例,這兩個 Keepalived 爭搶同一個 虛 IP 地址,兩個 HAProxy 也嘗試着去綁定同一個虛 IP 地址上的端口。只能有一個 Keepalived 能搶到這個虛 IP,搶到這個虛 IP 的 Keepalived 的主機上的 HAProxy 即為當前的 MASTER。

  Keepalived 內部維護一個權重值,權重值最高的 Keepalived 實例能夠搶到虛 IP。Keepalived 會定期檢查所在主機上的 HAProxy 的狀態,狀態健康時,則權重值增加。

2. 操作系統

CentOS-7-x86_64-Everything-1511

3. 安裝包

keepalived-1.3.4.tar.gz

4. HAProxy 安裝

參照 Keepalived + HAProxy 搭建【第一篇】HAProxy 的安裝和配置 在另一台主機(本文為192.168.6.129)上安裝 HAProxy 實例。

5. 安裝 psmisc

使用 killall -0 檢查 HAProxy 服務是否存在。如果沒有 killall 命令,則需要安裝 psmisc 包。

# yum intall psmisc

6. 安裝 openssl

# yum install openssl-devel

不安裝 openssl,keepalived 編譯的時候會報錯:

7. 安裝 libnl/libnl-3 庫

# yum install libnl*

不安裝 libnl/libnl-3,keepalived 編譯的時候會報警告:

8. 安裝

# yum install libnfnetlink-devel

不安裝 libnfnetlink-devel,keepalived 編譯的時候會報錯:

第二步:安裝與配置

1. 安裝

# tar zxzf keepalived-1.3.4.tar.gz
# # cd keepalived-1.3.4 # ./configure --prefix=/usr/local/keepalived # make # make install

2. 配置

1)注冊為系統服務

# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
# touch /etc/init.d/keepalived
# chmod +x /etc/init.d/keepalived
# vi /etc/init.d/keepalived

/etc/init.d/keepalived 的文件內容:

#!/bin/sh
#
# Startup script for the Keepalived daemon
#
# processname: keepalived
# pidfile: /var/run/keepalived.pid
# config: /etc/keepalived/keepalived.conf
# chkconfig: - 21 79
# description: Start and stop Keepalived

# Source function library
. /etc/rc.d/init.d/functions

# Source configuration file (we set KEEPALIVED_OPTIONS there)
. /etc/sysconfig/keepalived

RETVAL=0

prog="keepalived"

start() {
    echo -n $"Starting $prog: "
    daemon keepalived ${KEEPALIVED_OPTIONS}
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
}

stop() {
    echo -n $"Stopping $prog: "
    killproc keepalived
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
}

reload() {
    echo -n $"Reloading $prog: "
    killproc keepalived -1
    RETVAL=$?
    echo
}

# See how we were called.
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    reload)
        reload
        ;;
    restart)
        stop
        start
        ;;
    condrestart)
        if [ -f /var/lock/subsys/$prog ]; then
            stop
            start
        fi
        ;;
    status)
        status keepalived
        RETVAL=$?
        ;;
    *)
        echo "Usage: $0 {start|stop|reload|restart|condrestart|status}"
        RETVAL=1
esac

exit $RETVAL

2)編輯配置文件

# mkdir /etc/keepalived/
# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
# vi /etc/keepalived/keepalived.conf

配置文件內容:

global_defs {
    router_id LVS_DEVEL  #虛擬路由名稱
}

#HAProxy健康檢查配置
vrrp_script chk_haproxy {
    script "killall -0 haproxy"  #使用killall -0檢查haproxy實例是否存在,性能高於ps命令
    interval 2   #腳本運行周期
    weight 2   #每次檢查的加權權重值
}

#虛擬路由配置
vrrp_instance VI_1 {
    state MASTER           #本機實例狀態,MASTER/BACKUP,備機配置文件中請寫BACKUP
    interface eno16777736      #本機網卡名稱,使用ifconfig命令查看
    virtual_router_id 51   #虛擬路由編號,主備機保持一致
    priority 101           #本機初始權重,備機請填寫小於主機的值(例如100)
    advert_int 1           #爭搶虛地址的周期,秒
    virtual_ipaddress {
        192.168.6.131      #虛地址IP,主備機保持一致
    }
    track_script {
        chk_haproxy        #對應的健康檢查配置
    }
}

3. 啟動

# service keepalived start

返回信息:

其他相關命令:

重啟

# service keepalived restart

返回信息:

停止

# service keepalived stop

返回信息:

4. 測試

1)查看進程

# ps -ef|grep keepalived |grep -v grep

返回信息:

2)查看虛擬 IP 持有者

# ip addr sh eno16777736

其中,eno16777736 為網卡名稱

持有虛 IP 的主機返回以下信息:

另一台主機返回信息:

如果先啟動備機的 Keepalived,那么很有可能虛 IP 會被備機搶到,因為備機的權重配置只比主機低1,只要執行一次健康檢查就能把權重提高到102,高於主機的101。

第三步:測試

進行高可用性能測試

1. 架構信息

提供服務的 server 為 Nginx,每個 nginx 上放入帶有本機 IP 的 HTML 頁面,相關信息如下:

IP Nginx 端口 HAProxy 端口
192.168.6.128 8080 9090
192.168.6.129 8080 9090
192.168.6.130 8080 未安裝

2. 轉發測試

訪問地址:http://192.168.6.131:9090/hello.html

返回的頁面信息:

HAProxy 日志信息(/var/log/haproxy.log):

Nginx 日志信息:

 

3. 高可用測試

1)停掉 Keepalived 中為 MASTER 的主機上的 HAProxy 服務

# service haproxy stop

2)查看 Keepalived 日志(/var/log/messages)

MASER(192.168.6.128)健康檢查失���,權重值從103降低到101,得知更高的權重值為備機的102,則進入備機狀態:

192.168.6.128 將虛 IP 釋放:

BACKUP(192.168.6.129)被選舉為 MASTER:

192.168.6.129 獲得虛 IP:

2)訪問頁面

地址:http://192.168.6.131:9090/hello.html

頁面返回信息:

HAProxy 日志信息(/var/log/haproxy.log):

 

Nginx 日志信息:

附:搭建過程中遇到的問題

一、Haproxy 的問題

1. 現象

通過虛 IP 無法訪問到 HAProxy,通過主機 IP 可以訪問大 HAProxy。

2. 解決辦法

配置 HAProxy 時,bind 的配置,寫成了固定 IP:PORT 的格式,此時 HAProxy 無法綁定虛擬 IP 。將改行配置改成 bind *:port,問題解決。

二、Keepalived 的問題

1. 現象:

停止 MASTER 主機上的 HAProxy 服務,虛 IP 不漂移到 BACKUP 主機上。

2. 問題處理過程

1)健康檢查腳本

首先懷疑健康檢查腳本的問題。

進行手動執行:

HAProxy 未啟動時:

HAProxy 啟動時:

說明腳本沒有問題,排除該腳本問題。

2)Keepalived 主備切換

懷疑 Keepalived 本身就不能切換。

停止 MASTER 的 Keepalived 服務,發現虛 IP 漂移到了 BACKUP 主機上。

說明 Keepalived 可以進行主備切換

3)版本

懷疑 Keepalived 版本的問題。

安裝其他的版本,問題依然未解決。

排除版本問題

4)其他

主備配置字段、執行檢測腳本的配置字段等,均已排除。

3. 解決辦法

1)查看 Keepalived 的日志,發現一直打印 pid 退出的的日志,懷疑與此有關。

2)觀察 Keepalived 啟動過程的日志,日志中提示健康檢查腳本中的 killall 使用完整的路徑,即 /usr/bin/killall,修改完成后,重啟,主備切換正常。


免責聲明!

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



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