docker - 当其中一台服务器关闭时,Consul 集群无法正常工作
问题描述
我猜集群的主要目的是容错。但是,当我启动以下 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
当我停止其中一台服务器时,集群不再工作。我无法再注册服务(通过领事客户端)。
在其余服务器的日志中,我可以看到消息Failed to make RequestVote RPC
在客户端的日志中,我可以看到消息No cluster leader
我的配置有什么问题?
解决方案
领事的事情是,在某个时候,它希望达到法定人数,以便能够进行适当的领导选举。对于您的服务器,您使用-bootstrap-expect 2
基本上告诉服务器在开始领导选举之前需要两个节点。
如果您只有 2 个节点,并且一个节点出现故障(或损坏),您最终会出现脑裂的情况。剩下的节点没有足够的其他节点来决定谁应该成为集群内的领导者。因此,它将不接受任何新注册。
我的期望是,如果你有一个由 3 个节点组成的集群,其中一个节点出现故障,它应该能够继续运行。通常对于集群设置,不偶数节点是一个好主意,并且通常 (clustersize/2) >= 2
推荐阅读
- java - 安卓。JSON 解析器在我的新模块中返回 null
- python - 追加正在覆盖类列表中的现有数据
- c# - 创建自定义控件并将其添加到 Xamarin 中的 ListView。但它只在我双击时触发。我希望 ItemTapped 在单击时触发
- if-statement - 计算两个互斥的类别行中的项目数
- python - Django:具有过滤的多对多的多个分组注释
- python - Python Dictionary 如何创建列表项的组合?
- android - 用于多模块项目的 Firebase
- apache - Symfony 5 - 多个客户端域
- cypress - 在 Cypress 中使用 cy.get() 搜索具有两个属性之一的选择器
- python - 如何为 PyAudio 配置输出设备