一.常见问题

consul节点启动时,提示端口已被占用或node id 冲突

原因:

server 端和客户端部署在同一台服务器

修改server配置文件serverconfig/server.json,调用ports端口

修改client配置文件clientconfig/client.json,修改data_dir路径,与server端区分开。

consul节点启动时,提示“Multiple private IPV4 addresses found”

启动时,指定bind ip,具体如下:

-bind 10.xx.xxx.xxx(本地IP)

consul ui报500错误

找到集群注册信息

datacenter/raft/

删除raft下内容:

rm -rf datacenter/raft/*

二.命令

查看集群成员

bin/consul members

当服务端和客户端在同一台机子时,使用命令指定server端口:

bin/consul members --http-addr 127.0.0.1:8501

退出

bin/consul leave

指定端口退出

bin/consul leave  --http-addr 127.0.0.1:8501

强制退出

bin/consul force-leave  --http-addr 127.0.0.1:8501

删除某个service服务

Consul提供了一个删除服务的接口,请求方式为PUT,格式如下,ip、port、实例id这三个值按实际情况替换.

curl --request PUT http://127.0.0.1:8500/v1/agent/service/deregister/cloud-docker-service-8001

查看consul集群所有 service

/v1/internal/ui/services

查看consul集群内某个service下的服务详情

/v1/health/service/${service_name}

三.Consul集群选举机制-Raft算法

1.三种节点状态

每个节点任何时刻只处于三种状态之一:

  • Leader(领导者)
    • 唯一写入口
    • 定时发心跳,维持权威
    • 所有写操作先到 Leader,再同步给 Follower
  • Follower(追随者)
    • 被动,只接收、不主动发请求(不会主动参选
    • 收不到心跳 → 变成候选人
  • Candidate(候选人)
    • 发起选举,先给自己投票,再向其他节点拉票

状态流转:
Follower →(收不到心跳)→ Candidate →(得票过半)→ Leader

2.选举机制

Raft 里的 “过半”= 集群配置的总节点数的一半≠ 当前活着的节点数的一半

1. 心跳触发

  • Leader 每隔一段时间发心跳(AppendEntries)
  • Follower 收到心跳就保持沉默

2. 选举超时(随机)

  • Follower 一段时间没收到心跳 → 超时
  • 超时时间:150ms~300ms 随机
  • 随机 = 避免平票、避免同时抢主

3. 选举过程

 1. Follower → Candidate
 2. 自己投自己一票
 3. 给其他节点发投票请求
 4. 谁得到 > 半数票,谁立刻变成 Leader

4. 为什么不会卡死?

  • 随机超时 → 一定有一个先发起选举
  • 先发起的人更容易拿到票
  • 平票了就等下一轮随机超时,一定会选出主

3.日志复制(保证一致)

所有写操作都走这个流程:

  1. 客户端 → Leader
  2. Leader 把日志先存在本地
  3. Leader 并发发给所有 Follower
  4. Follower 收到后回复 ACK
  5. Leader 收到 过半 ACK
    → 提交(commit)
    → 应用到状态机
    → 告诉客户端成功
  6. 之后 Leader 通过心跳让所有节点最终一致

保证:只要提交成功,所有节点最终都会有这条日志。

4.安全性(不会乱)

Raft 有几条铁律:

  1. 选举安全性
    一个任期内 最多只有一个 Leader
  2. 日志匹配原则
    • 如果两个节点某条日志 index & term(任期) 相同
    • 那么这条日志之前的所有日志都完全相同
  3. Leader 只追加、不覆盖、不删除日志
    Follower 冲突时,Leader 强制覆盖 Follower,保证一致
  4. 投票限制
    节点只会给日志比自己新的候选人投票 → 保证新主一定拥有全部已提交日志

5.Term(任期)

你可以理解为时代、纪元:

  • 每个任期有一个全局唯一数字
  • 每次选举,任期 +1
  • 不同任期的消息直接拒绝
  • 用来识别过期的 Leader

6.Consul(Raft)集群存活能力表

节点总数 至少需要节点数(过半) 最多能挂几台还能正常选主
3 2 1
5 3 2
7 4 3
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐