滴滴一面:Keepalived+Nginx高可用,如何实现IP跳跃?(1)

尼恩说在前面

HashMap的工作原理是目前java面试问的较为常见的问题之一,在40岁老架构师 尼恩的读者交流群(50+)中,最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、shein 希音、百度、网易的面试资格,遇到很多很重要的面试题:

使用nginx、haproxy 反向代理 HTTP服务,如果 反向代理挂了,了怎么办?

Nginx 、haproxy如何实现高可用?

KeepAlived 如何实现 IP的漂移 / IP的跳跃?

很多 小伙伴 没有回答好,导致面试挂了。KeepAlived + Nginx 这个是一个非常重要的基础组件,考察的是高可用HA的基本功。

如何才能回答得很漂亮,才能 让面试官刮目相看、口水直流呢?这里,尼恩给大家做一下系统化、体系化的梳理,让面试官爱到 “不能自已、口水直流”,然后帮大家 实现 ”offer自由”

当然,这道面试题,以及参考答案,也会收入咱们的 《尼恩Java面试宝典》V175版本PDF集群,供后面的小伙伴参考,提升大家的 3高 架构、设计、开发水平。

注:本文以 PDF 持续更新,最新尼恩 架构笔记、面试题 的PDF文件,请关注本公众号【技术自由圈】获取。

nginx-keepalived的高可用方案

我们使用 nginx-keepalived双机热备机制,vip主机可以进行漂移,这样主机挂掉了,还有备用机可以顶上

具体的vip漂移架构图,如下:

在这里插入图片描述

Keepalived是什么?

Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,

Keepalived 是一款轻量级HA集群应用,它的设计初衷是为了做LVS集群的HA,即探测LVS健康情况,从而进行主备切换,不仅如此,还能够探测LVS代理的后端主机的健康状况,动态修改LVS转发规则。

当LVS进行主备切换的时候,对外提供服务的IP是如何做到切换的呢?

这就依赖于keepalived 所应用的vrrp协议,即Virtual Reduntant Routing Protocol,虚拟冗余路由协议。简单来讲,此协议是将IP设置在虚拟接口之上,根据一定的规则实现IP在物理主机上流动,即哪台主机可以占有该IP。

而且keepalived具有脚本调用接口,可通过脚本完成拓展功能。

它根据TCP/IP参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除,这些工作全部是自动完成的,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点。

后来Keepalived又加入了VRRP的功能,VRRP(VritrualRouterRedundancyProtocol,虚拟路由冗余协议)出现的目的是解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定运行,因此Keepalvied一方面具有服务器状态检测和故障隔离功能,另外一方面也有HAcluster功能。

健康检查和失败切换是keepalived的两大核心功能。所谓的健康检查,就是采用tcp三次握手,icmp请求,http请求,udp echo请求等方式对负载均衡器后面的实际的服务器(通常是承载真实业务的服务器)进行保活;而失败切换主要是应用于配置了主备模式的负载均衡器,利用VRRP维持主备负载均衡器的心跳,当主负载均衡器出现问题时,由备负载均衡器承载对应的业务,从而在最大限度上减少流量损失,并提供服务的稳定性。

VRRP虚拟路由冗余协议

虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP)是由IETF提出的解决局域网中配置静态网关出现单点失效现象的路由协议,1998年已推出正式的RFC2338协议标准。

VRRP广泛应用在边缘网络中,它的设计目标是支持特定情况下IP数据流量失败转移不会引起混乱,允许主机使用单路由器,以及即使在实际第一跳路由器使用失败的情形下仍能够维护路由器间的连通性。

VRRP协议的来源

在现实的网络环境中。主机之间的通信都是通过配置静态路由或者(默认网关)来完成的,而主机之间的路由器一旦发生故障,通信就会失效,因此这种通信模式当中,路由器就成了一个单点瓶颈,为了解决这个问题,就引入了VRRP协议。

VRRP的核心概念

VRRP是一种路由容错协议,也可以叫做备份路由协议。

在VRRP协议中,有两组重要的概念:

  • VRRP路由器和虚拟路由器
  • 主控路由器和备份路由器

备份路由器(BACKUP):虚拟路由器中的其他物理路由器不拥有对外的虚拟IP,也不对外提供网络功能,仅接受MASTER的VRRP状态通告信息,这些路由器被称为备份路由器。当主路由器失败时,处于BACKUP角色的备份路由器将重新进行选举,产生一个新的主路由器进入MASTER角色,继续提供对外服务,整个切换对用户来说是完全透明的。

虚拟路由器

VRRP路由器(物理实体)

什么是VRRP路由器?

VRRP路由器是指运行VRRP的路由器,是物理实体;

虚拟路由器

什么是虚拟路由器?

虚拟路由器是指VRRP协议创建的,是逻辑概念。一组VRRP路由器(物理实体)协同工作,共同构成一台虚拟路由器。该虚拟路由器对外表现为一个具有唯一固定的IP地址和MAC地址的逻辑路由器。

虚拟路由器是VRRP备份组中所有路由器的集合,它是一个逻辑概念,并不是正真存在的。从备份组外面看备份组中的路由器,感觉组中的所有路由器就像一个 一样,可以理解为在一个组中: 主路由器+所有备份路由器=虚拟路由器。

虚拟路由器有一个虚拟的IP地址和MAC地址。

主机将虚拟路由器当作默认网关。虚拟MAC地址的格式为00-00-5E-00-01-{VRID}。通常情况下,虚拟路由器回应ARP请求使用的是虚拟MAC地址,只有虚拟路由器做特殊配置的时候,才回应接口的真实MAC地址。

在这里插入图片描述

主控路由器主路由器(MASTER):

什么是主控路由器?

处于同一个VRRP组中的路由器具有两种互斥的角色:主控路由器和备份路由器

一个VRRP组中有且只有一台处于主控角色的路由器,可以有一个或者多个处于备份角色的路由器VRRP协议从路由器组中选出一台作为主控路由器,负责ARP解析和转发IP数据包,组中的其他路由器作为备份的角色并处于待命状态。

虚拟路由器通过虚拟IP对外提供服务,而在虚拟路由器内部同一时间只有一台物理路由器对外提供服务,这台提供服务的物理路由器被称为主路由器。一般情况下Master是由选举算法产生,它拥有对外服务的虚拟IP,提供各种网络功能,如:ARP请求,ICMP数据转发等。

在这里插入图片描述

当由于某种原因主控路由器发生故障时,其中的一台备份路由器能在瞬间的时延后升级为主控路由器,由于此切换非常迅速而且不用改变IP地址和MAC地址,故对终端使用者系统是透明的。

在这里插入图片描述

一个局域网络内的所有主机都设置缺省路由,当网内主机发出的目的地址不在本网段时,报文将被通过缺省路由发往外部路由器,从而实现了主机与外部网络的通信。

当缺省路由器down掉(即端口关闭)之后,内部主机将无法与外部通信,如果路由器设置了VRRP时,那么这时,虚拟路由将启用备份路由器,从而实现全网通信。

题外话:ARP协议

地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。

主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址。

在这里插入图片描述

arp缓存:收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。

地址解析协议是建立在网络中各个主机互相信任的基础上的,局域网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。

ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系、添加或删除静态对应关系等。

相关协议有RARP、代理ARP。NDP用于在IPv6中代替地址解析协议。

ARP协议工作过程

主机A的IP地址为192.168.1.1,MAC地址为0A-11-22-33-44-01;

主机B的IP地址为192.168.1.2,MAC地址为0A-11-22-33-44-02;

当主机A要与主机B通信时,地址解析协议可以将主机B的IP地址(192.168.1.2)解析成主机B的MAC地址,以下为工作流程:

第1步:根据主机A上的路由表内容,IP确定用于访问主机B的转发IP地址是192.168.1.2。然后A主机在自己的本地ARP缓存中检查主机B的匹配MAC地址。

第2步:如果主机A在ARP缓存中没有找到映射,它将询问192.168.1.2的硬件地址,从而将ARP请求帧广播到本地网络上的所有主机。源主机A的IP地址和MAC地址都包括在ARP请求中。本地网络上的每台主机都接收到ARP请求并且检查是否与自己的IP地址匹配。如果主机发现请求的IP地址与自己的IP地址不匹配,它将丢弃ARP请求。

第3步:主机B确定ARP请求中的IP地址与自己的IP地址匹配,则将主机A的IP地址和MAC地址映射添加到本地ARP缓存中。

第4步:主机B将包含其MAC地址的ARP回复消息直接发送回主机A。

第5步:当主机A收到从主机B发来的ARP回复消息时,会用主机B的IP和MAC地址映射更新ARP缓存。本机缓存是有生存期的,生存期结束后,将再次重复上面的过程。主机B的MAC地址一旦确定,主机A就能向主机B发送IP通信了。

VRRP协议选举机制

VRRP路由器在运行过程中有三种状态:

  1. Initialize状态:

    系统启动后就进入Initialize,此状态下路由器不对VRRP报文做任何处理;

  2. Master状态;

  3. Backup状态;

一般主路由器处于Master状态,备份路由器处于Backup状态。

VRRP使用选举机制来确定路由器的状态,优先级选举:

1.VRRP组中IP拥有者。如果虚拟IP地址与VRRP组中的某台VRRP路由器IP地址相同,则此路由器为IP地址拥有者,这台路由器将被定位主路由器。
2.比较优先级。如果没有IP地址拥有者,则比较路由器的优先级,优先级的范围是0~255,优先级大的作为主路由器
3.比较IP地址。在没有Ip地址拥有者和优先级相同的情况下,IP地址大的作为主路由器。

如下图所示,虚拟IP为10.1.1.254,在VRRP组中没有IP地址拥有者,则比较优先级,很明显RB和RA的优先级要大于RC,则比较RA和RB的IP地址,RB的IP地址大。

这里写图片描述

所以RB为组中的主路由器。

选举流程

路由器使用VRRP 功能后,会根据优先级确定自己在备份组中的角色。优先级高的路由器成为Master 路由器,优先级低的成为Backup 路由器。

  • Master 拥有对外服务的虚拟IP,提供各种网络功能,并定期发送VRRP 报文,通知备份组内的其他设备自己工作正常;

  • Backup 路由器只接收Master 发来的报文信息,用来监控Master 的运行状态。

当Master 失效时,Backup 路由器进行选举,优先级高的Backup 将成为新的Master 。

在抢占方式下,当Backup路由器收到VRRP 报文后,会将自己的优先级与报文中的优先级进行比较。如果大于通告报文中的优先级,则成为Master 路由器;否则将保持Backup状态;

在非抢占方式下,只要Master 路由器没有出现故障,备份组中的路由器始终保持 Master 或Backup 状态,Backup 路由器即使随后被配置了更高的优先级也不会成为Master 路由器;

如果Backup 路由器的定时器超时后仍未收到Master 路由器发送来的VRRP报文,则认为Master 路由器已经无法正常工作,此时Backup 路由器会认为自己是Master 路由器,并对外发送VRRP报文。

备份组内的路由器根据优先级选举出Master 路由器,承担报文的转发功能。

Keepalived体系结构

Keepalived起初是为LVS设计的,由于Keeplalived可以实现对集群节点的状态检测,

而IPVS可以实现负载均衡功能,因此,Keepalived借助于第三方模块IPVS就可以很方便地搭建一套负载均衡系统。

在Keepalived当中IPVS模块是可配置的,如果需要负载均衡功能,可以在编译Keepalived时开打负载均衡功能,也可以通过编译参数关闭。

这里写图片描述

keepalived运行时,会启动3个进程,分别为:core(核心进程),check和vrrp
- core:负责主进程的启动,维护和全局配置文件的加载;
- check:负责健康检查
- vrrp:用来实现vrrp协议

SchedulerI/OMultiplexer是一个I/O复用分发调度器,它负载安排Keepalived所有内部的任务请求;

Memory Mngt是一个内存管理机制,这个框架提供了访问内存的一些通用方法;

Control Plane 是keepalived的控制版面,可以实现对配置文件编译和解析;

Core componets 这部分主要包含了5个部分;

  • Watchdog:是计算机可靠领域中极为简单又非常有效的检测工具,Keepalived正是通过它监控Checkers和VRRP进程的。
  • Checkers: 这是Keepalived最基础的功能,也是最主要的功能,可以实现对服务器运行状态检测和故障隔离。
  • VRRP Stack: 这是keepalived后来引用VRRP功能,可以实现HA集群中失败切换功能。负责负载均衡器之间的失败切换FailOver;
  • IPVS wrapper:这个是IPVS功能的一个实现,IPVSwarrper模块将可以设置好的IPVS规则发送的内核空间并且提供给IPVS模块,最终实现IPVS模块的负载功能。
  • Netlink Reflector:用来实现高可用集群Failover时虚拟IP(VIP)的设置和切换,

IPVS内核模块

此模块是此文的重点。

Linux 的 IPVS内核模块基本上是一种高效的Layer-4交换机,它提供负载平衡的功能。

ipvs (IP Virtual Server) 实现了传输层负载均衡,也就是我们常说的4层LAN交换,作为 Linux 内核的一部分。

ipvs运行在主机上,在真实服务器集群前充当负载均衡器。

ipvs可以将基于TCP和UDP的服务请求转发到真实服务器上,并使真实服务器的服务在单个 IP 地址上显示为虚拟服务。

当一个TCP连接的初始SYN报文到达时,IPVS就选择一台服务器,将报文转发给它。

此后通过查发报文的IP和TCP报文头地址,保证此连接的后继报文被转发到相同的服务器。这样,IPVS不用检查到请求的内容再选择服务器,这就要求后端的服务器组是提供相同的服务,不管请求被送到哪一台服务器,返回结果都应该是一样的。但是在有一些应用中后端的服务器可能功能不一,有的是提供HTML文档的Web服务器,有的是提供图片的Web服务器,有的是提供CGI的Web服务器。这时,就需要基于内容请求分发 (Content-Based Request Distribution),同时基于内容请求分发可以提高后端服务器上访问的局部性。

当一个TCP连接的初始SYN报文到达时,IPVS就选择一台服务器,将报文转发给它。此后通过查发报文的IP和TCP报文头地址,保证此连接的后继报文被转发到相同的服务器。这样,IPVS无法检查到请求的内容再选择服务器,这就要求后端的服务器组是提供相同的服务,不管请求被送到哪一台服务器,返回结果都应该是一样的。但是在有一些应用中后端>的服务器可能功能不一,有的是提供HTML文档的Web服务器,有的是提供图片的Web服务器,有的是提供CGI的Web服务器。这时,就需要基于内容请求分发 (Content-Based Request Distribution),同时基于内容请求分发可以提高后端服务器上访问的局部性。

Keepalived对服务器运行状态和故障隔离的工作原理

Keepalived工作在TCP/IP参考模型的网络层/传输层/应用层:

网络层:

Keepalived通过ICMP协议向服务器集群中的每一个节点发送一个ICMP数据包(有点类似与Ping的功能),如果某个节点没有返回响应数据包,那么认为该节点发生了故障,Keepalived将报告这个节点失效,并从服务器集群中剔除故障节点。

传输层:

Keepalived 在传输层里利用了TCP协议的端口连接和扫描技术来判断集群节点的端口是否正常,比如对于常见的WEB服务器80端口。或者SSH服务22端口,Keepalived一旦在传输层探测到这些端口号没有数据响应和数据返回,就认为这些端口发生异常,然后强制将这些端口所对应的节点从服务器集群中剔除掉。

应用层:

Keepalived 的运行方式也更加全面化和复杂化,用户可以通过自定义Keepalived工作方式,例如:

可以通过编写程序或者脚本来运行Keepalived,而Keepalived将根据用户的设定参数检测各种程序或者服务是否允许正常,如果Keepalived的检测结果和用户设定的不一致时,Keepalived将把对应的服务器从服务器集群中剔除。

Keepalived + Nginx 系统架构

在Keepalived + Nginx高可用负载均衡架构中,keepalived负责实现High-availability (HA) 功能控制前端机VIP(虚拟网络地址),当有设备发生故障时,热备服务器可以瞬间将VIP自动切换过来,实际运行中体验只有2秒钟切换时间,DNS服务可以负责前端VIP的负载均衡。

nginx负责控制后端web服务器的负载均衡,将客户端的请求按照一定的算法转发给后端Real Server处理,而Real Server将响应直接返回给客户端。

系统环境

两台负载机器安装:centos7.5+docker+nginx+keepalived,分别命名为:NGINX_MASTER,NGINX_BACKUP。
后端web服务器,可以是提供web服务的任何架构,分别命名为:WEB_1,WEB_2。
后端数据库机器可任意架构,只要能提供数据库服务即可。

服务器操作系统IP地址安装软件
NGINX_MASTERCentos 7.5 64位192.168.2.228docker+nginx+keepalived
NGINX_BACKUPCentos 7.5 64位192.168.2.229docker+nginx+keepalived
WEB_1Centos 7.5 64位192.168.2.226docker+springboot
WEB_2Centos 7.5 64位192.168.2.227docker+springboot
数据库集群Centos 7.5 64位mysql集群

keepalive的配置文件

vim /etc/keepalived/keepalived.conf

vrrp_script chk_nginx {script "/etc/keepalived/nginx_pid.sh"   # 检查nginx状态的脚本interval 2weight 3
}vrrp_instance VI_1 {state MASTER     #备份服务器上将MASTER改为BACKUPinterface ens32virtual_router_id 51priority 100       #备份服务上将100改为小于100,可配置成90advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.2.242    #有多个vip可在下面继续增加}track_script {chk_nginx}
}

Keepalived的配置文件可以分为三块:

  • 全局定义块:对整个 Keepalive 配置生效的,不管是否使用 LVS;
  • VRRP 实例定义块:是 Keepalived 的核心;
  • 虚拟服务器(LVS)定义块:LVS 配置只在使用 Keepalived 来配置和管理 LVS 时才需要使用,如果仅仅使用 Keepalived做 HA,LVS 的配置完全是不需要的。

配置文件都是以块(block)形式组织的,每个块都在{和}包围的范围内。#和!开头的行都是注释。

部署架构

目的: 进一步提高keepalived 可用性

设计:有3台keepalived 服务器 192.168.1.106 192.168.1.107 192.168.1.108。

vip 是192.168.1.249

效果:只要有一台keepalive 运行正常。vip 就可以访问

serverhostnameip
keepalivedz6192.168.1.106
keepalivedz7192.168.1.107
keepalivedz8192.168.1.108

非抢占模式 默认 是谁先开启vip 运行在哪台机器上的。如果发生故障转移,再比较priority

离线部署keepalived

首先安装keepalived,下载离线包的命令为

yum install --downloadonly --downloaddir=./ keepalived

已经提供了安装包,上传安装包到 linux,比如root目录

keepalived_rpm.tar.gz

解压缩,然后执行命令安装

cd /root/
tar -zxvf   keepalived_rpm.tar.gz
cd keepalived_rpm
rpm -Uvh --force --nodeps *rpm

输出

[root@localhost ~]# tar -zxvf   keepalived_rpm.tar.gz
keepalived_rpm/
keepalived_rpm/keepalived-1.3.5-19.el7.x86_64.rpm
keepalived_rpm/lm_sensors-libs-3.4.0-8.20160601gitf9185e5.el7.x86_64.rpm
keepalived_rpm/net-snmp-agent-libs-5.7.2-49.el7_9.1.x86_64.rpm
keepalived_rpm/net-snmp-libs-5.7.2-49.el7_9.1.x86_64.rpm

安装的输出

[root@localhost ~]# cd keepalived_rpm
[root@localhost keepalived_rpm]# rpm -Uvh --force --nodeps *rpm
warning: keepalived-1.3.5-19.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...1:net-snmp-libs-1:5.7.2-49.el7_9.1 ################################# [ 25%]2:lm_sensors-libs-3.4.0-8.20160601g################################# [ 50%]3:net-snmp-agent-libs-1:5.7.2-49.el################################# [ 75%]4:keepalived-1.3.5-19.el7          ################################# [100%]

编写nginx的监控脚本

vi /etc/keepalived/check_nginx.sh

#!/bin/bash
A=`ps -C haproxy --no-header |wc -l`
if [ $A -eq 0 ];then
systemctl stop keepalived
fi

添加检查nginx状态的脚本 /etc/keepalived/nginx_pid.sh

#!/bin/bash
##检查nginx.pid文件是否存在
if [ -e /usr/local/nginx/logs/nginx.pid ];thenecho "nginx 已经启动"
else/usr/local/nginx/sbin/nginxif [ $? -eq 0 ];thenecho "nginx 已经启动"fi
fi

或者

#!/bin/bash
##使用ps -C nginx --no-header 来检测nginx 是否启动
date=`date`
nginx_status=`ps -C nginx --no-header|wc -l`
if [ $nginx_status -eq 0 ];thenecho "nginx没有启动"/usr/local/nginx/sbin/nginxif [ $? -eq 0 ];thenecho "$date nginx已经成功启动"fi
elseecho "$date nginx 已经启动 "fi

上传脚本,测试一下脚本

sh /etc/keepalived/check_nginx.sh

修改keepalived配置

cat /etc/keepalived/keepalived.conf

cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

复制 准备好的文件到离线环境,或者直接编辑。

vi /etc/keepalived/keepalived.conf

global_defs {   #全局定义部分notification_email {  #设置警报邮箱acassen@firewall.loc     #邮箱1failover@firewall.loc    #邮箱2sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc    #设置发件人地址smtp_server 127.0.0.1   #设置smtp server地址smtp_connect_timeout 30   #设置smtp超时连接时间    以上参数可以不配置router_id HA_HAPROXY    #是Keepalived服务器的路由标识在一个局域网内,这个标识(router_id)是唯一的
} vrrp_script check_nginx {script "/etc/keepalived/check_nginx.sh"
}vrrp_instance VI_1 {  #VRRP实例定义区块名字是VI_1state BACKUP    #表示当前实例VI_1的角色状态这个状态只能有MASTER和BACKUP两种状态,并且需要大写这些字符, MASTER 为正式工作的状态,BACKUP为备用的状态interface ens33    #绑定ens33网卡virtual_router_id 101 # VRRP 路由 ID实例,每个实例是唯一的 priority 90           # 优先级,备服务器设置 90 advert_int 1           # 指定VRRP 心跳包通告间隔时间,默认1秒 ,MASTER与BACKUP之间通信检查的时间间隔,authentication {   #authentication为权限认证配置不要改动,同一vrrp实例的MASTER与BACKUP使用相同的密码才能正常通信。auth_type PASS      auth_pass 1111 }  virtual_ipaddress {   #设置虚拟IP地址#      192.168.31.60/24172.18.8.231/24 } track_script {check_nginx} 
}

Keepalived的配置文件可以分为三块:

  • 全局定义块:对整个 Keepalive 配置生效的,不管是否使用 LVS;
  • VRRP 实例定义块:是 Keepalived 的核心;
  • 虚拟服务器(LVS)定义块:LVS 配置只在使用 Keepalived 来配置和管理 LVS 时才需要使用,如果仅仅使用 Keepalived做 HA,LVS 的配置完全是不需要的。

配置文件都是以块(block)形式组织的,每个块都在{和}包围的范围内。#和!开头的行都是注释。

离线包里边有 第一个节点的 配置文件,复制到 /etc/keepalived/ 目录就行

cp /home/docker-compose/keepalive-ha/keepalived01.conf   /etc/keepalived/keepalived.conf

输出如下:

[root@localhost keepalive-ha]# pwd
/home/docker-compose/keepalive-ha
[root@localhost keepalive-ha]# cp /home/docker-compose/keepalive-ha/keepalived01.conf   /etc/keepalived/keepalived.conf
cp: overwrite ‘/etc/keepalived/keepalived.conf’? yes
[root@localhost keepalive-ha]# cat /etc/keepalived/keepalived.conf
global_defs {   notification_email {  #mail1@firewall.loc  mail2@firewall.loc    }

重启 keepalive服务

命令如下


# systemctl enable keepalived# systemctl start keepalived# systemctl restart keepalived# systemctl status  keepalived

输出如下:

[root@localhost ~]# systemctl enable keepalived
Created symlink from /etc/systemd/system/multi-user.target.wants/keepalived.service to /usr/lib/systemd/system/keepalived.service.
[root@localhost ~]# systemctl restart keepalived
[root@localhost ~]#  systemctl status  keepalived
● keepalived.service - LVS and VRRP High Availability MonitorLoaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled)Active: active (running) since Fri 2021-11-05 13:28:30 CST; 19s agoProcess: 48837 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)Main PID: 48838 (keepalived)Tasks: 3Memory: 3.4MCGroup: /system.slice/keepalived.service├─48838 /usr/sbin/keepalived -D├─48839 /usr/sbin/keepalived -D└─48840 /usr/sbin/keepalived -DNov 05 13:28:34 localhost.localdomain Keepalived_vrrp[48840]: Sending gratuitous ARP on ens33 for 192.168.31.60
Nov 05 13:28:34 localhost.localdomain Keepalived_vrrp[48840]: Sending gratuitous ARP on ens33 for 192.168.31.60
Nov 05 13:28:34 localhost.localdomain Keepalived_vrrp[48840]: Sending gratuitous ARP on ens33 for 192.168.31.60
Nov 05 13:28:34 localhost.localdomain Keepalived_vrrp[48840]: Sending gratuitous ARP on ens33 for 192.168.31.60
Nov 05 13:28:39 localhost.localdomain Keepalived_vrrp[48840]: Sending gratuitous ARP on ens33 for 192.168.31.60
Nov 05 13:28:39 localhost.localdomain Keepalived_vrrp[48840]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens33 ...1.60
Nov 05 13:28:39 localhost.localdomain Keepalived_vrrp[48840]: Sending gratuitous ARP on ens33 for 192.168.31.60
Nov 05 13:28:39 localhost.localdomain Keepalived_vrrp[48840]: Sending gratuitous ARP on ens33 for 192.168.31.60
Nov 05 13:28:39 localhost.localdomain Keepalived_vrrp[48840]: Sending gratuitous ARP on ens33 for 192.168.31.60
Nov 05 13:28:39 localhost.localdomain Keepalived_vrrp[48840]: Sending gratuitous ARP on ens33 for 192.168.31.60
Hint: Some lines were ellipsized, use -l to show in full.

查看IP

[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:69:a4:84 brd ff:ff:ff:ff:ff:ffinet 172.18.8.101/24 brd 172.18.8.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet 172.18.8.231/24 scope global secondary ens33valid_lft forever preferred_lft foreverinet6 fe80::b7be:346e:2f0f:859e/64 scope link noprefixroutevalid_lft forever preferred_lft forever

访问高可用代理后的nacos

高可用代理

http://172.18.8.231:28848/nacos/#/configurationManagement?dataId=&group=&appName=&namespace=

用户名:nacos ,密码 nacos

第2个节点,第3个节点离线部署keepalived

复制文件/并且安装

scp /root/keepalived_rpm.tar.gz  root@172.18.8.103:/root
scp /root/keepalived_rpm.tar.gz  root@172.18.8.104:/root

解压缩,然后执行命令安装

cd /root/
tar -zxvf   keepalived_rpm.tar.gz
cd keepalived_rpm
rpm -Uvh --force --nodeps *rpm

把离线包里的 keepalive-ha 传过去,然后复制到 /etc/keepalived/

第1个节点,执行

cp /home/docker-compose/keepalive-ha/keepalived01.conf   /etc/keepalived/keepalived.conf
cp /home/docker-compose/keepalive-ha/check_haproxy.sh   /etc/keepalived/cat /etc/keepalived/keepalived.conf

第二个节点,执行

cp /home/docker-compose/keepalive-ha/keepalived02.conf   /etc/keepalived/keepalived.conf
cp /home/docker-compose/keepalive-ha/check_haproxy.sh   /etc/keepalived/cat /etc/keepalived/keepalived.conf

输出如下:

[root@localhost keepalive-ha]# cp /home/docker-compose/keepalive-ha/keepalived02.conf   /etc/keepalived/keepalived.conf
cp: overwrite ‘/etc/keepalived/keepalived.conf’? yes
[root@localhost keepalive-ha]# cp /home/docker-compose/keepalive-ha/check_haproxy.sh   /etc/keepalived/
cp: overwrite ‘/etc/keepalived/check_haproxy.sh’? yes

第3个节点,执行

cp /home/docker-compose/keepalive-ha/keepalived03.conf   /etc/keepalived/keepalived.conf
cp /home/docker-compose/keepalive-ha/check_haproxy.sh   /etc/keepalived/cat /etc/keepalived/keepalived.conf

输出如下:

cp /home/docker-compose/keepalive-ha/keepalived03.conf   /etc/keepalived/keepalived.conf
cp: overwrite ‘/etc/keepalived/keepalived.conf’? yes
[root@k8s-master keepalived_rpm]# cp /home/docker-compose/keepalive-ha/check_haproxy.sh   /etc/keepalived/
cp: overwrite ‘/etc/keepalived/check_haproxy.sh’? yes

重启 keepalive服务

命令如下

systemctl enable keepalivedsystemctl start keepalivedsystemctl restart keepalivedsystemctl status  keepalivedsystemctl stop  keepalived

查看IP地址

ip aip a | grep ens33ifconfig ens33

输出结果

[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:69:a4:84 brd ff:ff:ff:ff:ff:ffinet 172.18.8.101/24 brd 172.18.8.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet 172.18.8.231/24 scope global secondary ens33valid_lft forever preferred_lft foreverinet6 fe80::b7be:346e:2f0f:859e/64 scope link noprefixroutevalid_lft forever preferred_lft forever

测试高可用

停止101上的haproxy

 sh ./stop_node.shsh ./start_node.sh
[root@localhost haproxy-ha]# sh ./stop_node.sh
===========stoping haproxy-ha .....================
WARNING: Some services (ha_sit_proxy) use the 'deploy' key, which will be ignored. Compose does not support 'deploy' configuration - use `docker stack deploy` to deploy to a swarm.
Stopping ha_sit_proxy ... done
Removing ha_sit_proxy ... done
Network ha-network-overlay is external, skipping
访问vip的ng
http://172.18.8.231:80/

可以正常访问

访问vip的nacos (假设已经安装nacos)
http://172.18.8.231:28848/nacos/#/login

可以正常访问

访问高可用代理的minio(假设已经安装minio)

高可用代理

http://172.18.8.231:29991/minio/

用户名:nacos ,密码 nacos

说在最后

高可用相关的面试题,是非常常见的面试题。

以上的内容,如果大家能对答如流,如数家珍,基本上 面试官会被你 震惊到、吸引到。最终,让面试官爱到 “不能自已、口水直流”。offer, 也就来了。

在面试之前,建议大家系统化的刷一波 5000页《尼恩Java面试宝典》V175,在刷题过程中,如果有啥问题,大家可以来 找 40岁老架构师尼恩交流。

高可用包括 去掉IDC机房内部的 single of failure, 也包括 去掉 IDC机房之间的 single of failure,尼恩的HA高可用的系列文章,可供参考:

去掉IDC机房内部的 single of failure,参见下面的案例

《大家都崩,美团不崩:其高可用架构,巧夺天工!》

《美团面试:ES+Redis+MySQL高可用,如何实现?》

去掉 IDC机房之间的 single of failure,主要是异地多活

《单元化、异地多活,大厂如何实现?》

《B站刚崩,唯品会又崩:亿级用户网站的架构硬伤与解决方案》

《100Wqps异地多活,得物是怎么架构的?》

另外,建议大家系统化的刷一波 5000页《尼恩Java面试宝典》V175,当然,如果没有面试机会,可以找尼恩来帮扶、领路。

尼恩已经指导了大量的就业困难的小伙伴上岸,前段时间,帮助一个40岁+就业困难小伙伴拿到了一个年薪100W的offer,小伙伴实现了 逆天改命 。

尼恩技术圣经系列PDF

  • 《NIO圣经:一次穿透NIO、Selector、Epoll底层原理》
  • 《Docker圣经:大白话说Docker底层原理,6W字实现Docker自由》
  • 《K8S学习圣经:大白话说K8S底层原理,14W字实现K8S自由》
  • 《SpringCloud Alibaba 学习圣经,10万字实现SpringCloud 自由》
  • 《大数据HBase学习圣经:一本书实现HBase学习自由》
  • 《大数据Flink学习圣经:一本书实现大数据Flink自由》
  • 《响应式圣经:10W字,实现Spring响应式编程自由》
  • 《Go学习圣经:Go语言实现高并发CRUD业务开发》

……完整版尼恩技术圣经PDF集群,请找尼恩领取

《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》PDF,请到下面公号【技术自由圈】取↓↓↓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/733315.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV学习笔记(四)——对视频的读取操作

目录 读取视频内容 将彩色视频转换为灰色视频 读取视频内容 读取视频文件通常分为读取文件、验证是否打开成功打开文件、逐帧读取视频文件、释放资源和关闭窗口 &#xff08;1&#xff09;读取文件 在OpenCV中&#xff0c;通常使用VedioCapture来读取视频流&#xff0c;Vedi…

图的单源最短路径问题

目录 一、简述 二、前置配置 三、迪杰斯特拉算法 四、改进的迪杰斯特拉算法 五、贝尔曼福特算法 一、简述 图是一种比较常用的数据结构&#xff0c;将问题转换成图相关的思路也是比较常用的。 图的单源最短路径问题&#xff0c;也就是图中某一个节点到图中其他节点的最短路…

基于JAVA+ springboot实现的抗疫物质信息管理系统

基于JAVA springboot实现的抗疫物质信息管理系统设计和实现 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 …

macOS上实现「灵动岛」效果

自从Apple iPhone推出了「灵动岛」功能后&#xff0c;用户们就被其优雅的设计和强大的功能所吸引。然而&#xff0c;作为macOS用户&#xff0c;我们一直在等待这一功能能够在我们的设备上实现。现在&#xff0c;随着新的应用程序的推出&#xff0c;我们终于可以在我们的Mac上体…

JWT的是什么

session共享 什么是session共享 Session共享是指在分布式系统中&#xff0c;在多个服务器之间共享同一个用户的会话数据。在传统的Web应用中&#xff0c;用户的会话信息通常存储在服务器端的Session中&#xff0c;而每个用户的请求在同一个服务器上处理&#xff0c;因此可以轻…

【黑马程序员】Python基础

文章目录 初始PythonPython应用场景什么是编程语言安装Python开发环境第一个Python程序Python解释器 Python基础语法常用数值类型字符串总结 python中的注释变量数据类型数据类型转换标识符运算符算术运算服赋值运算符 字符串扩展字符串的三种定义方式字符串的引号嵌套字符串的…

基于redis实现互斥锁

利用setnx命令实现类似获取锁和释放锁。 获取锁&#xff0c;setnx lock 1&#xff0c;返回值为1视为获取成功&#xff0c;为0视为获取失败 释放锁&#xff0c;del lock 特殊情况&#xff1a; 如果获取锁之后&#xff0c;锁来还来不及释放&#xff0c;redis宕机了&#xff0c;这…

【CSP试题回顾】202009-2-风险人群筛查

CSP-202009-2-风险人群筛查 解题思路 主循环&#xff08;对每个查询&#xff09;&#xff1a; 使用一个布尔变量pass来标记风险人群是否至少一次进入了特定区域&#xff0c;以及一个布尔变量onlyOnce来确保停留计数 stayNum 在每次查询中最多只增加一次。内循环&#xff08;对…

面试官:如何保证缓存和数据库的一致性?

先更新数据库还是先更新缓存? 先说最基本的策略,一定要给缓存设置一个过期时间,避免异常情况下数据库和缓存长时间不一致 为了保证缓存和数据库的实时一致,我们不能用定时任务来更新缓存,我们要同时更新数据库和缓存,对应的方案有如下两种 先更新缓存,再更新数据库先更…

springboot252基于Springboot和vue的餐饮管理系统的设计与实现

餐饮管理系统的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率高&…

xss.haozi.me:0X12

</script> <script>alert(1)\</script>

0环PEB断链实现

截止到昨天那里我们的思路就清晰了&#xff0c;通过EPROCESS找到我们要隐藏的进程的ActiveProcessLinks&#xff0c;将双向链表的值修改&#xff0c;就可以将我们想要隐藏的这个进程的ActiveProcessLinks从双向链表中抹去的效果&#xff0c;这里的话如果在windbg里面直接使用ed…

猫头虎分享已解决Bug || 操作系统核心错误:KernelPanic, SystemCrash

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

2024-AI工具分析共享

大家都知道如今是AI的时代&#xff0c;各个行业陷入了面对ai冲击下的无力。 但是实际上造成工作岗位缩减并不是ai&#xff0c;而是使用ai的人。以下我将会推荐几个实用的ai工具。 生成式AI工具分享 首屈一指的就是行业内的大佬&#xff1a;ChatGPT 访问地址&#xff1a;https:/…

13. 用户注册功能实现

文章目录 一 、增加路由二、书写流程控制&#xff08;controller&#xff09;逻辑三、书写业务逻辑四、与DB交互五、测试 代码地址&#xff1a;https://gitee.com/lymgoforIT/bluebell 一 、增加路由 添加路由&#xff0c;使用分组管理 v1 : r.Group("/api/v1")//…

【java】22:throws 异常处理

基本介绍 1&#xff09;如果一个方法(中的语句执行时)可能生成某种异常&#xff0c;但是并不能确定如何处理这种异常&#xff0c;则此方法应显示地声明抛出异常&#xff0c;表明该方法将不对这些异常进行处理&#xff0c;而由该方法的调用者负责处理。 2)在方法声明中用throw…

Linux - 进程信号

1、信号入门 1.1、生活角度的信号 你在网上买了很多件商品&#xff0c;再等待不同商品快递的到来。但即便快递没有到来&#xff0c;你也知道快递来临时&#xff0c; 你该怎么处理快递。也就是你能“识别快递”&#xff1b;当快递员到了你楼下&#xff0c;你也收到快递到来的通…

Pytest+Selenium UI自动化测试实战实例(全)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 今天来说说pytest吧&#xff0c;经过几周的时间学习&#xff0c…

Redis实现用户活跃排行榜

在这里用户活跃度排行榜&#xff0c;主要是基于redis的zset数据结构来实现的&#xff0c;下面来看一下实例。 方案设计 来看一下业务场景先 1.场景说明 在技术派中&#xff0c;提供了一个用户的活跃排行榜&#xff0c;当然作为一个博客社区&#xff0c;更应该实现的是作者排…

连号区间数 刷题笔记

1.单个元素算一个连续区间 2.题意为 单独截取数组中的一段元素 例如 a数组假设为 3 1 2 5 4 6 7 假设取 a[3]-a[5] 则取出 5 4 6 重新排序后为 4 5 6 连续了 则ans; 假设 取a[i]-a[j]这一段元素 设该段元素的最大值为max,最小值为min 如果该段元素重新排序后…