Docker 其中一台服务器关闭时,领事群集无法正常工作

Docker 其中一台服务器关闭时,领事群集无法正常工作,docker,docker-compose,consul,Docker,Docker Compose,Consul,我猜集群的主要用途是容错。然而,当我启动下面的Consor集群时,情况并非如此,我不明白为什么 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:

我猜集群的主要用途是容错。然而,当我启动下面的Consor集群时,情况并非如此,我不明白为什么

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
当我停止其中一台服务器时,集群不再工作。我无法注册更多的服务(通过领事客户端)

在其余服务器的日志中,我可以看到消息
未能进行RequestVote RPC
在客户端日志中,我可以看到消息
No cluster leader


我的配置有什么问题

执政官的问题是,它希望在某个时候达到法定人数,以便能够进行适当的领导人选举。对于您的服务器,您正在使用
-bootstrap expect 2
来告诉服务器在开始领导层选举之前需要两个节点

如果你只有两个节点,而其中一个节点出现故障(或断开),那么你最终会出现大脑分裂的情况。剩下的节点没有足够的其他节点来决定谁应该是集群中的领导者。 因此,它将不接受任何新的注册


我的期望是,如果您有一个由3个节点组成的集群,其中一个节点出现故障,那么它应该能够继续运行。一般来说,对于集群设置,节点数量不偶数是一个好主意,通常(clustersize/2)>=2

好的,这是有意义的。我可以启动另一台服务器,期望3台。但是如果两台服务器停止,我也会陷入同样的情况。似乎最好不要固定服务器的数量。有可能吗?这是意料之中的,这是故意的。在形成集群时,他们总是希望法定人数拥有“多数”投票权。如果你杀死了三分之二的人,这就不可能了,这样他们就不能保证做出正确的决定。在将系统设计为容错系统时,通常会在一组故障域上分割节点,这样您就知道,即使出现一些故障,您仍将保持大多数节点。一个很好的例子是将节点分散到公共云提供商的多个可用性区域。引入地理冗余。