OpenStack Keystone 高可用:三节点 + HAProxy 实战
Keystone 是 OpenStack 的认证中心,挂了整个云就废了。本文是我在生产部署的 3 节点 HA 方案。
架构
VIP (HAProxy keepalived)
|
+-----+-----+
| | |
Key1 Key2 Key3 (Apache + mod_wsgi)
| | |
+-----+-----+
|
Galera Cluster (MariaDB 3 节点)
要点:
- Keystone 服务无状态,水平扩容
- 数据库用 Galera 多主同步
- 前面挂 HAProxy + VIP,单点故障不影响
关键配置 keystone.conf
[database]
connection = mysql+pymysql://keystone:password@<VIP>:3306/keystone
max_pool_size = 50
max_overflow = 100
[token]
provider = fernet
expiration = 3600
用 fernet token,不要用旧的 uuid token:
- fernet 不存数据库,纯加密 token
- 性能好 10 倍以上
- token rotation 自动化
Fernet key 同步
3 个节点的 fernet key 必须一致:
# 主节点生成
keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
# rsync 到其他节点
rsync -av /etc/keystone/fernet-keys/ node2:/etc/keystone/fernet-keys/
rsync -av /etc/keystone/fernet-keys/ node3:/etc/keystone/fernet-keys/
# 定期 rotate(crontab,每 24h)
keystone-manage fernet_rotate --keystone-user keystone --keystone-group keystone
rotate 后必须同步到所有节点,否则部分节点 token 验证失败。
HAProxy 配置
listen keystone_api
bind <VIP>:5000
balance source # 同一客户端固定到同一后端,防 session 漂
option httpchk GET /v3
server key1 <node1>:5000 check inter 2000 rise 2 fall 3
server key2 <node2>:5000 check inter 2000 rise 2 fall 3
server key3 <node3>:5000 check inter 2000 rise 2 fall 3
balance source 比 roundrobin 更稳,但流量分布略不均。
监控要看的指标
- Keystone API 响应时间(>500ms 报警)
- Token 创建 QPS
- Galera 集群同步延迟(wsrep_local_recv_queue)
- Fernet key 文件 mtime 一致性
一个真实事故
某次我们的 HAProxy 健康检查写成 option httpchk GET / ——返回 300 重定向。HAProxy 把所有节点判 down,Keystone 全部摘除,整个云挂 20 分钟。
教训:健康检查 URL 一定要返回 2xx,别用根路径。