Centos 7部署docker+nginx+keepalived實現高可用web集羣

一.體系架構

在Keepalived + Nginx高可用負載均衡架構中,keepalived負責實現High-availability (HA) 功能控制前端機VIP(虛擬網絡地址),當有設備發生故障時,熱備服務器能夠瞬間將VIP自動切換過來,實際運行中體驗只有2秒鐘切換時間,DNS服務能夠負責前端VIP的負載均衡。
nginx負責控制後端web服務器的負載均衡,將客戶端的請求按照必定的算法轉發給後端Real Server處理,而Real Server將響應直接返回給客戶端。
Centos 7部署docker+nginx+keepalived實現高可用web集羣php

二.簡單原理

NGINX_MASTER、NGINX_BACKUP兩臺服務器均經過keepalived軟件把ens32網卡綁上一個虛擬IP(VIP)地址192.168.2.242,此VIP當前由誰承載着服務就綁定在誰的ens32上,當NGINX_MASTER發生故障時,NGINX_BACKUP會經過/etc/keepalived/keepalived.conf文件中設置的心跳時間advert_int 1檢查,沒法獲取NGINX_MASTER正常狀態的話,NGINX_BACKUP會瞬間綁定VIP來接替nginx_master的工做,當NGINX_MASTER恢復後keepalived會經過priority參數判斷優先權將虛擬VIP地址192.168.2.242從新綁定給NGINX_MASTER的ens32網卡。
使用此方案的優越性
1.實現了可彈性化的架構,在壓力增大的時候能夠臨時添加web服務器添加到這個架構裏面去;
2.upstream具備負載均衡能力,能夠自動判斷後端的機器,而且自動踢出不能正常提供服務的機器;
3.相對於lvs而言,正則分發和重定向更爲靈活。而Keepalvied可保證單個nginx負載均衡器的有效性,避免單點故障;
4.用nginx作負載均衡,無需對後端的機器作任何改動。
5.nginx部署在docker容器裏,即大量地節約開發、測試、部署的時間,又能夠在出現故障時經過鏡像快速恢復業務。html

3、系統環境

兩臺負載機器安裝:centos7.5+docker+nginx+keepalived,分別命名爲:NGINX_MASTER,NGINX_BACKUP。
後端web服務器,能夠是提供web服務的任何架構,分別命名爲:WEB_1,WEB_2。
後端數據庫機器可任意架構,只要能提供數據庫服務便可。前端

服務器 操做系統 IP地址 安裝軟件
NGINX_MASTER Centos 7.5 64位 192.168.2.228 docker+nginx+keepalived
NGINX_BACKUP Centos 7.5 64位 192.168.2.229 docker+nginx+keepalived
WEB_1 Centos 7.5 64位 192.168.2.226 docker+apache+php
WEB_2 Centos 7.5 64位 192.168.2.227 docker+apache+php
數據庫集羣 Centos 7.5 64位 mysql集羣

4、web服務器部署

web服務器我這裏用的是LAMP架構,具體的安裝部署請參考個人另外一篇博文《Centos 7使用docker部署LAMP搭建wordpress博客系統》,http://www.javashuo.com/article/p-debomokf-z.htmlmysql

5、安裝配置nginx

分別在NGINX_MASTER、NGINX_BACKUP兩臺服務器上操做
一、部署docker環境
(1)安裝docker
注:安裝的是docker社區版本linux

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum -y install docker-ce

(2)修改配置文件,添加私有倉庫地址和阿里雲鏡像地址,並指定docker數據存儲目錄nginx

mkdir -p /data/docker
mkdir -p /etc/docker
vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://registry.docker-cn.com"], "graph": "/data/docker",
  "insecure-registries": ["192.168.2.225:5000"]
}

(3)啓動docker,並加入開機啓動c++

systemctl start docker
systemctl enable docker

二、配置nginx容器
(1)下載nginx鏡像
docker pull nginx
(2)複製nginx主配置文件到本地web

mkdir -p /data/docker/nginx/conf
docker run --name tmp-nginx-container -d nginx:latest
docker cp tmp-nginx-container:/etc/nginx/nginx.conf /data/docker/nginx/conf/
docker rm -f tmp-nginx-container

(4)建立運行nginx鏡像的腳本
vim docker_nginx.sh算法

#!/bin/bash
docker run --name nginx --restart=always -p 80:80 \
    -v /data/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro \
    -v /data/docker/nginx/conf/conf.d:/etc/nginx/conf.d \
    -v /data/docker/nginx/html:/usr/share/nginx/html \
    -v /data/docker/nginx/logs:/var/log/nginx \
    -d nginx:latest

注:--restart=always是重啓策略,當docker服務重啓後,容器也會自動啓動
(5)啓動nginx容器
sh docker_nginx.sh
(6)修改nginx主配置文件
vim /data/docker/nginx/conf/nginx.confsql

user  nginx;
worker_processes  4;   #工做進程數,爲CPU的核心數或者兩倍

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    use epoll;   #Linux最經常使用支持大併發的事件觸發機制
    worker_connections  65535;
}

http {
    include       /etc/nginx/mime.types;   #設定mime類型,類型由mime.type文件定義
    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  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  120;

    #gzip  on;
    limit_conn_zone $binary_remote_addr zone=perip:10m;   #添加limit_zone,限制同一IP併發數
    include /etc/nginx/conf.d/*.conf;   #包含nginx虛擬主機配置文件目錄
}

(7)建立upstream配置文件
vim /data/docker/nginx/conf/conf.d/myhost.conf

upstream xuad {
  ip_hash;  #會話保持
  server 192.168.2.226  max_fails=1 fail_timeout=60s;
  server 192.168.2.227  max_fails=1 fail_timeout=60s;
}

(8)建立虛擬主機配置文件
vim /data/docker/nginx/conf/conf.d/xuad.conf

server {
        listen       80; 
        server_name  localhost; 
        #charset GB2312; 

        location / 
        { 
              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; 
              proxy_pass http://xuad;
        } 

# 查看nginx的併發鏈接數配置
        location /NginxStatus
        {
             stub_status             on;
             access_log              off;
             auth_basic              "NginxStatus";
        }

        access_log  off;
        error_page 404  /404.html;
        error_page   500 502 503 504 /404.html;
        location = /404.html {
            root   html;
        }
        limit_conn perip 200;   #同一ip併發數爲200,超過會返回503
}

(9)重啓nginx容器
docker restart nginx

6、安裝配置keepalived

分別在NGINX_MASTER、NGINX_BACKUP兩臺服務器上操做
一、下載並安裝keepalived
注:keepalived安裝在實體機上

yum install wget make gcc gcc-c++ openssl-devel
wget http://www.keepalived.org/software/keepalived-2.0.7.tar.gz
tar zxvf keepalived-2.0.7.tar.gz
cd keepalived-2.0.7
./configure --prefix=/data/keepalived

若是報如下警告:
*** WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.

不用擔憂,咱們只須要用到VRRP功能,不須要用IPVS功能,因此請確保如下三項是yes就好了。
Use VRRP Framework : Yes
Use VRRP VMAC : Yes
Use VRRP authentication : Yes

make
make install

二、將keepalived 以服務方式啓動

mkdir /etc/keepalived
cp /data/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
systemctl enable keepalived

三、修改keepalived配置文件
vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   notification_email {
     xuad@xuad.com
   }
   notification_email_from root@xuad.com
   smtp_server mail.xuad.com
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_pid.sh"   # 檢查nginx狀態的腳本
    interval 2
    weight 3
}

vrrp_instance VI_1 {
    state MASTER     #備份服務器上將MASTER改成BACKUP
    interface ens32
    virtual_router_id 51
    priority 100       #備份服務上將100改成小於100,可配置成90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.2.242    #有多個vip可在下面繼續增長
    }
    track_script {
        chk_nginx
    }
}

四、添加檢查nginx狀態的腳本
vim /etc/keepalived/nginx_pid.sh

#!/bin/bash
#version 0.0.1
#
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
     systemctl restart docker
      sleep 3
            if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
                  systemctl stop keepalived
fi 
fi

腳本說明:當nginx進程不存在時,會自動重啓docker服務,docker服務啓動時會自動啓動nginx容器;再次檢查nginx進程,若是不存在,就中止keepalived服務,而後NGINX_BACKUP主機會自動接替NGINX_MASTER的工做。
chmod +x /etc/keepalived/nginx_pid.sh
五、配置firewalld防火牆容許vrrp協議
VRRP(Virtual Router Redundancy Protocol,虛擬路由器冗餘協議)

firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.2.229" protocol value="vrrp" accept"
firewall-cmd --reload

若是是backup服務器,source address改爲master服務器的IP
六、啓動keepalived
systemctl start keepalived

7、測試

一、當NGINX_MASTER、NGINX_BACKUP服務器nginx均正常工做時
在NGINX_MASTER上:
Centos 7部署docker+nginx+keepalived實現高可用web集羣
在NGINX_BACKUP上:
Centos 7部署docker+nginx+keepalived實現高可用web集羣
master服務器ens32網卡正常綁定VIP,而backup卻沒有綁定,經過瀏覽器可正常訪問網站。
二、關閉NGINX_MASTER的nginx容器
Centos 7部署docker+nginx+keepalived實現高可用web集羣
當nginx容器中止後,立刻就又啓起來了,nginx啓動腳本沒問題
三、關閉NGINX_MASTER的keepalived服務
在NGINX_MASTER上:
Centos 7部署docker+nginx+keepalived實現高可用web集羣
在NGINX_BACKUP上:
Centos 7部署docker+nginx+keepalived實現高可用web集羣
NGINX_BACKUP的ens32網卡已瞬間綁定VIP,經過瀏覽器訪問網站正常。
四、將NGINX_MASTER的keepalived服務啓動
在NGINX_MASTER上:
Centos 7部署docker+nginx+keepalived實現高可用web集羣
在NGINX_BACKUP上:
Centos 7部署docker+nginx+keepalived實現高可用web集羣
NGINX_MASTER的ens32網卡從新綁定VIP,經過瀏覽器訪問網站正常。
五、關閉WEB_1服務器,經過瀏覽器訪問網站正常。

附1:配置時間同步

一、在NGINX_MASTER和NGINX_BACKUP上安裝ntp
yum -y install ntp
二、在NGINX_MASTER上修改ntp配置文件
添加如下兩行

server 127.127.1.0 iburst  local clock   #添加使用本地時間
restrict 192.168.2.0 mask 255.255.255.0 nomodify   #容許更新的IP地址段

三、在NGINX_MASTER上啓動ntp服務,並加入開機啓動

systemctl start ntpd
systemctl enable ntpd

四、在NGINX_MASTER上添加防火牆策略
只容許192.168.2.229訪問ntp服務

firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.2.229" port protocol="udp" port="123" accept"
firewall-cmd --reload

五、在NGINX_BACKUP上同步NGINX_MASTER的時間
ntpdate 192.168.2.228
Centos 7部署docker+nginx+keepalived實現高可用web集羣
六、在NGINX_BACKUP上設置計劃任務,天天凌晨5點01分同步時間

crontab -e
1 5 * * * /usr/sbin/ntpdate 192.168.2.228 >> /var/log/upClock.log
相關文章
相關標籤/搜索