从单体到集群(1) - 使用Nginx配置静态资源并搭建Tomcat集群
从单体到集群(2) - keepalived+Nginx实现高可用集群
从单体到集群(3) - LVS+Keepalived+Nginx实现高可用集群负载均衡
--------------------------------------------------------------------------------------------------------------------------
软件版本:
IDAE:2019.2.2
VMware:12.5.2
虚拟机镜像:CentOs7.3标准版
Xshell:Xshell6
Postman:7.33.1
Tomcat:8.5.41
Nginx:1.18.0稳定版
keepalived:2.0.18
项目素材链接放上,需要的朋友请自行下载。后台项目为foodie-dev,前端项目有两个,foodie-shop为前端商城主体项目,foodie-center为前端商城个人中心项目。具体项目配置的话可以看下我的上篇博文架构篇:从单体到高可用集群(1) - 使用Nginx配置静态资源并搭建Tomcat集群
在上篇博文中,我们项目的架构由单体Tomcat部署前后台三个项目,演变成了由Nginx为静态资源提供服务同时将请求转发到后面的两个Tomcat集群上。上篇博文中的项目架构:
这样确实保证了后台服务不会因为单节点Tomcat宕机而导致整体服务崩溃,但这样也有一个问题,用单节点Nginx为tomcat集群作转发,万一Nginx挂了怎么办?所以我们今天的目标就是为单节点的Nginx搭建集群,确保Nginx的高可用。我们的目标架构如下:keepalived+Nginx高可用集群(双主热备模式)
我们先来了解一下主备模式:
可以明显的看到主备模式的缺点,假设主机永远不宕机的话,备机一直处在待机模式,无法响应客户的请求,造成资源的浪费。下面我们要说的双主热备模式就可以解决这个问题,主备是双主热备的前提,所以我们先来配置一下主备模式。配置之前我们首先要再去创建一台Nginx虚拟机配置静态资源服务和搭建两台Tomcat集群,创建的步骤省略,不懂的小伙伴可以参考我上篇博文架构篇:从单体到高可用集群(1) - 使用Nginx配置静态资源并搭建Tomcat集群。目前四台虚拟机是已经配置好了:
接下来我们把keepalived安装包上传到/home/software路径下,用tar指令解压:
tar -zxvf keepalived-2.0.18.tar.gz进入刚解压出的目录,配置并生成Makefile
./configure --prefix=/usr/local/keepalived --sysconf=/etc然后执行make和make install
make && make install这样keepalived我们就安装好了
进入/etc/keepalived路径,打开配置文件,修改配置文件内容为:
global_defs { #路由id:当前安装keepalived节点主机全局唯一标识符 router_id keepalived_150 } vrrp_instance VI_1 { #表示当前主机为主节点 state MASTER #绑定当前实例的网卡,这个需要用ip addr查询自己网卡配置,不一定都是ens33 interface ens33 #主备节点识别id,保证主备节点一致 1~255之间 virtual_router_id 255 #权值,因为是主节点设置的高一些 priority 100 #主备节点之间同步检查时间,单位为s advert_int 1 #授权认证密码 authentication { auth_type PASS auth_pass 1111 } #虚拟IP virtual_ipaddress { 192.168.1.140 } }保存退出后,去/usr/local/keepalived/sbin路径下启动keepalived:
./keepalived之后用ip addr指令查看一下,可以看到ens33网卡下生成配置好的虚拟IP
同理在151这台机器上也安装一个keepalived,只不过配置文件稍加修改:
global_defs { #路由id:当前安装keepalived节点主机全局唯一标识符 router_id keepalived_151 } vrrp_instance VI_1 { #表示当前主机为从节点 state BACKUP #绑定当前实例的网卡,这个需要用ip addr查询自己网卡配置,不一定都是ens33 interface ens33 #主备节点识别id,保证主备节点一致 virtual_router_id 255 #权值,因为是备用节点设置的低一些 priority 50 #主备节点之间同步检查时间,单位为s advert_int 1 #授权认证密码 authentication { auth_type PASS auth_pass 1111 } #虚拟IP virtual_ipaddress { 192.168.1.140 } }注:keepalived启动需要时间,别刚启动就去ip addr查看虚拟ip,我刚开始安装的时候就搞了半天,一直以为安装失败,汗-_-||。具体日志在/var/log/messages文件中,如果真的启动失败可以手动查看一下。
现在两台Nginx就配置好了集群,我们把192.168.1.150这台电脑的keepalived进程Kill掉,再访问192.168.1.140会发现被转发到了192.168.1.151这台电脑上,实现了Nginx的高可用。如果不想每次改完配置文件都去kill进程的话,可以把keepalived配置成系统服务。我们再访问192.168.1.140:90,可以看到后台请求也被转发到了192.168.1.151:90上,页面数据展示正常:
但这样的配置存在一个问题就是,如果挂的不是keepalived而是这台电脑上的Nginx的话,keepalived的转发就不会生效,因为它无法识别Nginx服务是否正常,解决方案是可以在keepalived.conf文件中配置对Nginx的定时检查,如果发现Nginx挂了,调用脚本重启Nginx。
增加Nginx重启检测脚本:
vim /etc/keepalived/check_nginx_alive_or_not.sh #!/bin/bash A=`ps -C nginx --no-header |wc -l` # 判断nginx是否宕机,如果宕机了,尝试重启 if [ $A -eq 0 ];then /usr/local/nginx/sbin/nginx # 等待一小会再次检查nginx,如果没有启动成功,则停止keepalived,使其启动备用机 sleep 3 if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then killall keepalived fi fi增加运行权限
chmod +x /etc/keepalived/check_nginx_alive_or_not.sh在keepalived配置文件中写入监听nginx脚本
vrrp_script check_nginx_alive { script "/etc/keepalived/check_nginx_alive_or_not.sh" interval 2 # 每隔两秒运行上一行脚本 weight 10 # 如果脚本运行失败,则升级权重+10 }在 vrrp_instance 中新增监控的脚本
track_script { check_nginx_alive # 追踪 nginx 脚本 }最后重启keepalived即可,至此keepalived+Nginx高可用集群(双机主备模式)搭建完毕。
双主热备的原理也很简单,就是在双机主备的基础上再增加一对实例,使192.168.1.150和192.168.1.151这两台虚拟机变成互为主备的关系。这次我们先打开原来的备用机151上keepalived的配置文件,做如下修改:
vrrp_instance VI_2 { #实例2中将备机151修改成主节点 state MASTER interface ens33 #记得同步修改对配id virtual_router_id 1 #因为是主节点,权值加大 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } #将虚拟IP:19.168.1.141绑定到自己的网卡上 virtual_ipaddress { 192.168.1.141 } }同理192.168.1.150这台虚拟机也进行相似的配置:
vrrp_instance VI_2 { #这次改为从节点 state BACKUP interface ens33 #配对id保持一致 virtual_router_id 1 priority 50 advert_int 1 authentication { auth_type PASS auth_pass 1111 } #增加虚拟IP:192.168.1.141 virtual_ipaddress { 192.168.1.141 } }之后进行保存重启服务,可以看到150这台电脑绑定的虚拟IP:192.168.1.140,151这台电脑绑定的虚拟IP:192.168.1.141
至此keepalived+Nginx高可用集群(双主热备模式)搭建完毕。细心的小伙伴可能会问,现在相当于有了两个前端访问入口(192.168.1.140和192.168.1.141),浏览器到底应该写哪一个呢?再来看一下我们的目标架构:
可以看到前端请求在访问到虚拟IP之前,挡了一层DNS轮训转发,这需要购买一个运营商的DNS服务,在服务中进行配置就可以实现此功能。DNS是基于域名的,因为我没有购买,所以就不能展示项目中这部分的配置了。但是不用急,接下来我会分享一篇“基于LVS+keepalived+Nginx实现高可用集群架构”的文章,欢迎大家来踩。