haproxy集羣+keepalived

針對上一篇博客的karaf集羣,在項目中的計劃是需要部署一個對外提供http接口的插件(兩臺karaf中各部署一個http).

那麼就有一個問題,對於兩臺服務器上的集羣,怎麼通過一個地址實現對集羣中接口的輪詢訪問?  --負載均衡

 

1.haproxy

選擇nginx和haproxy都可以.

簡介:

HAProxy提供高可用性、負載均衡以及基於TCP和HTTP應用的代 理,支持虛擬主機,它是免費、快速並且可靠的一種解決方案。HAProxy特別適用於那些負載特大的web站點,這些站點通常又需要會話保持或七層處理。HAProxy運行在當前的硬件上,完全可以支持數以萬計的併發連接。並且它的運行模式使得它可以很簡單安全的整合進您當前的架構中, 同時可以保護你的web服務器不被暴露到網絡上。

安裝:

下載 haproxy-2.1.4.tar.gz

yum install gcc     --虛擬機是最小安裝,所以需要手動安裝c環境

tar -zxvf haproxy-2.1.4.tar.gz   --解壓縮

cd haproxy-2.1.4   --進入haproxy目錄

make TARGET=linux310    編譯, 注意一定要在haproxy-2.1.4文件夾內, 裏面有markfile文件,否則會報錯make: *** 沒有指明目標並且找不到 makefile。 停止。

make install PREFIX=/usr/local/haproxy   --安裝

mkdir /usr/local/haproxy/conf   

cp examples/option-http_proxy.cfg /usr/local/haproxy/conf/haproxy.cfg   --拷貝源碼中的配置文件,用來配置haproxy

 

配置haproxy.cfg:

#進程,安全配置,性能調整,Debug參數
global
        log 127.0.0.1 local0 debug  #日誌輸出配置,所有日誌都記錄在本機,通過local0輸出 info日誌級別
        maxconn 4096 #每個HAproxy進程的最大連接併發數
        user root  #用戶
        group nobody  #組
        daemon  ##以後臺形式運行ha-proxy
        nbproc 1  #啓動3個ha-proxy進程,可以設置多個進程提高性能
        pidfile /usr/local/haproxy/logs/haproxy.pid  ##pid文件位置
#爲frontend, listen, backend提供默認配置
defaults
        #log  global            #集成全局配置中的日誌格式
        log 127.0.0.1 local0 info
        mode http  #所處理的類別(#7層 http;4層tcp) tcp模式一般用於,SSL,SSH,SMTP,MySQL等應用
        retries 3  #3次連接失敗就認爲該服務不可用
        balance  roundrobin               # rr 輪詢負載均衡
        timeout connect 10s #連接超時
        timeout client 20s #客戶端超時
        timeout server 30s #後端服務器超時
        timeout check 5s #設置對後端服務器的檢測超時時間,默認單位是毫秒
        timeout http-request 10s  # 請求報文的超時時長

#此部分用於設置接收用戶請求的前端虛擬節點,並根據ACL規則直接指定要使用的後端backend
frontend www
        bind 0.0.0.0:8008
        mode    http
        option  httplog ##啓用日誌記錄http請求
        option  forwardfor #通過X-Forwarded-For信息,來記錄客戶端來源IP
        option  httpclose #表示在客戶端和服務器端完成一次連接請求後,HAproxy將主動關閉此TCP連接
        log     global
        default_backend htmpool

#此部分用於設置羣集後端服務集羣的配置,處理前端用戶的請求,添加真實的服務器
backend htmpool
        mode    http
        option  redispatch #如果後端服務器發生故障,會通過此參數,將客戶的請求強制定向到另外一臺健康的後端服務器上,以保證服務正常
        option  abortonclose #此參數可以在服務器負載很高的情況下,自動結束當前隊列中處理時間比較長的連接
        balance roundrobin #定義負載均衡算法
        cookie  SERVERID #表示允許向cookie插入serverid
        #option httpchk GET /index.html  #啓用http的服務狀態檢測功能
        #option  httpchk HEAD /index.html  HTTP/1.1\r\nHost:\ www.xxx.com  # 頭部檢測格式
        server  web1 192.168.147.129:8001 cookie server1 weight 6 check inter 2000 rise 2 fall 3
        server  web2 192.168.147.130:8001 cookie server2 weight 6 check inter 2000 rise 2 fall 3
#       註釋如下:
        #服務器定義web1,cookie表示serverid爲web1
        #check  inter  2000 檢測心跳頻率
        #rise 3 是三次正確認爲服務器可用  fall 3  是三次失敗認爲服務器不可用
        #weight代表權重,backup爲備份節點

#用來設置haproxy代理服務頁面,監聽整個後端集羣狀態       
listen admin_stats
        bind 0.0.0.0:9188
        mode http
        log global
        stats refresh 30s #設置HAproxy監控統計頁面自動刷新時間
        stats uri /haproxy-status #設置HAproxy監控統計頁面的URL路徑
        stats realm welcome login\ Haproxy #設置登錄HAproxy監控統計頁面時,密碼框上的文本提示信息
        stats auth admin:admin123 #設置登錄HAproxy統計頁面的用戶名和密碼,可以爲監控頁面設置多個用戶名和密碼,每行一個
        stats hide-version #用來隱藏統計頁面上HAproxy的版本信息
        stats admin if TRUE #可以在監控頁面上手工啓用或禁用後端真實服務器
        #balance roundrobin
        #server system_01 192.168.147.129:8001 check inter 2000 rise 3 fall 3
        #server system_02 192.168.147.130:8001 check inter 2000 rise 3 fall 3

 
要轉發的後端地址可以在backend,也可以在listen中配置:

1.frontend+backend: frontend監聽某端口,攔截對該端口的請求,轉發到backend

2.listen:直接監聽某端口,定義負載均衡算法(共7種),綁定後端地址

 

啓動:

/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg

 

後端沒開啓監聽的服務,所以會報沒有可用服務,先開啓一個服務

listen中配置了一個前端服務頁面: ip:9188/haproxy-status  

可以看到一個服務開啓,一個服務關閉

查看haproxy的日誌:

可以在配置文件中看到關於日誌的設置 log 127.0.0.1 local0 debug ,需要在系統日誌進行設置

vim /etc/rsyslog.conf 

添加

local0.*     /var/log/haproxy/haproxy.log     #日誌位置

重啓 service rsyslog restart

2.haproxy集羣和keepalived

部署一個haproxy解決了對karaf集羣的負載均衡,如果haproxy掛了呢?是不是就沒法訪問後臺兩個服務.

解決 :在每臺服務器上部署haproxy+keepalived搭建高可用集羣

思路: 兩臺keepalived會搶佔虛擬ip100, 當主服務器master掛掉, 虛擬ip會自動漂移到備服務器,保證後臺服務的高可用.

keepalived簡介

KeepAlived軟件主要是通過VRRP協議實現高可用功能的。VRRP是Virtual Router RedundancyProtocol(虛擬路由器冗餘協議)的縮寫,  VRRP出現的目的就是爲了解決靜態路由單點故障問題的,它能夠保證當個別節點宕機時,整個網絡可以不間斷地運行.所以,Keepalived一方面具有配置管理LVS的功能,同時還具有對LVS下面節點進行健康檢查的功能,另一方面也可實現系統網絡服務的高可用功能.

keepalived安裝

1.yum安裝

不推薦, 我第一次這麼安裝的, 版本太低,導致後期出現了bug,調不通

2.安裝包安裝

版本: keepalived-2.0.18.tar.gz

源碼目錄: /usr/local/keep

安裝目錄: /usr/local/keepalived

源碼目錄下:

[root@localhost keep]# ls
keepalived-2.0.18  keepalived-2.0.18.tar.gz
[root@localhost keep]# cd keepalived-2.0.18
[root@localhost keepalived-2.0.18]# ./configure --prefix=/usr/local/keepalived
[root@localhost keepalived-2.0.18]# make && make install

./configure後出現的問題:

報錯:OpenSSL is not properly installed on your system
解決:yum -y install openssl-devel

報錯:this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS
解決:yum -y install libnl libnl-devel

編譯後:

[root@localhost local]# cd /usr/local/keepalived/
[root@localhost keepalived]# ls
bin  etc  sbin  share

安裝目錄下會自動生成文件:
/usr/local/etc/keepalived/keepalived.conf
/usr/local/etc/sysconfig/keepalived
/usr/local/sbin/keepalived

設置服務啓動:

[root@localhost keepalived]# cp /usr/local/keepalived/etc/sysconfig/keepalived  /etc/sysconfig/keepalived
[root@localhost keepalived]# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/keepalived
[root@localhost keepalived]# cp /usr/local/keep/keepalived-2.0.18/keepalived/etc/init.d/keepalived  /etc/init.d/keepalived
[root@localhost keepalived]# mkdir /etc/keepalived
[root@localhost keepalived]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf 

keepalived啓動/狀態/停止: systemctl  start/status/stop keepalived

keepalived配置

[root@localhost keepalived]# vim /etc/keepalived/keepalived.conf

!Configuration File for keepalived

global_defs
{
#   notification_email {       #發生故障時,接受信息的郵箱地址
#    [email protected]
#    [email protected]
#     [email protected]
#   }
#   notification_email_from [email protected]

   script_user root
 #  enable_script_security
   smtp_server 127.0.0.1
   smtp_connect_timeout 30 #連接超時時間
   router_id LVS_DEVEL #服務器名稱
#   vrrp_skip_check_adv_addr
#   vrrp_strict
#   vrrp_garp_interval 0
#   vrrp_gna_interval 0
}

vrrp_script chk_haproxy
{
   script "/etc/keepalived/check_ha.sh"  #對haproxy的檢測腳本
   interval 2  #時間間隔/s
   weight 2
}

vrrp_instance VI_1 {
    state MASTER    #主
    interface ens33  #監聽接口
    virtual_router_id 51
    priority 100  #優先級
    advert_int 1  #檢查間隔
    authentication {
        auth_type PASS #認證類型
        auth_pass 1111 #認證密碼
    }
    virtual_ipaddress {
        192.168.147.100  #虛擬ip,可以設置多個
    }
    track_script {
        chk_haproxy
    }
}

vrrp_script定義了haproxy的檢測腳本位置以及檢測時間間隔

腳本check_ha.sh:

#!/bin/bash
echo "start check"
A=`ps -C haproxy --no-header |wc -l` ## 查看是否有 haproxy進程 把值賦給變量A
if [ $A -eq 0 ];then ## 如果沒有進程值得爲 零
#/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/etc/haproxy.cfg
#sleep 3
#if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
#service keepalived stop
systemctl stop keepalived
fi
#fi

備服務器上修改配置文件,其他的都不變:

state BACKUP    #備
       priority 90  #優先級

啓動日誌: /var/log/messages

報錯: Unsafe permissions found for script '/etc/keepalived/check_ha.sh' - disabling.
Disabling track script chk_haproxy due to insecure
解決: --global_defs 中不要使用enable_script_security,而應該使用user root.正如上面給出的keepalived.conf一樣

問題: 如果出現systemctl stop keepalived關閉不了keepalived進程
解決: vim /usr/lib/systemd/system/keepalived.service
      註釋掉 #KillMode=process
      systemctl daemon-reload

 

演示:

1.啓動129,130上的karaf

2.啓動129,130上的haproxy

3.啓動129,130上的keepalived,可以看到目前虛擬ip在129上

4.postman請求接口兩次,輪詢,訪問到129,130的karaf各一次

5.手動關閉129的haproxy,可以看到虛擬ip已經漂移到130上

6.postman請求接口兩次,輪詢,訪問到129,130的karaf各一次,正常

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