真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

haproxy+keepalived實(shí)現(xiàn)web集群的高可用性

haproxy+keepalived實(shí)現(xiàn)web集群高可用性

創(chuàng)新互聯(lián)建站,專注為中小企業(yè)提供官網(wǎng)建設(shè)、營銷型網(wǎng)站制作、響應(yīng)式網(wǎng)站開發(fā)、展示型網(wǎng)站制作、成都做網(wǎng)站等服務(wù),幫助中小企業(yè)通過網(wǎng)站體現(xiàn)價(jià)值、有效益。幫助企業(yè)快速建站、解決網(wǎng)站建設(shè)與網(wǎng)站營銷推廣問題。

負(fù)載均衡集群的概念

負(fù)載均衡是設(shè)計(jì)分布式系統(tǒng)架構(gòu)必須要考慮的因素之一,它指的是通過調(diào)度分發(fā)的方式盡可能將“請求”、“訪問”的壓力負(fù)載平均分?jǐn)偟郊褐械母鱾€(gè)節(jié)點(diǎn),避免有些節(jié)點(diǎn)負(fù)載太高導(dǎo)致訪問延遲,而有些節(jié)點(diǎn)負(fù)載很小導(dǎo)致資源浪費(fèi)。這樣,每個(gè)節(jié)點(diǎn)都可以承擔(dān)一定的訪問請求負(fù)載壓力,并且可以實(shí)現(xiàn)訪問請求在各節(jié)點(diǎn)之間的動(dòng)態(tài)分配,以實(shí)現(xiàn)負(fù)載均衡,從而為企業(yè)提供更高性能,更加穩(wěn)定的系統(tǒng)架構(gòu)解決方案。


高可用集群的概念

高可用是指以減少服務(wù)中斷時(shí)間或者避免服務(wù)中斷為目標(biāo)的技術(shù),它也是分布式系統(tǒng)架構(gòu)中必須要考慮的因素之一。集群中節(jié)點(diǎn)之間進(jìn)行心跳檢查,可以實(shí)現(xiàn)對整個(gè)集群中的節(jié)點(diǎn)健康狀態(tài)的檢測,如果某個(gè)節(jié)點(diǎn)失效,它的備節(jié)點(diǎn)將在幾秒鐘的時(shí)間內(nèi)接管它的工作。因此對于用戶而言,服務(wù)總是可以訪問的。

haproxy是什么?

HAProxy是一個(gè)使用C語言編寫的自由及開放源代碼軟件,其提供高可用性、負(fù)載均衡,以及基于TCP和HTTP的應(yīng)用程序代理。HAProxy特別適用于那些負(fù)載特大的web站點(diǎn)(其實(shí)也適合數(shù)據(jù)庫的負(fù)載均衡),這些站點(diǎn)通常又需要會(huì)話保持或七層處理。HAProxy運(yùn)行在當(dāng)前的硬件上,完全可以支持?jǐn)?shù)以萬計(jì)的并發(fā)連接。并且它的運(yùn)行模式使得它可以很簡單安全的整合進(jìn)您當(dāng)前的架構(gòu)中, 同時(shí)可以保護(hù)你的web服務(wù)器不被暴露到網(wǎng)絡(luò)上。

包括 GitHub、Bitbucket、Stack Overflow、Reddit、Tumblr、Twitter和 Tuenti在內(nèi)的知名網(wǎng)站,及亞馬遜網(wǎng)絡(luò)服務(wù)系統(tǒng)都使用了HAProxy。

keepalived又是什么?

keepalived是一款輕量級的高可用軟件,它只能實(shí)現(xiàn)對IP資源的高可用。主要通過虛擬路由冗余協(xié)議(VRRP)實(shí)現(xiàn)高可用的功能。在非雙主keepalived集群中,會(huì)依靠優(yōu)先級選舉出一個(gè)主節(jié)點(diǎn),IP資源會(huì)優(yōu)先綁定到主節(jié)點(diǎn),其他節(jié)點(diǎn)成為備節(jié)點(diǎn),主節(jié)點(diǎn)與備節(jié)點(diǎn)之間會(huì)通過檢查心跳線來檢測對方的存活,一旦主節(jié)點(diǎn)宕機(jī),備用節(jié)點(diǎn)就搶占IP資源,當(dāng)主節(jié)點(diǎn)恢復(fù)正常,備節(jié)點(diǎn)又會(huì)釋放IP資源給主節(jié)點(diǎn)。

下面通過一個(gè)簡單的實(shí)驗(yàn),來看看如何實(shí)現(xiàn)通過haproxy+keepalived實(shí)現(xiàn)web集群的高可用和負(fù)載均衡

環(huán)境設(shè)置

主機(jī)名
角色
IP
web1
real server-1
192.168.83.129/24
web2
real server-2
192.168.83.130/24
haproxy1
代理服務(wù)器-1
192.168.83.131/24
haproxy2
代理服務(wù)器-2
192.168.83.131/24
銀河
客戶端
192.168.43.159/24

//所有的服務(wù)器都要同步時(shí)間,集群的時(shí)間是很敏感的,在生產(chǎn)環(huán)境中建議用公司內(nèi)部的ntp服務(wù)器,用外部的ntp服務(wù)器隨著運(yùn)行時(shí)間的增加,會(huì)逐漸出現(xiàn)時(shí)間偏移,一旦偏移量過大,集群便會(huì)出現(xiàn)非常嚴(yán)重的問題

 ntpdate time.nist.gov

 crontab -l

 */10 * * * * ntpdate time.nist.gov

在兩臺(tái)主機(jī)上部署apache作為real server

web1

[root@web1 ~]# yum -y install httpd
[root@web1 ~]# sed -i 's/Listen 80/Listen 8080/g' /etc/httpd/conf/httpd.conf    #出于安全性考慮,把默認(rèn)端口改成8080
[root@web1 ~]# systemctl start httpd
[root@web1 ~]# systemctl enable httpd
[root@web1 ~]# echo "web1" > /var//www/html/index.html

[root@web1 ~]# curl http://192.168.83.129:8080
web1

web2

[root@web2 ~]# yum -y install httpd

[root@web2 ~]# sed -i 's/Listen 80/Listen 8080/g' /etc/httpd/conf/httpd.conf    #出于安全性考慮,把默認(rèn)端口改成8080[root@web2 ~]# systemctl start httpd
[root@web2 ~]# systemctl enable httpd

[root@web2 ~]# echo "web2" > /var/www/html/index.html
[root@web2 ~]# curl http://192.168.83.130:8080
web2

設(shè)置代理服務(wù)器1

[root@haproxy1 ~]# yum -y install haproxy         #安裝haproxy
[root@haproxy1 ~]# cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak`date +%F-%T`      #在實(shí)際工作中,修改文件一定要謹(jǐn)慎,最好事先做一個(gè)備份
[root@haproxy1 haproxy]# cat haproxy.cfg.bak2017-05-28-01\:16\:53 |egrep -v "(#|^$)" > haproxy.cfg         #過濾注釋和空行

[root@haproxy1 ~]# cat /etc/haproxy/haproxy.cfg       #把配置文件修改如下

global       #全局配置
    log         127.0.0.1 local3 info  #把發(fā)送到日志設(shè)備local3的info級別的日志記錄在本地
    chroot      /var/lib/haproxy      #綁定haproxy的工作路徑
    pidfile     /var/run/haproxy.pid      #pid文件路徑
    maxconn     4000           #最大連接數(shù)
    user        haproxy           #運(yùn)行進(jìn)程的用戶
    group       haproxy         #運(yùn)行進(jìn)程的用戶組
    daemon                          #以后臺(tái)方式運(yùn)行
    stats socket /var/lib/haproxy/stats    #haproxy動(dòng)態(tài)維護(hù)的套接字文件,下面會(huì)通過一個(gè)小實(shí)驗(yàn)看這個(gè)玩意的作用
defaults      #除非有具體定義,否則default選項(xiàng)會(huì)加入到后面 選項(xiàng),不適用的就不會(huì)被定義
    mode                    http      #默認(rèn)的模式
    log                     global      #引用全局的日志配置
    option                  httplog     #啟用日志記錄http請求,haproxy默認(rèn)不記錄http請求日志
    option                  dontlognull     #日志中不記錄健康檢查的連接
    option http-server-close     #對于某些server端不支持http長連接的情況,利用這個(gè)參數(shù)可以使用客戶端到haproxy是長連接,而haproxy到server端是短連接   

    option forwardfor       except 127.0.0.0/8    #允許服務(wù)器記錄發(fā)起請求的真實(shí)客戶端的IP地址

    option         redispatch    #當(dāng)client從web服務(wù)器每獲取一個(gè)資源的時(shí)候都需要建立一次tcp連接,為了保持會(huì)話的持久性在一定時(shí)間之內(nèi)讓tcp連接保持持久性,當(dāng)再次訪問相同的資源的時(shí)候就不再需要建立tcp連接,tcp的持久性依賴cookie,當(dāng)你的一個(gè)realserver down了之后,會(huì)把訪問過的http的緩存重定向到另外一個(gè)real server

    retries         3     #連接真實(shí)服務(wù)器的失敗重連次數(shù),超過這個(gè)值后會(huì)將對應(yīng)正式服務(wù)器標(biāo)記為不可用
    timeout http-request    10s   #http請求超時(shí)時(shí)間
    timeout queue           1m       #請求在隊(duì)列中的超時(shí)時(shí)間
    timeout connect         10s      #連接超時(shí)
    timeout client          1m          #客戶端連接超時(shí)
    timeout server          1m         #服務(wù)端連接超時(shí)
    timeout http-keep-alive 10s   #http-keep-alive超時(shí)時(shí)間
    timeout check           10s         #檢測超時(shí)時(shí)間
    maxconn                 3000         #每個(gè)進(jìn)程最大的連接數(shù)
frontend  www      #定義前端
    bind *:80            #綁定客戶端訪問的是哪個(gè)IP的80端口
    mode http          #指定模式為http
    option httplog    #記錄http請求的日志
    log global            #應(yīng)用全局的日志配置
    stats uri /haproxy?stats    #haproxy自帶的監(jiān)控頁面
    default_backend             web    #指定默認(rèn)的后端
backend web       #定義后端
    mode http       #模式為http
    option redispatch
    balance roundrobin    #負(fù)載均衡算法指定為輪詢
    option httpchk GET /index.html      #檢測后端真實(shí)服務(wù)器的方法
server web1 192.168.83.129:8080 cookie web1 weight 1 check inter 2000 rise 2 fall 3
server web2 192.168.83.130:8080 cookie web2 weight 1 check inter 2000 rise 2 fall 3

#定義的真實(shí)服務(wù)器,權(quán)重為1,健康檢測時(shí)間間隔為2秒,重試2次,失敗3次標(biāo)記為不可用

[root@haproxy1 ~]# haproxy -c -f /etc/haproxy/haproxy.cfg   #檢查配置文件是否正確
Configuration file is valid

開啟遠(yuǎn)程記錄日志的功能

[root@haproxy1 ~]# cat -n /etc/rsyslog.conf 
    15 $ModLoad imudp         #刪除注釋
    16 $UDPServerRun 514     #刪除注釋
    73 local7.*                                           /var/log/boot.log      #在這一行下面添加下面的內(nèi)容
    74 local3.*                                          /var/log/haproxy.log  #把發(fā)送到local3日志設(shè)備的日志記錄在/var/log/haproxy.log 

[root@haproxy1 ~]# systemctl restart rsyslog

[root@haproxy1 ~]# systemctl start haproxy        
[root@haproxy1 ~]# systemctl enable haproxy

驗(yàn)證

haproxy+keepalived實(shí)現(xiàn)web集群的高可用性

haproxy+keepalived實(shí)現(xiàn)web集群的高可用性

瀏覽器輸入:http://192.168.83.131/haproxy?stats訪問haproxy的監(jiān)控頁面

haproxy+keepalived實(shí)現(xiàn)web集群的高可用性

測試一下配置文件中設(shè)置的真實(shí)服務(wù)器監(jiān)控狀態(tài)檢測的功能( option httpchk GET /index.html  )

[root@haproxy1 haproxy]# sed  -i 's/index\.html/test.html/g' haproxy.cfg   #把檢測頁面更改為test.index

[root@haproxy1 haproxy]# systemctl reload haproxy    #重載haproxy,生產(chǎn)中不建議重啟haprox,因?yàn)檫@會(huì)斷開所有現(xiàn)有的連接
Message from syslogd@localhost at May 29 10:30:23 ...
 haproxy[3305]: backend web has no server available!   #馬上提示后端服務(wù)器不可用

在監(jiān)控頁面可以看到后端的真實(shí)服務(wù)器宕機(jī)haproxy+keepalived實(shí)現(xiàn)web集群的高可用性

配置文件里面有一行是關(guān)于動(dòng)態(tài)維護(hù)haproxy的,那么動(dòng)態(tài)維護(hù)haproxy是什么回事呢,舉一個(gè)小示例如下:
[root@haproxy1 ~]# yum -y install socat

[root@haproxy1 ~]# echo "show info"|socat stdio /var/lib/haproxy/stats   #查看info的信息,里面的內(nèi)容可以用于監(jiān)控haproxy的狀態(tài)
Name: HAProxy
Version: 1.5.14
Release_date: 2015/07/02
Nbproc: 1
Process_num: 1
Pid: 3390
Uptime: 0d 0h24m43s
Uptime_sec: 883
Memmax_MB: 0
Ulimit-n: 8033
Maxsock: 8033
Maxconn: 4000
Hard_maxconn: 4000
CurrConns: 0
CumConns: 19
CumReq: 37
MaxSslConns: 0
CurrSslConns: 0
CumSslConns: 0
Maxpipes: 0
PipesUsed: 0
PipesFree: 0
ConnRate: 0
ConnRateLimit: 0
MaxConnRate: 2
Se***ate: 0
Se***ateLimit: 0
MaxSe***ate: 2
SslRate: 0
SslRateLimit: 0
MaxSslRate: 0
SslFrontendKeyRate: 0
SslFrontendMaxKeyRate: 0
SslFrontendSessionReuse_pct: 0
SslBackendKeyRate: 0
SslBackendMaxKeyRate: 0
SslCacheLookups: 0
SslCacheMisses: 0
CompressBpsIn: 0
CompressBpsOut: 0
CompressBpsRateLim: 0
ZlibMemUsage: 0
MaxZlibMemUsage: 0
Tasks: 8
Run_queue: 1
Idle_pct: 100
node: haproxy1
description:

動(dòng)態(tài)維護(hù)haproxy的功能還有很多,比如關(guān)閉重啟后端的真實(shí)服務(wù)器等等。

根據(jù)acl進(jìn)行訪問內(nèi)容的重定向

haproxy有一個(gè)很實(shí)用的功能,可以根據(jù)acl進(jìn)行訪問內(nèi)容的重定向,把配置文件中關(guān)于前端后端的配置更改如下:

frontend  www
    bind *:80
    mode http
    option httplog
    log global
    stats uri /haproxy?stats
    acl web1 hdr_reg(host) -i www.web1.com   #web1,acl的名字;hdr_reg(host),固定格式,用來識(shí)別host 
    acl web2 hdr_reg(host) -i www.web2.com
    use_backend www1 if web1       #use_backend指定使用哪個(gè)后端,if用來識(shí)別acl

    use_backend www2 if web2
backend www1
    mode http 
    option redispatch
    balance roundrobin
    option httpchk GET /index.html
    server web1 192.168.83.129:8080 cookie web1 weight 1 check inter 2000 rise 2 fall 3
backend www2
    mode http 
    option redispatch
    balance roundrobin
    option httpchk GET /index.html
    server web2 192.168.83.130:8080 cookie web2 weight 1 check inter 2000 rise 2 fall 3

不知道為什么我的手提電腦用谷歌火狐IE一直提示連接超時(shí),域名解析我也配置了,就用代理1來驗(yàn)證

haproxy+keepalived實(shí)現(xiàn)web集群的高可用性

除了根據(jù)域名,還可以根據(jù)文件的后綴名實(shí)現(xiàn)訪問內(nèi)容重定向

frontend  www
    bind *:80
    mode http
    option httplog
    option forwardfor
    log global
    stats uri /haproxy?stats
    acl is_static_reg url_reg /*.(css|jpg|png|js)$  
    use_backend static_web if is_static_reg
    default_backend web
backend web
    mode http 
    option redispatch
    balance roundrobin
    option httpchk GET /index.html
    server web1 192.168.83.129:8080 cookie web1 weight 1 check inter 2000 rise 2 fall 3
    server web2 192.168.83.130:8080 cookie web2 weight 1 check inter 2000 rise 2 fall 3
backend static_web
    mode http 
    option redispatch
    balance roundrobin
    option httpchk GET /index.html
    server web2 192.168.83.130:8080 cookie web2 weight 1 check inter 2000 rise 2 fall 3

[root@web2 html]# echo test_static > index.jpg

驗(yàn)證

haproxy+keepalived實(shí)現(xiàn)web集群的高可用性

haproxy+keepalived

為了防止單點(diǎn)故障還有單臺(tái)的haproxy無法承受大并發(fā)量,生產(chǎn)環(huán)境中一般會(huì)有兩臺(tái)或者以上的haproxy服務(wù)器做代理。

準(zhǔn)備另外一臺(tái)代理機(jī)haproxy2,配置和代理1大同小異

[root@haproxy2 ~]# yum -y install haproxy

[root@haproxy1 ~]# scp /etc/haproxy/haproxy.cfg haproxy2:/etc/haproxy/  #把haproxy1上的配置文件copy到haproxy2
[root@haproxy1 ~]# scp /etc/rsyslog.conf haproxy2:/etc/   ##把haproxy1上的配置文件copy到haproxy2

[root@haproxy2 ~]# systemctl enable haproxy
[root@haproxy2 ~]# systemctl restart haproxy
[root@haproxy2 ~]# systemctl restart rsyslog

驗(yàn)證haproxy2功能正常

haproxy+keepalived實(shí)現(xiàn)web集群的高可用性

haproxy+keepalived實(shí)現(xiàn)web集群的高可用性

在haproxy1上配置keepalived

[root@haproxy1 ~]# yum -y install keepalived   #下載keepalived

[root@haproxy1 ~]# tail -2 /etc/sysconfig/keepalived   #設(shè)置keepalived的日志發(fā)送到日志設(shè)備6
KEEPALIVED_OPTIONS="-D -S 6"

修改配置文件如下

[root@haproxy1 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
   notification_email {
   root@localhost    #告警郵件接收地址
   }
   notification_email_from keepalived@localhost   #應(yīng)該是郵件的標(biāo)題
   smtp_server 127.0.0.1     #smtp服務(wù)器地址
   smtp_connect_timeout 30   #連接smtp服務(wù)器超時(shí)時(shí)間
   router_id haproxy1     #每一個(gè)keepalived節(jié)點(diǎn)的router_id都是唯一的,不可以重復(fù)
vrrp_script haproxy{            #vrrp_script是為了防止keepalived節(jié)點(diǎn)宕機(jī)之后vip不會(huì)發(fā)生轉(zhuǎn)移,
   script "kiall -0 haproxy     用來檢查keepalived服務(wù)的狀態(tài)的模塊,這個(gè)模塊只關(guān)注腳本的返回值是0
   weight -25                  還是1,如果返回為1即時(shí)檢查失敗,把次節(jié)點(diǎn)的keepalived優(yōu)先級減去25
   }
}

vrrp_instance ha1 {
    state MASTER     #角色為MASTER
    interface eno16777736   #指定haproxy檢查網(wǎng)絡(luò)的接口
    virtual_router_id 51   #虛擬路由的ID,在所有的keepalived節(jié)點(diǎn)必須保持一致
    priority 100      #優(yōu)先級
    advert_int 1     #心跳檢查的時(shí)間間隔
    authentication {
        auth_type PASS    #指定keepalived節(jié)點(diǎn)之間的驗(yàn)證方式為密碼驗(yàn)證
        auth_pass linux     #keepalived節(jié)點(diǎn)的認(rèn)證密碼
    }
    virtual_ipaddress {
        192.168.83.111/24 dev eno16777736   #vip地址
    }
track_script{    
             haproxy    #調(diào)用haproxy檢查腳本
            }
}

在haproxy2上配置keepalived

[root@haproxy1 ~]# scp /etc/keepalived/keepalived.conf ;scp /etc/rsyslog.conf;scp /etc/sysconfig/keepalived   #把代理機(jī)1的配置文件傳輸?shù)?

[root@haproxy2 ~]# cat /etc/keepalived/keepalived.conf   #修改字段
   router_id haproxy2   #修改虛擬路由的ID
   state BACKUP   #修改角色
   priority 80     #修改優(yōu)先級

重啟haproxy1、2的服務(wù)

[root@haproxy1 ~]# systemctl restart keepalived
[root@haproxy1 ~]# systemctl restart haproxy
[root@haproxy1 ~]# systemctl restart rsyslog
[root@haproxy2 ~]# systemctl restart keepalived
[root@haproxy2 ~]# systemctl restart haproxy
[root@haproxy2 ~]# systemctl restart rsyslog

驗(yàn)證

[root@haproxy1 ~]# ip a |grep 111      #主節(jié)點(diǎn)haproxy1生成vip

    inet 192.168.83.111/24 scope global secondary eno16777736
[root@haproxy2 ~]# ip a |grep 111     #而備節(jié)點(diǎn)還有vip

訪問真實(shí)服務(wù)器

[root@haproxy1 ~]# curl http://192.168.83.111
web1
[root@haproxy1 ~]# curl http://192.168.83.111
web2

[root@haproxy1 ~]# systemctl stop keepalived   #模擬代理1宕機(jī),停服務(wù)模擬也OK,只要到1的心跳檢查不通過,2就會(huì)認(rèn)為1宕機(jī),從而搶占vip

[root@haproxy2 ~]# ip a |grep 111   #vip漂移到2
    inet 192.168.83.111/24 scope global secondary eno16777736

真實(shí)服務(wù)器依然可以訪問

haproxy+keepalived實(shí)現(xiàn)web集群的高可用性haproxy+keepalived實(shí)現(xiàn)web集群的高可用性

這就是通過haproxy+keepalived方式實(shí)現(xiàn)web集群高可用的簡單實(shí)驗(yàn),在工作中其實(shí)還有許許多多的配置,我暫時(shí)不是很明白,等我明白的差不多也會(huì)發(fā)上來和大家討論,暫時(shí)就先不發(fā)上來誤人子弟了,哈哈哈哈哈哈哈哈!

如有紕漏,歡迎指正。



當(dāng)前名稱:haproxy+keepalived實(shí)現(xiàn)web集群的高可用性
轉(zhuǎn)載注明:http://weahome.cn/article/gcghod.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部