一.体系架构
在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。
后端数据库机器可任意架构,只要能提供数据库服务即可。
服务器 |
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
[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
//查看端口
如果需要重启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_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服务器,通过浏览器访问网站正常。
排错
首先查看nginx配置文件是否有问题
两台keepakived的各项参数是否正常
docker上nginx是否映射端口,挂载nfs的共享目录。
nfs是否设置目录权限。是否配置rsync+inotify,写一个shell来做实时备份。
总结:
首先是镜像,就是拉取nginx的镜像。然后再把nginx镜像重建一下,就是变成我们需要的,主要就是改配置文件。然后把所有镜像push到harbor上
搭建nginx,做反向代理。
搭建docker,安装nginx镜像做测试做页面,测试面是从nfs共享来的。
搭建NFS,为了实现数据共享,包括数据库,就是持久化的。还要通过rsync+inotify,做到实时备份。