前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >搭建Keepalived+Nginx高可用服务架构

搭建Keepalived+Nginx高可用服务架构

作者头像
青山师
发布2023-05-05 19:36:08
3850
发布2023-05-05 19:36:08
举报
文章被收录于专栏:IT当时语_青山师_JAVA技术栈

搭建Keepalived+Nginx高可用服务架构

如果nginx服务存在异常,上面的负载均衡架构就面临问题,服务不可用。

这个时候就会采用高可用方案了,简单的高可用是一般主从备份机制。

我们可以使用2台机器,作为主、备服务器,各自运行nginx服务。 需要一个监控程序,来控制传输主、备之间的心跳信息(我是否还活着的信息),如果备份机在一段时间内没有收到主的发送信息,则认为主已经挂了,自己上去挑大梁,接管主服务继续提供负载均衡服务。 当备再次可以从主那里获得信息时,释放主服务,这样原来的主又可以再次提供负载均衡服务了。

这里有3个角色: 一主、一备、监控程序。其中的监控程序或者软件我们可以采用Keepalived。

Keepalived

Keepalived工作原理

Keepalived类似一个工作在layer3,4&7的交换机。 Layer3,4&7工作在IP/TCP协议栈的IP层,TCP层,及应用层,原理分别如下: Layer3:Keepalived使用Layer3的方式工作式时,Keepalived会定期向服务器群中的服务器发送一个ICMP的数据包(即我们平时用的Ping程序),如果发现某台服务的IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被 非法关机。Layer3的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。 Layer4:如果您理解了Layer3的方式,Layer4就容易了。Layer4主要以TCP端口的状态来决定服务器工作正常与否。如web server的服务端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除。 Layer7:Layer7就是工作在具体的应用层了,比Layer3,Layer4要复杂一点,在网络上占用的带宽也要大一些。Keepalived将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则Keepalived将把服务器从服务器群中剔除。 ---- 来自搜狗百科

Keepalived作用

主要用作真实服务器的健康状态检查以及负载均衡的主机和备机之间故障切换实现。

一般的高可用web架构组件:LVS+keepalived+nginx

Keepalived高可用架构

Keepalived高可用简单架构概念视图:

当主down机后,会提升备为主,保证服务可用。

当主再次上线时,备会退位,主继续服务。

Keepalived组成

Keepalived 模块化设计,主要有三个模块,分别是corecheckvrrp

  • core
    • keepalived的核心,负责主进程的启动和维护、全局配置文件的加载解析
  • check
    • 负责healthchecker(健康检查),包括各种健康检查方式,以及对应的配置的解析包括LVS的配置解析;可基于脚本检查对IPVS后端服务器健康状况进行检查。
  • vrrp
    • VRRPD子进程就是来实现VRRP(虚拟路由冗余协议)协议的

安装Keepalived

  • 方式一:可以直接使用yum安装。
代码语言:javascript
复制
yum install -y keepalived
  • 方拾二: 使用源码安装方式。
代码语言:javascript
复制
#下载
wget http://www.keepalived.org/software/keepalived-1.2.23.tar.gz
#解压
tar -zxvf keepalived-1.2.23.tar.gz
cd keepalived-1.2.23
#安装
./configure --prefix=/usr/local/keepalived   #prefix指定安装目录
make
make install


vi /usr/local/keepalived/etc/keepalived/keepalived.conf
替换为你自身逻辑的配置文件的内容。


vi /usr/local/keepalived/etc/sysconfig/keepalived
添加以下内容:
KEEPALIVED_OPTIONS="-D -f /usr/local/keepalived/etc/keepalived/keepalived.conf" #不使用默认的,自己显示指定keepalived配置文件路径


# 因为我们使用非默认路径(/usr/local)安装keepalived,需要设置一些软链接以保证keepalived能正常启动:
ln -s /usr/local/keepalived/sbin/keepalived  /usr/bin #将keepalived主程序加入到环境变量
ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived  /etc/init.d/ #keepalived启动脚本,放到/etc/init.d/目录下就可以使用service命令便捷调用
ln -s /usr/local/keepalived/etc/sysconfig/keepalived  /etc/sysconfig/ #keepalived启动脚本变量引用文件,默认文件路径是/etc/sysconfig/,也可以不做软链接,直接修改启动脚本中文件路径即可


启动服务
service keepalived start

# 可以检查下服务是否正常(没有消息就是最好的消息)
chkconfig keepalived on

# 查看绑定好的虚拟ip(vip)
ip addr

# 测试
使用配置好的虚拟ip,在浏览器访问测试一下即可。

也可以这样设置,配置文件:安装完成之后,可以把配置文件放到目录: /etc/keepalived

后面则统一修改 /etc/keepalived/keepalived.conf 配置文件即可。

/etc/keepalived/keepalived.conf

启动|停止|重启服务

代码语言:javascript
复制
service keepalived start|stop|restart

检查服务

代码语言:javascript
复制
chkconfig keepalived on

查看keepalived版本

代码语言:javascript
复制
keepalived -v
Keepalived v1.2.23 (12/20,2019)

需求

使用keepalived结合nginx,搭建一套简单的高可用集群方案。

并且测试主宕机的情况;

演示主上线的情况。

分析

  • 选择4台虚拟机:2台做nginx的主、备;2台做tomcat集群。
    • 为了使nginx命令方便的话,可以将其所在目录添加到:/etc/profile 文件中。
  • 选择192.168.75.132、192.168.75.135安装keepalived和nginx并分别做主、备。
  • 选择192.168.75.130、192.168.75.134安装tomcat做应用集群。

实战

在192.168.75.132、192.168.75.135分别安装keepalived并配置

代码语言:javascript
复制
#下载
mkdir /usr/local/keepalived
cd /usr/local/keepalived
wget http://www.keepalived.org/software/keepalived-1.2.23.tar.gz
# 或者 wget http://www.keepalived.org/software/keepalived-1.2.23.tar.gz --no-check-certificate  跳过证书验证
#解压
tar -zxvf keepalived-1.2.23.tar.gz
# cd 到解压后的目录
cd keepalived-1.2.23
# 源码安装三板斧搞起来
./configure --prefix=/usr/local/keepalived   #prefix指定安装目录
make
make install

安装好后,可以看到以下目录:

​ 在192.168.75.132(作为主)修改配置文件 keepalived.conf:

代码语言:javascript
复制
! Configuration File for keepalived

# 全局配置
global_defs {
   # 发生切换时,需要通知的邮件; 一行一个用户的email地址;这里假定了几个人..
   notification_email {
     zs@163.com
     ls@163.com
     ww@163.com
   }
   
   notification_email_from admin@163.com    				# 发件人,谁发的;这里假定了一个管理员邮箱admin@163.com
   smtp_server smtp.163.com                                 # smtp服务器地址,这里示例使用163的公开地址
   smtp_connect_timeout 30									# smtp连接超时时间设置
   router_id LVS_DEVEL										# 运行keepalived的一个路由标志id
}

# VRRP 配置
vrrp_instance VI_1 {
    state MASTER											# 配置标志,MASTER 为主;BACKUP 为备
    interface eth0						# 该keepalived实例绑定的网卡; RHEL7以前可以设置为eth0,7以及之后可以设置为ens33
    virtual_router_id 51				#VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组
    priority 100											# 主节点的优先级(1-254之间),备用节点必须比主节点优先级低
    advert_int 1											# 主、备之间检查是否一致的时间间隔:单位秒
    
	# 认证配置   设置验证信息,主、备节点必须一致
	authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {					# 指定虚拟IP, 主、备节点设置必须一样
		# 可以设置多个虚拟ip,换行即可;随便写;这个地址是虚拟的,并不需要实体机器
		# 会将该vip绑定到当前机器的网卡eth0上(因为vrrp_instance的interface指定了eth0)
        192.168.75.88					
    }
}

在192.168.75.135(作为备)修改配置文件 keepalived.conf:

  • vrrp_instance 下面的state改为了 BACKUP
  • vrrp_instance 下面的额priority改为了90 ,比主的100低即可。
  • 其他的配置项一样。
  1. 启动keepalived服务
代码语言:javascript
复制
service keepalived start
  • 可以使用 ip addr 命令查看vip是否已经绑定
  1. 测试正常情况 在Master和Backup上分别启动keepalived。此时VIP(192.168.75.88)是可访问的,也可以ping通,通过虚拟ip(192.168.75.88)访问,可以看到一直访问的是主(192.168.75.132):
  1. 测试Master宕掉的情况

现在把主(192.168.75.132)的keepalived关掉,在浏览器上再次访问192.168.75.88,会发现此时访问的是备(192.168.75.135)了:

  1. 测试Master宕掉又恢复的情况 重新把192.168.75.132的keepalived启动后,会看到浏览器输入192.168.75.88访问的一直是192.168.75.132(主)。

综上所述,当前的架构方案,在keepalived出现问题时,是可以及时更换主备的。

原始高可用方案存在的问题

我们把主的nginx服务关闭,再访问192.168.75.88,发现服务访问失败,因为此时一直访问的是主192.168.75.132的nginx。但是http://192.168.75.132:8080/服务其实是可用的。

这不是我们想要的结果,因为此时备(192.168.75.135)的nginx服务是OK的。能不能在主的nginx挂掉后,自动地切换到备的nginx服务呢?

毋庸置疑,肯定是可以的,我们还需要更多的配置。

截至目前,该方案不能保证主nginx挂掉后服务仍可用。所以,还需要继续提高高可用性。

我们需要在keepalived.conf中增加对nginx服务的检测,根据nginx服务的状态做出一些处理。

vrrp_script节点

​ 此模块专门用于对集群中服务资源进行监控 。与此模块同时使用的还有 track_script 模块,在此模块中可以引入监控脚本、命令组合、shell 语句等 ,以实现对服务、端口等多方面的监控。

​ track_script 模块主要用来调用 vrrp_script 模块使 keepalived执行对集群服务资源的检测。

​ vrrp_script 模块中还可以定义对服务资源检测的时间间隔、权重等参数,通过 vrrp_script 和 track_script 组合,可以实现对集群资源的监控并改变优先级,进而实现 keepalived 主备节点切换。

我们可以在keepalived.conf文件中新增一个vrrp_script节点,来指定监控一个shell脚本文件: /etc/keepalived/check_and_start_nginx.sh

代码语言:javascript
复制
# 新增一个vrrp_script节点,用来监控nginx
vrrp_script chk_nginx {
    script "/etc/keepalived/check_and_start_nginx.sh"   	# 检测nginx服务并尝试重启
    interval 2                    							# 每2s检查一次
    weight -5                     							# 检测失败(脚本返回非0)则优先级减少5个值
    fall 3                        							# 如果连续失败次数达到此值,则认为服务器已down
    rise 2                        							# 如果连续成功次数达到此值,则认为服务器已up,但不修改优先级
}

还需要在虚拟节点中增加track_script子节点引用vrrp_script节点:

代码语言:javascript
复制
# VRRP 配置
vrrp_instance VI_1 {
    state MASTER											# 配置标志,MASTER 为主;BACKUP 
    
    # ...... 省略
	
	# 引用VRRP脚本,即在 vrrp_script 中定义的
    track_script {                # 引用VRRP脚本
        chk_nginx          
    }     
}

shell脚本编写

vi /etc/keepalived/check_and_start_nginx.sh 编写以下内容:

代码语言:javascript
复制
#!/bin/bash

# 查看nginx进程是否正在运行,为0则表示已经down掉
nginx_result=$(ps -C nginx --no-heading|wc -l)
if [ "${nginx_result}" = "0" ]; then
	# 使用service的前提需要将nginx设置为servic; 或者直接使用nginx所在绝对路径比如: /usr/local/nginx/sbin/nginx
    service nginx start   # 或者使用   /usr/local/nginx/sbin/nginx
    sleep 2
    nginx_result=$(ps -C nginx --no-heading|wc -l)
    if [ "${nginx_result}" = "0" ]; then
		# 如果重启nginx服务还是不行的话,就把keepalived也停止;
		# 这样会访问备keepalived,从而保证主的nginx挂掉备也能使用
        /etc/rc.d/init.d/keepalived stop
    fi
fi

注意!!!!: 需要加执行权限:

代码语言:javascript
复制
chmod a+x /etc/keepalived/check_and_start_nginx.sh 

主的keepalived.conf

以下是完整的主的keepalived.conf(/etc/keepalived/keepalived.conf)文件配置:

代码语言:javascript
复制
! Configuration File for keepalived

# 全局配置
global_defs {
   # 发生切换时,需要通知的邮件; 一行一个用户的email地址;这里假定了几个人..
   notification_email {
     zs@163.com
     ls@163.com
     ww@163.com
   }
   
   notification_email_from admin@163.com    				# 发件人,谁发的;这里假定了一个管理员邮箱admin@163.com
   smtp_server smtp.163.com                                 # smtp服务器地址,这里示例使用163的公开地址
   smtp_connect_timeout 30									# smtp连接超时时间设置
   router_id LVS_DEVEL										# 运行keepalived的一个路由标志id
}

# 新增一个vrrp_script节点,用来监控nginx
vrrp_script chk_nginx {
    script "/etc/keepalived/check_and_start_nginx.sh"   	# 检测nginx服务并尝试重启
    interval 2                    							# 每2s检查一次
    weight -5                     							# 检测失败(脚本返回非0)则优先级减少5个值
    fall 3                        							# 如果连续失败次数达到此值,则认为服务器已down
    rise 2                        							# 如果连续成功次数达到此值,则认为服务器已up,但不修改优先级
}

# VRRP 配置
vrrp_instance VI_1 {
    state MASTER											# 配置标志,MASTER 为主;BACKUP 为备
    interface eth0						# 该keepalived实例绑定的网卡; RHEL7以前可以设置为eth0,7以及之后可以设置为ens33
    virtual_router_id 51				#VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组
    priority 100											# 主节点的优先级(1-254之间),备用节点必须比主节点优先级低
    advert_int 1											# 主、备之间检查是否一致的时间间隔:单位秒
    
	# 认证配置   设置验证信息,主、备节点必须一致
	authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {					# 指定虚拟IP, 主、备节点设置必须一样
		# 可以设置多个虚拟ip,换行即可;随便写;这个地址是虚拟的,并不需要实体机器
		# 会将该vip绑定到当前机器的网卡eth0上
        192.168.75.88					
    }
	
	# 引用VRRP脚本,即在 vrrp_script 中定义的
    track_script {                # 引用VRRP脚本
        chk_nginx          
    }     
}
  • 启动keepalived: service keepalived start

现在主(192.168.75.132)和备(192.168.75.135)的keepalived、nginx都已经启动;

此时 浏览器访问vip : http://192.168.75.88/, 回请求到主192.168.75.132:

现在将主的keepalived关闭,再访问http://192.168.75.88/,会请求到备192.168.75.135。

再将主的keepalived启动,又会访问到主。

注意: 原来我们将主的nginx关闭,访问 http://192.168.75.88/ 时会一直调用主,导致服务不可用。现在我们在主的keepalived中配置了监控nginx服务,看他是否会尝试重启主的nginx服务并且保证给外界提供访问。

我们在主上关闭nginx服务。稍等一会,访问 http://192.168.75.88/ ,发现可以访问到主的页面,这样keepalived监控了nginx的状态并将nginx服务启动了,保证了高可用,现在不需要人工干预去启动服务了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-12-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 搭建Keepalived+Nginx高可用服务架构
    • Keepalived
      • Keepalived工作原理
      • Keepalived作用
      • Keepalived高可用架构
      • Keepalived组成
      • 安装Keepalived
    • 需求
      • 分析
        • 实战
          • 原始高可用方案存在的问题
            • vrrp_script节点
            • shell脚本编写
            • 主的keepalived.conf
        相关产品与服务
        云服务器
        云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档