当其中一台服务器关闭时,Consul 集群无法正常工作

Consul cluster does not work properly when one of server is down

我想集群的主要目的是容错。但是,当我启动以下consul集群时,情况并非如此,我不明白为什么。

version: "3.5"

services:

  # docker network create --driver=bridge discovery-network

  # SERVICE DISCOVERY
  consul-server-0:
    image: consul:1.6.0
    container_name: consul-server-0
    command: "agent -server -bootstrap-expect 2 -client 0.0.0.0 -datacenter datacenter-1 -node consul-server-0"
    networks:
      - discovery-network

  consul-server-1:
    image: consul:1.6.0
    container_name: consul-server-1
    command: "agent -server -retry-join consul-server-0 -client 0.0.0.0 -datacenter datacenter-1  -node consul-server-1"
    networks:
      - discovery-network
    depends_on:
      - consul-server-0

  consul-client-1:
    image: consul:1.6.0
    container_name: consul-client-1
    command: "agent -retry-join consul-server-0 -ui -client 0.0.0.0  -datacenter datacenter-1  -node consul-client-1"
    ports:
      - "8500:8500" # GUI
    networks:
      - discovery-network
    depends_on:
      - consul-server-0

networks:
  discovery-network:
    external:true

当我停止其中一台服务器时,集群不再工作。我无法再注册服务(通过 consul-client)。

在其余服务器的日志中,我可以看到消息 Failed to make RequestVote RPC 在客户端的日志中,我可以看到消息 No cluster leader

我的配置有什么问题?

consul 的问题是,在某些时候它希望达到法定人数,以便能够进行适当的领导选举。对于您的服务器,您使用 -bootstrap-expect 2 实质上告诉服务器在开始领导选举之前期望有两个节点。

如果您只有 2 个节点,并且其中一个出现故障(或损坏),您最终会遇到裂脑情况。剩下的节点没有足够的其他节点来决定谁应该成为集群内的领导者。 因此,它将不接受任何新注册。

我的期望是,如果您有一个包含 3 个节点的集群,其中一个节点出现故障,它应该能够继续 运行。通常对于集群设置,非偶数的节点是个好主意,通常 (clustersize/2) >= 2