2. 现代数仓生产环境搭建

现代数仓的生产环境并不是“买一台服务器装个数据库”那么简单。在云平台上,一个可用的数仓开发环境通常由五类资源共同构成:计算资源(负责执行 SQL 与 ETL 的引擎)、存储资源(承载数据文件与元数据)、网络资源(VPC、子网、路由)、安全边界(安全组、访问控制、密钥)以及权限体系(账号、角色、库表授权)。本节以主流云数仓(如云原生 MPP 数仓、Serverless 数仓或托管 Hadoop/Spark 集群)的通用搭建逻辑为主线,给出一套可复现的搭建流程与判断依据。

一、先规划,再创建:资源与网络拓扑

创建实例前必须先确定网络拓扑,否则后期迁移成本极高。推荐的最小生产拓扑是:一个 VPC(例如 10.0.0.0/16),内部划分至少两个子网——私有子网(10.0.1.0/24)用于放置数仓计算节点与存储,公有子网(10.0.2.0/24)用于放置跳板机或 NAT 网关。数仓实例只挂私有子网,不分配公网 IP,所有访问通过跳板机、VPN 或专线进入。这样做的目的是把数据面与控制面分离:数据面不出公网,控制面(管理控制台、API)走云厂商的内网通道。

安全组需要按“最小开放”原则配置。典型规则如下:入方向仅允许来自跳板机安全组的 5432(PostgreSQL 协议数仓)、9030(MySQL 协议数仓)或 8080(Web 控制台)端口;出方向允许访问对象存储的 443 端口以及同 VPC 内的元数据服务端口。切勿图省事开放 0.0.0.0/0 的 22 或 5432,这是生产环境最常见的安全事故来源。

VPC 10.0.0.0/16 公有子网 10.0.2.0/24 跳板机 / VPN 公网入口 · 仅 22/443 NAT 网关 出网代理 私有子网 10.0.1.0/24(无公网 IP) 数仓计算集群 CN / Worker 节点 规格:8C32G × 3 端口 5432 / 9030 对象存储 OSS/S3 数据文件 + 冷数据 生命周期:30 天转低频 HTTPS 443 元数据服务 Catalog / Hive Metastore 安全组 入:跳板机 SG 白名单 内网访问 读写 元数据 策略 开发客户端 / BI 工具 SSH 隧道

二、创建实例:计算与存储的关键参数

进入云数仓控制台后,创建实例时通常需要填写以下参数。以某云原生 MPP 数仓为例,一套适合开发验证的配置是:计算规格 8 核 32GB × 3 节点,存储类型 选择 ESSD 云盘 200GB(若支持存算分离则存储独立计费),副本数 2,版本 选择稳定版而非最新预览版。副本数决定容错能力:2 副本可容忍单节点故障,3 副本适合核心生产,开发环境用 1 副本也可接受,但必须明确这是“非高可用”配置。

存算分离架构下,计算与存储分别弹性伸缩,此时要额外配置对象存储的 Bucket 与访问密钥。Bucket 命名建议带环境标识,例如 dw-dev-oss-001,并开启服务端加密(SSE-KMS)。创建完成后,控制台会返回一个内网连接地址,形如 dw-dev-xxxx.internal:5432,这个地址只在 VPC 内可解析,这正是我们前面坚持私有子网的原因。

三、连接测试:从跳板机验证链路

实例创建成功后不要急着建表,先做连通性验证。登录跳板机,依次执行以下检查:

# 1. 解析内网域名
nslookup dw-dev-xxxx.internal

# 2. 测试端口连通性
telnet dw-dev-xxxx.internal 5432

# 3. 使用客户端连接(PostgreSQL 协议示例)
psql -h dw-dev-xxxx.internal -p 5432 -U admin -d postgres

# 4. 连接成功后执行验证 SQL
SELECT version();
SHOW max_connections;

判断标准很明确:nslookup 必须返回 10.0.1.x 的私有地址;telnet 显示 Connected 而非超时;psql 能进入交互界面并返回版本号。如果 telnet 超时,优先检查安全组入方向规则是否放行了跳板机所在安全组;如果域名无法解析,检查是否误用了公网 DNS 或实例未绑定私有域名。这一步的排查顺序是“网络 → 安全组 → 认证”,不要一上来就怀疑密码错误。

四、基础权限设置:账号、角色与库表授权

开发环境至少需要三类账号:管理员账号(admin,仅用于运维,不用于日常开发)、开发账号(dev_user,拥有开发库的建表与读写权限)、只读账号(bi_reader,供 BI 工具查询)。权限模型遵循 RBAC:先建角色,再给角色授权,最后把角色赋予用户。示例 SQL 如下:

-- 创建角色
CREATE ROLE dev_role;
CREATE ROLE bi_role;

-- 开发角色:开发库全部权限
GRANT ALL PRIVILEGES ON DATABASE dw_dev TO dev_role;
GRANT ALL ON SCHEMA dev_ods TO dev_role;

-- 只读角色:仅查询
GRANT CONNECT ON DATABASE dw_dev TO bi_role;
GRANT USAGE ON SCHEMA dw_dws TO bi_role;
GRANT SELECT ON ALL TABLES IN SCHEMA dw_dws TO bi_role;

-- 创建用户并绑定角色
CREATE USER dev_user WITH PASSWORD 'Dev@2024#Strong';
GRANT dev_role TO dev_user;

授权后必须验证:用 dev_user 登录,尝试在 dev_ods 建表应成功,尝试删除 dw_dws 的表应被拒绝;用 bi_reader 登录,查询 dw_dws 应成功,写入应失败。这种“正反双向验证”比只看授权语句更可靠。此外,生产环境应禁用弱密码、开启 SSL 连接、定期轮换密钥,并把管理员账号的登录行为接入审计日志。

开发环境与生产环境建议使用不同的 VPC 或至少不同的子网与安全组,避免开发误操作影响生产数据。所有连接地址、账号、密钥应写入配置中心或密钥管理服务,不要硬编码在脚本里。

五、形成可用的开发环境

完成上述步骤后,一个可用的数仓开发环境应具备以下特征:能从跳板机稳定连接数仓;开发账号可建库建表;只读账号可查询;对象存储可读写;元数据服务正常;安全组未暴露公网端口。此时可以进一步初始化目录结构,例如建立 dev_ods、dev_dwd、dev_dws 三层 Schema,并写入一条测试数据验证端到端链路。至此,环境搭建闭环完成,后续的建模、ETL 与性能优化才有可靠的落地基础。