nginx与keepalived的那些事

简介: nginx与keepalived的那些事

1.含义

keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived是自动完成,不需人工干涉。

Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。

2.工作原理

Layer3,4,5工作在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将把这台服务器从服务器群中剔除。

Layer5:Layer5对指定的URL执行HTTP GET。然后使用MD5算法对HTTP GET结果进行求和。如果这个总数与预期值不符,那么测试是错误的,服务器将从服务器池中移除。该模块对同一服务实施多URL获取检查。如果您使用承载多个应用程序服务器的服务器,则此功能很有用。此功能使您能够检查应用程序服务器是否正常工作。MD5摘要是使用genhash实用程序(包含在keepalived软件包中)生成的。

SSL_GET与HTTP_GET相同,但使用SSL连接到远程Web服务器。

MISC_CHECK:此检查允许用户定义的脚本作为运行状况检查程序运行。结果必须是0或1.该脚本在导演盒上运行,这是测试内部应用程序的理想方式。可以使用完整路径(即/path_to_script/script.sh)调用可以不带参数运行的脚本。那些需要参数的需要用双引号括起来(即“/path_to_script/script.sh arg 1 … arg n”)

3.环境准备

[root@localhost ~]# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core)

服务器详情

IP 作用
192.168.180.131 keepalived+nginx(主)
192.168.180.132 keepalived+nginx(从)
192.168.180.133 web站点(tomcat)
192.168.180.134 web站点(tomcat)

4.配置过程

在LB01和LB02上安装keepalived(yum安装)

yum install keepalived -y

修改配置文件

vim /etc/keepalived/keepalived.conf

配置如下

LB01:

! Configuration File for keepalived
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LB01
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
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.110.200/24 dev ens33 label ens33:1
    }
}

LB02

! Configuration File for keepalived
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LB02
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.110.200/24 dev ens33 label ens33:1
    }
}

主要配置注释

  • router_id 是路由标识,在一个局域网里面应该是唯一的;
  • vrrp_instance VI_1{…}这是一个VRRP实例,里面定义了keepalived的主备状态、接口、优先级、 认证和IP信息;
  • state 定义了VRRP的角色;
  • interface定义使用的接口,这里我的服务器用的网卡都是eth1,根据实际来填写
  • virtual_router_id是虚拟路由ID标识,一组的keepalived配置中主备都是设置一致
  • priority是优先级,数字越大,优先级越大
  • auth_type是认证方式
  • auth_pass是认证的密码
  • virtual_ipaddress{…}定义虚拟IP地址,可以配置多个IP地址,这里我定义为192.168.101.200,绑定了ens33的网络接口,虚拟接口ens33:1
    启动keepalived
systemctl start keepalived.service

写入开机自启动

echo "systemctl start keepalived.service" >> /etc/rc.local

查看进程(3个进程)

ps -ef|grep keepalived

过几分钟,可以看到LB01(MASTER)上生成了一个虚拟IP,我们称之为VIP

ifconfig ens33:1

VIP即为虚拟IP

正常情况下只会在主节点上生产VIP,当主节点发生故障时,自动漂移到备节点,当两个节点同时出现VIP时,此时服务不可用,我们称之为"脑裂".


5.高可用切换试验

停掉LB01主节点服务,查看备节点状态

systemctl stop keepalived.service

可以看到VIP已经漂移到了备节点,现在我们将主节点起来,此时主节点会再将VIP夺回来

而备节点VIP消失

此时基本可以断定keepalived配置正确

nginx安装

LB01与LB02上,获取nginx源地址

rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

执行yum安装

yum install -y nginx

启动Nginx

systemctl start nginx

在/root下新建nginx状态监测脚本

#vim /root/check_ng.sh
nginx_num=` ps -ef|grep nginx|grep -v grep|wc -l`
if [ $nginx_num -eq 0 ]
   then
     systemctl stop  keepalived
fi

在keepalived配置监测脚本路径(此脚本需要先启动nginx在启动keepalived)

vim /etc/keepalived/keepalived.conf

新加入以下一段

vrrp_script check_nginx {
    script "/root/check_ng.sh"
    interval 2
    weight -20
}
#当检查心跳的时候,发现当前的nginx或keepalived停止了,权重值就减少20,这样的话就会比另一台服务器的权重小

重启keepalived

systemctl restart keepalived.service

此时正常

测试nginx页面,浏览器访问http://192.168.110.131/http://192.168.110.132,可以看到欢迎界面

6.配置WEB站点

在WEB01与WEB02上安装jdk与tomcat

安装jdk1.7

#yum安装
yum install java-1.7.0-openjdk -y
#配置环境变量
vim /etc/profile
#在末位加上以下参数
JAVA_HOME=/usr/lib/jvm/jre-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64 #该位置对应你的实际路径
JRE_HOME=$JAVA_HOME
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
 #:wq保存后
 source /etc/profile

验证是否成功

[root@192 ~]# java -version
java version "1.7.0_261"
OpenJDK Runtime Environment (rhel-2.6.22.2.el7_8-x86_64 u261-b02)
OpenJDK 64-Bit Server VM (build 24.261-b02, mixed mode)
[root@192 ~]# vim /etc/profile

tomcat站点安装就不一一描述了,我这里使用的apache-tomcat-7.0.103,官网下载后直接传上去即可

修改默认欢迎页面

apache-tomcat-7.0.103/webapps/ROOT下的index.jsp换成我们的测试文件,我的效果是这样的

接下来配置NGINX反向代理,转发到后端的两台tomcat上

LB01与LB02

vim /etc/nginx/conf.d/tomcat.conf
upstream tomcat {
  server 192.168.110.133:8080;
  server 192.168.110.134:8080;
}
server{
  listen 80;
  server_name localhost;
  location / {
        proxy_pass http://tomcat;
 }
}

配置完后校验一下语法

[root@192 conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

重新加载nginx

nginx -s reload

完成

7测试集群情况

浏览器访问http://192.168.110.200/

浏览器无法加载,且ping不通VIP,出现此问题的原因是keepalived.conf配置中默认vrrp_strict打开了,需要把它注释掉。

vim /etc/keepalived/keepalived.conf
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LB01
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
#重启keepalived
systemctl restart keepalived.service

此时在ping

再次访问

停掉主节点的keepalived试验,此时VIP在备机上

再次访问

*

码字不易,希望多多点赞,谢谢!`

相关文章
|
6月前
|
应用服务中间件 nginx
服务搭建篇(四) 搭建基于Nginx + keepalived的高可用服务
比如我这里虚拟IP+nginx端口是 : 192.168.154.10:80 , 我直接访问 , 出来的是192.168.154.134服务器上的nginx , 因为我刚刚做了区分 , 所以这个时候就可以知道访问的是哪个机器的Nginx , 然后我们把134的Nginx停掉 , 然后再次访问 , 仍然可以使用 , 此时 ,出现的135的页面 , 也就是访问的是192.168.154.135的Nginx
90 0
|
5月前
|
负载均衡 应用服务中间件 Linux
Nginx系列教程(14) - LVS+KeepAlived+Nginx实现高性能负载均衡集群
Nginx系列教程(14) - LVS+KeepAlived+Nginx实现高性能负载均衡集群
177 0
|
6月前
|
负载均衡 算法 应用服务中间件
百度搜索:蓝易云【Linux系统如何使用 HAProxy、Nginx 和 Keepalived 进行负载均衡?】
通过上述步骤,你可以在Linux系统中使用HAProxy、Nginx和Keepalived来实现负载均衡。这些工具可以帮助你将流量分配到多个后端服务器上,提高系统的性能、可靠性和可扩展性。
87 0
|
8月前
|
tengine 负载均衡 应用服务中间件
Nginx+Keepalived高可用集群部署详细文档
Nginx+Keepalived高可用集群部署详细文档
|
4月前
|
负载均衡 前端开发 应用服务中间件
NGINX高可用之keepalived+nginx主从模式+主主模式配置实践
NGINX高可用之keepalived+nginx主从模式+主主模式配置实践
124 1
|
5月前
|
应用服务中间件 Shell nginx
Nginx + keepalived 实现高可用 + 防盗链 + 动静分离(二)
Nginx + keepalived 实现高可用 + 防盗链 + 动静分离
|
5月前
|
负载均衡 NoSQL 应用服务中间件
Nginx + keepalived 实现高可用 + 防盗链 + 动静分离(一)
Nginx + keepalived 实现高可用 + 防盗链 + 动静分离
|
5月前
|
Kubernetes 应用服务中间件 Linux
suse 12 编译部署Keepalived + nginx 为 kube-apiserver 提供高可用
suse 12 编译部署Keepalived + nginx 为 kube-apiserver 提供高可用
57 0
|
6月前
|
Ubuntu
nginx+keepalived实现高可用
如果通过keepalived实现高可用
66 0
|
8月前
|
缓存 应用服务中间件 Linux
nginx高可用之keepalived
nginx高可用之keepalived
135 0