Consul 是由 HashiCorp 开发的一款开源工具,用于实现服务发现、配置管理和分布式系统的多数据中心协调。其高可用集群(High Availability Cluster)设计旨在确保服务持续可用、数据一致性和故障容错能力。

1. 核心组件

  • Server 节点:

    • 领导者(Leader):负责处理所有写操作(如服务注册、KV存储更新),并通过 Raft 协议保证数据一致性。

    • 跟随者(Follower):复制 Leader 的数据,参与 Raft 选举,故障时可晋升为 Leader。

    • 推荐配置:至少 3-5 个 Server 节点(避免脑裂,Raft 要求多数节点存活)。

  • Client 节点:

    • 轻量级代理,将请求转发给 Server 节点,不参与 Raft 选举。

    • 部署在每个服务节点上,用于服务注册和健康检查。


2. 高可用关键机制

  • Raft 共识算法:

    • 所有 Server 节点通过 Raft 选举 Leader,确保数据强一致性。

    • 写操作需多数节点(N/2 + 1)确认,例如 3 节点集群需至少 2 个节点确认。

  • 多数据中心支持:

    • 不同数据中心(DC)的 Consul 集群通过 WAN Gossip 通信。

    • 支持跨数据中心服务发现,但各 DC 的 Server 集群独立运行 Raft。

  • Gossip 协议:

    • 使用 UDP 广播节点状态(存活/故障),快速检测故障。

    • 分 LAN Gossip(同一数据中心)和 WAN Gossip(跨数据中心)。

  • 自动故障转移:

    • Leader 故障时,Follower 通过 Raft 选举新 Leader(通常在秒级完成)。

    • 客户端请求自动重定向到新 Leader。


3. 部署建议

  • Server 节点:

    • 奇数数量(如 3、5),分布在不同可用区(AZ)或物理机器。

    • 配置 -bootstrap-expect=N 指定初始集群大小(如 -bootstrap-expect=3)。

  • Client 节点:

    • 无状态,可水平扩展,通常与业务服务共置。

  • 网络要求:

    • Server 节点间低延迟(Raft 对延迟敏感)。

    • 开放端口:TCP 8300(Server RPC)、8301(LAN Gossip)、8302(WAN Gossip)、8500(HTTP API)。


4. 数据持久性与一致性

  • 持久化存储:Server 节点将数据(如 KV、服务目录)存储在本地(可通过 -data-dir 指定路径)。

  • 一致性模式:

    • default:读 Leader,强一致性。

    • stale:读任意节点,可能过期。

    • consistent:读多数节点,线性一致性。


5. 监控与运维

  • 健康检查:

    • 内置服务健康检查(HTTP/TCP/脚本)。

    • 节点故障通过 Gossip 协议快速传播。

  • 监控指标:

    • 通过 /v1/agent/metrics 接口或集成 Prometheus。

    • 关键指标:Raft 任期(term)、提交索引(commit index)、节点存活状态。

  • 备份与恢复:

    • 定期备份 -data-dir 下的 raft/ 和 serf/ 目录。

    • 使用 consul snapshot save/restore 命令。


6. 典型应用场景

  • 服务网格:与 Connect 功能结合实现 mTLS 加密通信。

  • 配置中心:通过 KV 存储动态配置(如 vault 集成)。

  • 多云/混合云:跨数据中心服务发现。


7. 注意事项

  • 脑裂问题:网络分区时,少数派节点会拒绝写入(需人工干预或配置 autopilot 自动清理)。

  • 性能权衡:更多 Server 节点提高容错能力,但会增加 Raft 协商开销。

  • 版本升级:建议滚动升级,确保多数 Server 节点始终在线。

  • 集群数量:建议以奇数集群为主,确保不会出现 Leader 选举不出的情况。


集群IP示例

集群别名

集群IP

集群角色

二进制链接

master

192.168.1.1

Consul

slave

192.168.1.2

Consul

arbiter

192.168.1.3

Consul


部署保活服务*supervisor

  • 部署所在服务器:master slave arbiter

  • 部署命令:yum -y install supervisor


编写Consul集群所需文件

  • Consul.ini 启动文件内容

    • 部署所在服务器:master slave arbiter

    • 启动文件所在位置:/etc/supervisord.d/

    • 启动文件名称: consul.ini

[program:consul]
command=/opt/app/consul/consul agent -server -http-port=8500 -data-dir=/data/data/consul/ -node=192e168e1e1 -bind=192.168.1.1 -bootstrap-expect=3 -client=0.0.0.0 -datacenter=xiaopalu -ui -config-dir=/opt/app/consul/config/
process_name=%(program_name)s
numprocs=1
directory=/opt/app/consul
autostart=true            ; 系统启动时自动启动此程序
autorestart=true        ; 进程崩溃后自动重启
startsecs=5             ; 进程启动后必须保持运行至少5秒才算成功
startretries=3         ; 启动失败时最多尝试3次
stopsignal=QUIT        ; 停止程序时发送的信号
stopwaitsecs=5         ; 等待5秒钟让程序优雅退出
user=root              ; 以root用户身份运行(注意安全风险)
redirect_stderr=true   ; 将标准错误输出重定向到标准输出
stdout_logfile=/var/log/consul.log  ; 日志文件路径
stdout_logfile_maxbytes=10MB        ; 日志文件最大尺寸
stdout_logfile_backups=5            ; 日志轮换备份数量
; 以下为可选环境变量配置(当前被注释)
; environment=A=1,B=2
; 以下为可能的额外配置(被注释)
; serverurl=AUTO
  • 文件内容注解:

    • 启动Consul代理,作为一个服务器节点(-server

    • 设置HTTP端口为8500

    • 指定数据存储目录

    • 设置节点名为192e168e1e1

    • 绑定IP为192.168.1.1

    • 预期启动3个服务器节点(-bootstrap-expect=3

    • 允许所有IP访问HTTP接口(-client=0.0.0.0

    • 指定数据中心名称为xiaopalu

    • 启用UI界面(-ui

    • 指定配置文件目录(-config-dir


  • Auth.hcl 鉴权文件

    • 部署所在服务器:master slave arbiter

    • 鉴权文件所在位置:/opt/app/consul/config/

    • 鉴权文件名称:auth.hcl

{
    "acl": {
        "enabled": true,                       // 启用ACL功能
        "default_policy": "deny",              // 默认策略:拒绝所有未授权请求
        "enable_token_persistence": true,      // 启用Token持久化,重启后保持Token状态
        "tokens": {
            "master": "xiaopaluliulangji"      // 集群的鉴权Token(Master权限Token)
        }
    }
}

  • Consulha.hcl 集群节点文件

    • 部署所在服务器:master slave arbiter

    • 鉴权文件所在位置:/opt/app/consul/config/

    • 鉴权文件名称:consulha.hcl

      • 注:本文件中的IP地址 必须Consul.ini 启动文件中 bind 参数的IP地址保持一致,且三个IP必须可以相互 PING 通!

      • 测试方式:ping -I 本节点IP地址 其他节点的IP地址

        • 例子:ping -I 192.168.1.1 192.168.1.2

server = true # 启用服务器模式
retry_join = ["192.168.1.1", "192.168.1.2", "192.168.1.3"] # 其他节点的IP地址

  • Consul 二进制启动文件

    • 部署所在服务器:master slave arbiter

    • 二进制文件所在目录:/opt/app/consul/

    • 二进制文件名称:consul

      • 放入后添加权限:chmod +x /opt/app/consul/consul

    • 更新 supervisor 保活服务: supervisorctl update

      • 注:这一步supervisorctl update 是用来同步配置文件的变更到 Supervisor 进程中的命令,确保配置的修改得以生效。

    • 启动 Consul 服务:supervisorctl start consul

      • 注:Consul 集群同步端口为 8301,记得开放 8301 端口,否则会显示端口连接超时( timeout )


Consul集群额外命令

  • 查看集群节点: /opt/app/consul/consul members -token xiaopaluliiulangji

  • 页面查看集群节点:http://192.168.1.1:8500/