一.体系架构

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

二.简单原理

NGINX_MASTER、NGINX_BACKUP两台服务器均通过keepalived软件把ens33网卡绑上一个虚拟IP(VIP)地址192.168.1.40,此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.1.40重新绑定给NGINX_MASTER的ens33网卡。
使用此方案的优越性
1.实现了可弹性化的架构,在压力增大的时候可以临时添加web服务器添加到这个架构里面去;
2.upstream具有负载均衡能力,可以自动判断后端的机器,并且自动踢出不能正常提供服务的机器;
3.相对于lvs而言,正则分发和重定向更为灵活。而Keepalvied可保证单个nginx负载均衡器的有效性,避免单点故障;
4.用nginx做负载均衡,无需对后端的机器做任何改动。
5.nginx部署在docker容器里,即大量地节约开发、测试、部署的时间,又可以在出现故障时通过镜像快速恢复业务。

三、系统环境

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

nginx+docker+nfs部署

服务器 IP地址 安装软件
NGINX_MASTER 192.168.1.10 nginx+keepalived
NGINX_BACKUP 192.168.1.20 nginx+keepalived
WEB_1 192.168.1.11 docker+nginx
WEB_2 192.168.1.13 docker+nginx
nfs_MASTER 192.168.1.30 nfs+rsync+inotify
nfs_BACKUP 192.168.1.10 nfs+rsync+inotify

nginx部署(两台都是)

安装nginx

[root@nginx01 ~]# tar zxf nginx-1.14.0.tar.gz 
//解压nginx安装包
[root@nginx01 ~]# cd nginx-1.14.0/
[root@nginx01 nginx-1.14.0]# yum -y install openssl-devel pcre-devel zlib-devel
//安装nginx依赖包
[root@nginx01 nginx-1.14.0]# ./configure --prefix=/usr/local/nginx1.14 --with-http_dav_module --with-http_stub_status_module --with-http_addition_module  --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-pcre --with-http_ssl_module --with-http_gzip_static_module --user=nginx --group=nginx && make  &&  make install
//编译安装nginx
[root@nginx01 nginx-1.14.0]# useradd nginx -s /sbin/nologin -M
//创建所需用户
[root@nginx01 nginx-1.14.0]# ln -s /usr/local/nginx1.14/sbin/nginx /usr/local/sbin/
//链接命令
[root@nginx01 nginx-1.14.0]# nginx 
//开启nginx
[root@nginx01 nginx-1.14.0]# netstat -anpt | grep nginx
//查看nginx是否开启

nginx+docker+nfs部署

部署nginx

[root@nginx01 ~]# cd /usr/local/nginx1.14/conf/
[root@nginx01 conf]# vim nginx.conf

​ http模块加

upstream backend {
server 192.168.1.11:90 weight=1 max_fails=2 fail_timeout=10s;
server 192.168.1.13:90 weight=1 max_fails=2 fail_timeout=10s;
}
    location / {
       # root   html;
       # index  index.html index.htm;
       proxy_pass http://backend;  #添加
    }

高可用环境

安装keepalived

[root@nginx02 nginx-1.14.0]# yum -y install keepalived

配置keepalived

修改主和备nginx服务器上的keepalived 配置文件 /etc/keepalived/keepalived.conf 文件

主nginx

修改主nginx下/etc/keepalived/keepalived.conf文件

! Configuration File for keepalived
global_defs {
   router_id LVS_DEVEL
}   
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }   
    virtual_ipaddress {
        192.168.1.40
    }
}

备nginx

修改备nginx下 /etc/keepalived /keepalived.conf文件

配置备nginx时需要注意:需要修改state为BACKUP , priority比MASTER低,virtual_router_id和master的值一致

! Configuration File for keepalived
global_defs {
   router_id TWO
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 1
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.40
    }
}

测试(在做完docker的时候)

主备nginx都启动keepalived

systemctl  start  keepalived
[root@nginx01 conf]# curl 192.168.1.40
wsd666

nfs部署(两台都是)

nfs操作

[root@localhost ~]# yum -y install nfs-utils
//下载nfs服务

[root@nfs ~]# mkdir /database
//创建共享目录
[root@nfs02 ~]# chmod 777 /database/
//设置权限
[root@nfs ~]# vim /etc/exports
//设置权限如下
/database *(rw,sync,no_root_squash)

开启各项服务

[root@nfs ~]# systemctl start rpcbind
[root@nfs ~]# systemctl enable rpcbind
[root@nfs ~]# systemctl start nfs-server
[root@nfs ~]# systemctl enable nfs-server

docker01和docker02测试nfs

[root@nfs01 ~]# vim /etc/rsyncd.conf 
//建立rsync配置文件
uid = nobody
gid = nobody
use chroot = yes
address = 192.168.1.30
port 873
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
hosts allow = 192.168.1.0/24
[wwwroot]
path = /database
read only = no
dont compress = *.gz *.bz2 *.rar *.zip
[root@nfs01 ~]# mkdir /database
//创建共享目录
[root@nfs01 ~]# rsync --daemon
//启动rsync
[root@nfs01 ~]# netstat -anpt | grep rsync
//查看端口

nginx+docker+nfs部署

如果需要重启rsync服务,需要:

[root@localhost ~]# kill  $(cat /var/run/rsyncd.pid)
//停止服务
[root@localhost ~]# rsync --daemon
//启动服务
[root@localhost ~]# kill -9 $(cat /var/run/rsyncd.pid)

或者直接使用“netstat -anpt | grep rsync”命令查出进程号,使用“kill 进程号”一样。
使用第一种方法停止rsync服务必须删除存放rsync服务进程的文件:

[root@localhost ~]# rm -rf /var/run/rsyncd.pid

使用rsync备份工具

配置好rsync同步源服务器之后,客户端就可以使用rsync工具来执行远程同步了。

与rsync主机同步
rsync命令的选项:
-r:递归模式,包含目录及子目录中所有文件
-l:对于符号链接文件仍然复制为符号链接文件
-p:保留文件的权限标记
-t:保留文件的时间标记
-g:保留文件的属组标记(仅超级用户使用)
-o:保留文件的属主标记(仅超级用户使用)
-D:保留设备文件及其他特殊文件
-a:归档模式,递归并保留对象属性,等同于 -rlptgoD
-v:显示同步过程的详细(verbose)信息
-z:在传输文件时进行压缩(compress)
-H:保留硬连接文件
-A:保留ACL属性信息
--delete:删除目标位置有而原始位置没有的文件
--checksum:根据对象的校验和来决定是否跳过文件

rsync是一款快速增量备份工具,支持:
(1)本地复制;
(2)与其他SSH同步;
(3)与rsync主机同步。

手动与rsync主机同步
[root@localhost ~]# rsync -avz 192.168.1.1::wwwroot /root
或者
[root@localhost ~]# rsync -avz rsync://192.168.1.1/wwwroot /root
[root@nfs01 database]# vim index.html
xgp666
//创建测试目录

配置inotify+rsync实时同步(两台都是)

(1)、软件安装

rpm -q rsync //查询rsync是否安装,一般为系统自带安装
yum install rsync -y //若没有安装,使用yum安装

安装inotify软件包

[root@nfs02 ~]# tar zxf inotify-tools-3.14.tar.gz 
[root@nfs02 ~]# cd inotify-tools-3.14/
[root@nfs02 inotify-tools-3.14]#  ./configure && make && make install

(2)调整inotify内核参数

[root@nfs02 ~]# vim /etc/sysctl.conf
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576

[root@nfs02 ~]# sysctl -p
//生效

(3) 编写触发式同步脚本

#!/bin/bash
A="inotifywait -mrq -e modify,move,create,delete /database/"
B="rsync -avz  /database/ 192.168.1.40::wwwroot"
$A | while read DIRECTORY EVENT FILE
do
    if [ $(pgrep rsync | wc -l) -gt 0 ] ; then
        $B
    fi
done

此处需要注意,在两台服务器需要同步的目录之间,也需要将目录权限放到最大,避免因目录本身权限报错。

[root@nfs01 inotify-tools-3.14]# chmod  +x /opt/ino.sh

设置脚本开机自启

[root@nfs01 database]# vim /etc/rc.d/rc.local 
/opt/ino.sh &
/usr/bin/rsync --daemon

源服务器端测试

  • 执行脚本后,当前终端会变成实时监控界面,需要重新打开终端操作。
  • 在源服务器端共享模块目录下进行文件操作,然后去备份服务器下,可观察到文件已经被实时同步。

docker部署(两台都是)

[root@docker01 ~]# docker pull nginx
[root@docker01 ~]# mkdir -p  /www  
//创建挂载目录

nfs创建好之后docker上挂载目录

[root@docker01 ~]#  mount  -t nfs 192.168.1.30:/database /www
[root@docker01 ~]# docker run -itd --name nginx -p 90:80 -v /www/index.html:/usr/share/nginx/html/index.html nginx:latest

测试

1、当NGINX_MASTER、NGINX_BACKUP服务器nginx均正常工作时
在NGINX_MASTER上:
nginx+docker+nfs部署
在NGINX_BACKUP上:
nginx+docker+nfs部署
master服务器ens32网卡正常绑定VIP,而backup却没有绑定,通过浏览器可正常访问网站。
2、关闭NGINX_MASTER的nginx容器
nginx+docker+nfs部署
当nginx容器停止后,马上就又启起来了,nginx启动脚本没问题
3、关闭NGINX_MASTER的keepalived服务
在NGINX_MASTER上:
nginx+docker+nfs部署
在NGINX_BACKUP上:
nginx+docker+nfs部署
NGINX_BACKUP的ens32网卡已瞬间绑定VIP,通过浏览器访问网站正常。
4、将NGINX_MASTER的keepalived服务启动
在NGINX_MASTER上:
nginx+docker+nfs部署
在NGINX_BACKUP上:
nginx+docker+nfs部署
NGINX_MASTER的ens32网卡重新绑定VIP,通过浏览器访问网站正常。
5、关闭WEB_1服务器,通过浏览器访问网站正常。

排错

首先查看nginx配置文件是否有问题
两台keepakived的各项参数是否正常
docker上nginx是否映射端口,挂载nfs的共享目录。
nfs是否设置目录权限。是否配置rsync+inotify,写一个shell来做实时备份。

总结:

首先是镜像,就是拉取nginx的镜像。然后再把nginx镜像重建一下,就是变成我们需要的,主要就是改配置文件。然后把所有镜像push到harbor上

搭建nginx,做反向代理。
搭建docker,安装nginx镜像做测试做页面,测试面是从nfs共享来的。
搭建NFS,为了实现数据共享,包括数据库,就是持久化的。还要通过rsync+inotify,做到实时备份。