keepalived+nginx高可用

1 掛載iso鏡像文件作爲本地yum源

  • 掛載ISO文件到/mnt/CentOS6:mount -o loop /home/CentOS-6.7-x86_64-DVD.iso /mnt/CentOS6
  • 創建repo文件
cd /etc/yum.repos.d
mkdir bak
mv *.repo /etc/yum.repos.d/bak
vi CentOS6.7-localsource.repo

[CentOS7-Localsource]
name=CentOS6
baseurl=file:///mnt/CentOS6
enabled=1
gpgcheck=0

yum  clean all(清除緩存)
yum makecache(建立新緩存)

LVS提供虛擬服務,採用直接路由模式DR;nginx作爲反向代理服務器來實現負載均衡;keepalived實現主從熱備,檢查RealServer的健康狀態以及主機與備機之間失效轉移。本文選用Tenengine作爲反向代理和負載均衡服務,Tengine是由淘寶網發起的Web服務器項目。它在Nginx的基礎上,針對大訪問量網站的需求,添加了很多高級功能和特性;Tengine的性能和穩定性已經在大型的網站如淘寶網,天貓商城等得到了很好的檢驗。

直接路由模式DR (Direct Routing)

  • 相關術語
    • 1.DS:Director Server。指的是前端負載均衡器節點
    • 2.RS:Real Server。後端真實的工作服務器
    • 3.VIP:向外部直接面向用戶請求,作爲用戶請求的目標的ip地址
    • 4.DIP:Director Server IP,主要用於和內部主機通訊的IP地址
    • 5.RIP:Real Server IP,後端服務器的IP地址
    • 6.CIP:Client IP,訪問客戶端的IP地址
  • 原理:負載均衡器和RS都使用同一個IP對外服務。但只有DR對ARP請求進行響應,所有RS對本身這個IP的ARP請求保持靜默。也就是說,網關會把對這個服務IP的請求全部定向給DR,而DR收到數據包後根據調度算法,找出對應的RS,把目的MAC地址改爲RS的MAC(因爲IP一致)並將請求分發給這臺RS。這時RS收到這個數據包,處理完成之後,由於IP一致,可以直接將數據返給客戶,則等於直接從客戶端收到這個數據包無異,處理後直接返回給客戶端。由於負載均衡器要對二層包頭進行改換,所以負載均衡器和RS之間必須在一個廣播域,也可以簡單的理解爲在同一臺交換機上。

優點:負載均衡器只是分發請求,應答包通過單獨的路由方法返回給客戶端。

缺點:要求負載均衡器的網卡必須與物理網卡在一個物理段上。

本次安裝環境及軟件版本:

- CentOS6.7
- Tengine-2.2.0
- keepalived-2.0.13

2 nginx安裝

  • 下載
    http://tengine.taobao.org/download.html

  • 解壓
    tar -zxvf Tengine-2.2.0.tar.gz -C /opt/

  • 安裝
    進入解壓後的目錄 ./configure --prefix=/opt/tengine

    異常1:  
       [root@bogon tengine]# ./configure  
    checking for OS  
     + Linux 3.10.0-327.el7.x86_64 x86_64  
    checking for C compiler ... not found  
       
    ./configure: error: C compiler cc is not found  
    也就是c編譯器 gcc找不到  
      安裝gcc  yum -y install gcc  
    繼續檢查  
    異常2:  
     checking for PCRE library ... not found  
    checking for PCRE library in /usr/local/ ... not found  
    checking for PCRE library in /usr/include/pcre/ ... not found  
    checking for PCRE library in /usr/pkg/ ... not found  
    checking for PCRE library in /opt/local/ ... not found  
       
    ./configure: error: the HTTP rewrite module requires the PCRE library.  
    You can either disable the module by using --without-http_rewrite_module  
     缺少pcre和pcre-devel 安裝 yum -y install pcre pcre-devel  
     這裏安裝好後 可以通過。
     
     異常3:  
     checking for OpenSSL library ... not found  
     缺少openssl和openssl-devel 安裝 yum -y install openssl openssl-devel  
    

    make && make install
    安裝完成,安裝目錄爲configure時指定的/opt/tengine,如未指定默認安裝目錄爲/usr/local/nginx

  • 安裝完成之後,檢查nginx的配置文件是否正確

    cd /opt/tengine/sbin/
    ./nginx -t
    

    檢查通過,說明nginx安裝成功。

  • nginx啓動

    配置環境變量
    vi /etc/profile
    
    加入
    export NGINX_HOME=/opt/tengine
    export PATH=$PATH:$NGINX_HOME/sbin
    保存
    
    輸入nginx啓動。
    
  • nginx常用命令

    • nginx -m 顯示所有加載的模塊
    • nginx -l 顯示所有可以使用的指令
    • nginx -t 檢查nginx的配置文件是否正確
    • nginx -s 啓動nginx
    • nginx -s reload 重新加載配置文件
    • nginx -s stop 停止nginx
  • 配置nginx
    vi /home/java/tengine/conf/nginx.conf

# user  root;            #運行用戶
worker_processes  1;        #啓動進程,通常設置成和cpu的數量相等

#全局錯誤日誌及PID文件
error_log  /home/java/nginx/logs/error.log;
error_log  /home/java/nginx/logs/error.log  notice;
error_log  /home/java/nginx/logs/error.log  info;
pid        /home/java/nginx/logs/nginx.pid;

# 工作模式及連接數上線
events {
    use epoll;            #epoll是多路複用IO(I/O Multiplexing)中的一種方式,但是僅用於linux2.6以上內核,可以大大提高nginx的性能

    worker_connections  1024;    #單個後臺worker process進程的最大併發鏈接數
}

#設定http服務器,利用它的反向代理功能提供負載均衡支持
http {
    include       mime.types;   #文件擴展名與類型映射表
    default_type  application/octet-stream; #默認文件類型
    
    #設置日誌模式
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    #設定請求緩衝
    server_names_hash_bucket_size  128;
    client_header_buffer_size   32K;
    large_client_header_buffers  4 32k;
    # client_max_body_size   8m;
    
    #sendfile 指令指定 nginx 是否調用 sendfile 函數(zero copy 方式)來輸出文件,對於普通應用,
    #必須設爲 on,如果用來進行下載等應用磁盤IO重負載應用,可設置爲 off,以平衡磁盤與網絡I/O處理速度,降低系統的uptime.
    sendfile        on;
    tcp_nopush     on;
    tcp_nodelay    on;

    #連接超時時間
    #keepalive_timeout  0;
    keepalive_timeout  65;

    #開啓gzip壓縮,降低傳輸流量
    gzip  on;
    #設置允許壓縮的頁面最小字節數,頁面字節數從header頭的Content-Length中獲取。默認值是0,表示不管頁面多大都進行壓縮。建議設置成大於1K。如果小於1K可能會越壓越大。
    gzip_min_length    1k;
    #壓縮緩衝區大小。表示申請4個單位爲16K的內存作爲壓縮結果流緩存,默認值是申請與原始數據大小相同的內存空間來存儲gzip壓縮結果。
    gzip_buffers    4 16k;
    #壓縮版本(默認1.1)用於設置識別HTTP協議版本,目前大部分瀏覽器已經支持GZIP解壓,使用默認即可。
    gzip_http_version  1.1;
    #壓縮比率。用來指定GZIP壓縮比,1壓縮比最小,處理速度最快;9壓縮比最大,傳輸速度快,但處理最慢,也比較消耗cpu資源。
    gzip_comp_level  2;
    #用來指定壓縮的類型,“text/html”類型總是會被壓縮
    gzip_types  text/plain application/x-javascript text/css  application/xml;
    gzip_vary on;

    #反向代理負載均衡設定部分

    #upstream表示負載服務器池,切記,這個名稱不能使用下劃線,否則無法識別導致負載不過去
    upstream serverpool {
        #server tomcat地址:端口號 weight表示權值,權值越大,被分配的機率越大;
        server 192.168.33.101:80 weight=4 max_fails=2 fail_timeout=30s;
      server 192.168.33.102:80 weight=4 max_fails=2 fail_timeout=30s;
    }

    server {
        listen       8088;        #監聽端口    
        server_name  www.test.com; #對外提供服務的網址(域名或者ip)
    
        #默認請求設置
        location / {
            index index.jsp index.html index.htm;   #設定訪問的默認首頁
            #root /usr/local/apache7/webapps;    #站點根目錄,此目錄下存放我們的web項目
            proxy_pass http://serverpool;
        }
        
        #charset koi8-r;

        #access_log  logs/host.access.log  main;

    
        #所有的jsp頁面均由tomcat處理
        location ~ \.(jsp|jspx|dp)?$
        {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_pass http://serverpool;    #轉向tomcat處理
        }
        
        #所有的靜態文件直接讀取不經過tomcat,nginx自己處理
        location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ 
        { 
            expires  30d;
        }
        location ~ .*\.(js|css)?$
        {
               expires  1h;
        }
        #log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '$status $body_bytes_sent "$http_referer"' '"$http_user_agent" $http_x_forwarded_for';
        #access_log  /usr/local/nginx/logs/ubitechtest.log access;#設定訪問日誌的存放路徑     

        # redirect server error pages to the static page /50x.html
        #

        #定義錯誤提示頁面
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }
}

其他節點上配置文件可完全一樣。至此nginx已搭建完成,瀏覽器輸入http://192.168.33.101:8088即可訪問。

3 keepalived實現nginx高可用(HA)

  • 安裝
    編譯安裝方式與nginx類似。
先解壓
tar -zxvf /home/soft/keepalived-2.0.13.tar.gz

cd /home/soft/keepalived-2.0.13/
./configure --prefix=/opt/keepalived-2.0.13
make && make install
  • 建立服務啓動腳本,以便使用service命令控制,將解壓後路徑/home/soft/keepalived-2.0.13/keepalived/etc/init.d的文件keepalived拷貝到/etc/init.d下
cp /home/soft/keepalived-2.0.13/keepalived/etc/init.d/keepalived /etc/init.d/
  • 由於安裝使用非默認路徑(本教程中使用的/opt/keepalived-2.0.13)故需修改相關路徑,保證keepalived能正常啓動
vi /etc/init.d/keepalived
大約15行
將. /etc/sysconfig/keepalived 修改爲
. /opt/keepalived-2.0.13/etc/sysconfig/keepalived
  • 設置正確啓動參數命令,並將修改好的keepalived拷貝到/etc/sysconfig 目錄下
vi /opt/keepalived-2.0.13/etc/sysconfig/keepalived

修改的路徑爲安裝路徑下的配置文件,如果不修改,則默認會去找/etc/keepalived/keepalived.conf文件。
KEEPALIVED_OPTIONS="-D -f /opt/keepalived-2.0.13/etc/keepalived/keepalived.conf"

將修改好的keepalived拷貝到/etc/etc/sysconfig 目錄下
cp /opt/keepalived-2.0.13/etc/sysconfig/keepalived /etc/sysconfig/
  • 配置keepalived
    vi /opt/keepalived-2.0.13/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
    router_id LVS_MASTER         # 設置lvs的id,在一個網絡應該是唯一的
}
vrrp_instance VI_1 {
    state MASTER            # 指定keepalived的角色,備用服務器上爲 BACKUP
    interface ens33            # 當前進行vrrp通訊的網絡接口卡(當前centos的網卡),根據自己的服務器來設置
    virtual_router_id 66        # 虛擬路由編號,主從要一直
    priority 100            # 優先級,數值越大,獲取處理請求的優先級越高,備用服務器上數值要小點
    advert_int 1            # 檢查間隔,默認爲1s(vrrp組播週期秒數)
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.33.200        # 定義虛擬ip(VIP),可多設,每行一個
    }
}

# 定義對外提供的LVS的VIP以及port
virtual_server 192.168.33.200 80 {
    delay_loop 6             # 設置健康檢查時間,每隔6秒查詢realserver狀態
    lb_algo rr            # lvs 算法
    lb_kind DR            # 設置lvs實現負載的機制,有NAT、TUN、DR三個模式
    persistence_timeout 0        # 同一IP的連接60秒內被分配到同一臺realserver
    protocol TCP
    
    #真實服務器(nginx) 
    real_server 192.168.33.101 8088 {
        weight 3        # 配置節點權值,數值越大權重越高
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 8088
        }
        
    }
    real_server 192.168.33.102 8088 {
        weight 3
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 8088
        }
    }
}
  • 這裏在keepalived的配置文件中定義的LVS模式爲DR模式,還需要在兩臺rs上執行lvs_dr_rs.sh腳本
vi /opt/keepalived-2.0.13/lvs_dr_rs.sh

#/bin/bash
vip=192.168.33.200
#把vip綁定在lo上,是爲了實現rs直接把結果返回給客戶端
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#以下操作爲更改arp內核參數,目的是爲了讓rs順利發送mac地址給客戶端
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

  • 執行:sh /opt/keepalived-2.0.13/lvs_dr_rs.sh
  • 在兩臺真實服務器上面執行完畢之後,執行ip addr就能看到兩臺服務器的lo都綁定好了虛擬ip.
  • 服務器重啓之後綁定的這個虛擬ip就沒有了,需要再執行一下腳本,所以可以把對這個腳本的執行放到開機自啓中。
執行命令:vi /etc/rc.d/rc.local
將以下內容添加至該文件中:sh /opt/keepalived-2.0.13/lvs_dr_rs.sh
保存退出,然後添加執行權限:chmod +x rc.local

  • 啓動keepalived服務: service keepalived start
  • 在keepalived端執行命令ipvsadm -ln查看連接數,如果報錯,先安裝ipvsadm,yum install -y ipvsadm
[root@chenhao keepalived-2.0.13]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.33.200:80 rr
  -> 192.168.33.101:80            Route   3      0          1         
  -> 192.168.33.102:80            Route   3      0          2
  • 出現的問題
1、啓動過程中提示keepalived command not found
啓動方式爲:/etc/init.d/keepalived start
原因:keepalived命令沒有在/usr/sbin目錄下
解決方法:cp /opt/keepalived-2.0.13/sbin/keepalived /usr/sbin
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章