總概:
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漂移到主伺服器!