nginx+keepalived高可用及雙主模式

高可用有2中方式。

一、Nginx+keepalived 主從配置前端

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

二、Nginx+keepalived 雙主配置nginx

這種方案,使用兩個vip地址,前端使用2臺機器,互爲主備,同時有兩臺機器工做,當其中一臺機器出現故障,兩臺機器的請求轉移到一臺機器負擔,很是適合於當前架構環境。web



nginx+keepalived高可用

1.環境以下

lb-01:192.168.75.136/24  nginx+keepalived-master
lb-02:192.168.75.137/24  nginx+keepalived-backup
VIP:192.168.75.135
 
rs-01:192.168.75.133/24 apache
rs-02:192.168.75.13424 apache

lb操做系統centos七、rs操做系統ubuntu14.04apache

2.lb-01/02安裝nginx切配置文件一致

nginx-repo倉庫源ubuntu

# cat /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

安裝nginxcentos

# yum install nginx -y

啓動nginx服務命令瀏覽器

# systemctl start nginx.service

nginx配置文件內容以下bash

[root@lb-01 conf.d]# pwd
/etc/nginx/conf.d
[root@lb-01 conf.d]# cat upstream.conf
upstream pools {
    server 192.168.75.133:80 weight=3;
    server 192.168.75.134:80 weight=3;
}
server {
    listen 80;
    server_name www.zxl.com;
    location / {
        proxy_pass http://pools;
        include /etc/nginx/conf.d/a.conf;
    }
}

include a.conf配置文件內容服務器

[root@lb-01 conf.d]# cat a.conf
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    client_max_body_size 10m;
    client_body_buffer_size 128k;
    proxy_connect_timeout 30;
    proxy_send_timeout 15;
    proxy_read_timeout 15;

把nginx相關配置文件拷貝到對端lb-02機器相應的目錄,而後檢查nginx -t語法以及從新加載便可

3.測試2臺lb-01/02是否負載均衡

打開客戶端瀏覽器分別訪問lb-01/02的ip地址,結果以下

lb-01訪問結果以下 
spacer.gif wKiom1d1InCzNP-sAAApRaAZvfA282.jpg-wh_50spacer.gif

lb-02訪問結果以下 
spacer.gif 
spacer.gifwKioL1d1InrhN9MPAAAqsOqB-cE865.jpg-wh_50

從上面能夠看到lb-01/02已經均衡訪問了

4.nginx結合keepalived高可用

爲何使用keepalived呢?使用keepalived就用來作高可用的,提供虛擬VIP

4.1分別在2臺lb上安裝keepalived

# yum install keepalived -y

查看keepalived版本

# keepalived -v
Keepalived v1.2.13 (11/20,2015)

4.2關於2臺keepalived配置文件

在lb-01-master keepalived配置文件內容以下

[root@lb-01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
   notification_email {
    19872672@qq.com
   }
   notification_email_from root@localhost.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_MASTER
}
 
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.75.135
    }
}

在lb-02-backup keepalived配置文件內容以下

[root@lb-02 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
   notification_email {
    19872672@qq.com
   }
   notification_email_from root@localhost.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_BACKUP
}
 
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.75.135
    }
}

而後分別啓動2臺keepalived服務

[root@lb-01 ~]# systemctl start keepalived.service

[root@lb-02 ~]# systemctl start keepalived.service

4.3查看虛擬VIP

lb-01-master機器查看

[root@lb-01 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 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
       valid_lft forever preferred_lft forever
    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:4f:23:ba brd ff:ff:ff:ff:ff:ff
    inet 192.168.75.136/24 brd 192.168.75.255 scope global dynamic eth0
       valid_lft 1133sec preferred_lft 1133sec
    inet 192.168.75.135/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe4f:23ba/64 scope link
       valid_lft forever preferred_lft forever

從上面能夠看到虛擬VIP地址192.168.75.135

lb-02-backup機器查看

root@lb-02 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 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
       valid_lft forever preferred_lft forever
    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:9d:61:b5 brd ff:ff:ff:ff:ff:ff
    inet 192.168.75.137/24 brd 192.168.75.255 scope global dynamic eth0
       valid_lft 1306sec preferred_lft 1306sec
    inet6 fe80::20c:29ff:fe9d:61b5/64 scope link
       valid_lft forever preferred_lft forever

從上面能夠看到沒有虛擬VIP地址

4.4測試訪問虛擬VIP

打開瀏覽器訪問 
spacer.gif 
spacer.gifwKiom1d1IwCiYgsjAAAqYFcmx7k428.jpg-wh_50

此時虛擬VIP能夠輪詢訪問了

4.5模擬故障

把lb-01-master nginx和keepalived中止查看是否還能正常提供服務

[root@lb-01 ~]# nginx -s stop
[root@lb-01 ~]# systemctl stop keepalived.service

查看nginx服務是否中止

或者ps -ef|grep nginx查看也能夠

[root@lb-01 ~]# netstat -ntpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1034/sshd           
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1793/master         
tcp6       0      0 :::22                   :::*                    LISTEN      1034/sshd           
tcp6       0      0 ::1:25                  :::*                    LISTEN      1793/master

此時虛擬VIP已經再也不lb-01-master上了

[root@lb-01 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 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
       valid_lft forever preferred_lft forever
    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:4f:23:ba brd ff:ff:ff:ff:ff:ff
    inet 192.168.75.136/24 brd 192.168.75.255 scope global dynamic eth0
       valid_lft 1361sec preferred_lft 1361sec
    inet6 fe80::20c:29ff:fe4f:23ba/64 scope link
       valid_lft forever preferred_lft forever

4.6客戶端打開瀏覽器訪問是否正常訪問

spacer.gif 
spacer.gif wKiom1d1I0-Rru9qAAAr-C4z-Oo933.jpg-wh_50

lb-01nginx和keepalived掛了也不影響服務

4.7查看lb-02-backup機器VIP狀況

[root@lb-02 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 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
       valid_lft forever preferred_lft forever
    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:9d:61:b5 brd ff:ff:ff:ff:ff:ff
    inet 192.168.75.137/24 brd 192.168.75.255 scope global dynamic eth0
       valid_lft 1366sec preferred_lft 1366sec
    inet 192.168.75.135/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe9d:61b5/64 scope link
       valid_lft forever preferred_lft forever

此時虛擬VIP 已經在lb-02機器上

4.8分別查看2臺lb機器日誌關於keepalived切換過程

lb-01的keepalived日誌

[root@lb-01 ~]# tail -f /var/log/messages
Jun 30 17:01:01 node1 systemd: Started Session 1159 of user root.
Jun 30 17:05:32 node1 systemd: Stopped nginx - high performance web server.
Jun 30 17:05:44 node1 systemd: Stopping LVS and VRRP High Availability Monitor...
Jun 30 17:05:44 node1 Keepalived[32926]: Stopping Keepalived v1.2.13 (11/20,2015)
Jun 30 17:05:44 node1 Keepalived_vrrp[32928]: VRRP_Instance(VI_1) sending 0 priority
Jun 30 17:05:44 node1 Keepalived_vrrp[32928]: VRRP_Instance(VI_1) removing protocol VIPs.
Jun 30 17:05:44 node1 Keepalived_healthcheckers[32927]: Netlink reflector reports IP 192.168.75.135 removed
Jun 30 17:05:44 node1 systemd: Stopped LVS and VRRP High Availability Monitor.

能夠看到服務中止後會發送一個檢測試劑以及以及刪除VIP等等狀況

lb-02keepalived日誌

[root@lb-02 log]# tail -f messages
Jun 30 17:01:35 node2 systemd: Started Network Manager Script Dispatcher Service.
Jun 30 17:01:35 node2 nm-dispatcher: Dispatching action 'dhcp4-change' for eth0
Jun 30 17:05:44 node2 Keepalived_vrrp[46346]: VRRP_Instance(VI_1) Transition to MASTER STATE
Jun 30 17:05:45 node2 Keepalived_vrrp[46346]: VRRP_Instance(VI_1) Entering MASTER STATE
Jun 30 17:05:45 node2 Keepalived_vrrp[46346]: VRRP_Instance(VI_1) setting protocol VIPs.
Jun 30 17:05:45 node2 Keepalived_vrrp[46346]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.75.135
Jun 30 17:05:45 node2 Keepalived_healthcheckers[46345]: Netlink reflector reports IP 192.168.75.135 added
Jun 30 17:05:50 node2 Keepalived_vrrp[46346]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.75.135

能夠看到日誌輸出過程當中設置爲master虛擬機VIP:192.168.75.135等信息

4.9上面故障模擬是人爲手工操做,那麼有木有自動檢測切換呢?

檢測腳本的內容以下

[root@lb-01 ~]# cat /data/scripts/check_nginx_status.sh
#!/bin/bash
start_nginx=`which nginx`
nginx_status1=`ps -C nginx --no-header |wc -l`
if [ $nginx_status1 -eq 0 ];then
    $start_nginx
    sleep 3
    nginx_status2=`ps -C nginx --no-header |wc -l`
    if [ $nginx_status2 -eq 0 ];then
    systemctl stop keepalived.service
    fi
fi

注:lb-01/02腳本內容同樣,放入計劃任務便可,好比每三秒檢測一下

* * * * * sleep 3; /bin/bash /data/scripts/check_nginx_status.sh


那麼如何實現nginx+keepalived雙主模式呢?

1.其實只是須要更改下keepalived配置文件便可,配置文件實例以下

增長新的VIP192.168.75.150,192.168.75.135是lb-01機器上主虛擬VIP,192.168.75.150是lb-02機器上主虛擬VIP

lb-01的keepalived配置文件內容以下

[root@lb-01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
   notification_email {
    1987277672@qq.com
   }
   notification_email_from root@localhost.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_MASTER
}
 
 
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.75.135
    }
}
 
vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 52
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.75.150
 }
}

lb-02的keepalived配置文件內容以下

[root@lb-02 ~]# cat /etc/keepalived/keepalived.conf 
global_defs {
   notification_email {
    1987277672@qq.com
   }
   notification_email_from root@localhost.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_BACKUP
}
 
 
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
 
    virtual_ipaddress {
        192.168.75.135
    }
}
 
vrrp_instance VI_2 {
    state MASTER
    interface eth0
    virtual_router_id 52
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.75.150
    }
}

2.分別啓動2臺lb上nginx和keepalived服務

lb-01啓動

[root@lb-01 keepalived]# nginx
[root@lb-01 keepalived]# systemctl start keepalived.service

lb-01查看服務是否啓動

[root@lb-01 ~]# ps -ef|grep ninx
root       6336   6128  0 22:39 pts/1    00:00:00 grep --color=auto ninx
[root@lb-01 ~]# ps -ef|grep nginx
root       6298      1  0 22:28 ?        00:00:00 nginx: master process nginx
nginx      6299   6298  0 22:28 ?        00:00:00 nginx: worker process
root       6338   6128  0 22:39 pts/1    00:00:00 grep --color=auto nginx
[root@lb-01 ~]# ps -ef|grep keepalived
root       6304      1  0 22:29 ?        00:00:00 /usr/sbin/keepalived -D
root       6305   6304  0 22:29 ?        00:00:00 /usr/sbin/keepalived -D
root       6306   6304  0 22:29 ?        00:00:00 /usr/sbin/keepalived -D
root       6340   6128  0 22:39 pts/1    00:00:00 grep --color=auto keepalived

lb-01查看虛擬ip

[root@lb-01 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 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
       valid_lft forever preferred_lft forever
    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:4f:23:ba brd ff:ff:ff:ff:ff:ff
    inet 192.168.75.136/24 brd 192.168.75.255 scope global dynamic eth0
       valid_lft 1506sec preferred_lft 1506sec
    inet 192.168.75.135/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe4f:23ba/64 scope link
       valid_lft forever preferred_lft forever

注:能夠看到lb-01機器上虛擬VIP是192.168.75.135

lb-02啓動

[root@lb-02 keepalived]# nginx
[root@lb-02 keepalived]# systemctl start keepalived.service

lb-02查看服務是否啓動

[root@lb-02 ~]# ps -ef|grep nginx
root      56849      1  0 22:27 ?        00:00:00 nginx: master process nginx
nginx     56850  56849  0 22:27 ?        00:00:00 nginx: worker process
root      56899  53901  0 22:41 pts/0    00:00:00 grep --color=auto nginx
[root@lb-02 ~]# ps -ef|grep keepalived
root      56856      1  0 22:28 ?        00:00:00 /usr/sbin/keepalived -D
root      56857  56856  0 22:28 ?        00:00:00 /usr/sbin/keepalived -D
root      56858  56856  0 22:28 ?        00:00:00 /usr/sbin/keepalived -D
root      56901  53901  0 22:41 pts/0    00:00:00 grep --color=auto keepalived

lb-02查看虛擬ip

[root@lb-02 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 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
       valid_lft forever preferred_lft forever
    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:9d:61:b5 brd ff:ff:ff:ff:ff:ff
    inet 192.168.75.137/24 brd 192.168.75.255 scope global dynamic eth0
       valid_lft 1087sec preferred_lft 1087sec
    inet 192.168.75.150/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe9d:61b5/64 scope link
       valid_lft forever preferred_lft forever

注:能夠看到lb-02機器上虛擬VIP是192.168.75.150

3.客戶端測試訪問虛擬VIP

訪問虛擬VIP:192.168.75.135結果以下 
spacer.gif wKiom1d1JFGB2RuFAAAr7EjYdaM085.jpg-wh_50spacer.gif

訪問虛擬VIP:192.168.75.150結果以下 
spacer.gif 
spacer.gifwKiom1d1JFriYCyhAAAqTjCAFrs741.jpg-wh_50

3.模擬故障

把lb-01服務中止

[root@lb-01 ~]# nginx -s stop
[root@lb-01 ~]# systemctl stop keepalived.service

驗證lb-01服務是否中止狀態

[root@lb-01 ~]# ps -ef|grep nginx
root       6355   6128  0 22:49 pts/1    00:00:00 grep --color=auto nginx
[root@lb-01 ~]# ps -ef|grep keepalived
root       6373   6128  0 22:49 pts/1    00:00:00 grep --color=auto keepalived

查看lb-01虛擬VIP是否存在結果以下

[root@lb-01 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 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
       valid_lft forever preferred_lft forever
    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:4f:23:ba brd ff:ff:ff:ff:ff:ff
    inet 192.168.75.136/24 brd 192.168.75.255 scope global dynamic eth0
       valid_lft 1798sec preferred_lft 1798sec
    inet6 fe80::20c:29ff:fe4f:23ba/64 scope link
       valid_lft forever preferred_lft forever

從上面結果能夠看到,此時虛擬VIP已經再也不lb-01機器了

4.測試訪問虛擬VIP**

訪問虛擬VIP:192.168.75.135結果以下 
spacer.gif 
spacer.gifwKioL1d1JKWgT1N1AAApAhBHMJ8324.jpg-wh_50

訪問虛擬VIP:192.168.75.150結果以下 
spacer.gif wKioL1d1JLOhaQK6AAAq-_qv_sc633.jpg-wh_50spacer.gif

從上面結果能夠看到,即便lb-01機器發生了故障也不影響使用,這樣也利用2臺lb資源了

查看一下lb-02虛擬ip結果狀況以下

[root@lb-02 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 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
       valid_lft forever preferred_lft forever
    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:9d:61:b5 brd ff:ff:ff:ff:ff:ff
    inet 192.168.75.137/24 brd 192.168.75.255 scope global dynamic eth0
       valid_lft 1020sec preferred_lft 1020sec
    inet 192.168.75.150/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet 192.168.75.135/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe9d:61b5/64 scope link
       valid_lft forever preferred_lft forever

注:此時虛擬VIP地址都已經在lb-02機器上了,nginx+keepalived先這樣了。服務級別還能夠使用開源監控軟件來進行監控,先這樣吧。。。。

相關文章
相關標籤/搜索