分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 运营维护

Centos 7部署docker+nginx+keepalived实现高可用web集群

发布时间:2023-09-06 02:16责任编辑:熊小新关键词:nginxkeepalived
一.体系架构

在Keepalived + Nginx高可用负载均衡架构中,keepalived负责实现High-availability (HA) 功能控制前端机VIP(虚拟网络地址),当有设备发生故障时,热备服务器可以瞬间将VIP自动切换过来,实际运行中体验只有2秒钟切换时间,DNS服务可以负责前端VIP的负载均衡。
nginx负责控制后端web服务器的负载均衡,将客户端的请求按照一定的算法转发给后端Real Server处理,而Real Server将响应直接返回给客户端。

二.简单原理

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容器里,即大量地节约开发、测试、部署的时间,又可以在出现故障时通过镜像快速恢复业务。

三、系统环境

两台负载机器安装:centos7.5+docker+nginx+keepalived,分别命名为:NGINX_MASTER,NGINX_BACKUP。
后端web服务器,可以是提供web服务的任何架构,分别命名为:WEB_1,WEB_2。
后端数据库机器可任意架构,只要能提供数据库服务即可。

服务器操作系统IP地址安装软件
NGINX_MASTERCentos 7.5 64位192.168.2.228docker+nginx+keepalived
NGINX_BACKUPCentos 7.5 64位192.168.2.229docker+nginx+keepalived
WEB_1Centos 7.5 64位192.168.2.226docker+apache+php
WEB_2Centos 7.5 64位192.168.2.227docker+apache+php
数据库集群Centos 7.5 64位mysql集群

四、web服务器部署

web服务器我这里用的是LAMP架构,具体的安装部署请参考我的另一篇博文《Centos 7使用docker部署LAMP搭建wordpress博客系统》,http://blog.51cto.com/andyxu/2177116。

五、安装配置nginx

分别在NGINX_MASTER、NGINX_BACKUP两台服务器上操作
1、部署docker环境
(1)安装docker
注:安装的是docker社区版本

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

(2)修改配置文件,添加私有仓库地址和阿里云镜像地址,并指定docker数据存储目录

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

(3)启动docker,并加入开机启动

systemctl start dockersystemctl enable docker

2、配置nginx容器
(1)下载nginx镜像
docker pull nginx
(2)复制nginx主配置文件到本地

mkdir -p /data/docker/nginx/confdocker run --name tmp-nginx-container -d nginx:latestdocker 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/bashdocker 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.conf

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

六、安装配置keepalived

分别在NGINX_MASTER、NGINX_BACKUP两台服务器上操作
1、下载并安装keepalived
注:keepalived安装在实体机上

yum install wget make gcc gcc-c++ openssl-develwget http://www.keepalived.org/software/keepalived-2.0.7.tar.gztar zxvf keepalived-2.0.7.tar.gzcd 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

makemake install

2、将keepalived 以服务方式启动

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

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

! Configuration File for keepalivedglobal_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 ???}}

4、添加检查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 keepalivedfi fi

脚本说明:当nginx进程不存在时,会自动重启docker服务,docker服务启动时会自动启动nginx容器;再次检查nginx进程,如果不存在,就停止keepalived服务,然后NGINX_BACKUP主机会自动接替NGINX_MASTER的工作。
chmod +x /etc/keepalived/nginx_pid.sh
5、配置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
6、启动keepalived
systemctl start keepalived

七、测试

1、当NGINX_MASTER、NGINX_BACKUP服务器nginx均正常工作时
在NGINX_MASTER上:

在NGINX_BACKUP上:

master服务器ens32网卡正常绑定VIP,而backup却没有绑定,通过浏览器可正常访问网站。
2、关闭NGINX_MASTER的nginx容器

当nginx容器停止后,马上就又启起来了,nginx启动脚本没问题
3、关闭NGINX_MASTER的keepalived服务
在NGINX_MASTER上:

在NGINX_BACKUP上:

NGINX_BACKUP的ens32网卡已瞬间绑定VIP,通过浏览器访问网站正常。
4、将NGINX_MASTER的keepalived服务启动
在NGINX_MASTER上:

在NGINX_BACKUP上:

NGINX_MASTER的ens32网卡重新绑定VIP,通过浏览器访问网站正常。
5、关闭WEB_1服务器,通过浏览器访问网站正常。

附1:配置时间同步

1、在NGINX_MASTER和NGINX_BACKUP上安装ntp
yum -y install ntp
2、在NGINX_MASTER上修改ntp配置文件
添加以下两行

server 127.127.1.0 iburst ?local clock ??#添加使用本地时间restrict 192.168.2.0 mask 255.255.255.0 nomodify ??#允许更新的IP地址段

3、在NGINX_MASTER上启动ntp服务,并加入开机启动

systemctl start ntpdsystemctl enable ntpd

4、在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

5、在NGINX_BACKUP上同步NGINX_MASTER的时间
ntpdate 192.168.2.228

6、在NGINX_BACKUP上设置计划任务,每天凌晨5点01分同步时间

crontab -e1 5 * * * /usr/sbin/ntpdate 192.168.2.228 >> /var/log/upClock.log

Centos 7部署docker+nginx+keepalived实现高可用web集群

原文地址:http://blog.51cto.com/andyxu/2286045

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved