1. 程式人生 > >keepAlived應用於HaProxy的主備自動切換實現高可用,避免單點故障

keepAlived應用於HaProxy的主備自動切換實現高可用,避免單點故障

前言

對於訪問量較大的網站來說,隨著流量的增加單臺伺服器已經無法處理所有的請求,這時候需要多臺伺服器對大量的請求進行分流處理,即負載均衡。而如果實現負載均衡,必須在網站的入口部署伺服器(不只是一臺)對這些請求進行分發,這臺伺服器即反向代理。由於反向代理伺服器是網站的入口,其負載壓力大且易遭到攻擊,存在單點故障的風險,所以我們需要一個高可用的方案來實現當一臺反向代理伺服器宕機的時候,另一臺伺服器會自動接管服務。基於以上要求,我們使用HAProxy,KeepAlived來構建高可用的反向代理系統。

介紹

HAProxy是高效能的代理伺服器,其可以提供7層和4層代理,具有healthcheck,負載均衡等多種特性,效能卓越,包括Twitter,Reddit,StackOverflow,GitHub在內的多家知名網際網路公司在

使用

KeepAlived是一個高可用方案,通過VIP(即虛擬IP)和心跳檢測來實現高可用。其原理是存在一組(兩臺)伺服器,分別賦予Master,Backup兩個角色,預設情況下Master會繫結VIP到自己的網絡卡上,對外提供服務。Master,Backup會在一定的時間間隔向對方傳送心跳資料包來檢測對方的狀態,這個時間間隔一般為2秒鐘,如果Backup發現Master宕機,那麼Backup會發送ARP包到閘道器,把VIP繫結到自己的網絡卡,此時Backup對外提供服務,實現自動化的故障轉移,當Master恢復的時候會重新接管服務。

環境

OS: CentOS Linux release 6.0 (Final) 2.6.32-71.29.1.el6.x86_64 
HAProxy: 1.4.18 
KeepAlived: 1.2.2 
VIP: 192.168.1.99 
M: 192.168.1.222 
S: 192.168.1.189

架構

                    192.168.1.99
             +-----------VIP----------+   
             |                        |
             |                        |
           Master                   Backup
        192.168.1.189            192.168.1.222
        +----------+             +----------+
        | HAProxy  |             | HAProxy  |
        |keepalived|             |keepalived|
        +----------+             +----------+
             |  
             v  
    +--------+---------+ 
    |        |         |
    |        |         |
    v        v         v
+------+  +------+  +------+
| WEB1 |  | WEB2 |  | WEB3 |
+------+  +------+  +------+

安裝HAProxy

安裝pcre

$ yum install pcre
$ wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.18.tar.gz
$ tar -zxvf haproxy-1.4.18.tar.gz
$ cd haproxy-1.4.18

注意編譯引數: 
TARGET是指自己系統的核心版本 ARCH指定系統是32位還是64位 
CPU=native: use the build machine's specific processor optimizations 
更多編譯引數內容見原始碼中的README 
$ make TARGET=linux26 ARCH=x86_64 USE_PCRE=1 CPU=native $ make install

配置檔案 /etc/haproxy.cfg

global
    log 127.0.0.1   local3
    maxconn 20000   
    uid 535  #uid和gid按照實際情況進行配置
    gid 520  
    chroot /var/chroot/haproxy
    daemon 
    nbproc 1 

defaults
   log     127.0.0.1       local3
   mode    http            
   option  httplog
   option  httpclose
   option  dontlognull
   option  forwardfor
   retries 2
   balance roundrobin 
   stats   uri     /haproxy-stats
   contimeout      5000
   clitimeout      50000
   srvtimeout      50000

frontend http-in
        bind *:80 
        default_backend pool1

backend pool1
        option httpchk HEAD / HTTP/1.0
        stats refresh 2
        server WEB1 192.168.1.189:81 weight 3 maxconn 10000 check 
        server WEB2 192.168.1.222:81 weight 3 maxconn 10000 check

檢視HAProxy的狀態:http://192.168.1.99/haproxy-stats,這個頁面會顯示HAProxy本身以及後端伺服器的狀態。

日誌

haproxy會把日誌記錄傳送到syslog server(CentOS6下是rsyslogd,UDP514埠), 編輯/etc/rsyslog.conf檔案,新增如下內容:

$ModLoad imudp
$UDPServerRun 514
$UDPServerAddress 127.0.0.1
local3.*                /var/log/haproxy.log

重啟rsyslog

$ /etc/init.d/rsyslog restart

自動輪轉日誌,編輯/etc/logrotate.d/haproxy.cfg,新增如下內容:

/var/log/haproxy.log
{
    rotate 4
    daily
    missingok
    notifempty
    compress
    delaycompress
    sharedscripts
    postrotate
    reload rsyslog > /dev/null 2>&1 || true
    endscript
}

啟動指令碼

$ wget -O haproxy https://raw.github.com/gist/3665034/4125bd5b81977a72e5eec30650fb21f3034782a0/haproxy-init.d 
$ cp haproxy /etc/init.d/haproxy
$ chmod +x /etc/init.d/haproxy
#使用方式
$ /etc/init.d/haproxy start|stop|restart

安裝KeepAlived

安裝依賴庫

$ yum install popt popt-devel

安裝KeepAlived

$ wget http://www.keepalived.org/software/keepalived-1.2.2.tar.gz
$ tar -zxvf keepalived-1.2.2.tar.gz
$ cd keepalived-1.2.2
$ ./configure --prefix=/usr/local/keepalived
$ make && make install

$ cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/keepalived
$ cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
$ cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
$ mkdir -p /etc/keepalived/
$ cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf 
$ chmod +x /etc/init.d/keepalived

使用方式

$ /etc/init.d/keepalived start|stop|restart

Master伺服器上的配置 /etc/keepalived/keepalived.conf

global_defs {

   notification_email {
       [email protected]
   }

   notification_email_from [email protected]
   smtp_server 192.168.x.x
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

#監測haproxy程序狀態,每2秒執行一次
vrrp_script chk_haproxy {
    script "/usr/local/keepalived/chk_haproxy.sh"
    interval 2
    weight 2
}

vrrp_instance VI_1 {
    state MASTER #標示狀態為MASTER
    interface eth0
    virtual_router_id 51
    priority 101   #MASTER權重要高於BACKUP
    advert_int 1
    mcast_src_ip 192.168.1.189 #Master伺服器IP

    authentication {
        auth_type PASS #主從伺服器驗證方式
        auth_pass 1111
    }

    track_script {
        chk_haproxy #監測haproxy程序狀態
    }

    #VIP
    virtual_ipaddress {
        192.168.1.99 #虛擬IP
    }
}

Bakcup伺服器上的配置 /etc/keepalived/keepalived.conf

global_defs {
   notification_email {
   [email protected]
   }

   notification_email_from [email protected]
   smtp_server 192.168.x.x
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

#監測haproxy程序狀態,每2秒執行一次
vrrp_script chk_haproxy {
    script "/usr/local/keepalived/chk_haproxy.sh"
    interval 2
    weight 2
}

vrrp_instance VI_1 {
    state BACKUP #狀態為BACKUP
    interface eth0
    virtual_router_id 51
    priority 100  #權重要低於MASTER
    advert_int 1
    mcast_src_ip 192.168.1.222 #Backup伺服器的IP

    authentication {
        auth_type PASS
        auth_pass 1111
    }

    track_script {
        chk_haproxy #監測haproxy程序狀態
    }

    #VIP
    virtual_ipaddress {
        192.168.1.99 #虛擬IP
    }
}

chk_haproxy.sh內容

#!/bin/bash
#
# author: weizhifeng
# description: 
# 定時檢視haproxy是否存在,如果不存在則啟動haproxy,
# 如果啟動失敗,則停止keepalived
# 
status=$(ps aux|grep haproxy | grep -v grep | grep -v bash | wc -l)
if [ "${status}" = "0" ]; then
    /etc/init.d/haproxy start

    status2=$(ps aux|grep haproxy | grep -v grep | grep -v bash |wc -l)

    if [ "${status2}" = "0"  ]; then
            /etc/init.d/keepalived stop
    fi
fi

高可用測試

  1. 在Master上停止keepalived,檢視系統日誌,發現MASTER釋放了VIP

     $ /etc/init.d/keepalived stop
     $ tail -f /var/log/message
     Keepalived: Terminating on signal Keepalived: Stopping Keepalived v1.2.2 (11/03,2011) 
     Keepalived_vrrp: Terminating VRRP child process on signal 
     Keepalived_vrrp: VRRP_Instance(VI_1) removing protocol VIPs.
    
  2. 在Backup上檢視系統日誌,發現Backup已經進入MASTER角色,並且綁定了VIP 192.168.1.99

     $ tail -f /var/log/message
     Keepalived_vrrp: VRRP_Instance(VI_1) Entering MASTER STATE
     Keepalived_vrrp: VRRP_Instance(VI_1) setting protocol VIPs
     Keepalived_vrrp: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.1.99 #在Backup上檢視VIP是否已經繫結
    
  3. 在Master上重新啟動keepalived,檢視系統日誌,發現重新獲得MASTER角色,並且繫結VIP 192.168.1.99

     $ /etc/init.d/keepalived start
     $ tail -f /var/log/message
     Keepalived_vrrp: VRRP_Instance(VI_1) Transition to MASTER STATE
     Keepalived_vrrp: VRRP_Instance(VI_1) Entering MASTER STATE
     Keepalived_vrrp: VRRP_Instance(VI_1) setting protocol VIPs.
     Keepalived_vrrp: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.1.99
    
  4. 在Backup上檢視系統日誌,發現其重新回到BACKUP角色,並且釋放VIP

     $ tail -f /var/log/message
     Keepalived_vrrp: VRRP_Instance(VI_1) Received higher prio advert
     Keepalived_vrrp: VRRP_Instance(VI_1) Entering BACKUP STATE
     Keepalived_vrrp: VRRP_Instance(VI_1) removing protocol VIPs.
    

併發測試

我們使用webbench來對HAProxy進行併發測試

$ yum install ctags
$ wget http://home.tiscali.cz/~cz210552/distfiles/webbench-1.5.tar.gz
$ tar -zxvf webbench-1.5.tar.gz
$ cd webbench-1.5
$ make 
$ mkdir -p /usr/local/man && make install

測試環境: 
CPU:Intel 雙核 x86_64 主頻3191MHZ 
Mem:2G
修改php-fpm.conf,設定PHP-FPM spawn的程序數量為100:

pm.start_servers = 100
pm.max_spare_servers = 100

測試方法:

$ webbench -c 100 -t 3000 http://192.168.1.99/check.txt
$ webbench -c 100 -t 3000 http://192.168.1.99/test.php

測試結果:

併發訪問txt檔案,HAProxy的session數量為10000左右,這說明HAProxy能夠hold住10000個併發連線;併發訪問php檔案,HAProxy的session峰值為200左右,接近於後端PHP的併發處理能力(100x2)。

參考:

相關推薦

keepAlived用於HaProxy自動切換實現可用避免故障

前言 對於訪問量較大的網站來說,隨著流量的增加單臺伺服器已經無法處理所有的請求,這時候需要多臺伺服器對大量的請求進行分流處理,即負載均衡。而如果實現負載均衡,必須在網站的入口部署伺服器(不只是一臺)對這些請求進行分發,這臺伺服器即反向代理。由於反向代理伺服器是網站的入口

解決Nginx + Keepalived主從雙機熱+自動切換實現負載均衡及可用

解決Nginx + Keepalived主從雙機熱備+自動切換,實現負載均衡及高可用 IP 伺服器 服務 192.168.1.10 lb-node1 Nginx、kee

使用mycat實現mysql讀寫分離以及自動切換模式

一:軟體環境 Window7 Mycat-server1.6 JDK1.8 Mysql5.62臺 二:讀寫分離的好處 增加了冗餘(備份資料)。 讀寫分開,減輕機器壓力,提高資料庫併發。 Mycat

Nginx+keepalived主從雙機熱自動切換架構

1:安裝 keepalived 安裝 keepalived 非常的簡單和容易,這跟安裝其他 GNU 原始碼軟體步驟是以模一樣的。下面 給出其安裝過程 下載最新穩定版  wget http://www.keepalived.org/software/keepaliv

超詳細MySQL復制+MMM實現可用

mnt 更新 nat mount iad com 基於 read p12 簡介 MMM(Master-Master Replication Manager for MySQL, MySQL主主復制管理器)是一套靈活的腳本程序,基於perl實現,用來對mysql replic

greenplum(5.10)生產系統節點切換

node directory usr build refused elk sync 信息 ges 集群安裝信息參考:系統初始化:http://blog.51cto.com/michaelkang/2167195集群安裝配置:http://blog.51cto.com/mic

postgresql 切換-恢復方案

連接 報警 err 判斷 ber arch 處理 clu cluster 前言 前期的gitlab 已經開始推廣測試,最近對postgresql 做了主備,這裏說下方案及在實施過程中遇到的坑。postgresql 的具安裝不在此介紹。 基礎信息 primary_ip

keepalived實現nginx可用

ddr cti 文件重命名 實現 usr time deb 安裝 fall keepalived實現nginx高可用(HA) 安裝直接yum安裝就可以,版本可能比官網落後,但是夠用了, yum -y install keepalived 編輯配置文件,默認路徑 /et

經驗分享(4)Yarn ResourceManager頁面如何實現自動切換

hdfs、yarn、hbase這些元件的master支援多個,實現自動主備切換,其中hdfs、hbase無論訪問主master或者備master都可以正常訪問頁面,但是yarn比較特別,只有主master的頁面可以訪問,備master會返回Refresh,3s後重定向; 一種方式是提供兩個域名,分別對應兩個

haproxy對mysql複製的負載均衡中配keepalived實現可用

突破單點故障限制,實現熱備防止宕機 在主主複製的基礎和負載均衡的基礎之上用keepalived實現熱備 keepalived 提供一個vip 虛擬的ip,並監測haproxy1和haproxy2的執行情況,讓這個vip在兩者間進行搶佔(機制有預設,有優先,有宕機後另一個自動獲取) keep

Keepalived(處理故障可用Keepalived+LVS(可用負載均衡) 、 HAProxy伺服器(負載均衡)

keepalived概述 keepalived執行原理 Top NSD CLUSTER DAY03 案例1:Keepalived高可用伺服器

Oracle 11g Data Guard之切換(switchover不使用DG Broker)

--目前主庫PROD3,備庫AUX --檢視主備庫日誌傳輸情況 [email protected]> select max(sequence#) from v$archived_log; MAX(SEQUENCE#) --------------

Mycat實現讀寫分離切換

Master IP:172.16.34.212 Slave IP:172.16.34.34.156 Mycat server IP:172.16.34.219 不涉及過多理論,只有實現的過程。mysql讀寫分離和主備熱切換,容災,資料分片的實現手段目前比較流行的是Mycat。當然利用應用層程式碼去解決這些

MySQL+MyCat實現讀寫分離和切換

配置MyCat的schema.xml檔案 <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"> <tab

decorator 裝飾頁面根據不同設自動切換移動和pc站

str 設備 跳轉 util 自動 handle 不同 author tor package com.thinkgem.jeesite.modules.sys.interceptor; import javax.servlet.http.HttpServle

Spring Boot中自定義註解+AOP實現切換

摘要: 本篇文章的場景是做排程中心和監控中心時的需求,後端使用TDDL實現分表分庫,需求:實現關鍵業務的查詢監控,當用Mybatis查詢資料時需要從主庫切換到備庫或者直接連到備庫上查詢,從而減小主庫的壓力,在本篇文章中主要記錄在Spring Boot中通過自定義註解結合AOP實現直接連線備庫查詢。 一.通過A

ansible實現nginx雙模式反代keepalived可用memcached緩存

ansible實現nginx前端反代 keepalived高可用與對後端rs的配置 ansible自動化運維工具配置ngnix前端反代到後端真實機,並設置keepalived高可用,在後端一臺真實主機上配置httpd,mysql,php-fpm;設置memcached緩存服務器在這臺真實主機上;(

HAproxy+Keepalived實現可用

daemon type tom com rontab date redis start virt HAproxy+Keepalived實現高可用 說明: HA1:HAproxy+Keepalived(master) HA2:HAproxy+Keepalived(back

keepalived+mysql實現可用

keepalived+mysqlmysql主從配置參考:http://blog.51cto.com/243662875/2126015 主主配置就是互為主從 keepalived下載網址:http://www.keepalived.org/ 環境 準備應用 keepalived-2.0.2.tar.gz o

幹貨memcached+keepalived實現復制和可用詳解!

sdf 功能 部署方式 live sys ref mtu pad gin keepalived+memcached主主復制高可用介紹: 客戶端連接兩臺服務器之間的VIP地址,如果後端服務器故障自動切換。 Keepalive原理: 1.故障檢測: Keepalived的作用