KeepAlived實現HAProxy雙主并實現資源的動靜分離

KeepAlived實現HAProxy雙主并實現資源的動靜分離

前言

我們這次使用HAProxy作為負載均衡調度器來實現后端httpd服務的負載均衡和動靜分離,并使用KeepAlivedHAproxy實現雙主高可用, 再使用DNS輪詢將用戶對www.anyisalin.com的訪問負載均衡至兩個HAProxy實現的負載均衡調度器上

HAProxy介紹

HAProxy的是一個免費的,非??焖俸涂煽康慕鉀Q方案,提供高可用性,負載均衡和代理對TCP和HTTP的應用程序。它特別適用于非常高流量網站。多年來,它已成為標準的開源的負載均衡程序,現在隨最主流的Linux發行版,并且通常默認的云平臺部署。其運作模式使得其集成到現有的架構非常容易,無風險,同時還提供了可能性不暴露脆弱的Web服務器到網絡 
__轉自HAProxy官方站點

我們今天只演示HAProxy作為負載均衡器的場景

實驗拓撲

blob.png

實驗環境

VIP1: 172.16.1.10 VIP2: 172.16.1.11

主機 IP 功用
node1.anyisalin.com 172.16.1.2, VIP HAproxy, KeepAlived Node
node2.anyisalin.com 172.16.1.3, VIP HAproxy, KeepAlived Node
node3.anyisalin.com 172.16.1.4 httpd, Image資源
node4.anyisalin.com 172.16.1.5 httpd, 動態網頁
node5.anyisalin.com 172.16.1.8 dns

注意: 本文實驗中所有主機SElinux和iptables都是關閉的

實驗步驟

配置后端httpd服務器

node3存放圖片

[root@node3 ~]# yum install httpd -y      #安裝httpd
[root@node3 ~]# cd /var/www/html/
[root@node3 html]# ls   
mage.jpg    #這里有一張實現存好的圖片

[root@node3 html]# service httpd start  #啟動httpd服務

node4存放php文件

[root@node4 ~]# yum install httpd php 
[root@node4 ~]# ls /var/www/html/  #查看目錄下的文件, 什么都沒有
[root@node4 ~]# cat >> /var/www/html/index.php << "EOF"  #創建網頁文件
> <html>
>     <head><title>Welcome to magedu.com</title></head>
>     <body>
>         <img src="/mage.jpg"/>     #我們的網頁目錄下并沒有這張圖片
>         <?php
>         echo "<h1>Welcome to MageEdu</h1>";
>         ?>
>     </body>
> </html>
> EOF

[root@node3 html]# service httpd start  #啟動httpd服務

配置HAProxy實現backend負載均衡

[root@node1 ~]# yum install  -y haproxy    #安裝haproxy


[root@node1 ~]# vim /etc/haproxy/haproxy.cfg   #配置文件如下
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats
    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

frontend  main 
    bind *:80

    ##開啟stats界面
    stats enable
    stats hide-version
    stats uri /haproxyadmin

    default_backend             dynamic       #默認backend為dynamic
    acl    url_static    path_end    -i .jpg  #訪問控制列表, 匹配結尾為.jpg的資源
    use_backend   static  if url_static       #如果結尾為.jpg, 則使用backend為static

backend dynamic
    balance     roundrobin        #這里使用roundrobin算法
    server dynamic 172.16.1.5:80 check
backend static
   balance     uri                #這里使用uri算法
   server static  172.16.1.4:80 check

測試動靜分離效果

我們訪問172.16.1.2

blob.png

blob.png

當我們將node3的httpd服務停止

blob.png

再次將node3的httpd服務啟動

下載.gif

我們打開了stats頁面, 可以通過設置的URI進行訪問

blob.png

配置KeepAlived

KeepAlived的配置不做解釋, 有興趣的請看官方文檔

node1和node2上都需要一個腳本文件監控haproxy的運行狀態

[root@node2 keepalived]# vim /etc/keepalived/haproxytest.sh 
#!/bin/bash
if [ $(ps -C haproxy --no-header | wc -l  ) -eq 0 ]; then
    /etc/init.d/haproxy start
fi
sleep 2
if [ $(ps -C haproxy --no-header | wc -l ) -eq 0 ]; then
    /etc/init.d/haproxy start
fi



node1的配置文件如下

[root@node1 ~]# vim /etc/keepalived/keepalived.conf 
global_defs {
   notification_email {
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server localhost
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_script chk_haproxy {
    script /etc/keepalived/haproxytest.sh 
    interval 2
    weight 2
}

vrrp_script chk_down {
    script "[ -f /etc/keepalived/down  ] && exit 1 || exit 0"
    interval 2
    weight -20
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }

  track_script {
    chk_haproxy
   }
  track_script {
    chk_down
   }
    virtual_ipaddress {
    172.16.1.10/24
    }
}
vrrp_instance VI_2 {
    state MASTER
    interface eth0
    virtual_router_id 52
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 2222
    }

  track_script {
    chk_haproxy
   }
  track_script {
    chk_down
   }
    virtual_ipaddress {
    172.16.1.11/24
    }
}


node2的配置文件如下

[root@node2 keepalived]# cat keepalived.conf 
global_defs {
   notification_email {
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server localhost
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_script chk_haproxy {
    script /etc/keepalived/haproxytest.sh 
    interval 2
    weight 2
}

vrrp_script chk_down {
    script "[ -f /etc/keepalived/down  ] && exit 1 || exit 0"
    interval 2
    weight -20
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }

  track_script {
    chk_haproxy
   }
  track_script {
    chk_down
   }
    virtual_ipaddress {
    172.16.1.10/24
    }
}
vrrp_instance VI_2 {
    state MASTER
    interface eth0
    virtual_router_id 52
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 2222
    }

  track_script {
    chk_haproxy
   }
  track_script {
    chk_down
   }
    virtual_ipaddress {
    172.16.1.11/24
    }
}


兩個節點啟動Keepalived并查看狀態
[root@node1 ~]# service keepalived start
[root@node1 ~]# ssh node2.anyisalin.com -- service keepalived start

[root@node1 ~]# ip a | grep "inet\>"               #ip地址為172.16.1.10
    inet 127.0.0.1/8 scope host lo
    inet 172.16.1.2/24 brd 172.16.1.255 scope global eth0
    inet 172.16.1.10/24 scope global secondary eth0

[root@node2 keepalived]# ip a | grep "inet\>"       #ip地址為172.16.1.11
    inet 127.0.0.1/8 scope host lo
    inet 172.16.1.3/24 brd 172.16.1.255 scope global eth0
    inet 172.16.1.11/24 scope global secondary eth0

[root@node1 ~]# scp /etc/haproxy/haproxy.cfg node2.anyisalin.com:/etc/haproxy/ #同步文件到node2

我們這樣配置haproxy會自動啟動在兩個節點上

測試KeepAlived

我們分別對172.16.1.10172.16.1.11進行測試, 都能夠正常調度

下載 (1).gif

我們強行停止node1KeepAlived,IP已經轉移, 再次進行測試

下載 (2).gif

配置DNS

過程沒什么好說的, 不懂可以看我以前的文章DNS and BIND 配置指南

[root@node5 ~]# yum install bind bind-utils

[root@node5 ~]# vim /etc/named.conf   #編輯配置文件
options {
        directory       "/var/named";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

zone "." IN {
        type hint;
        file "named.ca";
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

[root@node5 ~]# vim /etc/named.rfc1912.zones   #添加以下字段

zone "anyisalin.com" IN {
        type master;
        file "anyisalin.com.zone";
};


[root@node5 ~]# vim /var/named/anyisalin.com.zone   #創建區域解析庫文件
$TTL 600
$ORIGIN anyisalin.com.
@   IN  SOA  ns.anyisalin.com  admin.anyisalin.com (
        20160416
        1D
        5M
        7D
        1D
)

        IN     NS   ns
ns      IN      A   172.16.1.8
www     IN      A   172.16.1.10
www     IN      A   172.16.1.11

[root@node5 ~]# service named start    #啟動dns

DNS測試

[root@node5 ~]# nslookup      #測試能達到以下效果
> www.anyisalin.com
Server:     172.16.1.1
Address:    172.16.1.1#53

Name:   www.anyisalin.com
Address: 172.16.1.11
Name:   www.anyisalin.com
Address: 172.16.1.10
> www.anyisalin.com
Server:     172.16.1.1
Address:    172.16.1.1#53

Name:   www.anyisalin.com
Address: 172.16.1.10
Name:   www.anyisalin.com
Address: 172.16.1.11

最終測試

直接訪問www.anyisalin.com

blob.png

node2的服務停止, 再次進行測試, 能夠正常訪問

下載 (3).gif

總結

我們輕松地通過HAProxy實現資源的動靜分離和后端httpd主機的負載均衡,也通過KeepAlived實現HAProxy的高可用, 最后在再通過DNS輪詢實現HAProxy的負載均衡, 整套架構還是很完整的, 如果有小伙伴有興趣可以多放點資源上去, 哈哈, 我這算不算侵犯馬哥的肖像權啊, 如果侵犯了, 請告知, 我會刪除的!

作者水平很低, 如果有錯誤及時指出, 如果你覺得本文寫的好請點一波贊~(≧▽≦)/~ 
作者: AnyISaIln QQ: 1449472454 
感謝: MageEdu

原創文章,作者:Net18-AnyISalIn,如若轉載,請注明出處:http://www.www58058.com/14951

(0)
Net18-AnyISalInNet18-AnyISalIn
上一篇 2016-04-16
下一篇 2016-04-17

相關推薦

  • linux sort 命令詳解

    linux sort 命令詳解 sort是在Linux里非常常用的一個命令,管排序的,集中精力,五分鐘搞定sort,現在開始! 1 sort的工作原理 sort將文件的每一行作為一個單位,相互比較,比較原則是從首字符向后,依次按ASCII碼值進行比較,最后將他們按升序輸出。 [rocrocket@rocrocket programming]$&nb…

    Linux干貨 2016-08-15
  • redis主從復制(3)— 復制超時

    1、repl-timeout前兩篇[1]關于redis主從復制的文章解釋了一些因為slave replication buffer或者replication backlog參數的錯誤配置(或者默認參數值)導致主從復制中斷的現象。redis里面的repl-timeout參數值也太小也將會導致復制不成功。top redis headaches for devop…

    Linux干貨 2016-04-05
  • 馬哥教育網絡班21期+第10周課程練習

    1、請詳細描述CentOS系統的啟動流程(詳細到每個過程系統做了哪些事情) POST –>Boot Sequence(BIOS) –> Boot Loader(MBR) –> Kernel(ramdisk) –>rootfs –>…

    Linux干貨 2016-09-19
  • N25-第一周 總結

    linux bassic The first week of blogging 概要 計算機與操作系統、linux發行版及他們之間聯系與區別、Linux的哲學思想、linux系統上命令使用格式及基礎命令介紹、linux命令幫助說明、FHS 一、計算機與操作系統 什么是計算機? 電子計算機(computer),亦稱電腦,是一種利用電子學原理,根據一系列指令對數…

    Linux干貨 2016-12-04
  • 磁盤陣列(RAID)簡介

    資料 RAID(Redundant Arrays of Inexpensive Disks 廉價磁盤冗余陣列)即磁盤陣列,磁盤陣列是由多個價格比較便宜的磁盤組合成的一個容量巨大的磁盤組,其原理是利用數組方式來制作磁盤組,配合數據分散排列的設計,配合數據分散排列的設計,提升數據的安全性。它把數據分別存放在多個硬盤上,輸入輸出操作能以平衡的方式交疊,改良性能,因…

    Linux干貨 2017-04-17
  • 學習宣言

    我的人生宣言:做人要學到老,活到老,最重要的玩到老啊。人的一生真的太短了,要做我們喜歡的事情,趁自己年輕的時候吧!行動吧!加油!!

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