Vmware部署Nginx+KeepAlived集群双主架构的问题及解决方法

前言

用nginx做负载均衡,作为架构的最前端或中间层,随着日益增长的访问量,需要给负载均衡做高可用架构,利用keepalived解决单点风险,一旦 nginx宕机能快速切换到备份服务器。

Vmware网络配置可能遇到的问题解决方法

  • 启动VMware DHCP ServiceVMware NAT Service两个服务
  • 在网络适配器开启网络共享,允许其他网络打勾保存,重启虚拟机

安装

节点部署

节点 地址 服务
centos7_1 192.168.211.130 Keepalived+Nginx
centos7_2 192.168.211.131 Keepalived+Nginx
centos7_3 192.168.211.132 Redis服务器
web1(物理机) 192.168.211.128 FastApi+Celery
web2(物理机) 192.168.211.129 FastApi+Celery

web的配置

web1启动python http服务器

vim index.html

<html>
<body>
<h1>Web Svr 1</h1>
</body>
</html>

nohup python -m SimpleHTTPServer 8080 > running.log 2>&1 &

web2启动python http服务器

vim index.html

<html>
<body>
<h1>Web Svr 2</h1>
</body>
</html>

nohup python -m SimpleHTTPServer 8080 > running.log 2>&1 &

关闭防火墙

firewall-cmd --state
systemctl stop firewalld.service
systemctl disable firewalld.service

现在浏览器访问就正常了,页面显示Web Svr 1 和 2

centos1和2安装Nginx

首先配置阿里云的源

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo

安装依赖包

yum -y install gcc
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
yum install -y openssl openssl-devel

下载nginx,并解压

wget http://nginx.org/download/nginx-1.8.0.tar.gz
tar -zxvf nginx-1.8.0.tar.gz

安装nginx

cd nginx-1.8.0
./configure --user=nobody --group=nobody --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_gzip_static_module --with-http_realip_module --with-http_sub_module --with-http_ssl_module
make
make install
cd /usr/local/nginx/sbin/
# 检查配置文件
./nginx -t
# 启动nginx
./nginx

开放nginx访问

firewall-cmd --zone=public --add-port=80/tcp --permanent
systemctl restart firewalld.service

此时访问130和131都可以看到nginx的首页。

创建nginx启动文件

需要在init.d文件夹中创建nginx启动文件。 这样每次服务器重新启动init进程都会自动启动Nginx。

cd /etc/init.d/
vim nginx

#!/bin/sh
#
# nginx - this script starts and stops the nginx daemin
#
# chkconfig:   - 85 15
# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /etc/nginx/nginx.conf
# pidfile:     /var/run/nginx.pid
# user:        nginx

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

nginx="/usr/local/nginx/sbin/nginx"
prog=$(basename $nginx)

NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"

lockfile=/var/run/nginx.lock

start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}

stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}

restart() {
    configtest || return $?
    stop
    start
}

reload() {
    configtest || return $?
    echo -n $"Reloading $prog: "
    killproc $nginx -HUP
    RETVAL=$?
    echo
}

force_reload() {
    restart
}

configtest() {
  $nginx -t -c $NGINX_CONF_FILE
}

rh_status() {
    status $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}

case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
            ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
        exit 2
esac

校验配置文件依次输入下列命令

chkconfig --add nginx
chkconfig --level 345 nginx on

给这个文件添加执行权限

chmod +x nginx
ls

functions  netconsole  network  nginx  README

启动Nginx服务

service nginx start
service nginx status
service nginx reload

Nginx反向代理、负载均衡(centos_1)

修改nginx.conf配置文件,去除注释的代码

cd /usr/local/nginx/conf/
mv nginx.conf nginx.conf.bak
egrep -v '^#' nginx.conf.bak
egrep -v '^#|^[ ]*#' nginx.conf.bak
egrep -v '^#|^[ ]*#|^$' nginx.conf.bak
egrep -v '^#|^[ ]*#|^$' nginx.conf.bak >> nginx.conf
cat nginx.conf

输出如下

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

重新加载nginx配置

# 测试配置文件是否正常
../sbin/nginx -t
# 重新加载nginx配置
../sbin/nginx -s reload

配置nginx反向代理、负载均衡

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    # websvr 服务器集群(也可以叫负载均衡池)
    upstream websvr {
        server 192.168.211.128:8001  weight=1;
        server 192.168.211.129:8001  weight=2;
    }

    server {
        listen       80;
        # 用来指定ip地址或者域名,多个配置之间用空格分隔
        server_name  192.168.211.130;
        location / {
            # 将所有请求交给websvr集群去处理
            proxy_pass http://websvr;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

现在重启nginx

sbin/nginx -s reload

websvr名称可自定义,可以指明这些服务器的含义。也就是只需要添加upstream websvrproxy_pass就可以实现负载均衡。

现在访问130,页面上就会出现Web Svr 1和Web Svr 2切换,会根据权重选择服务器,weight值越大,权重越高,也就是重复刷新该页面,平均Web Svr 2出现2次,Web Svr 1出现1次。

到目前为止,仍然不能实现高可用,虽然web服务可以这样做,单点故障可以通过这种方式处理,但是如果nginx服务故障了,整个系统基本就无法访问了,那么就需要使用多台Nginx来保障。

多个Nginx协同工作,Nginx高可用【双机主从模式】

131服务器(centos_2)上新增一台nginx服务,和之前的配置一样,只需要修改 nginx.conf 即可

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

        upstream websvr {
        server 192.168.211.128:8001  weight=1;
        server 192.168.211.129:8001  weight=2;
    }

    server {
        listen       80;
        server_name  192.168.211.131;
        location / {
            proxy_pass http://websvr;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

# 重新加载nginx
sbin/nginx -s reload

现在访问 http://192.168.211.130/ 也可以得到和 http://192.168.211.131/ 类似的结果。

这两台Nginx服务器的IP是不同的,那怎么做才能将这两台nginx服务器一起工作呢?这就需要用到keepalived了。

安装软件,两台centos同时安装

yum install keepalived pcre-devel  -y

配置keepalived

两台均备份

cp /etc/keepalived/keepalived.conf keepalived.conf.bak

centos_1配置Keepalived-MASTER

[root@localhost keepalived]# cat keepalived.conf
! Configuration File for keepalived

global_defs {
    script_user root
	enable_script_security
}

vrrp_script chk_nginx {
    # 指定监控脚本,检测nginx服务是否正常运行
    script "/etc/keepalived/chk_nginx.sh"
    # 指定监控时间,每10s执行一次
    interval 10
    # 脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
    # weight -5
    # # 检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
    # fall 2
    # 检测1次成功就算成功。但不修改优先级
    # rise 1
}

vrrp_instance VI_1 {
	# 指定keepalived的角色,主机设置为MASTER,备用机设置为BACKUP
    state BACKUP
	# 指定HA监测网络的接口。centos7使用 ip addr 获取
    interface ens33
	# 主备的virtual_router_id必须一样,可以设置为IP后一组:must be between 1 & 255
    virtual_router_id 51
	# 优先级值,在同一个vrrp_instance下, MASTRE 一定要高于 BAUCKUP,MASTER恢复后,BACKUP自动交接
    priority 90
	# VRRP 广播周期秒数,如果没检测到该广播,就被认为服务挂了,将切换主备
    advert_int 1
	# 设置验证类型和密码。主从必须一样
    authentication {
		# 设置vrrp验证类型,主要有PASS和AH两种
        auth_type PASS
		# 加密的密码,两台服务器一定要一样,才能正常通信
        auth_pass 1111
    }
	track_script {
        # 执行监控的服务,引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级
        chk_nginx
    }
    virtual_ipaddress {
		# VRRP HA 虚拟地址 如果有多个VIP,继续换行填写
        192.168.211.140
    }
}

把配置文件发送到131节点

scp /etc/keepalived/keppalived.conf 192.168.211.131:/etc/keepalived/keepalived.conf

对于131节点只需要修改

state BACKUP
priority 90

主keepalived配置监控脚本chk_nginx.sh

创建一个脚本,用于在keepalived中执行

vi /etc/keepalived/chk_nginx.sh

#!/bin/bash
# 查看是否有 nginx进程 把值赋给变量counter
counter=`ps -C nginx --no-header |wc -l`
# 如果没有进程值得为 0
if [ $counter -eq 0 ];then
    # 尝试启动nginx
    echo "Keepalived Info: Try to start nginx" >> /var/log/messages
    /etc/nginx/sbin/nginx
    sleep 3
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
        # 输出日至道系统消息
        echo "Keepalived Info: Unable to start nginx" >> /var/log/messages
        # 如果还没没启动,则结束 keepalived 进程
        # killall keepalived
        # 或者停止
        /etc/init.d/keepalived stop
        exit 1
    else
        echo "Keepalived Info: Nginx service has been restored" >> /var/log/messages
        exit 0
    fi
else
    # 状态正常
    echo "Keepalived Info: Nginx detection is normal" >> /var/log/messages;
    exit 0
fi

接下来授予执行权限,并测试

chmod +x chk_nginx.sh
./chk_nginx.sh

两边重启keepalived

systemctl restart keepalived
systemctl status keepalived

此时访问.140也是可以正常显示的,也就是绑定的IP成功了。执行前可以通过下面命令实时查看 messages 中的输出日志

tail -f /var/log/messages 

# 如果nginx关闭
Keepalived Info: Try to start nginx
Keepalived Info: Nginx service has been restored
# nginx正常打开
Keepalived Info: Nginx detection is normal

当nginx检测正常,就会返回0;检测没有了,返回1,但是keepalived似乎不是检测这个返回值来实现转移,而是检测keepalived服务是否存在,来释放本地VIP后,最终转移虚拟IP,到另一台服务器。

参考文章

https://www.jianshu.com/p/7e8e61d34960
https://www.cnblogs.com/zhangxingeng/p/10721083.html

到此这篇关于Vmware部署Nginx+KeepAlived集群双主架构的文章就介绍到这了,更多相关Nginx+KeepAlived集群内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Nginx实现高可用集群构建(Keepalived+Haproxy+Nginx)

    1.组件及实现的功能 Keepalived:实现对Haproxy服务的高可用,并采用双主模型配置; Haproxy:实现对Nginx的负载均衡和读写分离; Nginx:实现对HTTP请求的高速处理; 2.架构设计图 3.Keepalived部署 在两个节点上都需要执行安装keepalived,命令如下: $ yum -y install keepalived 修改 172.16.25.109 节点上 keepalived.conf 文件配置,命令如下 $ vim /etc/keepalived/

  • Keepalived+Nginx+Tomcat 实现高可用Web集群的示例代码

    Keepalived+Nginx+Tomcat 实现高可用Web集群 一.Nginx的安装过程 1.下载Nginx安装包,安装依赖环境包 (1)安装 C++编译环境 yum -y install gcc #C++ (2)安装pcre yum -y install pcre-devel (3)安装zlib yum -y install zlib-devel (4)安装Nginx 定位到nginx 解压文件位置,执行编译安装命令 [root@localhost nginx-1.12.2]# pwd

  • Vmware部署Nginx+KeepAlived集群双主架构的问题及解决方法

    前言 用nginx做负载均衡,作为架构的最前端或中间层,随着日益增长的访问量,需要给负载均衡做高可用架构,利用keepalived解决单点风险,一旦 nginx宕机能快速切换到备份服务器. Vmware网络配置可能遇到的问题解决方法 启动VMware DHCP Service和VMware NAT Service两个服务 在网络适配器开启网络共享,允许其他网络打勾保存,重启虚拟机 安装 节点部署 节点 地址 服务 centos7_1 192.168.211.130 Keepalived+Ngin

  • Docker部署MySQL8集群(一主二从)的实现步骤

    目录 一.CentOS7.9安装Docker20 二.部署MySQL集群(一主二从) 三.结果 一.CentOS7.9安装Docker20 1.安装yum-utils工具 yum install -y yum-utils 2.设置docker的依赖源 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 注释:CentOS直接使用yum命令安装的Docker版本为1.13.1属于

  • 用Docker swarm快速部署Nebula Graph集群的教程

    一.前言 本文介绍如何使用 Docker Swarm 来部署 Nebula Graph 集群. 二.nebula集群搭建 2.1 环境准备 机器准备 ip 内存(Gb) cpu(核数) 192.168.1.166 16 4 192.168.1.167 16 4 192.168.1.168 16 4 在安装前确保所有机器已安装docker 2.2 初始化swarm集群 在192.168.1.166机器上执行 $ docker swarm init --advertise-addr 192.168.

  • k8s部署redis cluster集群的实现

    Redis 介绍 Redis代表REmote DIctionary Server是一种开源的内存中数据存储,通常用作数据库,缓存或消息代理.它可以存储和操作高级数据类型,例如列表,地图,集合和排序集合. 由于Redis接受多种格式的密钥,因此可以在服务器上执行操作,从而减少了客户端的工作量. 它仅将磁盘用于持久性,而将数据完全保存在内存中. Redis是一种流行的数据存储解决方案,并被GitHub,Pinterest,Snapchat,Twitter,StackOverflow,Flickr等技

  • 基于Redis6.2.6版本部署Redis Cluster集群的问题

    目录 1.Redis6.2.6简介以及环境规划 2.二进制安装Redis程序 2.1.二进制安装redis6.2.6 2.2.创建Reids Cluster集群目录 3.配置Redis Cluster三主三从交叉复制集群 3.1.准备六个节点的redis配置文件 3.2.将六个节点全部启动 3.3.配置集群节点之间相互发现 3.4.为集群中的充当Master的节点分配槽位 3.5.配置三主三从交叉复制模式 4.快速搭建Redis Cluster集群 1.Redis6.2.6简介以及环境规划 在R

  • Nginx gateway集群和动态网关的实现思路

    目录 基于nginx部署gateway集群 动态Gateway 使用数据库实现动态路由 网关是系统的唯一对外的入口,介于客户端和服务器端之间的中间层,处理非业务功能,提供路由请求.鉴权.监控.缓存.限流等功能.无论你查看任何一个微服务项目架构,你都会发现在客户端和服务器端之间有一个网关,移动端的任何请求都必须经过网关才能到达服务端. 网关怎么实现集群:使用nginx实现. 基于nginx部署gateway集群 1.将网关项目多个部署启动例如:网关1 127.0.0.1:81网关1 127.0.0

  • 阿里云服务器部署 Docker Swarm集群

    目录 一.什么是 Docker Swarm? 二.Docker Swarm 和 k8s的区别 三.购买4台阿里云服务器 四.Docker Swarm 工作模式 五.部署 Docker Swarm 集群 连接4台服务器 安装Docker ️部署Swarm 六.Raft协议 七.其它命令

  • MySQL的自增ID(主键) 用完了的解决方法

    在 MySQL 中用很多类型的自增 ID,每个自增 ID 都设置了初始值.一般情况下初始值都是从 0 开始,然后按照一定的步长增加(一般是自增 1).一般情况下,我们都是用int(11)来作为数据表的自增 ID,在 MySQL 中只要定义了这个数的字节长度,那么就会有上限. MySQL的自增ID(主键) 用完了,怎么办? 如果用 int unsigned (int,4个字节 ), 我们可以算下最大当前声明的自增ID最大是多少,由于这里定义的是 int unsigned,所以最大可以达到2的32幂

  • Centos7 安装部署Kubernetes(k8s)集群实现过程

    目录 一.系统环境 二.前言 三.Kubernetes 3.1 概述 3.2 Kubernetes 组件 3.2.1 控制平面组件 3.2.2 Node组件 四.安装部署Kubernetes集群 4.1 环境介绍 4.2 配置节点的基本环境 4.3 节点安装docker,并进行相关配置 4.4 安装kubelet,kubeadm,kubectl 4.5 kubeadm初始化 4.6 添加worker节点到k8s集群 4.7 部署CNI网络插件calico 4.8 配置kubectl命令tab键自

  • 在Redis集群中使用pipeline批量插入的实现方法

    由于项目中需要使用批量插入功能, 所以在网上查找到了Redis 批量插入可以使用pipeline来高效的插入, 示例代码如下: String key = "key"; Jedis jedis = new Jedis("xx.xx.xx.xx"); Pipeline p = jedis.pipelined(); List<String> myData = .... //要插入的数据列表 for(String data: myData){ p.hset(ke

随机推荐