nginx+docker+nfs部署
一.体系架构
在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 keepalivedglobal_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 keepalivedglobal_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.40wsd666
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 = nobodygid = nobodyuse chroot = yesaddress = 192.168.1.30port 873log file = /var/log/rsyncd.logpid file = /var/run/rsyncd.pidhosts allow = 192.168.1.0/24[wwwroot]path = /databaseread only = nodont 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.htmlxgp666//创建测试目录
配置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.conffs.inotify.max_queued_events = 16384fs.inotify.max_user_instances = 1024fs.inotify.max_user_watches = 1048576[root@nfs02 ~]# sysctl -p//生效
(3) 编写触发式同步脚本
#!/bin/bashA="inotifywait -mrq -e modify,move,create,delete /database/"B="rsync -avz /database/ 192.168.1.40::wwwroot"$A | while read DIRECTORY EVENT FILEdo if [ $(pgrep rsync | wc -l) -gt 0 ] ; then $B fidone
此处需要注意,在两台服务器需要同步的目录之间,也需要将目录权限放到最大,避免因目录本身权限报错。
[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,做到实时备份。