亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

haproxy+keepalived實現web集群的高可用性

發布時間:2020-03-31 00:30:04 來源:網絡 閱讀:3688 作者:黎董 欄目:建站服務器

haproxy+keepalived實現web集群高可用性


負載均衡集群的概念

負載均衡是設計分布式系統架構必須要考慮的因素之一,它指的是通過調度分發的方式盡可能將“請求”、“訪問”的壓力負載平均分攤到集群中的各個節點,避免有些節點負載太高導致訪問延遲,而有些節點負載很小導致資源浪費。這樣,每個節點都可以承擔一定的訪問請求負載壓力,并且可以實現訪問請求在各節點之間的動態分配,以實現負載均衡,從而為企業提供更高性能,更加穩定的系統架構解決方案。


高可用集群的概念

高可用是指以減少服務中斷時間或者避免服務中斷為目標的技術,它也是分布式系統架構中必須要考慮的因素之一。集群中節點之間進行心跳檢查,可以實現對整個集群中的節點健康狀態的檢測,如果某個節點失效,它的備節點將在幾秒鐘的時間內接管它的工作。因此對于用戶而言,服務總是可以訪問的。


haproxy是什么?

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

包括 GitHub、Bitbucket、Stack Overflow、Reddit、Tumblr、Twitter和 Tuenti在內的知名網站,及亞馬遜網絡服務系統都使用了HAProxy。


keepalived又是什么?

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



下面通過一個簡單的實驗,來看看如何實現通過haproxy+keepalived實現web集群的高可用和負載均衡


環境設置

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


//所有的服務器都要同步時間,集群的時間是很敏感的,在生產環境中建議用公司內部的ntp服務器,用外部的ntp服務器隨著運行時間的增加,會逐漸出現時間偏移,一旦偏移量過大,集群便會出現非常嚴重的問題


 ntpdate time.nist.gov

 crontab -l

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


在兩臺主機上部署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    #出于安全性考慮,把默認端口改成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    #出于安全性考慮,把默認端口改成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


設置代理服務器1

[root@haproxy1 ~]# yum -y install haproxy         #安裝haproxy
[root@haproxy1 ~]# cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak`date +%F-%T`      #在實際工作中,修改文件一定要謹慎,最好事先做一個備份
[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  #把發送到日志設備local3的info級別的日志記錄在本地
    chroot      /var/lib/haproxy      #綁定haproxy的工作路徑
    pidfile     /var/run/haproxy.pid      #pid文件路徑
    maxconn     4000           #最大連接數
    user        haproxy           #運行進程的用戶
    group       haproxy         #運行進程的用戶組
    daemon                          #以后臺方式運行
    stats socket /var/lib/haproxy/stats    #haproxy動態維護的套接字文件,下面會通過一個小實驗看這個玩意的作用
defaults      #除非有具體定義,否則default選項會加入到后面 選項,不適用的就不會被定義
    mode                    http      #默認的模式
    log                     global      #引用全局的日志配置
    option                  httplog     #啟用日志記錄http請求,haproxy默認不記錄http請求日志
    option                  dontlognull     #日志中不記錄健康檢查的連接
    option http-server-close     #對于某些server端不支持http長連接的情況,利用這個參數可以使用客戶端到haproxy是長連接,而haproxy到server端是短連接   

    option forwardfor       except 127.0.0.0/8    #允許服務器記錄發起請求的真實客戶端的IP地址

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

    retries         3     #連接真實服務器的失敗重連次數,超過這個值后會將對應正式服務器標記為不可用
    timeout http-request    10s   #http請求超時時間
    timeout queue           1m       #請求在隊列中的超時時間
    timeout connect         10s      #連接超時
    timeout client          1m          #客戶端連接超時
    timeout server          1m         #服務端連接超時
    timeout http-keep-alive 10s   #http-keep-alive超時時間
    timeout check           10s         #檢測超時時間
    maxconn                 3000         #每個進程最大的連接數
frontend  www      #定義前端
    bind *:80            #綁定客戶端訪問的是哪個IP的80端口
    mode http          #指定模式為http
    option httplog    #記錄http請求的日志
    log global            #應用全局的日志配置
    stats uri /haproxy?stats    #haproxy自帶的監控頁面
    default_backend             web    #指定默認的后端
backend web       #定義后端
    mode http       #模式為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

#定義的真實服務器,權重為1,健康檢測時間間隔為2秒,重試2次,失敗3次標記為不可用


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


開啟遠程記錄日志的功能

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

[root@haproxy1 ~]# systemctl restart rsyslog

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


驗證

haproxy+keepalived實現web集群的高可用性

haproxy+keepalived實現web集群的高可用性

瀏覽器輸入:http://192.168.83.131/haproxy?stats訪問haproxy的監控頁面

haproxy+keepalived實現web集群的高可用性

測試一下配置文件中設置的真實服務器監控狀態檢測的功能( 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,生產中不建議重啟haprox,因為這會斷開所有現有的連接
Message from syslogd@localhost at May 29 10:30:23 ...
 haproxy[3305]: backend web has no server available!   #馬上提示后端服務器不可用


在監控頁面可以看到后端的真實服務器宕機haproxy+keepalived實現web集群的高可用性

配置文件里面有一行是關于動態維護haproxy的,那么動態維護haproxy是什么回事呢,舉一個小示例如下:
[root@haproxy1 ~]# yum -y install socat

[root@haproxy1 ~]# echo "show info"|socat stdio /var/lib/haproxy/stats   #查看info的信息,里面的內容可以用于監控haproxy的狀態
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:

動態維護haproxy的功能還有很多,比如關閉重啟后端的真實服務器等等。


根據acl進行訪問內容的重定向


haproxy有一個很實用的功能,可以根據acl進行訪問內容的重定向,把配置文件中關于前端后端的配置更改如下:

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),固定格式,用來識別host 
    acl web2 hdr_reg(host) -i www.web2.com
    use_backend www1 if web1       #use_backend指定使用哪個后端,if用來識別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一直提示連接超時,域名解析我也配置了,就用代理1來驗證

haproxy+keepalived實現web集群的高可用性


除了根據域名,還可以根據文件的后綴名實現訪問內容重定向

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


驗證

haproxy+keepalived實現web集群的高可用性



haproxy+keepalived

為了防止單點故障還有單臺的haproxy無法承受大并發量,生產環境中一般會有兩臺或者以上的haproxy服務器做代理。


準備另外一臺代理機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


驗證haproxy2功能正常

haproxy+keepalived實現web集群的高可用性

haproxy+keepalived實現web集群的高可用性

在haproxy1上配置keepalived

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

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


修改配置文件如下

[root@haproxy1 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
   notification_email {
   root@localhost    #告警郵件接收地址
   }
   notification_email_from keepalived@localhost   #應該是郵件的標題
   smtp_server 127.0.0.1     #smtp服務器地址
   smtp_connect_timeout 30   #連接smtp服務器超時時間
   router_id haproxy1     #每一個keepalived節點的router_id都是唯一的,不可以重復
vrrp_script haproxy{            #vrrp_script是為了防止keepalived節點宕機之后vip不會發生轉移,
   script "kiall -0 haproxy     用來檢查keepalived服務的狀態的模塊,這個模塊只關注腳本的返回值是0
   weight -25                  還是1,如果返回為1即時檢查失敗,把次節點的keepalived優先級減去25
   }
}

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


在haproxy2上配置keepalived

[root@haproxy1 ~]# scp /etc/keepalived/keepalived.conf ;scp /etc/rsyslog.conf;scp /etc/sysconfig/keepalived   #把代理機1的配置文件傳輸到2

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


重啟haproxy1、2的服務

[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


驗證


[root@haproxy1 ~]# ip a |grep 111      #主節點haproxy1生成vip

    inet 192.168.83.111/24 scope global secondary eno16777736
[root@haproxy2 ~]# ip a |grep 111     #而備節點還有vip


訪問真實服務器

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


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

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


真實服務器依然可以訪問

haproxy+keepalived實現web集群的高可用性haproxy+keepalived實現web集群的高可用性


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

如有紕漏,歡迎指正。























向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东山县| 千阳县| 宁陕县| 阜城县| 姜堰市| 皋兰县| 贵南县| 池州市| 龙里县| 东辽县| 新乡县| 鄂托克旗| 开封市| 玉溪市| 通辽市| 溧水县| 武城县| 温州市| 呼玛县| 江源县| 平湖市| 安达市| 大余县| 永年县| 陇南市| 富民县| 恩平市| 遂昌县| 德江县| 舒城县| 马关县| 嵊泗县| 永登县| 云梦县| 乌鲁木齐市| 叙永县| 新昌县| 郸城县| 紫阳县| 清河县| 如东县|