欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

keepalived结合nginx实现nginx高可用的方法

程序员文章站 2024-02-05 14:58:52
1.简介 keepalived 是一个基于vrrp协议来实现的lvs服务高可用方案,可以利用其来避免单点故障。一个lvs服务会有2台服务器运行keepalived,一台为...

1.简介

keepalived 是一个基于vrrp协议来实现的lvs服务高可用方案,可以利用其来避免单点故障。一个lvs服务会有2台服务器运行keepalived,一台为主服务器(master),一台为备份服务器(backup),但是对外表现为一个虚拟ip,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候, 备份服务器就会接管虚拟ip,继续提供服务,从而保证了高可用性。keepalived是vrrp的完美实现,因此在介绍keepalived之前,先介绍一下vrrp的原理。

1.vrrp 协议简介

在现实的网络环境中,两台需要通信的主机大多数情况下并没有直接的物理连接。对于这样的情况,它们之间路由怎样选择?主机如何选定到达目的主机的下一跳路由,这个问题通常的解决方法有二种:

  1. 在主机上使用动态路由协议(rip、ospf等)
  2. 在主机上配置静态路由

很明显,在主机上配置动态路由是非常不切实际的,因为管理、维护成本以及是否支持等诸多问题。配置静态路由就变得十分流行,但路由器(或者说默认网关default gateway)却经常成为单点故障。vrrp的目的就是为了解决静态路由单点故障问题,vrrp通过一竞选(election)协议来动态的将路由任务交给lan中虚拟路由器中的某台vrrp路由器。

2.vrrp 工作机制

在一个vrrp虚拟路由器中,有多台物理的vrrp路由器,但是这多台的物理的机器并不能同时工作,而是由一台称为master的负责路由工作,其它的都是backup,master并非一成不变,vrrp让每个vrrp路由器参与竞选,最终获胜的就是master。master拥有一些特权,比如,拥有虚拟路由器的ip地址,我们的主机就是用这个ip地址作为静态路由的。拥有特权的master要负责转发发送给网关地址的包和响应arp请求。

vrrp通过竞选协议来实现虚拟路由器的功能,所有的协议报文都是通过ip多播(multicast)包(多播地址224.0.0.18)形式发送的。虚拟路由器由vrid(范围0-255)和一组ip地址组成,对外表现为一个周知的mac地址。所以,在一个虚拟路由 器中,不管谁是master,对外都是相同的mac和ip(称之为vip)。客户端主机并不需要因为master的改变而修改自己的路由配置,对客户端来说,这种主从的切换是透明的。

在一个虚拟路由器中,只有作为master的vrrp路由器会一直发送vrrp通告信息(vrrpadvertisement message),backup不会抢占master,除非它的优先级(priority)更高。当master不可用时(backup收不到通告信息), 多台backup中优先级最高的这台会被抢占为master。这种抢占是非常快速的(<1s),以保证服务的连续性。由于安全性考虑,vrrp包使用了加密协议进行加密。

3.vrrp 工作流程

(1).初始化:   

路由器启动时,如果路由器的优先级是255(最高优先级,路由器拥有路由器地址),要发送vrrp通告信息,并发送广播arp信息通告路由器ip地址对应的mac地址为路由虚拟mac,设置通告信息定时器准备定时发送vrrp通告信息,转为master状态;否则进入backup状态,设置定时器检查定时检查是否收到master的通告信息。

(2).master

  1. 设置定时通告定时器;
  2. 用vrrp虚拟mac地址响应路由器ip地址的arp请求;
  3. 转发目的mac是vrrp虚拟mac的数据包;
  4. 如果是虚拟路由器ip的拥有者,将接受目的地址是虚拟路由器ip的数据包,否则丢弃;
  5. 当收到shutdown的事件时删除定时通告定时器,发送优先权级为0的通告包,转初始化状态;
  6. 如果定时通告定时器超时时,发送vrrp通告信息;
  7. 收到vrrp通告信息时,如果优先权为0,发送vrrp通告信息;否则判断数据的优先级是否高于本机,或相等而且实际ip地址大于本地实际ip,设置定时通告定时器,复位主机超时定时器,转backup状态;否则的话,丢弃该通告包;

(3).backup

  1. 设置主机超时定时器;
  2. 不能响应针对虚拟路由器ip的arp请求信息;
  3. 丢弃所有目的mac地址是虚拟路由器mac地址的数据包;
  4. 不接受目的是虚拟路由器ip的所有数据包;
  5. 当收到shutdown的事件时删除主机超时定时器,转初始化状态;
  6. 主机超时定时器超时的时候,发送vrrp通告信息,广播arp地址信息,转master状态;
  7. 收到vrrp通告信息时,如果优先权为0,表示进入master选举;否则判断数据的优先级是否高于本机,如果高的话承认master有效,复位主机超时定时器;否则的话,丢弃该通告包;

4.arp查询处理

当内部主机通过arp查询虚拟路由器ip地址对应的mac地址时,master路由器回复的mac地址为虚拟的vrrp的mac地址,而不是实际网卡的 mac地址,这样在路由器切换时让内网机器觉察不到;而在路由器重新启动时,不能主动发送本机网卡的实际mac地址。如果虚拟路由器开启的arp代理 (proxy_arp)功能,代理的arp回应也回应vrrp虚拟mac地址。

2.搭建环境

1.服务器1:10.63.0.154  安装keeplived并设置priority 优先值为100
2.服务器2:10.63.0.155  安装keeplived并设置priority 优先值为98
3.设置两台服务器对应的虚拟ip为:10.63.0.158

3.安装keepalived主节点

本次安装keepalived采用yum的模式,在服务器1上安装,主要操作步骤如下:

1.安装ipvsadm,指令:yum install ipvsadm,安装完成后,可通过指令ipvsadm –v查看版本号。
2.安装keepalived,指令:yum install keepalived,安装完成后,可通过指令keepalived –v查看版本号。
3.创建/usr/local/nginx/nginx_check.sh脚本。脚本内容如下: 

#!/bin/bash
#判断nginx服务是否启动,如果不存在,调用nginx启用命令,并停止2秒,若#启动失败,杀掉keepalived
a=`ps -c nginx --no-header |wc -l`
if [ $a -eq 0 ];then 
 /usr/sbin/nginx
 sleep 2
 if [ `ps -c nginx --no-header |wc -l` -eq 0 ];then
  killall keepalived
 fi
fi

设置nginx_check.sh权限,设置命令为:chmod  777   /usr/local/nginx/nginx_check.sh

4.配置keepalived节点信息,默认配置文件为/etc/keepalived/keepalived.conf。keepalived.conf配置文件如下: 

! configuration file for keepalived

global_defs {
 router_id nginx_master154
}

vrrp_script chk_nginx {
 script "/usr/local/nginx/nginx_check.sh"
 interval 2
 weight 20
}
vrrp_instance vi_1 {
 state master
 interface eth0
 virtual_router_id 154
 mcast_src_ip 10.63.0.154
 priority 100
 nopreempt
 advert_int 1
 authentication {
  auth_type pass
  auth_pass 1111
 }
 track_script {
  chk_nginx
 }
 virtual_ipaddress {
  10.63.0.158
 }
}
}

配置文件关键参数说明:

  1.  router_id   //定义节点名称
  2. vrrp_script chk_nginx {    script "/etc/keepalived/nginx_check.sh"     interval 2     weight -20  }    //每隔2秒中去执行/etc/keepalived/nginx_check.sh脚本一次,这项检查从开始便一直进行,interval表示间隔时间,weight -20的意思是,脚本执行当判断异常时,把10.63.0.154这个节点的优先级降低20。
  3. state master   //表示该节点角色定义为master
  4. virtual_router_id 154  //定义虚拟的节点标识
  5. interface eth0   //定义网卡名称 查看服务器网卡名称可通过指令:ifconfig或者ip  a,如图:

keepalived结合nginx实现nginx高可用的方法

以上配置文件完成后,启动nginx,启动keepalived,可测试nginx是否可被虚拟ip地址访问。启动keepalived指令:systemctl start keepalived.service,启动后可通过指令 systemctl status keepalived.service查看状态。利用虚拟ip访问nginx主界面截图如下:

keepalived结合nginx实现nginx高可用的方法    

3.安装keepalived备用节点

 在服务器2上面安装keepalived的方法和服务器1完全一样,在keepalived.conf配置文件中只需修改三个地方:

  1. interface eth0   //定义网卡名称 查看服务器2的网卡 如网卡名称为 eno24 ,则定义为:interface eno24
  2. priority  //优先值设置为98
  3. mcast_src_ip 10.63.0.155

两台服务器上面的keepalived安装成功后,通过虚拟ip10.63.0.158调用测试,发现始终是主节点的页面,不会调用备用节点的页面。设置把服务器1上面的keepalived关闭后,再次调用,会出现备用节点的主界面,如下图:

keepalived结合nginx实现nginx高可用的方法    

4.linux服务管理工具systemctl

linux中,有service和chkconfig两个命令管理服务。systemctl 是管理服务的主要工具, 它整合了chkconfig 与 service功能于一体。(可以通过该命令管理yum安装软件,同时设置是否开机启动)

  1. systemctl is-enabled servicename.service #查询服务是否开机启动
  2. systemctl enable *.service #开机运行服务
  3. systemctl disable *.service #取消开机运行
  4. systemctl start *.service #启动服务
  5. systemctl stop *.service #停止服务
  6. systemctl restart *.service #重启服务
  7. systemctl reload *.service #重新加载服务配置文件
  8. systemctl status *.service #查询服务运行状态
  9. systemctl --failed #显示启动失败的服务

注:*代表某个服务的名字,如http的服务名为httpd

例如在centos 7 上安装http

[root@centos7 ~]# yum -y install httpd

启动服务(等同于service httpd start)  systemctl start httpd.service
停止服务(等同于service httpd stop)  systemctl stop httpd.service
重启服务(等同于service httpd restart) systemctl restart httpd.service
查看服务是否运行(等同于service httpd status) systemctl status httpd.service 开机自启动服务(等同于chkconfig httpd on)  systemctl enable httpd.service
开机时禁用服务(等同于chkconfig httpd on) systemctl disable httpd.service

ps -ef | grep nginx #查看服务进程

#非systemctl配置开机启动:chmod +x /etc/rc.d/rc.local
#打开rc.localvi /etc/rc.local
#加入启动脚本其中路径一定要用全路径如:/usr/local/nginx/sbin/nginx

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。