Haproxy+keepalived高可用代理服務



1、haproxynginx的區別javascript

Haproxy的工做模式:代理模式爲httptcp作代理,能夠爲多種服務作代理,它是一個專門的代理服務器,本身不能成爲web服務。
php

nginx的工做模式:web模式和代理,Nginx只爲WEB服務作代理。
css



2、安裝配置html

一、安裝
前端


# yum -y install haproxy


注意,若是在生產中安裝,必定要注意安裝軟件的版本要落後最新版本一到兩個,不然,新版本中出現了bug沒法解決將是致命的。java

二、配置詳解
node

************************全局配置*****************************
linux


Global
log     127.0.0.1 local2  # 定義全局日誌服務器
chroot   /var/lib/haproxy  # 修改haproxy的工做目錄到制定的目錄,提升安全性
pidfile   /var/run/haproxy.pid # pid文件位置
maxconn   4000      # 最大鏈接數
user    haproxy     # 服務運行時的身份,也能夠用uid來表示
group    haproxy     # 服務運行時的身份所屬的組,能夠用gid來表示
Daemon           # 服務以守護進程的身份運行
# turn on stats unix socket    # 默認打開UNIX socket
stats socket /var/lib/haproxy/stats # 指明unix socket 所在的位置
Node      www.a.com  # 定義當前節點的名稱,用於HA場景中多haproxy進程共享同一個IP地址時
ulimit-n    100       # 設定每進程所可以打開的最大文件描述符數目,默認狀況下其會自動進行計算,所以不推薦修改此選項

log127.0.0.1local2要想啓用,能夠看到默認配置文件中有這麼一行註釋
nginx

#local2.*/var/log/haproxy.logweb

作以下配置便可啓用

# touch /var/log/haproxy.log
# vim /etc/rsyslog.conf
$ModLoad imudp
$UDPServerRun 514
# service rsyslog restart
# tail -f /var/log/haproxy.log
Oct  6 10:45:22 localhost haproxy[22208]: 172.16.5.200:50332 [06/Oct/2013:10:45:22.852] web static/www.web1.com 6/0/2/4/32 200 45383 - - ---- 3/3/0/1/0 0/0 "GET / HTTP/1.1"

顯示了客戶端ip和realserver主機名等信息

**********************默認配置*********************************

defaults
mode  http      # 爲http服務代理,http爲7層協議,tcp4層
log   global     # 全局日誌
option httplog      # 日誌類別爲http日誌格式
option dontlognull   # 不記錄健康查詢的日誌
#########健康情況檢測的意義在於,後端服務器若掛掉了,就不會再向它發送請求信息。
option http-server-close  # 每次請求完後主動關閉http通道,支持客戶端長鏈接
option forwardfor  except 127.0.0.0/8 # 若是後端服務器須要得到客戶端真實ip須要配置的參數,能夠從http header中得到客戶端ip
option  redispatch   #serverid對應的服務器掛掉後,強制定向到其餘健康的服務器
retries  3       #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   # 每一個進程最大鏈接數,能夠在global中配置

************************前端代理配置******************************

frontend main *:5000  # 前端定義服務器名稱和端口
acl url_static  path_beg -i /static /p_w_picpaths /javascript /stylesheets
acl url_static  path_end -i .jpg .gif .png .css .js
use_backend static     if url_static
default_backend       app
定義訪問控制,若是符合 url_static,就代理到static,若是不是url_static,就使用默認的後端服務

***********************後端服務器配置*****************************

backend static
balance   roundrobin  #負載均衡調度算法
server   static 127.0.0.1:4331 check # 定義了一個後端服務器並作健康情況檢測
backend app
balance   roundrobin
server app1 127.0.0.1:5001 check rise 2 fall 1
server app2 127.0.0.1:5002 check rise 2 fall 1
server app3 127.0.0.1:5003 check rise 2 fall 1
server app4 127.0.0.1:5004 check rise 2 fall 1
# check rise 2 fall 1 健康情況檢查,rise表示後端realserver從stop到start檢查的次數,fall表示從start到stop檢查的次數



3、實例配置

本機ip172.16.5.16

開啓forward轉發功能

#sysctl-wnet.ipv4.ip_forward=1

關閉防火牆

爲後端ip172.16.6.1作代理

爲後端服務器提供頁面並啓動httpd

# vim /var/www/html/index.html
<h1>welcome!</>
# service httpd start
global
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
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode          http
log           global
option         httplog
option         dontlognull
option http-server-close
option forwardfor    except 127.0.0.0/8 header X-Forward-For # 後端服務器日誌中記錄遠程客戶端ip,別忘了在後端服務器上修改log格式
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
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend web
bind *:80
default_backend static
也能夠寫成
frontend web 172.16.5.16:80
dfault_backend static
#---------------------------------------------------------------------
# static backend for serving up p_w_picpaths, stylesheets and such
#---------------------------------------------------------------------
backend static
server   www.web1.com 172.16.6.1:80 check
stats          enable # 開啓服務器狀態信息
stats          hide-version # 隱藏版本信息
stats          realm haproxy\ stats # 說明認證信息 \ 轉譯了一個空格
stats          auth admin:admin # 認證用戶
stats          admin if TRUE # 經過認證就容許管理
stats          uri /abc # 自定義stats顯示頁面uri

效果圖


202150700.jpg


單獨使用一個端口來監聽stats狀態信息。

global
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
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
listen stats
bind *:1080
stats          enable
stats          hide-version
stats          realm haproxy\ stats
stats          auth admin:admin
stats          admin if TRUE
stats          uri /abc
frontend web
bind *:80
default_backend static
backend static
server   www.web1.com 172.16.6.1:80 check


效果圖:


202211132.jpg


202231438.jpg




4、負載均衡--調度算法


roundrobin動態支持權重和在服務器運行時調整,支持慢速啓動

static-rr靜態不支持在服務器運行時調整,不支持慢速啓動

leastconn最少鏈接,只建議使用很是長的會話

source:後端服務器時動態服務器時使用,相似於nginx的iphash

Hash-type:map-based靜態hash碼取餘計算iphash碼除以全部的服務器數,餘數得幾就放在第幾個服務器上

Hash-type:consistent動態一致性hashhash環

基於權重weight動態

uri根據用戶訪問的uri來負載均衡,它也有hash表,一樣有hash-type,第一次訪問的結果被負載到哪一個服務器,保存在了hash表中,在來訪問一樣的uri,就會始終到這臺服務器。

url_param根據用戶賬號信息,將請求發往同一個服務器,一樣有hash-type

hdr:首部根據請求首部調度,一樣有hash-type

requestheader請求首部

reponseheader響應首部

hdrhosts)格式

hdrwww.a.com)實例



一致性hash負載均衡


global
log     127.0.0.1 local2
chroot   /var/lib/haproxy
pidfile   /var/run/haproxy.pid
maxconn   4000
user    haproxy
group    haproxy
daemon
stats socket /var/lib/haproxy/stats
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
listen stats
bind *:1080
stats          enable
stats          hide-version
stats          realm haproxy\ stats
stats          auth admin:admin
stats          admin if TRUE
stats          uri /abc
frontend web
bind *:80
default_backend static
backend static
balance   source
hash-type  consistent
server   www.web1.com 172.16.6.1:80 check weight 3
server   www.web2.com 172.16.6.2:80 check weight 1




5、acl訪問控制


frontend web
bind *:8080
default_backend static
acl abc src 172.16.5.100
redirect prefix http://172.16.5.16/def if abc

當客戶端ip172.16.5.100時,重定向到http://172.16.5.16/def


acl要和redirectprefix或者redirectlocation搭配使用


官方實例,將用戶登陸後的url重定向到https安全鏈接。


acl clear   dst_port 80
acl secure   dst_port 8080
acl login_page url_beg  /login
acl logout   url_beg  /logout
acl uid_given url_reg  /login?userid=[^&]+
acl cookie_set hdr_sub(cookie) SEEN=1
redirect prefix  https://mysite.com set-cookie SEEN=1 if !cookie_set
redirect prefix  https://mysite.com      if login_page !secure
redirect prefix  http://mysite.com drop-query if login_page !uid_given
redirect location http://mysite.com/      if !login_page secure
redirect location / clear-cookie USERID=    if logout


訪問阻止

frontend web
bind *:8080
default_backend static
acl abc src 172.16.5.100
block if abc  # 阻止訪問


202300144.jpg


修改原配置文件,實現動靜分離


frontend web
bind *:80
acl url_static    path_beg    -i /static /p_w_picpaths /javascript /stylesheets
#字符形式
acl url_static    path_reg    -i ^/static ^/p_w_picpaths ^/javascript ^/stylesheets
#正則表達式
acl url_static    path_end    -i .jpg .jpeg .gif .png .css .js
#字符
acl url_static    path_reg   -i .jpg $.jpeg$ .gif $.png$ .css$ .js$
# 正則表達式
#通常能用字符,就不要用正則表達式,字符的比正則表達式快。
use_backend static_servers     if url_static
default_backend dynamic_servers
backend static_servers
balance roundrobin
server imgsrv1 172.16.200.7:80 check maxconn 6000
server imgsrv2 172.16.200.8:80 check maxconn 6000
backend dynamic_servers
balance source
server websrv1 172.16.200.7:80 check maxconn 1000
server websrv2 172.16.200.8:80 check maxconn 1000
server websrv3 172.16.200.9:80 check maxconn 1000

haproxylisten配置示例:


listen webfarm
bind 192.168.0.99:80
mode http
stats enable
stats auth someuser:somepassword
balance roundrobin
cookie JSESSIONID prefix
option httpclose
option forwardfor
option httpchk HEAD /check.txt HTTP/1.0
server webA 192.168.0.102:80 cookie A check
server webB 192.168.0.103:80 cookie B check

Haproxy綜合配置事例


global
pidfile /var/run/haproxy.pid
log 127.0.0.1 local0 info
defaults
mode http
clitimeout   600000
srvtimeout   600000
timeout connect 8000
stats enable
stats auth  admin:admin
stats uri/monitor
stats refresh5s
option httpchk GET /status
retries5
option redispatch
errorfile 503 /path/to/503.text.file
balanceroundrobin# each server is used in turns, according to assigned weight
frontend http
bind :80
monitor-uri  /haproxy # end point to monitor HAProxy status (returns 200)
acl api1 path_reg ^/api1/?
acl api2 path_reg ^/api2/?
use_backend api1 if api1
use_backend api2 if api2
backend api1
# option httpclose
server srv0 172.16.5.15:80 weight 1 maxconn 100 check inter 4000
server srv1 172.16.5.16:80 weight 1 maxconn 100 check inter 4000
server srv2 172.16.5.16:80 weight 1 maxconn 100 check inter 4000
backend api2
option httpclose
server srv01 172.16.5.18:80 weight 1 maxconn 50 check inter 4000



6、結合keepalived作高可用代理


拓撲圖

163644368.jpg



規劃:

準備工做請參照以前寫的博客,無非就是時間同步,雙機互信,主機名稱可以互相解析。

node1:

ip:172.16.5.15

hostname:www.a.com

node2

ip:172.16.5.16

hostname:www.b.com

後端realserver讓別人代作


配置haproxy

node1:# yum -y install haproxy
node2:# yum -y install haproxy
# cd /etc/haproxy
# mv haproxy.cfg haproxy.bak
# vim haproxy.cfg
global
log         127.0.0.1 local2
chroot      /var/lib/haproxy
pidfile     /var/run/haproxy.pid
maxconn     4000
user        haproxy
group       haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
mode                    http
log                     global
option                  httplog
option                  dontlognull
option http-server-close
option forwardfor       except 127.0.0.0/8 header X-Forward-For
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
listen stats #專門弄個端口進行狀態管理
bind *:1080
stats                   enable
stats                   hide-version
stats                   realm haproxy\ stats
stats                   auth admin:admin
stats                   admin if TRUE
stats                   uri /abc
frontend web
    bind *:80
    acl danymic path_end -i .php
    acl abc src 172.16.5.100
    block if abc
    use_backend php if danymic
    default_backend static
backend static
    balance     roundrobin
    server      www.web1.com 172.16.5.16:8080 check rise 2 fall 1 weight 1
    server      www.web2.com 172.16.5.15:8080 check rise 2 fall 1 weight 1
backend php
    balance roundrobin
    server    www.web3.com 172.16.6.1:80 check rise 2 fall 1 weight 1
    server    www.web4.com 172.16.6.2:80 check rise 2 fall 1 weight 1
# scp haproxy.cfg b:/etc/haproxy/

配置keepalived

node1

# yum -y install keepalived
# cd /etc/keepalived/
# vim keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 1
weight 2
}
#vrrp_script chk_mantaince_down {
#   script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
#   interval 1
#   weight 2
#}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 5
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 11111
}
virtual_ipaddress {
172.16.5.100/16
}
track_script {
chk_mantaince_down
chk_haproxy
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
vrrp_instance VI_2 {
state MASTER
interface eth0
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 11111
}
virtual_ipaddress {
172.16.5.101/16
}
track_script {
chk_mantaince_down
chk_haproxy
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}

該配置文件主要實現的功能:一、兩個實例VI,實現了雙主模型,主要爲前端dns負載均衡使用;二、單個主從模型能夠實現高可用,前提是如果針對某個服務,這個服務必須在keepalived啓動以前啓動,並且要對之監控;三、固然,也要作好對keepalived服務自己的監控,這就須要編輯另外的腳本,腳本所在的目錄必須與notify_master"/etc/keepalived/notify.shmaster"中提到的一致。



編寫對keepalived服務自己的監控腳本

# vim /etc/keepalived/notify.sh
#!/bin/bash
# Author: MageEdu <linuxedu@foxmail.com>
# description: An example of notify script
#
vip=172.16.5.100
contact='root@localhost'
Notify() {
mailsubject="`hostname` to be $1: $vip floating"
mailbody="`date '+%F %H:%M:%S'`: vrrp transition, `hostname` changed to be $1"
echo $mailbody | mail -s "$mailsubject" $contact
}
case "$1" in
master)
notify master
/etc/rc.d/init.d/haproxy start
exit 0
;;
backup)
notify backup
/etc/rc.d/init.d/haproxy restart
exit 0
;;
fault)
notify fault
exit 0
;;
*)
echo 'Usage: `basename $0` {master|backup|fault}'
exit 1
;;
esac


注意:本腳本中提到了vip,而本實驗是雙主模型,其中有兩個vip,若是想省事,就寫一個就好了,若是求精確,能夠複製這個腳本,修改vip而後在配置文件中修改另外一個實例中的notify.sh的路徑。



node2中也要這樣配置,不過要修改主從和優先級,這裏再也不羅嗦。

配置完以後,啓動了haproxy和keepalived以後,對配置作下校驗。


#service haproxy start
#service keepalived start
node1
# ip addr show
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 UP qlen 1000
link/ether 00:0c:29:a5:31:22 brd ff:ff:ff:ff:ff:ff
inet 172.16.5.15/16 brd 172.16.255.255 scope global eth0
inet 172.16.5.101/16 scope global secondary eth0
inet6 fe80::20c:29ff:fea5:3122/64 scope link
valid_lft forever preferred_lft forever
node2
# ip addr show
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 UP qlen 1000
link/ether 00:0c:29:cc:55:6d brd ff:ff:ff:ff:ff:ff
inet 172.16.5.16/16 brd 172.16.255.255 scope global eth0
inet 172.16.5.100/16 scope global secondary eth0
inet6 fe80::20c:29ff:fecc:556d/64 scope link
valid_lft forever preferred_lft forever

驗證效果


###########################keepalived的雙主模型實現的負載均衡##################################

152733243.jpg

152734210.jpg


############################動靜分離之靜態頁面負載均衡############################

152854266.jpg

152855158.jpg


############################動靜分離之動態頁面負載均衡##############################

153011605.jpg

153012842.jpg


**************************************************************************************************訪問專門設定的用於查看代理狀態的頁面

105548238.jpg


**************************************************************************************************修改配置文件,將拒絕訪問的ip改成客戶端ip,獲得以下頁面

frontendweb

bind*:80

default_backendstatic

aclabcsrc172.16.5.200

blockifabc

172.16.5.200是我物理機的IP地址

105549194.jpg

以上總結,有不足之處,望指教。。

相關文章
相關標籤/搜索