在Keepalived + Nginx高可用負(fù)載均衡架構(gòu)中,keepalived負(fù)責(zé)實(shí)現(xiàn)High-availability (HA) 功能控制前端機(jī)VIP(虛擬網(wǎng)絡(luò)地址),當(dāng)有設(shè)備發(fā)生故障時(shí),熱備服務(wù)器可以瞬間將VIP自動(dòng)切換過來,實(shí)際運(yùn)行中體驗(yàn)只有2秒鐘切換時(shí)間,DNS服務(wù)可以負(fù)責(zé)前端VIP的負(fù)載均衡。
nginx負(fù)責(zé)控制后端web服務(wù)器的負(fù)載均衡,將客戶端的請求按照一定的算法轉(zhuǎn)發(fā)給后端Real Server處理,而Real Server將響應(yīng)直接返回給客戶端。
創(chuàng)新互聯(lián)建站于2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢想脫穎而出為使命,1280元陽信做網(wǎng)站,已為上家服務(wù),為陽信各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18982081108
NGINX_MASTER、NGINX_BACKUP兩臺服務(wù)器均通過keepalived軟件把ens32網(wǎng)卡綁上一個(gè)虛擬IP(VIP)地址192.168.2.242,此VIP當(dāng)前由誰承載著服務(wù)就綁定在誰的ens32上,當(dāng)NGINX_MASTER發(fā)生故障時(shí),NGINX_BACKUP會通過/etc/keepalived/keepalived.conf文件中設(shè)置的心跳時(shí)間advert_int 1檢查,無法獲取NGINX_MASTER正常狀態(tài)的話,NGINX_BACKUP會瞬間綁定VIP來接替nginx_master的工作,當(dāng)NGINX_MASTER恢復(fù)后keepalived會通過priority參數(shù)判斷優(yōu)先權(quán)將虛擬VIP地址192.168.2.242重新綁定給NGINX_MASTER的ens32網(wǎng)卡。
使用此方案的優(yōu)越性
1.實(shí)現(xiàn)了可彈性化的架構(gòu),在壓力增大的時(shí)候可以臨時(shí)添加web服務(wù)器添加到這個(gè)架構(gòu)里面去;
2.upstream具有負(fù)載均衡能力,可以自動(dòng)判斷后端的機(jī)器,并且自動(dòng)踢出不能正常提供服務(wù)的機(jī)器;
3.相對于lvs而言,正則分發(fā)和重定向更為靈活。而Keepalvied可保證單個(gè)nginx負(fù)載均衡器的有效性,避免單點(diǎn)故障;
4.用nginx做負(fù)載均衡,無需對后端的機(jī)器做任何改動(dòng)。
5.nginx部署在docker容器里,即大量地節(jié)約開發(fā)、測試、部署的時(shí)間,又可以在出現(xiàn)故障時(shí)通過鏡像快速恢復(fù)業(yè)務(wù)。
兩臺負(fù)載機(jī)器安裝:centos7.5+docker+nginx+keepalived,分別命名為:NGINX_MASTER,NGINX_BACKUP。
后端web服務(wù)器,可以是提供web服務(wù)的任何架構(gòu),分別命名為:WEB_1,WEB_2。
后端數(shù)據(jù)庫機(jī)器可任意架構(gòu),只要能提供數(shù)據(jù)庫服務(wù)即可。
服務(wù)器 | 操作系統(tǒng) | 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 |
數(shù)據(jù)庫集群 | Centos 7.5 64位 | MySQL集群 |
web服務(wù)器我這里用的是LAMP架構(gòu),具體的安裝部署請參考我的另一篇博文《Centos 7使用docker部署LAMP搭建wordpress博客系統(tǒng)》,https://blog.51cto.com/andyxu/2177116。
分別在NGINX_MASTER、NGINX_BACKUP兩臺服務(wù)器上操作
1、部署docker環(huán)境
(1)安裝docker
注:安裝的是docker社區(qū)版本
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數(shù)據(jù)存儲目錄
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)啟動(dòng)docker,并加入開機(jī)啟動(dòng)
systemctl start docker
systemctl enable docker
2、配置nginx容器
(1)下載nginx鏡像docker pull nginx
(2)復(fù)制nginx主配置文件到本地
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)創(chuàng)建運(yùn)行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是重啟策略,當(dāng)docker服務(wù)重啟后,容器也會自動(dòng)啟動(dòng)
(5)啟動(dòng)nginx容器sh docker_nginx.sh
(6)修改nginx主配置文件
vim /data/docker/nginx/conf/nginx.conf
user nginx;
worker_processes 4; #工作進(jìn)程數(shù),為CPU的核心數(shù)或者兩倍
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
use epoll; #Linux最常用支持大并發(fā)的事件觸發(fā)機(jī)制
worker_connections 65535;
}
http {
include /etc/nginx/mime.types; #設(shè)定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并發(fā)數(shù)
include /etc/nginx/conf.d/*.conf; #包含nginx虛擬主機(jī)配置文件目錄
}
(7)創(chuàng)建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)創(chuàng)建虛擬主機(jī)配置文件
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的并發(fā)連接數(shù)配置
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并發(fā)數(shù)為200,超過會返回503
}
(9)重啟nginx容器docker restart nginx
分別在NGINX_MASTER、NGINX_BACKUP兩臺服務(wù)器上操作
1、下載并安裝keepalived
注:keepalived安裝在實(shí)體機(jī)上
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
如果報(bào)以下警告:
*** WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.
不用擔(dān)心,我們只需要用到VRRP功能,不需要用IPVS功能,所以請確保以下三項(xiàng)是yes就行了。
Use VRRP Framework : Yes
Use VRRP VMAC : Yes
Use VRRP authentication : Yes
make
make install
2、將keepalived 以服務(wù)方式啟動(dòng)
mkdir /etc/keepalived
cp /data/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
systemctl enable keepalived
3、修改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狀態(tài)的腳本
interval 2
weight 3
}
vrrp_instance VI_1 {
state MASTER #備份服務(wù)器上將MASTER改為BACKUP
interface ens32
virtual_router_id 51
priority 100 #備份服務(wù)上將100改為小于100,可配置成90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.2.242 #有多個(gè)vip可在下面繼續(xù)增加
}
track_script {
chk_nginx
}
}
4、添加檢查nginx狀態(tài)的腳本
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
腳本說明:當(dāng)nginx進(jìn)程不存在時(shí),會自動(dòng)重啟docker服務(wù),docker服務(wù)啟動(dòng)時(shí)會自動(dòng)啟動(dòng)nginx容器;再次檢查nginx進(jìn)程,如果不存在,就停止keepalived服務(wù),然后NGINX_BACKUP主機(jī)會自動(dòng)接替NGINX_MASTER的工作。chmod +x /etc/keepalived/nginx_pid.sh
5、配置firewalld防火墻允許vrrp協(xié)議
VRRP(Virtual Router Redundancy Protocol,虛擬路由器冗余協(xié)議)
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.2.229" protocol value="vrrp" accept"
firewall-cmd --reload
如果是backup服務(wù)器,source address改成master服務(wù)器的IP
6、啟動(dòng)keepalivedsystemctl start keepalived
1、當(dāng)NGINX_MASTER、NGINX_BACKUP服務(wù)器nginx均正常工作時(shí)
在NGINX_MASTER上:
在NGINX_BACKUP上:
master服務(wù)器ens32網(wǎng)卡正常綁定VIP,而backup卻沒有綁定,通過瀏覽器可正常訪問網(wǎng)站。
2、關(guān)閉NGINX_MASTER的nginx容器
當(dāng)nginx容器停止后,馬上就又啟起來了,nginx啟動(dòng)腳本沒問題
3、關(guān)閉NGINX_MASTER的keepalived服務(wù)
在NGINX_MASTER上:
在NGINX_BACKUP上:
NGINX_BACKUP的ens32網(wǎng)卡已瞬間綁定VIP,通過瀏覽器訪問網(wǎng)站正常。
4、將NGINX_MASTER的keepalived服務(wù)啟動(dòng)
在NGINX_MASTER上:
在NGINX_BACKUP上:
NGINX_MASTER的ens32網(wǎng)卡重新綁定VIP,通過瀏覽器訪問網(wǎng)站正常。
5、關(guān)閉WEB_1服務(wù)器,通過瀏覽器訪問網(wǎng)站正常。
1、在NGINX_MASTER和NGINX_BACKUP上安裝ntpyum -y install ntp
2、在NGINX_MASTER上修改ntp配置文件
添加以下兩行
server 127.127.1.0 iburst local clock #添加使用本地時(shí)間
restrict 192.168.2.0 mask 255.255.255.0 nomodify #允許更新的IP地址段
3、在NGINX_MASTER上啟動(dòng)ntp服務(wù),并加入開機(jī)啟動(dòng)
systemctl start ntpd
systemctl enable ntpd
4、在NGINX_MASTER上添加防火墻策略
只允許192.168.2.229訪問ntp服務(wù)
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.2.229" port protocol="udp" port="123" accept"
firewall-cmd --reload
5、在NGINX_BACKUP上同步NGINX_MASTER的時(shí)間ntpdate 192.168.2.228
6、在NGINX_BACKUP上設(shè)置計(jì)劃任務(wù),每天凌晨5點(diǎn)01分同步時(shí)間
crontab -e
1 5 * * * /usr/sbin/ntpdate 192.168.2.228 >> /var/log/upClock.log
本文名稱:Centos7部署docker+nginx+keepalived實(shí)現(xiàn)高可用web集群
瀏覽路徑:http://jinyejixie.com/article30/ipiiso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、關(guān)鍵詞優(yōu)化、定制開發(fā)、微信小程序、面包屑導(dǎo)航、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)