Keepalived+HAproxy實現高可用負載均衡


總概:

      Keepalived是一個類似於layer3, 4 & 5交換機制的軟件,也就是我們平時說的第3層、第4層和第5層交換。Keepalived的作用是檢測web服務器的狀態,如果有一台web服務器死機,或工作出現故障,Keepalived將檢測到,並將有故障的web服務器從系統中剔除,當web服務器工作正常后Keepalived自動將web服務器加入到服務器群中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的web服務器

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

這里我利用HAproxy對多台redis服務器進行負載,然后用Keepalived對HAproxy進行監控:

     (主)服務器A:10.10.51.231

     (從)服務器B:10.10.51.232

      VIP:10.10.51.230

      Keepalived監控A、B上的HAproxy,利用Keepalived的VIP漂移技術,若A、B上的HAprox都工作正常,則VIP與優先級別高的服務器(主服務器)綁定,當主服務器當掉時,則與從服務器綁定,而VIP則是暴露給外部訪問的ip;HAproxy利用Keepalived生產的VIP對多台redis(從)進行讀負載,當某台redis當掉,則將其移除,回復后加入集群。

 

一、安裝keepalived

1、下載后解壓 tar zxvf keepalived-1.2.7.tar.gz 到任意目錄

[root@Centos-Server ~]# tar zxvf keepalived-1.2.7.tar.gz -C /usr/local/keepalived

解壓后,進入keepalived目錄

[root@Centos-Server ~]# cd /usr/local/keepalived
[root@Centos-Server ~]# ./configure
[root@Centos-Server ~]# make && make install

注:若這里報錯提示沒有裝openssl,則執行[root@Centos-Server ~]# yum –y install openssl-devel安裝,若還有其他的包沒裝,則執行yum命令進行安裝。

2、配置keepalived

[root@Centos-Server ~]# cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
[root@Centos-Server ~]# cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
[root@Centos-Server ~]# mkdir /etc/keepalived
[root@Centos-Server ~]# cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
[root@Centos-Server ~]# ln -s /usr/local/sbin/keepalived /usr/sbin/
[root@Centos-Server ~]# vi /etc/keepalived/keepalived.conf

! Configuration File for keepalived
global_defs {
   router_id LVS_DEVEL
}

vrrp_script chk_haproxy {                        #Haproxy服務啟動
   script "/etc/keepalived/check_haproxy.sh"     #監控haproxy進程的腳本, 根據自己的實際路徑放置
   interval 2
   weight -4
}
vrrp_instance VI_1 { state MASTER
#主機為MASTER,備機為BACKUP interface eth0 #監測網絡端口,用ipconfig查看 virtual_router_id 51 #主備機必須相同 priority 150 #主備機取不同的優先級,主機要大。從服務器上改為120 advert_int 1 #VRRP Multicast廣播周期秒數 authentication { auth_type PASS #VRRP認證方式 auth_pass 1111 #VRRP口令 主備機密碼必須相同 }
track_script {
#調用haproxy進程檢測腳本 chk_haproxy } virtual_ipaddress { 10.10.51.230 #VIP 漂移地址 即集群IP地址 } }
[root@Centos-Server ~]# vim /etc/keepalived/check_haproxy.sh

#!/bin/bash
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
   /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg
   sleep 3
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then /etc/init.d/keepalived stop fi fi

此文件root組讀寫權限,並且允許程序執行此文件。

[root@Centos-Server ~]# chmod 777 /etc/keepalived/check_haproxy.sh

 

三、安裝HAproxy

1、下載后解壓 tar zxvf haproxy-1.4.24.tar.gz 到任意目錄

解壓后,進入Haproxy目錄

[root@Centos-Server ~]# cd /usr/local/haproxy-1.4.24
[root@Centos-Server ~]# make TARGET=linux26 PREFIX=/usr/local/haproxy                               
[root@Centos-Server ~]# make install PREFIX=/usr/local/haproxy        #將Haproxy安裝到/usr/local/haproxy

2、配置HAproxy

[root@Centos-Server ~]# cd /usr/local/haproxy
[root@Centos-Server ~]# vim haproxy.cfg

注:這里是沒有haproxy.cfg文件的,可以回到安裝文件目錄下將examples下的haproxy.cfg拷貝到usr/local/haproxy下。

[root@Centos-Server haproxy-1.5.11]# cp /usr/local/mypackages/haproxy-1.5.11/examples/haproxy.cfg /usr/local/haproxy
####################HAProxy配置中分成五部分內容,當然這些組件不是必選的,可以根據需要選擇部分作為配置。
#global  :參數是進程級的,通常和操作系統(OS)相關。這些參數一般只設置一次,如果配置無誤,就不需要再次配置進行修改
#defaults:配置默認參數的,這些參數可以被利用配置到frontend,backend,listen組件
#frontend:接收請求的前端虛擬節點,Frontend可以根據規則直接指定具體使用后端的 backend(可動態選擇)。
#backend :后端服務集群的配置,是真實的服務器,一個Backend對應一個或者多個實體服務器。
#listen  :Frontend和Backend的組合體。

global
    log 127.0.0.1 local0    #日志輸出配置,所有日志都記錄在本機,通過local0輸出
    maxconn 4096            #限制單個進程的最大連接數
    chroot /usr/local/haproxy                 #Haproxy安裝目錄
    uid 99            #所屬運行用戶,默認99為nobody
    gid 99            #所屬運行用戶組,默認99為nobody
    daemon            #讓進程作為守護進程在后台運行
    nbproc 1          #指定作為守護進程運行時的進程數
    pidfile /usr/local/haproxy/haproxy.pid    #將所有進程寫入pid文件

defaults
    log global
    mode tcp                  #所處理的類別,默認采用http模式,可配置成tcp作4層消息轉發
    maxconn 4096              #限制單個進程的最大連接數
    option httplog            #http 日志格式 
    option dontlognull        #不記錄空連接
    option forwardfor         #如果后端服務器需要獲得客戶端真實ip需要配置的參數,可以從Http Header中獲得客戶端ip
    option httpclose          #每次請求完畢后主動關閉http通道,haproxy不支持keep-alive,只能模擬這種模式的實現
    option abortonclose       #當服務器負載很高的時候,自動結束掉當前隊列處理比較久的連接 
    option redispatch         #在連接失敗或斷開的情況下,允許當前會話被重新分發
    retries 3                 #設置在一個服務器上鏈接失敗后的重連次數
    balance source            #表示根據請求源IP,這個跟Nginx的IP_hash機制類似,我們用其作為解決session問題的一種方法。
    timeout client 30s        #設置客戶端的最大超時時間(毫秒)
    timeout connect 5s        #設置等待連接到服務器成功的最大時間
    timeout server 30s        #設置服務器端的最大超時時間
    timeout check 5s          #心跳檢測時間

#前端代理 Redis
frontend Redis
    bind *:6379
    default_backend RedisServer

#后端分發 Redis
backend RedisServer
    mode tcp
    balance source
    server redis-233 10.10.51.233:6379 check inter 2000 fall 5
    server redis-234 10.10.51.234:6379 check inter 2000 fall 5
    server redis-235 10.10.51.235:6379 check inter 2000 fall 5


#前端代理 Web
frontend WebSite
    bind 10.10.51.230:80                            #這里建議使用bind *:80的方式,要不然做集群高可用的時候有問題,vip切換到其他機器就不能訪問了。
    acl WwwSite hdr(host) -i www.ccav.com           #acl后面是規則名稱,-i是要訪問的域名,如果訪問www.zhirs.com這個域名就分發到下面的webserver 的作用域。
    acl ImgSite hdr(host) -i res.ccav.com           #如果訪問img.baison.com.cn就分發到imgserver這個作用域。
    use_backend WwwSiteServer if WwwSite
    use_backend ImgSiteServer if ImgSite

#后台分發 Web
backend WwwSiteServer
    mode http
    balance source                    #banlance roundrobin 輪詢,balance source 保存session值,支持static-rr,leastconn,first,uri等
    option httpchk /index.html        #檢測文件,如果分發到后台index.html 訪問不到就不再分發給它
    server web01 10.10.51.241:80  check inter 2000 fall 3 weight 30
    server web02 10.10.51.242:80  check inter 2000 fall 3 weight 20
 
backend ImgSiteServer
    mode http
    option httpchk /index.html
    balance roundrobin
    server web03 10.10.51.243:80  check inter 2000 fall 3 weight 10


    # weight - 調節服務器的負重
    # check - 允許對該服務器進行健康檢查
    # inter - 設置連續的兩次健康檢查之間的時間,單位為毫秒(ms),默認值 2000(ms)
    # rise - 指定多少次連續成功的健康檢查后,可認定該服務器處於可操作狀態,默認值 2
    # fall - 指定多少次不成功的健康檢查后,認為服務器為當掉狀態,默認值 3
    # maxconn - 指定可被發送到該服務器的最大並發連接數

#狀態檢測
listen status 10.10.51.231:8080        #監控頁面的端口
    mode http
    stats enable
    stats refresh 10s                  #統計頁面自動刷新時間
    stats uri /haproxy-admin           #監控頁面的訪問地址
    stats realm Haproxy\ Statistics    #統計頁面密碼框上提示文本
    stats auth ccav:123456             #統計頁面用戶名和密碼設置
    stats hide-version                 #隱藏統計頁面上HAProxy的版本信息

3、加上日志支持

[root@Centos-Server ~]# vim /etc/rsyslog.conf

#在最下邊增加
local3.* /var/log/haproxy.log
local0.* /var/log/haproxy.log
[root@Centos-Server ~]# vim /etc/sysconfig/rsyslog
修改: SYSLOGD_OPTIONS="-r -m 0" 

[root@Centos-Server ~]# service rsyslog restart        #重啟日志服務

 

三、測試

1、啟動Keepalived:

[root@Centos-Server ~]# /usr/local/keepalived/bin/keepalived -D -f /etc/keepalived/keepalived.conf  #指定啟動配置文件

正在啟動 keepalived: [確定]
#說明:Keepalived啟動后會去檢查HAproxy,若HAproxy未啟動,則啟動HAproxy,若啟動HAproxy失敗,則關閉Keepalived

2、啟動Haproxy

[root@Centos-Server ~]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg #啟動 [root@Centos-Server ~]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg -st `cat /usr/local/haproxy/logs/haproxy.pid` #重啟 [root@Centos-Server ~]# killall haproxy #停止

PS:haproxy啟動故障:Starting proxy cluster: cannot bind socket

[root@Centos-Server ~]# /etc/sysctl.conf        #修改內核參數
net.ipv4.ip_forward = 1
net.ipv4.ip_nonlocal_bind=1                     #沒有就新增此條記錄

[root@Centos-Server ~]# sysctl -p               #保存結果,使結果生效。

3、查看keepalived狀況:

[root@alex]# service keepalived status

keepalived (pid  5420) 正在運行...

4、查看HAproxy狀況:

[root@alex]# ps -aux|grep haproxy

Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
nobody   5430  0.0  0.0  11980   944 ?  Ss  16:37   0:00 /usr/local/haproxy/sbin/haproxy –f /usr/local/haproxy/haproxy.conf
nobody   5431  0.0  0.0  11980   944 ?  Ss  16:37   0:00 /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.conf
root      5618  0.0  0.0 103252   844 pts/2    S+   16:38   0:00 grep haproxy

Keepalived啟動后自動將HAproxy啟動了。

5、查看Keepalived生成的VIP是否與主服務器綁定

[root@alex]# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
    valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    link/ether 08:00:27:42:71:2d brd ff:ff:ff:ff:ff:ff
    inet 10.10.51.231/24 brd 192.168.4.255 scope global eth5
    inet 10.10.51.230/32 scope global eth5
    inet6 fe80::a00:27ff:fe42:712d/64 scope link
    valid_lft forever preferred_lft forever

VIP綁定OK!

6、打開HAproxy的圖形管理界面:

瀏覽器輸入http://localhost:8080/haproxy-admin

用戶名:ccav   密碼:123456

這時候我們Kill掉HAproxy,Keepalived檢查到后會重新將HAproxy啟動。

[root@alex sysconfig]# killall haproxy

刷新頁面,可以看到HAproxy的pid改變了。

7、這時我們將主服務器上的keepalived當掉,看VIP是否漂移到了從服務器上,從服務器接管服務。

A、主服務器上:

[root@Centos-Server ~]# killall keepalived
[root@Centos-Server ~]# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
    valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    link/ether 08:00:27:42:71:2d brd ff:ff:ff:ff:ff:ff
    inet 10.10.51.231/24 brd 192.168.4.255 scope global eth5
    inet6 fe80::a00:27ff:fe42:712d/64 scope link
    valid_lft forever preferred_lft forever

B、從服務器上:

[root@Centos-Server ~]# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
    valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    link/ether 08:00:27:be:47:90 brd ff:ff:ff:ff:ff:ff
    inet 10.10.51.232/24 brd 192.168.4.255 scope global eth6
    inet 10.10.51.230/32 scope global eth6
    inet6 fe80::a00:27ff:febe:4790/64 scope link
    valid_lft forever preferred_lft forever

VIP漂移OK!

8、這時候重啟主服務器的Keepalived,查看VIP是否漂移回來。

[root@Centos-Server ~]# service keepalived start
正在啟動 keepalived:                                      [確定]

[root@Centos-Server ~]# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
    valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    link/ether 08:00:27:42:71:2d brd ff:ff:ff:ff:ff:ff
    inet 10.10.51.231/24 brd 192.168.4.255 scope global eth5
    inet 10.10.51.230/32 scope global eth5
    inet6 fe80::a00:27ff:fe42:712d/64 scope link
    valid_lft forever preferred_lft forever

VIP漂移到主服務器!


免責聲明!

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



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