Apache Superset高可用部署:多节点集群配置指南
1. 引言:为什么需要高可用集群?
在企业级数据可视化场景中,Apache Superset(数据探索与可视化平台)作为核心工具,面临三大挑战:单节点故障导致服务中断、高峰期并发查询性能瓶颈、数据处理任务堆积延迟。本文将通过多节点集群架构解决这些问题,实现服务无间断运行、负载均衡分配任务、资源弹性扩展。
读完本文,你将掌握:
- 高可用集群的核心组件与拓扑结构
- 多节点部署的分步实施指南
- 负载均衡与会话共享配置
- 监控告警与故障转移策略
- 性能优化与最佳实践
2. 集群架构设计
2.1 核心组件
2.2 组件功能说明
| 组件 | 作用 | 高可用策略 |
|---|---|---|
| Web节点 | 处理HTTP请求、渲染UI | 多实例部署+负载均衡 |
| Redis集群 | 缓存、会话存储、Celery broker | 主从复制+哨兵模式 |
| PostgreSQL | 元数据存储 | 主从复制+自动故障转移 |
| Celery Worker | 异步任务处理(报表生成、数据导出) | 多节点水平扩展 |
| Celery Beat | 定时任务调度 | 单实例+监控重启 |
| 负载均衡器 | 请求分发、SSL终结 | 双机热备(keepalived) |
3. 环境准备与前置要求
3.1 服务器配置(生产环境建议)
| 节点类型 | CPU | 内存 | 磁盘 | 数量 | 操作系统 |
|---|---|---|---|---|---|
| Web节点 | 4核+ | 16GB+ | SSD 100GB+ | 2+ | Ubuntu 22.04 LTS |
| Worker节点 | 8核+ | 32GB+ | SSD 200GB+ | 2+ | Ubuntu 22.04 LTS |
| 数据库节点 | 8核+ | 32GB+ | SSD 500GB+ | 2(主从) | Ubuntu 22.04 LTS |
| Redis节点 | 4核+ | 16GB+ | SSD 100GB+ | 3(主从+哨兵) | Ubuntu 22.04 LTS |
| 负载均衡节点 | 2核+ | 4GB+ | SSD 50GB+ | 2 | Ubuntu 22.04 LTS |
3.2 网络要求
- 所有节点间内网互通,关闭不必要端口
- Web节点仅开放80/443端口对外
- 数据库/Redis节点仅允许集群内部访问
3.3 软件依赖
# 所有节点通用依赖
sudo apt update && sudo apt install -y python3.10 python3.10-venv python3-pip \
docker.io docker-compose git curl wget
# 负载均衡节点额外依赖
sudo apt install -y nginx haproxy keepalived
# 数据库节点额外依赖
sudo apt install -y postgresql-15 postgresql-replication-manager
4. 分步部署指南
4.1 基础环境配置(所有节点)
4.1.1 克隆代码仓库
git clone https://gitcode.com/gh_mirrors/supers/superset.git
cd superset
4.1.2 创建环境变量文件
# 生成安全密钥
SECRET_KEY=$(python -c "import secrets; print(secrets.token_urlsafe(50))")
# 创建.env文件
cat > docker/.env << EOF
SECRET_KEY=${SECRET_KEY}
POSTGRES_USER=superset
POSTGRES_PASSWORD=$(secrets.token_urlsafe(20))
POSTGRES_DB=superset
REDIS_HOST=redis-master
REDIS_PORT=6379
SQLALCHEMY_DATABASE_URI=postgresql://superset:${POSTGRES_PASSWORD}@db-master:5432/superset
EOF
4.2 数据库集群配置(主从复制)
4.2.1 主库配置(db-master节点)
# 修改postgresql.conf
sudo sed -i "s/#wal_level = replica/wal_level = hot_standby/" /etc/postgresql/15/main/postgresql.conf
sudo sed -i "s/#max_wal_senders = 10/max_wal_senders = 5/" /etc/postgresql/15/main/postgresql.conf
sudo sed -i "s/#hot_standby = on/hot_standby = on/" /etc/postgresql/15/main/postgresql.conf
# 添加复制用户
sudo -u postgres psql -c "CREATE USER replicator WITH REPLICATION ENCRYPTED PASSWORD '$(secrets.token_urlsafe(20))';"
# 修改pg_hba.conf
echo "host replication replicator 10.0.0.0/24 md5" | sudo tee -a /etc/postgresql/15/main/pg_hba.conf
# 重启服务
sudo systemctl restart postgresql
4.2.2 从库配置(db-slave节点)
# 停止服务并清空数据目录
sudo systemctl stop postgresql
sudo rm -rf /var/lib/postgresql/15/main/*
# 从主库同步初始数据
sudo -u postgres pg_basebackup -h db-master -U replicator -D /var/lib/postgresql/15/main -P -X stream
# 创建恢复配置
cat > /var/lib/postgresql/15/main/recovery.conf << EOF
standby_mode = 'on'
primary_conninfo = 'host=db-master port=5432 user=replicator password=${REPLICATOR_PASSWORD}'
trigger_file = '/tmp/promote_to_primary'
EOF
# 重启服务
sudo systemctl start postgresql
4.3 Redis集群配置(主从+哨兵)
4.3.1 主节点配置(redis-master)
cat > /etc/redis/redis.conf << EOF
port 6379
daemonize yes
pidfile /var/run/redis/redis-server.pid
logfile /var/log/redis/redis-server.log
dir /var/lib/redis
appendonly yes
appendfilename "appendonly.aof"
requirepass $(secrets.token_urlsafe(20))
EOF
sudo systemctl restart redis-server
4.3.2 哨兵配置(所有Redis节点)
cat > /etc/redis/sentinel.conf << EOF
port 26379
daemonize yes
sentinel monitor mymaster redis-master 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1
sentinel auth-pass mymaster ${REDIS_PASSWORD}
EOF
sudo systemctl restart redis-sentinel
4.4 Superset应用集群部署
4.4.1 修改docker-compose.yml
# 仅展示修改部分,完整配置需保留原文件结构
services:
superset:
deploy:
replicas: 3 # 启动3个Web节点
environment:
- SESSION_COOKIE_SECURE=True
- SESSION_COOKIE_SAMESITE=Lax
- CELERY_RESULT_BACKEND=redis://:${REDIS_PASSWORD}@redis-master:6379/1
- CELERY_BROKER_URL=redis://:${REDIS_PASSWORD}@redis-master:6379/0
- CACHE_CONFIG={"CACHE_TYPE":"RedisCache","CACHE_REDIS_URL":"redis://:${REDIS_PASSWORD}@redis-master:6379/2"}
superset-worker:
deploy:
replicas: 4 # 启动4个Worker节点
environment:
- CELERYD_CONCURRENCY=8 # 每个Worker处理8个并发任务
nginx:
ports:
- "80:80"
- "443:443"
volumes:
- ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- ./ssl:/etc/nginx/ssl:ro
4.4.2 启动集群
# 初始化数据库(仅需执行一次)
docker-compose up -d superset-init
# 启动所有服务
docker-compose up -d
# 查看服务状态
docker-compose ps
4.5 负载均衡配置(Nginx)
4.5.1 Nginx配置文件
# docker/nginx/nginx.conf
worker_processes auto;
events {
worker_connections 1024;
}
http {
upstream superset_web {
server superset_1:8088;
server superset_2:8088;
server superset_3:8088;
ip_hash; # 确保会话一致性
}
server {
listen 80;
server_name superset.example.com;
# 重定向到HTTPS
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name superset.example.com;
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
location / {
proxy_pass http://superset_web;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# WebSocket支持
location /ws {
proxy_pass http://superset-websocket:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
}
4.5.2 启用配置并重启
# 生成SSL证书(示例使用自签名证书,生产环境建议使用Let's Encrypt)
mkdir -p ./ssl
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout ./ssl/privkey.pem -out ./ssl/fullchain.pem \
-subj "/CN=superset.example.com"
# 重启Nginx
docker-compose restart nginx
5. 集群配置优化
5.1 性能调优参数
5.1.1 Superset配置优化
# 创建自定义配置文件
cat > docker/pythonpath_dev/superset_config.py << EOF
from superset.config import *
# 缓存配置
CACHE_CONFIG = {
'CACHE_TYPE': 'RedisCache',
'CACHE_REDIS_URL': os.environ.get('REDIS_URL', 'redis://:${REDIS_PASSWORD}@redis-master:6379/2'),
'CACHE_DEFAULT_TIMEOUT': 86400, # 1天缓存
'CACHE_KEY_PREFIX': 'superset_'
}
# 异步任务配置
CELERY_CONFIG = {
'broker_url': os.environ.get('CELERY_BROKER_URL', 'redis://:${REDIS_PASSWORD}@redis-master:6379/0'),
'result_backend': os.environ.get('CELERY_RESULT_BACKEND', 'redis://:${REDIS_PASSWORD}@redis-master:6379/1'),
'worker_concurrency': 8,
'task_acks_late': True,
'task_reject_on_worker_lost': True,
'task_track_started': True,
}
# 数据库连接池配置
SQLALCHEMY_ENGINE_OPTIONS = {
'pool_size': 20,
'max_overflow': 100,
'pool_recycle': 300,
'pool_pre_ping': True,
}
# 特性开关
FEATURE_FLAGS = {
'ALERT_REPORTS': True,
'ENABLE_EXPLORE_JSON_CSRF_PROTECTION': True,
'ENABLE_TEMPLATE_PROCESSING': True,
'EMBEDDED_SUPERSET': True,
}
# 安全配置
SESSION_COOKIE_SECURE = True
SESSION_COOKIE_HTTPONLY = True
SESSION_COOKIE_SAMESITE = 'Lax'
EOF
5.1.2 Worker节点资源配置
# docker-compose.yml中添加资源限制
services:
superset-worker:
deploy:
resources:
limits:
cpus: '4'
memory: 8G
reservations:
cpus: '2'
memory: 4G
5.2 自动扩展配置
使用Docker Swarm或Kubernetes实现基于CPU/内存使用率的自动扩缩容。以下是Docker Swarm的示例配置:
# docker-compose.yml
version: '3.8'
services:
superset:
deploy:
replicas: 3
resources:
limits:
cpus: '1'
memory: 2G
restart_policy:
condition: on-failure
placement:
constraints: [node.role == worker]
update_config:
parallelism: 1
delay: 10s
rollback_config:
parallelism: 1
delay: 10s
# 自动扩缩容规则
mode: replicated
replicas: 3
placement:
constraints: [node.role == worker]
resources:
limits:
cpus: '1'
memory: 2G
deploy:
resources:
limits:
cpus: '1'
memory: 2G
restart_policy:
condition: on-failure
update_config:
parallelism: 1
delay: 10s
rollback_config:
parallelism: 1
delay: 10s
# 自动扩缩容
replicas: 3
placement:
constraints: [node.role == worker]
resources:
limits:
cpus: '1'
memory: 2G
restart_policy:
condition: on-failure
update_config:
parallelism: 1
delay: 10s
rollback_config:
parallelism: 1
delay: 10s
6. 监控与故障转移
6.1 监控指标收集
6.1.1 Prometheus配置
# prometheus.yml
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'superset'
static_configs:
- targets: ['superset_1:8088', 'superset_2:8088', 'superset_3:8088']
- job_name: 'celery'
static_configs:
- targets: ['superset-worker_1:5555', 'superset-worker_2:5555', 'superset-worker_3:5555', 'superset-worker_4:5555']
- job_name: 'postgres'
static_configs:
- targets: ['db-master:9187', 'db-slave:9187']
- job_name: 'redis'
static_configs:
- targets: ['redis-master:9121', 'redis-slave:9121', 'redis-sentinel:9121']
6.1.2 关键监控指标
| 指标名称 | 说明 | 告警阈值 |
|---|---|---|
| superset_http_requests_total | HTTP请求总数 | - |
| superset_http_request_duration_seconds | 请求响应时间 | P95 > 5s |
| celery_task_active_count | 活跃任务数 | > worker数*并发数 |
| celery_task_failed_total | 失败任务数 | 5分钟内>10 |
| postgresql_up | 数据库可用性 | 0 |
| redis_connected_clients | Redis连接数 | > maxclients*0.8 |
6.2 故障转移策略
6.2.1 数据库自动故障转移
使用PostgreSQL的repmgr工具实现自动故障转移:
# 在主库安装repmgr
sudo apt install -y repmgr
# 配置自动故障转移
sudo repmgr standby promote -f /etc/repmgr.conf --siblings-follow
6.2.2 Redis哨兵自动切换
当主节点故障时,Redis哨兵会自动将从节点提升为主节点,并更新配置。应用无需重启,只需确保使用哨兵地址连接:
# 修改Redis连接配置
CELERY_BROKER_URL = 'redis://:${REDIS_PASSWORD}@redis-sentinel:26379/0;sentinel=mymaster'
7. 验证集群可用性
7.1 功能验证
# 检查服务状态
docker-compose ps
# 查看日志
docker-compose logs -f superset
# 验证数据库复制状态
psql -h db-master -U superset -c "SELECT * FROM pg_stat_replication;"
# 测试负载均衡
for i in {1..10}; do curl -s -o /dev/null -w "%{http_code} %{url_effective}\n" https://superset.example.com/health; done
7.2 故障模拟测试
# 模拟Web节点故障
docker-compose stop superset_1
# 验证服务仍可访问
curl -I https://superset.example.com/health
# 模拟Worker节点故障
docker-compose stop superset-worker_1
# 验证任务仍能处理
curl -X POST https://superset.example.com/api/v1/reports/export/1
# 恢复节点
docker-compose start superset_1 superset-worker_1
8. 总结与最佳实践
8.1 部署清单
- 所有节点时间同步(使用NTP)
- 数据库主从复制配置完成并验证
- Redis哨兵模式正确配置
- 负载均衡会话一致性验证
- SSL证书正确配置
- 监控系统正常采集指标
- 故障转移测试通过
8.2 运维建议
- 定期备份:每日自动备份数据库,保留30天历史
- 滚动更新:每次只更新一个节点,确保服务不中断
- 资源监控:密切关注Worker节点内存使用,防止OOM
- 安全加固:定期更新依赖包,关闭不必要的API端点
- 文档维护:记录集群拓扑变更、配置修改历史
8.3 未来扩展方向
- 引入Kubernetes实现更灵活的容器编排
- 配置读写分离,提高查询性能
- 实现多区域部署,容灾能力更强
- 集成数据湖/数据仓库,扩展数据处理能力
通过本文介绍的多节点集群方案,Apache Superset可实现99.9%以上的服务可用性,支持每秒数百次查询请求,满足企业级数据可视化平台的高可用需求。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



