spring cloud之eureka高可用集群和服务分区解析

目录
  • 准备
  • 搭建
  • 验证
  • 解释

准备

1.首先,在C:\WINDOWS\System32\drivers\etc\hosts文件里面添加一下映射,如果不添加也没关系,只是如果是单机环境,在eureka首页中的replicas那一项看到的其它注册中心都是localhost,我这里为了方便理解就添加了映射。

2.为了方便理解,我这里是单个application用一个module,没有采用通过多个profile开启多个application的做法,而且这样做一会儿验证起来也比较清晰。

3.必要的一些概念

先看官方的这张图:

springcloud中eureka的默认region是us-east-1,一个region下可以有多个zone。

比如zone1内有服务A,zone2内也有服务A,消费者A(这里指调用服务A的client)如果属于zone1,他就会优先调用zone1,如果zone1内的服务都不可用了,就会调用zone2中的服务A,这种调用方式就是服务分区。

分区其实就是建立在集群之上,zone1和zone2构成了集群,但是消费者A调用zone1的时候可能开销会小一些,所以可以让他优先调用zone1内的服务A。

搭建

2个注册中心

  • region1-zone1(region1区域内的zone1),region1-zone2(region1区域内的zone2)

region1-zone1:

application.properties:

#端口
server.port=8761
#主机名
eureka.instance.hostname=region1-zone1
#应用名称
spring.application.name=eureka-server

#是否注册自身到eureka服务器
eureka.client.register-with-eureka=true
#是否获取eureka服务器注册表上的注册信息
eureka.client.fetch-registry=true

#false表示在此eureka服务器中关闭自我保护模式,所谓自我保护模式,默认true
eureka.server.enableSelfPreservation=false

#配置这个eureka server注册中心所属的region,默认值us-east-1
eureka.client.region=region1

#region1内的所有zone,提取第一个作为自己的zone
eureka.client.availability-zones.region1=region1-zone1,region1-zone2

#region1内的所有其它zone的注册中心
eureka.client.service-url.region1-zone2=http://region1-zone2:8764/eureka/

启动类:

@SpringBootApplication
@EnableEurekaServer
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

region1-zone2:

server.port=8764
eureka.instance.hostname=region1-zone2
spring.application.name=eureka-server

eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
eureka.server.enableSelfPreservation=false

eureka.client.region=region1
eureka.client.availability-zones.region1=region1-zone2,region1-zone1
eureka.client.service-url.region1-zone1=http://region1-zone1:8761/eureka/

启动类:同region1-zone1

3个service-hi服务

我这里用前缀用来区分他们分别属于哪个zone。

region1-zone1-service-hi-1:

server.port=8762
spring.application.name=test-zone
eureka.client.region=region1

eureka.client.availability-zones.region1=region1-zone1,region1-zone2
eureka.client.service-url.region1-zone1=http://region1-zone1:8761/eureka/
eureka.client.service-url.region1-zone2=http://region1-zone2:8764/eureka/
eureka.client.prefer-same-zone-eureka=true
eureka.instance.prefer-ip-address=true

#属于哪一个zone
eureka.instance.metadata-map.zone=region1-zone1

#自定义信息,验证的时候用
info=region1-zone1-service-hi-1

启动类:

@EnableEurekaClient
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

controller:

@RestController
public class HelloController {
    @Value("${info}")
    private String info;
    @RequestMapping(value="/hi")
    public String hi() {
        return info;
    }
}

region1-zone1-service-hi-2:

server.port=8763
spring.application.name=test-zone
eureka.client.region=region1
eureka.client.availability-zones.region1=region1-zone1,region1-zone2
eureka.client.service-url.region1-zone1=http://region1-zone1:8761/eureka/
eureka.client.service-url.region1-zone2=http://region1-zone2:8764/eureka/
eureka.client.prefer-same-zone-eureka=true
eureka.instance.prefer-ip-address=true
eureka.instance.metadata-map.zone=region1-zone1
info=region1-zone1-service-hi-2

启动类、controller都和region1-zone1-service-hi-1相同

region1-zone2-service-hi-1:

server.port=8765

spring.application.name=test-zone
eureka.client.region=region1
eureka.client.availability-zones.region1=region1-zone2,region1-zone1
eureka.client.service-url.region1-zone1=http://region1-zone1:8761/eureka/
eureka.client.service-url.region1-zone2=http://region1-zone2:8764/eureka/
eureka.client.prefer-same-zone-eureka=true
eureka.instance.prefer-ip-address=true
eureka.instance.metadata-map.zone=region1-zone2
info=region1-zone2-service-hi-1

启动类、controller都和region1-zone1-service-hi-1相同

1个consumer

application.properties:

server.port=8888
spring.application.name=region1-consumer
eureka.client.region=region1
eureka.client.availability-zones.region1=region1-zone1,region1-zone2
eureka.client.service-url.region1-zone1=http://region1-zone1:8761/eureka/
eureka.client.service-url.region1-zone2=http://region1-zone2:8764/eureka/
eureka.client.prefer-same-zone-eureka=true
eureka.instance.prefer-ip-address=true
eureka.instance.metadata-map.zone=region1-zone1

logging.level.root=debug
 

controller:

@RestController
public class HiController {
    @Autowired
    private RestTemplate restTemplate;
    @RequestMapping(value="/hello")
    public String hi() {
        return restTemplate.getForObject("http://test-zone/hi", String.class);
    }
}

验证

先启动两个注册中心:eureka-server-region1-zone1、eureka-server-region1-zone2。

然后将4个服务启动。

再启动消费者服务。

访问zone1的注册中心:

访问zone2的注册中心:

可以看到每个注册中心都有4个服务,这说明,3个service-hi和一个consumer注册到了集群中所有注册中心上。

打开浏览器访问:http://ip:8888/hello,ip自行改成consumer服务的ip即可,连续访问这个url若干次,可以看到consumer调用的service的始终是zone1中的service-hi-1和service-hi-2,并且由于ribbon的默认负载均衡规则,service-hi-1和service-hi-2被轮询调用。

然后我们关闭zone1中的service-hi-1,再访问若干次,可以发现此时始终只有service-hi-2提供服务了。

然后我们再关闭zone1中的service-hi-2,再访问若干次url,此时zone1中的注册中心已经没有服务提供者可以给consumer消费了,zone2中的service-hi-1开始给consumer提供服务。

解释

1.有的人可能会发现在关闭服务后立即调用会报错,这一点下面做下解释:

打开debug

logging.level.root=debug

这里我截取了一部分心跳日志:

2018-06-24 14:06:03.684 DEBUG 2260 --- [erListUpdater-0] c.n.l.DynamicServerListLoadBalancer      : List of Servers for test-zone obtained from Discovery client: [192.168.5.1:8765, 192.168.5.1:8762, 192.168.5.1:8763]
2018-06-24 14:06:03.684 DEBUG 2260 --- [erListUpdater-0] c.n.l.ZoneAffinityServerListFilter       : Determining if zone affinity should be enabled with given server list: [192.168.5.1:8762, 192.168.5.1:8763]
2018-06-24 14:06:03.684 DEBUG 2260 --- [erListUpdater-0] c.n.l.DynamicServerListLoadBalancer      : Filtered List of Servers for test-zone obtained from Discovery client: [192.168.5.1:8762, 192.168.5.1:8763]
2018-06-24 14:06:03.684 DEBUG 2260 --- [erListUpdater-0] c.netflix.loadbalancer.BaseLoadBalancer  : LoadBalancer [test-zone]: clearing server list (SET op)
2018-06-24 14:06:03.684 DEBUG 2260 --- [erListUpdater-0] c.netflix.loadbalancer.BaseLoadBalancer  : LoadBalancer [test-zone]:  addServer [192.168.5.1:8762]
2018-06-24 14:06:03.684 DEBUG 2260 --- [erListUpdater-0] c.netflix.loadbalancer.BaseLoadBalancer  : LoadBalancer [test-zone]:  addServer [192.168.5.1:8763]
2018-06-24 14:06:03.684 DEBUG 2260 --- [erListUpdater-0] c.n.l.DynamicServerListLoadBalancer      : Setting server list for zones: {region1-zone1=[192.168.5.1:8762, 192.168.5.1:8763]}
[192.168.5.1:8765, 192.168.5.1:8762, 192.168.5.1:8763]
2018-06-24 14:06:03.684 DEBUG 2260 --- [erListUpdater-0] c.n.l.ZoneAffinityServerListFilter       : Determining if zone affinity should be enabled with given server list: [192.168.5.1:8762, 192.168.5.1:8763]
2018-06-24 14:06:03.684 DEBUG 2260 --- [erListUpdater-0] c.n.l.DynamicServerListLoadBalancer      : Filtered List of Servers for test-zone obtained from Discovery client: [192.168.5.1:8762, 192.168.5.1:8763]
2018-06-24 14:06:03.684 DEBUG 2260 --- [erListUpdater-0] c.netflix.loadbalancer.BaseLoadBalancer  : LoadBalancer [test-zone]: clearing server list (SET op)
2018-06-24 14:06:03.684 DEBUG 2260 --- [erListUpdater-0] c.netflix.loadbalancer.BaseLoadBalancer  : LoadBalancer [test-zone]:  addServer [192.168.5.1:8762]
2018-06-24 14:06:03.684 DEBUG 2260 --- [erListUpdater-0] c.netflix.loadbalancer.BaseLoadBalancer  : LoadBalancer [test-zone]:  addServer [192.168.5.1:8763]
2018-06-24 14:06:03.684 DEBUG 2260 --- [erListUpdater-0] c.n.l.DynamicServerListLoadBalancer      : Setting server list for zones: {region1-zone1=[192.168.5.1:8762, 192.168.5.1:8763]}

2.此时region1-zone1-service-hi-1已经下线,但是region1-zone1-service-hi-2和region1-zone2-service-hi-1还存在于ribbon的服务列表中。由于服务分区的原因,ribbon只会使用region1-zone1-service-hi-2服务。

2018-06-24 14:07:03.687 DEBUG 2260 --- [erListUpdater-0] c.n.l.DynamicServerListLoadBalancer      : List of Servers for test-zone obtained from Discovery client: [192.168.5.1:8765, 192.168.5.1:8763]
2018-06-24 14:07:03.687 DEBUG 2260 --- [erListUpdater-0] c.n.l.ZoneAffinityServerListFilter       : Determining if zone affinity should be enabled with given server list: [192.168.5.1:8763]
2018-06-24 14:07:03.687 DEBUG 2260 --- [erListUpdater-0] c.n.l.ZoneAffinityServerListFilter       : zoneAffinity is overriden. blackOutServerPercentage: 0.0, activeReqeustsPerServer: 0.0, availableServers: 1
2018-06-24 14:07:03.687 DEBUG 2260 --- [erListUpdater-0] c.n.l.DynamicServerListLoadBalancer      : Filtered List of Servers for test-zone obtained from Discovery client: [192.168.5.1:8763]
2018-06-24 14:07:03.687 DEBUG 2260 --- [erListUpdater-0] c.netflix.loadbalancer.BaseLoadBalancer  : LoadBalancer [test-zone]: clearing server list (SET op)
2018-06-24 14:07:03.687 DEBUG 2260 --- [erListUpdater-0] c.netflix.loadbalancer.BaseLoadBalancer  : LoadBalancer [test-zone]:  addServer [192.168.5.1:8763]
2018-06-24 14:07:03.688 DEBUG 2260 --- [erListUpdater-0] c.n.l.DynamicServerListLoadBalancer      : Setting server list for zones: {region1-zone1=[192.168.5.1:8763]}
[192.168.5.1:8765, 192.168.5.1:8763]
2018-06-24 14:07:03.687 DEBUG 2260 --- [erListUpdater-0] c.n.l.ZoneAffinityServerListFilter       : Determining if zone affinity should be enabled with given server list: [192.168.5.1:8763]
2018-06-24 14:07:03.687 DEBUG 2260 --- [erListUpdater-0] c.n.l.ZoneAffinityServerListFilter       : zoneAffinity is overriden. blackOutServerPercentage: 0.0, activeReqeustsPerServer: 0.0, availableServers: 1
2018-06-24 14:07:03.687 DEBUG 2260 --- [erListUpdater-0] c.n.l.DynamicServerListLoadBalancer      : Filtered List of Servers for test-zone obtained from Discovery client: [192.168.5.1:8763]
2018-06-24 14:07:03.687 DEBUG 2260 --- [erListUpdater-0] c.netflix.loadbalancer.BaseLoadBalancer  : LoadBalancer [test-zone]: clearing server list (SET op)
2018-06-24 14:07:03.687 DEBUG 2260 --- [erListUpdater-0] c.netflix.loadbalancer.BaseLoadBalancer  : LoadBalancer [test-zone]:  addServer [192.168.5.1:8763]
2018-06-24 14:07:03.688 DEBUG 2260 --- [erListUpdater-0] c.n.l.DynamicServerListLoadBalancer      : Setting server list for zones: {region1-zone1=[192.168.5.1:8763]}

3.此时zone1中的服务:region1-zone1-service-hi-1和region1-zone1-service-hi-2都已经下线,ribbon只能使用region1-zone2-service-hi-1服务

2018-06-24 14:08:03.692 DEBUG 2260 --- [erListUpdater-0] c.n.l.DynamicServerListLoadBalancer      : List of Servers for test-zone obtained from Discovery client: [192.168.5.1:8765]
2018-06-24 14:08:03.692 DEBUG 2260 --- [erListUpdater-0] c.n.l.ZoneAffinityServerListFilter       : Determining if zone affinity should be enabled with given server list: []
2018-06-24 14:08:03.692 DEBUG 2260 --- [erListUpdater-0] c.n.l.ZoneAffinityServerListFilter       : zoneAffinity is overriden. blackOutServerPercentage: NaN, activeReqeustsPerServer: 0.0, availableServers: 0
2018-06-24 14:08:03.692 DEBUG 2260 --- [erListUpdater-0] c.n.l.DynamicServerListLoadBalancer      : Filtered List of Servers for test-zone obtained from Discovery client: [192.168.5.1:8765]
2018-06-24 14:08:03.692 DEBUG 2260 --- [erListUpdater-0] c.netflix.loadbalancer.BaseLoadBalancer  : LoadBalancer [test-zone]: clearing server list (SET op)
2018-06-24 14:08:03.692 DEBUG 2260 --- [erListUpdater-0] c.netflix.loadbalancer.BaseLoadBalancer  : LoadBalancer [test-zone]:  addServer [192.168.5.1:8765]
2018-06-24 14:08:03.692 DEBUG 2260 --- [erListUpdater-0] c.n.l.DynamicServerListLoadBalancer      : Setting server list for zones: {region1-zone2=[192.168.5.1:8765]}
[192.168.5.1:8765]
2018-06-24 14:08:03.692 DEBUG 2260 --- [erListUpdater-0] c.n.l.ZoneAffinityServerListFilter       : Determining if zone affinity should be enabled with given server list: []
2018-06-24 14:08:03.692 DEBUG 2260 --- [erListUpdater-0] c.n.l.ZoneAffinityServerListFilter       : zoneAffinity is overriden. blackOutServerPercentage: NaN, activeReqeustsPerServer: 0.0, availableServers: 0
2018-06-24 14:08:03.692 DEBUG 2260 --- [erListUpdater-0] c.n.l.DynamicServerListLoadBalancer      : Filtered List of Servers for test-zone obtained from Discovery client: [192.168.5.1:8765]
2018-06-24 14:08:03.692 DEBUG 2260 --- [erListUpdater-0] c.netflix.loadbalancer.BaseLoadBalancer  : LoadBalancer [test-zone]: clearing server list (SET op)
2018-06-24 14:08:03.692 DEBUG 2260 --- [erListUpdater-0] c.netflix.loadbalancer.BaseLoadBalancer  : LoadBalancer [test-zone]:  addServer [192.168.5.1:8765]
2018-06-24 14:08:03.692 DEBUG 2260 --- [erListUpdater-0] c.n.l.DynamicServerListLoadBalancer      : Setting server list for zones: {region1-zone2=[192.168.5.1:8765]}

因为存在心跳机制,默认情况下,服务的超时时间是90s,服务和注册中心的心跳间隔是30s

我们可以看下spring cloud的文档:


eureka.instance.lease-expiration-duration-in-seconds


90


Indicates the time in seconds that the eureka server waits since it received thelast heartbeat before it can remove this instance from its view and there bydisallowing traffic to this instance.

Setting this value too long could mean that the traffic could be routed to theinstance even though the instance is not alive. Setting this value too small couldmean, the instance may be taken out of traffic because of temporary networkglitches.This value to be set to atleast higher than the value specified inleaseRenewalIntervalInSeconds.

大概意思是:

eureka将等待一定的时间(默认90秒)保持实例的存活,过了这个时间如果没有收到最新的心跳,那么eureka将会把这个实例从自己的视图中移除,并且拒绝他的流量。


eureka.instance.lease-renewal-interval-in-seconds


30


Indicates how often (in seconds) the eureka client needs to send heartbeats to eureka server to indicate that it is still alive. If the heartbeats are not received for the period specified in leaseExpirationDurationInSeconds, eurekaserver will remove the instance from its view, there by disallowing traffic to thisinstance.

Note that the instance could still not take traffic if it implementsHealthCheckCallback and then decides to make itself unavailable.

这个是在讲心跳的时间间隔:指示eureka client隔多少时间发送心跳给server,过了这个时间如果没收到心跳,eureka server就会移除超时的eureka client。

所以说,当一个服务下线,eureka server要90s后才能知道这个服务已经不存在了。

为什么我这里调试的时候要禁用保护模式?

当保护模式被触发的时候,实例就永远不会过期,如果zone1中的服务都下线了,由于这个保护模式,eureka并不会让这些实例过期,因此,zone2中的服务就永远调用不到了。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • springcloud微服务之Eureka配置详解

    Eureka注册中心/服务发现框架 Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的.SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能. Eureka包含两个组件:Eureka Server和Eureka Client. Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Serve

  • SpringCloud搭建netflix-eureka微服务集群的过程详解

    1.打开官网稍微学习一下,了解一下spring cloud是个什么东西,大概有哪些组件等 https://spring.io/projects/spring-cloud https://docs.spring.io/spring-cloud-netflix/docs/current/reference/html/ 2.新建项目 打开网址:https://start.spring.io/ 选择需要引入的组件,然后下载下来即可 3.更改项目结构 为了测试的方便,需将项目结构更改为多模块的项目. 步骤

  • 单台Spring Cloud Eureka升级到三台Eureka高可用集群

    概述 由于前段时间,公司业务发展快,接了太多的业务需求了,没有时间把Eureka搞成高可用的,先用一台Eureka应付.当时由于流量还不大,不会出现问题.但是最近一个月,流量逐渐增大,老板担心万一单台Eureka挂了,服务会用不了.让我赶紧升级成3台Eureka,并两两注册,做到高可用.下面就把升级的过程说一下. 未升级前 单台Eureka上,只有购物车这个服务提供方,共两台. 升级步骤 为了描述的方便,线上已经存在的Eureka称之为peer1,新增的两台Eureka分别叫peer2和peer

  • Springcloud eureka搭建高可用集群过程图解

    一 前言 eureka作为注册中心,其充当着服务注册与发现功能,加载负载均衡:若在项目运行中eureka挂了,那么整个服务整体都会暂停,所以为服务运行的安全性,有必要搭建eureka集群:当其中一个eureka节点挂了,我们还有另外的节点可用:本篇文章的核心是如何在idea上运行eureka集群,和项目部署:需注意的jdk版本是1.8,高于jdk1.8打包部署会出问题,需要引入其他依赖: 二 eureka-server配置文件改造 之前的配置文件如下,这是单个eureka-server的配置,并

  • spring cloud之eureka高可用集群和服务分区解析

    目录 准备 搭建 验证 解释 准备 1.首先,在C:\WINDOWS\System32\drivers\etc\hosts文件里面添加一下映射,如果不添加也没关系,只是如果是单机环境,在eureka首页中的replicas那一项看到的其它注册中心都是localhost,我这里为了方便理解就添加了映射. 2.为了方便理解,我这里是单个application用一个module,没有采用通过多个profile开启多个application的做法,而且这样做一会儿验证起来也比较清晰. 3.必要的一些概念

  • 运用.net core中实例讲解RabbitMQ高可用集群构建

    目录 一.集群架构简介 二.普通集群搭建 2.1 各个节点分别安装RabbitMQ 2.2 把节点加入集群 2.3 代码演示普通集群的问题 三.镜像集群 四.HAProxy环境搭建. 五.KeepAlived 环境搭建 一.集群架构简介 当单台 RabbitMQ 服务器的处理消息的能力达到瓶颈时,此时可以通过 RabbitMQ 集群来进行扩展,从而达到提升吞吐量的目的.RabbitMQ 集群是一个或多个节点的逻辑分组,集群中的每个节点都是对等的,每个节点共享所有的用户,虚拟主机,队列,交换器,绑

  • CentOS下RabbitMq高可用集群环境搭建教程

    CentOS下RabbitMq高可用集群环境搭建教程分享给大家. 准备工作 1.准备两台或多台安装有rabbitmq-server服务的服务器 我这里准备了两台,分别如下: 192.168.40.130 rabbitmq01 192.168.40.131 rabbitmq02 2.确保防火墙是关闭的3,官网参考资料 http://www.rabbitmq.com/clustering.html hosts映射 修改每台服务上的hosts文件(路径:/etc/hosts),设置成如下: 192.1

  • 基于 ZooKeeper 搭建 Hadoop 高可用集群 的教程图解

    一.高可用简介 Hadoop 高可用 (High Availability) 分为 HDFS 高可用和 YARN 高可用,两者的实现基本类似,但 HDFS NameNode 对数据存储及其一致性的要求比 YARN ResourceManger 高得多,所以它的实现也更加复杂,故下面先进行讲解: 1.1 高可用整体架构 HDFS 高可用架构如下: 图片引用自: https://www.edureka.co/blog/how-to-set-up-hadoop-cluster-with-hdfs-hi

  • 基于mysql+mycat搭建稳定高可用集群负载均衡主备复制读写分离操作

    数据库性能优化普遍采用集群方式,oracle集群软硬件投入昂贵,今天花了一天时间搭建基于mysql的集群环境. 主要思路 简单说,实现mysql主备复制-->利用mycat实现负载均衡. 比较了常用的读写分离方式,推荐mycat,社区活跃,性能稳定. 测试环境 MYSQL版本:Server version: 5.5.53,到官网可以下载WINDWOS安装包. 注意:确保mysql版本为5.5以后,以前版本主备同步配置方式不同. linux实现思路类似,修改my.cnf即可. A主mysql.19

  • nginx高可用集群的实现过程

    这篇文章主要介绍了nginx高可用集群的实现过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.配置: (1)需要两台nginx服务器 (2)需要keepalived (3)需要虚拟ip 2.配置高可用的准备工作 (1)需要两台服务器192.168.180.113和192.168.180.112 (2)在两台服务器安装nginx (3)在两台服务器安装keepalived 3.在两台服务器安装keepalived (1)使用yum命令进行安

  • MySQL之高可用集群部署及故障切换实现

    一.MHA 1.概念 2.MHA 的组成 3.MHA 的特点 二.搭建MySQL+MHA 思路和准备工作 1.MHA架构 数据库安装 一主两从 MHA搭建 2.故障模拟 模拟主库失效 备选主库成为主库 原故障主库恢复重新加入到MHA成为从库 3.准备4台安装MySQL虚拟机 MHA高可用集群相关软件包 MHAmanager IP:192.168.221.30 MySQL1 IP:192.168.221.20 MySQL2 IP:192.168.221.100 MySQL3 IP: 192.168

  • Redis5之后版本的高可用集群搭建的实现

    一.安装redis 1.安装gcc yum install gcc 2.下载redis-5.0.8.tar.gz 3.把下载好的redis-5.0.8.tar.gz放在/gyu/software文件夹下,并解压 > tar xzf redis-5.0.8.tar.gz > cd redis-5.0.8 4.进入到解压好的redis-5.0.8目录下,进行编译与安装 > make & make install 5.启动并指定配置文件 > src/redis-server re

  • Nginx实现高可用集群构建(Keepalived+Haproxy+Nginx)

    1.组件及实现的功能 Keepalived:实现对Haproxy服务的高可用,并采用双主模型配置; Haproxy:实现对Nginx的负载均衡和读写分离; Nginx:实现对HTTP请求的高速处理; 2.架构设计图 3.Keepalived部署 在两个节点上都需要执行安装keepalived,命令如下: $ yum -y install keepalived 修改 172.16.25.109 节点上 keepalived.conf 文件配置,命令如下 $ vim /etc/keepalived/

随机推荐