Apache Superset高可用部署:多节点集群配置指南

Apache Superset高可用部署:多节点集群配置指南

【免费下载链接】superset Apache Superset is a Data Visualization and Data Exploration Platform 【免费下载链接】superset 项目地址: https://gitcode.com/gh_mirrors/supers/superset

1. 引言:为什么需要高可用集群?

在企业级数据可视化场景中,Apache Superset(数据探索与可视化平台)作为核心工具,面临三大挑战:单节点故障导致服务中断、高峰期并发查询性能瓶颈、数据处理任务堆积延迟。本文将通过多节点集群架构解决这些问题,实现服务无间断运行、负载均衡分配任务、资源弹性扩展。

读完本文,你将掌握:

  • 高可用集群的核心组件与拓扑结构
  • 多节点部署的分步实施指南
  • 负载均衡与会话共享配置
  • 监控告警与故障转移策略
  • 性能优化与最佳实践

2. 集群架构设计

2.1 核心组件

mermaid

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+2Ubuntu 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_totalHTTP请求总数-
superset_http_request_duration_seconds请求响应时间P95 > 5s
celery_task_active_count活跃任务数> worker数*并发数
celery_task_failed_total失败任务数5分钟内>10
postgresql_up数据库可用性0
redis_connected_clientsRedis连接数> 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 运维建议

  1. 定期备份:每日自动备份数据库,保留30天历史
  2. 滚动更新:每次只更新一个节点,确保服务不中断
  3. 资源监控:密切关注Worker节点内存使用,防止OOM
  4. 安全加固:定期更新依赖包,关闭不必要的API端点
  5. 文档维护:记录集群拓扑变更、配置修改历史

8.3 未来扩展方向

  • 引入Kubernetes实现更灵活的容器编排
  • 配置读写分离,提高查询性能
  • 实现多区域部署,容灾能力更强
  • 集成数据湖/数据仓库,扩展数据处理能力

通过本文介绍的多节点集群方案,Apache Superset可实现99.9%以上的服务可用性,支持每秒数百次查询请求,满足企业级数据可视化平台的高可用需求。

【免费下载链接】superset Apache Superset is a Data Visualization and Data Exploration Platform 【免费下载链接】superset 项目地址: https://gitcode.com/gh_mirrors/supers/superset

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值