环境变量
服务器配置完全通过环境变量完成。键大小写不敏感,空值视为未设置, 布尔型值只有 1/true/yes/on 才为真。Docker 镜像基于 scratch, 因此配置纯粹通过环境变量注入,没有配置文件。
| 环境变量 | 默认值 | 说明 |
|---|---|---|
PORT | 5225 | 单机模式下的监听端口。集群模式下被忽略,改为使用 CLUSTER_SELF 的端口 |
SOCKET_BIND | 0.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_VERIFY | false | 跳过对端证书校验 —— 仅供测试 |
DOCKER | false | 在集群模式下将内部监听端口固定为 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 个)。
- 先重启跟随者,一次一台。等重启的节点通过复制或快照追赶上进度后, 再进行下一台。
- 最后,下线 leader —— 新 leader 会在 0.5-1 秒内选出,客户端会透明地 切换过去。
- 重新启动已下线的节点,会使其以 follower 身份重新加入。
详细步骤见滚动重启流程。
参考
- 镜像:
sarolab/ticketing· Github:saro-lab/ticketing - 在客户端(broker)一侧注册每一个节点地址,以便自动故障转移。 各语言的具体用法见库列表。