nginx+keepalived實現nginx雙主高可用的負載均衡

一、前言:

在互聯網上面,網站爲用戶提供原始的內容訪問,同時爲用戶提供交互操作。提供穩定可靠的服務,可以給用戶帶來良好的體驗,保證用戶的正常訪問使用,在網站的可靠性方面,有很多的技術可以來提供,這類技術可以分爲:

高可用:保證服務的可靠,穩定,實現故障的屏蔽,避免了單點故障。

高性能:多臺服務器連接起來,處理一個複雜的計算問題。

負載均衡:將用戶請求引導到後端多臺服務器,實現服務器請求的負載。

我們將這類技術稱之爲集羣負載均衡,可以提供負載均衡和高可用的有硬件和軟件,軟件方面有haproxylvskeepalivednginx,heartbeat,corosync等等,而這裏我們採用的是nginx-keepalived來構建。

Nginx有很強的代理功能,但是一臺nginx 就形成了單點,現在使用keepalived來解決這個問題,keepalived可以實現故障轉移切換,實現後端的健康檢查,前端的高可用,使網站故障記錄大大降低,避免了單點故障造成網站無法訪問的問題,確保了網站業務的正常運行。

二、Nginx+keepalived有兩種配置方案:

2.1Nginx+keepalived 主從配置

這種方案,使用一個vip地址,前端使用2臺機器,一臺做主,一臺做備,但同時只有一臺機器工作,另一臺備份機器在主機器不出現故障的時候,永遠處於浪費狀態,對於服務器不多的網站,該方案不經濟實惠,所以本次不予採用。

2.2Nginx+keepalived 雙主配置

這種方案,使用兩個vip地址,前端使用2臺機器,互爲主備,同時有兩臺機器工作,當其中一臺機器出現故障,兩臺機器的請求轉移到一臺機器負擔,非常適合於當前架構環境,故本次採用此方案對網站進行高可用架構。

三、Nginx+keepalived 主從配置

3.1Nginx+keepalived 主從配置詳情請見http://kling.blog.51cto.com/3320545/1240359

這裏不做重點介紹。

四、Ningx+Keepalived 雙主配置

4.1、拓撲結構

4.2、測試環境如下:

系統:Ceentos 6.4 64位

前端node1服務器:

DIP: 192.168.122.2

VIP: 192.168.122.22

前端node2服務器:

DIP: 192.168.122.3

VIP:192.168.122.23

後端服務器:

web server01:192.168.122.4

web server02:192.168.122.5

web server03:192.168.122.6

4.3、軟件安裝

分別在兩臺前端服務器上安裝nginx+keepalived,使用腳本如下:

#!/bin/bash
# author: kuangl
# mail: [email protected]
# description: The installation of Nginx files.
# -------------------------------------------------------- #
         ## Nginx_install
# -------------------------------------------------------- #
# Nginx installation
#CURRENT_PATH=$(pwd)
for i in $(rpm -q gcc gcc-c++ kernel-devel openssl-devel zlib-devel popt-devel popt-static libnl-devel wget make |grep 'not installed' | awk '{print $2}')
do
    yum -y install $i
done
[ -d /root/software ]
[ "$?" != 0 ] && mkdir /root/software
cd /root/software
[ !  -e pcre-8.33.tar.gz ] && wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.33.tar.gz
tar -zxvf pcre-8.33.tar.gz
cd pcre-8.33
./configure
make && make install
echo $? || [ $? != 0  ] || echo  " installation pcre  failed" || exit 1
cd /root/software
[ ! -e nginx-1.2.9.tar.gz ] && wget http://nginx.org/download/nginx-1.2.9.tar.gz
tar -zxvf nginx-1.2.9.tar.gz
cd nginx-1.2.9
./configure  --prefix=/usr/local/nginx --with-http_ssl_module --with-http_sub_module --with-http_stub_status_module  --with-http_gzip_static_module
make && make install
echo $? || [ $? != 0  ] || echo  " installation  nginx  failed" || exit 1
# -------------------------------------------------------- #
            ## Keepalived_intsall
# -------------------------------------------------------- #
# Keepalived installation
cd /root/softwarae
[ ! -e keepalived-1.2.4.tar.gz ] &&  wget http://www.keepalived.org/software/keepalived-1.2.4.tar.gz
tar -zxvf keepalived-1.2.4.tar.gz
cd keepalived-1.2.4
ln -s /usr/src/kernels/$(uname -r) /usr/src/kernels/linux
./configure --prefix=/usr  --bindir=/usr/bin  --sbindir=/usr/bin  --libexecdir=/usr/libexec --localstatedir=/var --libdir=/lib64  --infodir=/usr/share/info  --sysconfdir=/etc --mandir=/usr/local/share/man   --with-kernel-dir=/usr/src/kernels/linux
make && make install
echo $? || [ $? != 0  ] || print " installation keepalived  failed" || exit 1
chkconfig --add keepalived
chkconfig --level 345 keepalived on

4.4、在後端服務器上安裝apached

    後端node4

[root@node4 ~]# yum  -y install httpd
[root@node4 html]# echo "this is 192.168.122.4" > /var/www/htmlindex.html
[root@node4 ~]# service httpd start
[root@node4 html]# curl  192.168.122.4
this is 192.168.122.4

  後端node5

[root@node5 ~]# yum  -y install httpd
[root@node5 html]# echo "this is 192.168.122.5" > /var/www/htmlindex.html
[root@node5 ~]# service httpd start
[root@node5 html]# curl  192.168.122.5
this is 192.168.122.5

  後端node6

[root@node6 ~]# yum  -y install httpd
[root@node6 html]# echo "this is 192.168.122.6" > /var/www/htmlindex.html
[root@node6 ~]# service httpd start
[root@node6 html]# curl  192.168.122.6
this is 192.168.122.6

4.5、node2、node3上配置nginx

[root@node2 ~]# vim /usr/local/nginx/conf/nginx.conf
upstream web1       ##定義負載均衡組爲web1
    {
        ip_hash;
        server 192.168.122.4:80;
        server 192.168.122.5:80;
        server 192.168.122.6:80;
    }
 server {
        listen       80;
        server_name  dev.test01.com;
        location /
        {
        root /home/kuangl/;
        index index.html index.htm;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_pass http://web1;
        }
      }

4.6、在node2上配置keepalived

[root@node2 conf]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
   notification_email {
     [email protected]
   }
   notification_email_from root@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
vrrp_script chk_haproxy {
    script "/etc/keepalived/chk_nginx.sh"
    interval 2
    weight 2
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 200
    priority 250
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass kuanglnginx
    }
   track_script {
        chk_nginx
    }
    virtual_ipaddress {
        192.168.122.22
    }
}
vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 251
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass kuangl
    }
    track_script {
        chk_nginx
    }
    virtual_ipaddress {
        192.168.122.23
    }
}

4.7、在node3上配置keepalived

! Configuration File for keepalived
global_defs {
   notification_email {
     [email protected]
   }
   notification_email_from root@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
vrrp_script chk_haproxy {
    script "/etc/keepalived/chk_nginx.sh"
    interval 2
    weight 2
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 200
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass kuanglnginx
    }
    track_script {
        chk_nginx
    }
    virtual_ipaddress {
        192.168.122.22
    }
}
vrrp_instance VI_2 {
    state MASTER
    interface eth0
    virtual_router_id 251
    priority 250
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass kuangl
    }
    track_script {
        chk_nginx
    }
    virtual_ipaddress {
        192.168.122.23
    }
}

4.8、在兩臺雙主服務器上添加自動檢測腳本

#!/bin/bash
# description:
# 定時查看nginx是否存在,如果不存在則啓動nginx
# 如果啓動失敗,則停止keepalived
status=$(ps -C nginx --no-heading|wc -l)
if [ "${status}" = "0" ]; then
        /usr/local/nginx/sbin/nginx
        status2=$(ps -C nginx --no-heading|wc -l)
        if [ "${status2}" = "0"  ]; then
                /etc/init.d/keepalived stop
        fi
fi

4.9、開啓nginx、keepalived服務

[root@node2 ~]# service keepalived start
[root@node2 ~]# /usr/local/nginx/sbin/nginx
[root@node3 ~]# service keepalived start
[root@node3 ~]# /usr/local/nginx/sbin/nginx

4.10、用 ip a 查看VIP

4.11、測試訪問

[kuangl@node01 ~]$ curl http://192.168.122.22
this is 192.168.122.6
[kuangl@node01 ~]$ curl http://192.168.122.22
this is 192.168.122.4
[kuangl@node01 ~]$ curl http://192.168.122.22
this is 192.168.122.5
[kuangl@node01 ~]$ curl http://192.168.122.23
this is 192.168.122.6
[kuangl@node01 ~]$ curl http://192.168.122.23
this is 192.168.122.4
[kuangl@node01 ~]$ curl http://192.168.122.23
this is 192.168.122.5

五、後端用rsync做數據同步

  node5-node6上配置進程模式,以node5爲例

[root@node5 ~]# yum -y install rsync
[root@node5 ~]# vim /etc/rsynsd.conf
uid = root
gid = root
use chroot = no
max connections = 5
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
[web01]                       
path=/home/kuangl/           
comment = update           
ignore errors               
read only = no              
list = no                  
hosts allow = 192.168.122.0/24
auth users = root         
uid = root
gid = root
secrets file = /etc/rsyncd.secrets
[root@node5 ~]# vim /etc/rsyncd.secrets
root:123456
[root@node5 ~]# chmod 0600 /etc/rsyncd.secrets
[root@node5 ~]# ll /etc/rsyncd.secrets
-rw-------. 1 root root 12 Jul 20 19:41 /etc/rsyncd.secrets
[root@node5 ~]# rsync --daemon
[root@node5 ~]# echo "rsync --daemon" >> /etc/rc.local

 node4上配置命令模式:

[root@node4 ~]# yum -y install rsync
[root@node4 ~]# vim /etc/rsyncd.secrets
123456
[root@node4 ~]# chmod 0600 /etc/rsyncd.secrets
root@node4 kuangl]# rsync -vzrtopg --delete --progress --password-file=/etc/rsyncd.secrets  rsync+inotify [email protected]::web01
sending incremental file list
rsync+inotify/
rsync+inotify/inotify-tools-3.14.tar.gz
      358772 100%    1.85MB/s    0:00:00 (xfer#1, to-check=2/4)
rsync+inotify/rsync+inotify_client.sh
         617 100%    3.11kB/s    0:00:00 (xfer#2, to-check=1/4)
rsync+inotify/rsync+inotify_server.sh
         900 100%    4.03kB/s    0:00:00 (xfer#3, to-check=0/4)
sent 360679 bytes  received 69 bytes  240498.67 bytes/sec
total size is 360289  speedup is 1.00

 查看結果

[root@node5 ~]# cd /home/kuangl/
[root@node5 kuangl]# ll
total 8
-rw-r--r--. 1 root root   22 Jul 20 15:16 index.html
drwxr-xr-x. 2 root root 4096 Nov 11  2012 rsync+inotify


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章