目前正在测试中:完成后将开放 GitHub 代码。

Ticketing 服务器部署

运行环境
Shell
模式
bash
客户端连接示例
rust
使用 nc 快速测试
bash

环境变量

服务器配置完全通过环境变量完成。键大小写不敏感,空值视为未设置, 布尔型值只有 1/true/yes/on 才为真。Docker 镜像基于 scratch, 因此配置纯粹通过环境变量注入,没有配置文件。

环境变量默认值说明
PORT5225单机模式下的监听端口。集群模式下被忽略,改为使用 CLUSTER_SELF 的端口
SOCKET_BIND0.0.0.0监听地址
CLIENT_TOKENS(无)逗号分隔的客户端认证 token 列表。未设置时允许空 token
CLUSTER_SELF(无)本节点的广播地址,host:port。设置后即开启集群模式
CLUSTER_PEERS(无)逗号分隔的全部节点广播地址列表。恰好 3 或 5 个,每个节点上顺序相同,必须包含 self
CLUSTER_TOKENS(无)逗号分隔的对端认证 token 列表
TLS_CERT / TLS_KEY(无)证书/私钥 PEM 文件路径 —— 两者同时设置即启用 TLS
TLS_CA(无)用于校验对端证书的 CA —— 未设置时回退到系统信任存储
TLS_SKIP_VERIFYfalse跳过对端证书校验 —— 仅供测试
DOCKERfalse在集群模式下将内部监听端口固定为 5225/6225 —— 官方镜像中默认设置
DEBUG取决于构建1/true 启用调试日志

完整规则(端口推导、广播地址、零停机 token 轮换等)见 配置 (环境变量)

单机 vs. 集群

  • 单机(1 个节点):不设置 CLUSTER_* 时,节点独立运行。速度最快,但 重启时会有短暂中断,且状态存于内存中,重启后会丢失(lease 是安全网)。
  • 集群(无中断):3 或 5 个节点。 节点通过 Raft 共识共享同一份 锁状态 —— 只有 leader 处理请求,每一次状态变更都要在多数派提交后才最终 生效。如果 leader 挂掉,新 leader 会在 0.5-1 秒内选出,只要多数派保持 存活,锁状态与服务就会持续运行。完整说明见工作原理协议 (集群)
  • 每个集群节点除了监听客户端端口外,还会监听一个 Raft 端口(客户端端口 + 1000)——需要在防火墙中同时开放这两个端口。

Kubernetes 集群部署使用 StatefulSet + headless Service。为每个 Pod 赋予一个稳定的 DNS 名称(ticketing-0.ticketing…ticketing-1.ticketing…), 把这些名称放入 CLUSTER_PEERS,并通过 downward API(metadata.name) 为每个 Pod 自动注入 CLUSTER_SELF

无中断重启(滚动)

核心规则只有一条 —— 多数派必须始终保持存活(3 个节点时一次最多下线 1 个)。

  1. 先重启跟随者,一次一台。等重启的节点通过复制或快照追赶上进度后, 再进行下一台。
  2. 最后,下线 leader —— 新 leader 会在 0.5-1 秒内选出,客户端会透明地 切换过去。
  3. 重新启动已下线的节点,会使其以 follower 身份重新加入。

详细步骤见滚动重启流程

参考