HAProxy實戰(一)

實驗目的

  • 測試基于haproxy的反代和負載均衡配置

  • 測試keepalived高可用haproxy的效果

實驗要點

(1) 動靜分離discuzx,動靜都要基于負載均衡實現;
(2) 進一步測試在haproxy和后端主機之間添加varnish緩存;
(3) 給出拓撲設計;
(4) haproxy的設定要求:

(a) 啟動stats;
(b) 自定義403、502和503的錯誤頁;
(c) 各組后端主機選擇合適的調度方法;
(d) 記錄好日志;
(e) 使用keepalived高可用haproxy;

拓撲結構

HAProxy實戰(一)

拓撲圖的簡要說明

  • node2和node5上同時運行keepalived和haproxy,做高可用,VIP為172.16.47.100

  • 在node3和node4上,模擬了2臺基于IP的虛擬主機,以減少實驗中機器的數量

  • 在node3上,運行nginx的同時,還運行了nfs服務,共享目錄;在node4上把該共享目錄掛載到本地,用于httpd服務存放靜態內容;node3上的nginx將該目錄作為其網頁文件根路徑,從而實現了靜態內容的共享

  • haproxy主機負責接受用戶請求,當用戶請求的是圖片資源時,調度至nginx服務器,否則調度請求至httpd服務器

實驗配置

根據實驗拓撲,在node3上部署nginx服務,nfs服務

[root@node3 ~]# rpm -ivh nginx-1.10.0-1.el7.ngx.x86_64.rpm  #安裝nginx
[root@node3 ~]# yum install nfs-utils -y #安裝nfs
[root@node3 ~]# mkdir /testdir/nfs -pv  #創建nfs服務器的導出目錄
[root@node3 ~]# vim /etc/exports
[root@node3 ~]# cat /etc/exports    #授權node4上的2個ip可以訪問
/testdir/nfs    172.16.47.104(rw,no_root_squash)    172.16.47.204(rw,no_root_squash)
[root@node3 ~]# systemctl start rpcbind 
[root@node3 ~]# systemctl start nfs #啟動nsf服務,因為nfs服務依賴于rpc服務,因此要先啟動rpc

ssl -tnl可以看到111端口(rpc)和2049(nfs)都已經起來

HAProxy實戰(一)

修改nginx的配置文件,添加兩個基于IP的虛擬主機,以模擬一組靜態服務器組,將其網頁根文件路徑設置為nfs服務器的導出目錄。

[root@node3 /etc/nginx/conf.d]# egrep -v "#|^$" default.conf
server {
    listen      172.16.47.103:80;
    server_name  www.33love.me;
    location / {
        root   /testdir/nfs;
        index  index.html index.htm;
    rewrite /attachment/(.*)$ /$1;  #因為在前端用戶訪問某附件資源時,其訪問路徑是http://172.16.47.100/bbs/data/attachment/XX,而nginx本地只有attachment目錄下的相關資源,因此要對url進行重寫
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
server {
    listen    172.16.47.203:80;
    server_name    www.33love.com;
    root    /testdir/nfs;
    index index.html;
    rewrite    /attachment/(.*)$ /$1;
}
[root@node3 /etc/nginx/conf.d]#

提供測試主頁,啟動nginx服務,測試nginx服務是否正常

HAProxy實戰(一)

在node4上部署配置amp環境

yum install httpd php php-mysql mariadb-server -y,啟動mariadb,創建bbs庫,授權用戶訪問,部署用于安裝Discuz論壇所需的數據庫環境

HAProxy實戰(一)

解壓Discuzx至httpd工作目錄/var/www/html/下,改名upload為bbs,解壓目錄下的data/attachment/目錄為用戶上傳附件的目錄,將node3上的共享目錄/testdir/nfs掛載到該目錄下。這樣的話,就需要先將該目錄下的文件先備份處理,待掛載后,再移進來。

注意:得先在node3上創建一個于node4上的apache用戶相同ID號的用戶,并且讓該用戶對nfs導出的目錄有寫權限。

HAProxy實戰(一)

HAProxy實戰(一)

HAProxy實戰(一)

HAProxy實戰(一)

HAProxy實戰(一)

再來配置httpd服務器,創建兩個基于IP的虛擬主機,模擬動態服務器組

HAProxy實戰(一)

兩個IP訪問都沒問題,開始安裝

HAProxy實戰(一)

HAProxy實戰(一)

在node2上安裝部署haproxy和keepalived

yum install haproxy keepalived -y #安裝相應軟件

配置keepalived高可用haproxy,node2為備節點
! Configuration File for keepalived

global_defs {
   notification_email {
    root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id Lurker
   vrrp_mcast_group4 224.0.100.33
}

vrrp_script chk_haproxy {
        script "killall -0 haproxy"
        interval 1  #每隔一秒執行一次上面的檢測
        weight -5   #權重減5,而主的上面我配置的是權重減10
        rise 1
        fall 2
}

vrrp_instance VI_1 {
    state BACKUP    #備
    interface eno16777736
    virtual_router_id 14
    priority 95 #優先級
    advert_int 1    #vrrp通告的時間間隔
    authentication {
        auth_type PASS
        auth_pass 3333
    }

        track_script {
                chk_haproxy
        }

   virtual_ipaddress {
        172.16.47.100/16 dev eno16777736
    }
        track_interface {
                eno16777736
        }
}

HAProxy的配置
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000
    errorfile 403 /tmp/403.html #定義錯誤頁面
    errorfile 502 /tmp/502.html
    errorfile 503 /tmp/503.html

frontend  bbs *:80  #注意備份節點上的監聽地址不能寫出VIP,因為它是Backup狀態時,是沒有VIP的,如果寫出VIP,這時會報錯的
    acl fujian path_sub -i /attachment   #定義acl,當訪問路徑有attachment時,匹配
    use_backend nginxgroup if fujian
    default_backend httpdgroup

backend nginxgroup  #定義處理靜態內容的nginx服務器組
    balance roundrobin
    server nginx103 172.16.47.103:80 check maxconn 1000
    server nginx203 172.16.47.203:80 check maxconn 2000

backend httpdgroup  #定義處理動態內容的httpd服務器組
    balance uri
    option httpchk /index.html
    hash-type consistent
    server httpd104 172.16.47.104:80 check maxconn 300
    server httpd204 172.16.47.204:80 check maxconn 500

listen statspage    #自定義狀態頁面
    bind *:3333
    stats enable
    stats uri /myadmin?stats
    stats realm Lurker\ HAProxy \stats \Page
    stats auth admin:admin@123
    stats admin if TRUE

配置rsyslog
開啟TCP或UDP
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
加上一句定義loacl2的facility日志文件路徑
local12.*                                               /varlog/haproxy.log

node5上的配置也是類似,只不過配置keepalived時要配置成主節點。

重啟rsyslog,啟動keepalived,haproxy,測試訪問。

HAProxy實戰(一)

HAProxy實戰(一)

停掉主節點node5上的haproxy,可以看到VIP,已經到備節點node2上,頁面也仍可以正常訪問

HAProxy實戰(一)

HAProxy實戰(一)

至此,keepalived高可用haproxy成功。不過在這里的時候遇到一個坑,記錄一下。

在配置好keepalived高可用haproxy后,把node5(主)和node3(備)上的haproxy和keepalived都起起來,這時VIP在node5上面,能正常訪問頁面,這沒問題;把node5上的Haproxy停掉之后,它的優先級減了10,成了90,,這也沒問題,但是,node3的優先級按正常來說應該是95,這時node3優先級比node5高,應該成為主,VIP應該在node3上,但是實際上卻沒有。

在node2上抓包tcpdump -i eno16777736 -nn host 224.0.100.33

可以看到,仍是node5(172.16.47.105)發的vrrp報文,并且優先級變成了90。

HAProxy實戰(一)

到這里我們來分析一下:node5的優先級降低,都變成了90,而node2卻還沒有變成主,難道是node2的優先級更低?停掉node5上的keepalived讓其優先級變為0,來看看node2的優先級。

HAProxy實戰(一)

node2的優先級不是應該是95嗎,怎么變成90了?于是想到檢查haproxy健康狀態的配置段:

vrrp_script chk_haproxy {
        script "killall -0 haproxy"
        interval 1  #每隔一秒執行一次上面的檢測
        weight -5   #權重減5,而主的上面我配置的是權重減10
        rise 1
        fall 2
}

killall -0 haproxy是檢查haproxy進程是否存在,存在返回0。所以檢測的邏輯是:每秒鐘執行一次script “killall -0 haproxy”,如果返回碼為0,則不執行下面的weight -5,否則執行。自己手動執行一下killall -0 haproxy,發現killall命令竟然不存在。

HAProxy實戰(一)

killall命令不存在,那么killall命令肯定執行不成功,返回非0值了。于是就明白為什么node2權重會異常的減5了。安裝上killall所需的包,問題就解決了。

HAProxy實戰(一)

統計頁面如下:

HAProxy實戰(一)

現在來驗證動靜分離是否成功:查看已經上傳的圖片是由誰處理的。

HAProxy實戰(一)

可以看到,是由nignx處理的,再來看看其他資源

HAProxy實戰(一)

可以看到,是由apache處理的。這說明,我們在haproxy上定義的acl生效了,當匹配到/attachment時,請求就被調度至nginx,其他的請求全都送往httpd服務器組,查看我們定義的haproxy的日志,可以看到nginxgroup和httpdgroup都處理過請求。

HAProxy實戰(一)

node4上停掉httpd服務器,systemctl stop httpd.service,我們自定義的錯誤頁面也出來了

HAProxy實戰(一)

至此,discuz論壇的動靜分離也已經實現。

原創文章,作者:Lurker,如若轉載,請注明出處:http://www.www58058.com/68260

(0)
LurkerLurker
上一篇 2017-02-12 22:26
下一篇 2017-02-13 11:37

相關推薦

  • HA Cluster—Keepalived

    HA Cluster 集群類型:LB(lvs/nginx(http/upstream, stream/upstream))、HA、HP 系統可用性的公式:A=MTBF/(MTBF+MTTR) 系統故障: 硬件故障:設計缺陷、wear out、自然災害 軟件故障:設計缺陷 提升系統高用性的解決方案之降低MTTR: 解決方案:冗余(redundant) acti…

    Linux干貨 2017-10-30
  • 文件系統管理_設定文件系統的配額

    認識配置配額系統 :為控制用戶使用的空間的大小,在linux可以實現對分區的大小控制,控制用戶在這個分區內使用空間的大小同時還可以對用戶的文件個數實現控制。 在linux系統中其遵循文件分區來實現控制 磁盤的配額只針對單個分區來實現控制,不能對單塊磁盤(硬盤)來實現控制的 【搭建試驗環境 1】 怎樣把某一個文件夾(/home)單獨放到(遷移)一個獨立的分區中…

    Linux干貨 2017-04-24
  • Linux 文 本 處 理 工 具

    Linux 文 本 處 理 工 具 一.學習大綱: ◎各種文本工具來查看、分析、統計文本文件 文件內容查看工具:cat, tac,rev,more,less 文件截?。篽ead和tail 按列抽取:cut,paste 分析文本的工具:wc , sort , uniq,diff和patch 命令使用練習題 ◎文本過濾與處理工具: grep與正則表達式…

    Linux干貨 2016-08-05
  • N25第四周博客作業

    第四周博客作業 1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有任何訪問權限。 2、編輯/etc/group文件,添加組hadoop。      3、手動編輯/etc/passwd文件新增一行,添加用戶hadoop,其基本組ID為hadoop組的i…

    Linux干貨 2016-12-19
  • Tomcat 性能優化-1

    <Connector  port="8080" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75&…

    Linux干貨 2016-09-19
  • mariadb基礎應用

    mariadb基礎應用 一、 前言 MariaDB is one of the most popular database servers in the world. It’s made by the original developers of MySQL and guaranteed to stay open source. Notable users …

    Linux干貨 2016-12-16
欧美性久久久久