<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>踩坑实战 on 文艺技术笔记</title><link>https://wenyiblog.top/tags/%E8%B8%A9%E5%9D%91%E5%AE%9E%E6%88%98/</link><description>Recent content in 踩坑实战 on 文艺技术笔记</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>文艺技术笔记 | 软件工程师文艺</copyright><lastBuildDate>Tue, 07 Jul 2026 20:40:00 +0800</lastBuildDate><atom:link href="https://wenyiblog.top/tags/%E8%B8%A9%E5%9D%91%E5%AE%9E%E6%88%98/index.xml" rel="self" type="application/rss+xml"/><item><title>数据中台私有化部署全攻略：从架构设计到运维FAQ的一线经验汇总</title><link>https://wenyiblog.top/2026/07/data-platform-private-deployment/</link><pubDate>Tue, 07 Jul 2026 20:40:00 +0800</pubDate><guid>https://wenyiblog.top/2026/07/data-platform-private-deployment/</guid><description>&lt;h2 id="私有化部署为什么比想象中难十倍"&gt;&lt;a href="#%e7%a7%81%e6%9c%89%e5%8c%96%e9%83%a8%e7%bd%b2%e4%b8%ba%e4%bb%80%e4%b9%88%e6%af%94%e6%83%b3%e8%b1%a1%e4%b8%ad%e9%9a%be%e5%8d%81%e5%80%8d" class="header-anchor"&gt;&lt;/a&gt;私有化部署为什么比想象中难十倍
&lt;/h2&gt;&lt;p&gt;做过数据中台私有化部署的人都有一个感受：这件事的难度和售前沟通时听到的完全不是一回事。&lt;/p&gt;
&lt;p&gt;售前告诉你&amp;quot;我们的产品在某某客户那边已经跑了一年了，很成熟&amp;quot;。等你真正开始部署才发现——那个客户的环境跟你完全不一样：操作系统版本不同、数据库类型不同、网络架构不同、安全策略不同。那些&amp;quot;成熟&amp;quot;的经验，换到你的环境里全部要重新验证。&lt;/p&gt;
&lt;p&gt;私有化部署的核心难点不在于安装，而在于&lt;strong&gt;适配&lt;/strong&gt;。你面对的是千变万化的客户环境，而产品方通常只能给出有限的环境适配矩阵。两者之间的差距，就是你需要填的坑。&lt;/p&gt;
&lt;h2 id="部署架构设计先想清楚再动手"&gt;&lt;a href="#%e9%83%a8%e7%bd%b2%e6%9e%b6%e6%9e%84%e8%ae%be%e8%ae%a1%e5%85%88%e6%83%b3%e6%b8%85%e6%a5%9a%e5%86%8d%e5%8a%a8%e6%89%8b" class="header-anchor"&gt;&lt;/a&gt;部署架构设计：先想清楚再动手
&lt;/h2&gt;&lt;h3 id="典型的数据中台部署架构"&gt;&lt;a href="#%e5%85%b8%e5%9e%8b%e7%9a%84%e6%95%b0%e6%8d%ae%e4%b8%ad%e5%8f%b0%e9%83%a8%e7%bd%b2%e6%9e%b6%e6%9e%84" class="header-anchor"&gt;&lt;/a&gt;典型的数据中台部署架构
&lt;/h3&gt;&lt;p&gt;一个完整的数据中台通常包含以下几个层次：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┌─────────────────────────────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 接入层（Nginx / F5） │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├─────────────────────────────────────────┤
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 应用服务层（20-30个微服务） │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├─────────────────────────────────────────┤
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 计算引擎层（Spark / Flink / Presto） │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├─────────────────────────────────────────┤
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 存储层（HDFS / S3 / MySQL / ES / Redis）│
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├─────────────────────────────────────────┤
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 基础设施层（K8s / VM / 物理机） │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└─────────────────────────────────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;每一层都有多种部署方式，选择哪种取决于客户的硬件条件和安全要求。&lt;/p&gt;
&lt;h3 id="三种常见的部署模式"&gt;&lt;a href="#%e4%b8%89%e7%a7%8d%e5%b8%b8%e8%a7%81%e7%9a%84%e9%83%a8%e7%bd%b2%e6%a8%a1%e5%bc%8f" class="header-anchor"&gt;&lt;/a&gt;三种常见的部署模式
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;模式一：全 K8s 部署&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;所有组件都容器化，运行在 Kubernetes 集群上。这是最现代化的方式，运维效率最高，但对 K8s 运维能力要求也最高。&lt;/p&gt;
&lt;p&gt;适用条件：客户有 K8s 运维团队，或者有云厂商的托管 K8s 服务。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;模式二：混合部署&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;核心应用服务跑在 K8s 上，但存储和计算引擎跑在物理机或虚拟机上。这是最常见的私有化部署模式——因为大数据存储（HDFS）和计算引擎（Spark）在容器化场景下性能损耗较大。&lt;/p&gt;
&lt;p&gt;适用条件：大多数企业环境，兼顾灵活性和性能。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;模式三：全虚拟机部署&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;所有组件都部署在虚拟机上，不用 K8s。这是最保守的方式，适合那些对容器技术还不熟悉或者安全策略不允许使用 K8s 的客户。&lt;/p&gt;
&lt;p&gt;适用条件：传统企业、金融行业、政务行业。&lt;/p&gt;
&lt;h3 id="硬件规划的基本原则"&gt;&lt;a href="#%e7%a1%ac%e4%bb%b6%e8%a7%84%e5%88%92%e7%9a%84%e5%9f%ba%e6%9c%ac%e5%8e%9f%e5%88%99" class="header-anchor"&gt;&lt;/a&gt;硬件规划的基本原则
&lt;/h3&gt;&lt;p&gt;数据中台的硬件规划经常被低估。一个常见的错误是按&amp;quot;刚好够用&amp;quot;来配——结果上线后不到半年就开始报空间不足。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;组件&lt;/th&gt;
&lt;th style="text-align: left"&gt;最低配置&lt;/th&gt;
&lt;th style="text-align: left"&gt;推荐配置&lt;/th&gt;
&lt;th style="text-align: left"&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;应用服务（K8s Worker）&lt;/td&gt;
&lt;td style="text-align: left"&gt;3台 8C32G&lt;/td&gt;
&lt;td style="text-align: left"&gt;5台 16C64G&lt;/td&gt;
&lt;td style="text-align: left"&gt;微服务数量多，内存是瓶颈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;HDFS NameNode&lt;/td&gt;
&lt;td style="text-align: left"&gt;2台 8C32G&lt;/td&gt;
&lt;td style="text-align: left"&gt;2台 16C64G&lt;/td&gt;
&lt;td style="text-align: left"&gt;高可用必须双节点&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;HDFS DataNode&lt;/td&gt;
&lt;td style="text-align: left"&gt;3台 16C64G + 10TB&lt;/td&gt;
&lt;td style="text-align: left"&gt;5台 32C128G + 20TB&lt;/td&gt;
&lt;td style="text-align: left"&gt;数据增长是持续的&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;MySQL 主库&lt;/td&gt;
&lt;td style="text-align: left"&gt;1台 8C32G&lt;/td&gt;
&lt;td style="text-align: left"&gt;2台 16C64G（主从）&lt;/td&gt;
&lt;td style="text-align: left"&gt;元数据和配置数据&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Elasticsearch&lt;/td&gt;
&lt;td style="text-align: left"&gt;3台 16C64G&lt;/td&gt;
&lt;td style="text-align: left"&gt;5台 32C128G&lt;/td&gt;
&lt;td style="text-align: left"&gt;日志和搜索&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Redis&lt;/td&gt;
&lt;td style="text-align: left"&gt;3台 4C8G&lt;/td&gt;
&lt;td style="text-align: left"&gt;3台 8C16G（集群）&lt;/td&gt;
&lt;td style="text-align: left"&gt;缓存和会话&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;存储规划的铁律：按预期数据量的 3 倍来规划。数据副本（通常 3 副本）+ 中间数据 + 预留增长空间。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="网络架构最容易被忽视的部署前提"&gt;&lt;a href="#%e7%bd%91%e7%bb%9c%e6%9e%b6%e6%9e%84%e6%9c%80%e5%ae%b9%e6%98%93%e8%a2%ab%e5%bf%bd%e8%a7%86%e7%9a%84%e9%83%a8%e7%bd%b2%e5%89%8d%e6%8f%90" class="header-anchor"&gt;&lt;/a&gt;网络架构：最容易被忽视的部署前提
&lt;/h2&gt;&lt;h3 id="私有化环境的网络限制"&gt;&lt;a href="#%e7%a7%81%e6%9c%89%e5%8c%96%e7%8e%af%e5%a2%83%e7%9a%84%e7%bd%91%e7%bb%9c%e9%99%90%e5%88%b6" class="header-anchor"&gt;&lt;/a&gt;私有化环境的网络限制
&lt;/h3&gt;&lt;p&gt;云上的网络是扁平的，所有服务都能互相访问。但私有化环境通常有严格的网络分区：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DMZ 区&lt;/strong&gt;：对外暴露的服务（Web 入口、API 网关）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;应用区&lt;/strong&gt;：内部业务服务&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据区&lt;/strong&gt;：数据库和存储系统&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;管理区&lt;/strong&gt;：运维和管理工具&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;跨区访问通常需要走防火墙策略审批。这意味着你在部署之前，必须先梳理出所有组件之间的网络访问关系，提前申请开通。&lt;/p&gt;
&lt;h3 id="网络访问矩阵梳理方法"&gt;&lt;a href="#%e7%bd%91%e7%bb%9c%e8%ae%bf%e9%97%ae%e7%9f%a9%e9%98%b5%e6%a2%b3%e7%90%86%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;网络访问矩阵梳理方法
&lt;/h3&gt;&lt;p&gt;在部署之前，做一张网络访问矩阵表：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;源&lt;/th&gt;
&lt;th style="text-align: left"&gt;目标&lt;/th&gt;
&lt;th style="text-align: left"&gt;端口&lt;/th&gt;
&lt;th style="text-align: left"&gt;协议&lt;/th&gt;
&lt;th style="text-align: left"&gt;用途&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;用户浏览器&lt;/td&gt;
&lt;td style="text-align: left"&gt;Nginx&lt;/td&gt;
&lt;td style="text-align: left"&gt;443&lt;/td&gt;
&lt;td style="text-align: left"&gt;HTTPS&lt;/td&gt;
&lt;td style="text-align: left"&gt;Web 访问&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Nginx&lt;/td&gt;
&lt;td style="text-align: left"&gt;API Gateway&lt;/td&gt;
&lt;td style="text-align: left"&gt;8080&lt;/td&gt;
&lt;td style="text-align: left"&gt;HTTP&lt;/td&gt;
&lt;td style="text-align: left"&gt;请求转发&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;API Gateway&lt;/td&gt;
&lt;td style="text-align: left"&gt;各微服务&lt;/td&gt;
&lt;td style="text-align: left"&gt;8080-8099&lt;/td&gt;
&lt;td style="text-align: left"&gt;HTTP&lt;/td&gt;
&lt;td style="text-align: left"&gt;服务调用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;微服务&lt;/td&gt;
&lt;td style="text-align: left"&gt;MySQL&lt;/td&gt;
&lt;td style="text-align: left"&gt;3306&lt;/td&gt;
&lt;td style="text-align: left"&gt;TCP&lt;/td&gt;
&lt;td style="text-align: left"&gt;数据访问&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;微服务&lt;/td&gt;
&lt;td style="text-align: left"&gt;Redis&lt;/td&gt;
&lt;td style="text-align: left"&gt;6379&lt;/td&gt;
&lt;td style="text-align: left"&gt;TCP&lt;/td&gt;
&lt;td style="text-align: left"&gt;缓存访问&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Spark Driver&lt;/td&gt;
&lt;td style="text-align: left"&gt;HDFS&lt;/td&gt;
&lt;td style="text-align: left"&gt;8020/9000&lt;/td&gt;
&lt;td style="text-align: left"&gt;TCP&lt;/td&gt;
&lt;td style="text-align: left"&gt;数据读写&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Flink JobManager&lt;/td&gt;
&lt;td style="text-align: left"&gt;Flink TaskManager&lt;/td&gt;
&lt;td style="text-align: left"&gt;6123&lt;/td&gt;
&lt;td style="text-align: left"&gt;TCP&lt;/td&gt;
&lt;td style="text-align: left"&gt;任务分发&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这张表要在部署前就交给网络团队审批。经验之谈：&lt;strong&gt;至少预留两周时间做网络策略审批&lt;/strong&gt;。很多项目的延期不是因为技术问题，而是因为网络策略审批卡了两周。&lt;/p&gt;
&lt;h3 id="反向代理和-tls-配置"&gt;&lt;a href="#%e5%8f%8d%e5%90%91%e4%bb%a3%e7%90%86%e5%92%8c-tls-%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;反向代理和 TLS 配置
&lt;/h3&gt;&lt;p&gt;私有化环境通常要求全链路 HTTPS。这意味着你需要：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;申请或自签 TLS 证书&lt;/li&gt;
&lt;li&gt;在 Nginx 或 F5 上配置 SSL 卸载&lt;/li&gt;
&lt;li&gt;内部服务之间是否也要 mTLS（看安全要求）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;一个常见的坑：自签证书在 Java 应用里需要手动导入信任库。如果忘了这一步，服务之间的 HTTPS 调用会报 &lt;code&gt;SSLHandshakeException&lt;/code&gt;，而且错误信息不明显，排查起来很费时间。&lt;/p&gt;
&lt;h2 id="存储适配hdfs-不是唯一选择"&gt;&lt;a href="#%e5%ad%98%e5%82%a8%e9%80%82%e9%85%8dhdfs-%e4%b8%8d%e6%98%af%e5%94%af%e4%b8%80%e9%80%89%e6%8b%a9" class="header-anchor"&gt;&lt;/a&gt;存储适配：HDFS 不是唯一选择
&lt;/h2&gt;&lt;h3 id="存储方案对比"&gt;&lt;a href="#%e5%ad%98%e5%82%a8%e6%96%b9%e6%a1%88%e5%af%b9%e6%af%94" class="header-anchor"&gt;&lt;/a&gt;存储方案对比
&lt;/h3&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;方案&lt;/th&gt;
&lt;th style="text-align: left"&gt;优势&lt;/th&gt;
&lt;th style="text-align: left"&gt;劣势&lt;/th&gt;
&lt;th style="text-align: left"&gt;适用场景&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;HDFS&lt;/td&gt;
&lt;td style="text-align: left"&gt;成熟稳定，生态好&lt;/td&gt;
&lt;td style="text-align: left"&gt;运维复杂，NameNode 是单点&lt;/td&gt;
&lt;td style="text-align: left"&gt;传统大数据场景&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;MinIO（S3 兼容）&lt;/td&gt;
&lt;td style="text-align: left"&gt;轻量、易运维、S3 API&lt;/td&gt;
&lt;td style="text-align: left"&gt;大规模性能不如 HDFS&lt;/td&gt;
&lt;td style="text-align: left"&gt;中小规模，云原生架构&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Ceph&lt;/td&gt;
&lt;td style="text-align: left"&gt;统一存储（块/文件/对象）&lt;/td&gt;
&lt;td style="text-align: left"&gt;运维复杂度高&lt;/td&gt;
&lt;td style="text-align: left"&gt;需要统一存储平台&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;云存储（NAS/OSS）&lt;/td&gt;
&lt;td style="text-align: left"&gt;免运维&lt;/td&gt;
&lt;td style="text-align: left"&gt;依赖云环境&lt;/td&gt;
&lt;td style="text-align: left"&gt;混合云场景&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="一个实际的选择案例"&gt;&lt;a href="#%e4%b8%80%e4%b8%aa%e5%ae%9e%e9%99%85%e7%9a%84%e9%80%89%e6%8b%a9%e6%a1%88%e4%be%8b" class="header-anchor"&gt;&lt;/a&gt;一个实际的选择案例
&lt;/h3&gt;&lt;p&gt;某制造企业的私有化部署，最初方案是用 HDFS。但在部署过程中发现几个问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;客户的硬件是通用服务器，没有 JBOD 配置，HDFS 的本地磁盘优势发挥不出来&lt;/li&gt;
&lt;li&gt;客户只有 3 台服务器可以做存储，HDFS 3 副本意味着实际可用容量只有 1 台&lt;/li&gt;
&lt;li&gt;客户的运维团队没有 Hadoop 经验&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最终改为 MinIO + NFS 后端。MinIO 提供了 S3 兼容的 API（Spark 和 Flink 都能直接对接），运维复杂度大幅降低，3 台服务器做了纠删码配置，可用容量提升到约 2 台。&lt;/p&gt;
&lt;h2 id="高可用设计哪些组件必须做-ha"&gt;&lt;a href="#%e9%ab%98%e5%8f%af%e7%94%a8%e8%ae%be%e8%ae%a1%e5%93%aa%e4%ba%9b%e7%bb%84%e4%bb%b6%e5%bf%85%e9%a1%bb%e5%81%9a-ha" class="header-anchor"&gt;&lt;/a&gt;高可用设计：哪些组件必须做 HA
&lt;/h2&gt;&lt;h3 id="ha-优先级矩阵"&gt;&lt;a href="#ha-%e4%bc%98%e5%85%88%e7%ba%a7%e7%9f%a9%e9%98%b5" class="header-anchor"&gt;&lt;/a&gt;HA 优先级矩阵
&lt;/h3&gt;&lt;p&gt;不是所有组件都需要高可用。做 HA 意味着成本和复杂度翻倍，所以需要按业务重要性分级：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;组件&lt;/th&gt;
&lt;th style="text-align: left"&gt;HA 优先级&lt;/th&gt;
&lt;th style="text-align: left"&gt;HA 方案&lt;/th&gt;
&lt;th style="text-align: left"&gt;不 HA 的后果&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Nginx / 接入层&lt;/td&gt;
&lt;td style="text-align: left"&gt;P0&lt;/td&gt;
&lt;td style="text-align: left"&gt;Keepalived + VIP&lt;/td&gt;
&lt;td style="text-align: left"&gt;全站不可用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;API Gateway&lt;/td&gt;
&lt;td style="text-align: left"&gt;P0&lt;/td&gt;
&lt;td style="text-align: left"&gt;K8s 多副本&lt;/td&gt;
&lt;td style="text-align: left"&gt;所有请求失败&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;MySQL 主库&lt;/td&gt;
&lt;td style="text-align: left"&gt;P0&lt;/td&gt;
&lt;td style="text-align: left"&gt;主从 + 半同步&lt;/td&gt;
&lt;td style="text-align: left"&gt;元数据丢失&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;HDFS NameNode&lt;/td&gt;
&lt;td style="text-align: left"&gt;P1&lt;/td&gt;
&lt;td style="text-align: left"&gt;HA 双活&lt;/td&gt;
&lt;td style="text-align: left"&gt;大数据任务全部停&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Redis&lt;/td&gt;
&lt;td style="text-align: left"&gt;P1&lt;/td&gt;
&lt;td style="text-align: left"&gt;Sentinel / Cluster&lt;/td&gt;
&lt;td style="text-align: left"&gt;缓存失效，性能下降&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Elasticsearch&lt;/td&gt;
&lt;td style="text-align: left"&gt;P1&lt;/td&gt;
&lt;td style="text-align: left"&gt;多节点集群&lt;/td&gt;
&lt;td style="text-align: left"&gt;日志和搜索不可用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Spark / Flink&lt;/td&gt;
&lt;td style="text-align: left"&gt;P2&lt;/td&gt;
&lt;td style="text-align: left"&gt;YARN/K8s 自动恢复&lt;/td&gt;
&lt;td style="text-align: left"&gt;任务失败需重跑&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;非核心微服务&lt;/td&gt;
&lt;td style="text-align: left"&gt;P2&lt;/td&gt;
&lt;td style="text-align: left"&gt;K8s 多副本&lt;/td&gt;
&lt;td style="text-align: left"&gt;部分功能不可用&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="数据库高可用的常见方案"&gt;&lt;a href="#%e6%95%b0%e6%8d%ae%e5%ba%93%e9%ab%98%e5%8f%af%e7%94%a8%e7%9a%84%e5%b8%b8%e8%a7%81%e6%96%b9%e6%a1%88" class="header-anchor"&gt;&lt;/a&gt;数据库高可用的常见方案
&lt;/h3&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;方案&lt;/th&gt;
&lt;th style="text-align: left"&gt;切换时间&lt;/th&gt;
&lt;th style="text-align: left"&gt;数据一致性&lt;/th&gt;
&lt;th style="text-align: left"&gt;复杂度&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;MySQL 主从 + MHA&lt;/td&gt;
&lt;td style="text-align: left"&gt;30秒-1分钟&lt;/td&gt;
&lt;td style="text-align: left"&gt;可能丢少量事务&lt;/td&gt;
&lt;td style="text-align: left"&gt;中&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;MySQL 主从 + Orchestrator&lt;/td&gt;
&lt;td style="text-align: left"&gt;10-30秒&lt;/td&gt;
&lt;td style="text-align: left"&gt;可能丢少量事务&lt;/td&gt;
&lt;td style="text-align: left"&gt;中高&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;MySQL Group Replication&lt;/td&gt;
&lt;td style="text-align: left"&gt;秒级&lt;/td&gt;
&lt;td style="text-align: left"&gt;强一致&lt;/td&gt;
&lt;td style="text-align: left"&gt;高&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;MySQL + ProxySQL&lt;/td&gt;
&lt;td style="text-align: left"&gt;秒级&lt;/td&gt;
&lt;td style="text-align: left"&gt;取决于复制模式&lt;/td&gt;
&lt;td style="text-align: left"&gt;中&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;TiDB（分布式）&lt;/td&gt;
&lt;td style="text-align: left"&gt;秒级&lt;/td&gt;
&lt;td style="text-align: left"&gt;强一致&lt;/td&gt;
&lt;td style="text-align: left"&gt;中（但运维思路不同）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;对于大多数私有化部署场景，MySQL 主从 + MHA 或 Orchestrator 是性价比最高的方案。Group Replication 虽然一致性更好，但对网络延迟要求高，在跨机房场景下表现不稳定。&lt;/p&gt;
&lt;h2 id="升级策略生产环境怎么安全升级"&gt;&lt;a href="#%e5%8d%87%e7%ba%a7%e7%ad%96%e7%95%a5%e7%94%9f%e4%ba%a7%e7%8e%af%e5%a2%83%e6%80%8e%e4%b9%88%e5%ae%89%e5%85%a8%e5%8d%87%e7%ba%a7" class="header-anchor"&gt;&lt;/a&gt;升级策略：生产环境怎么安全升级
&lt;/h2&gt;&lt;h3 id="升级的三种模式"&gt;&lt;a href="#%e5%8d%87%e7%ba%a7%e7%9a%84%e4%b8%89%e7%a7%8d%e6%a8%a1%e5%bc%8f" class="header-anchor"&gt;&lt;/a&gt;升级的三种模式
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;滚动升级&lt;/strong&gt;：逐个节点升级，始终保持部分节点在线。用户无感知，但升级时间长，而且要求新旧版本能兼容。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;蓝绿升级&lt;/strong&gt;：部署一套完整的新版本环境，验证通过后一键切换。用户体验最好，但需要双倍的硬件资源。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;停机升级&lt;/strong&gt;：停服升级，验证后重新上线。最简单但影响最大，适合可以接受维护窗口的场景。&lt;/p&gt;
&lt;h3 id="升级前的必做检查"&gt;&lt;a href="#%e5%8d%87%e7%ba%a7%e5%89%8d%e7%9a%84%e5%bf%85%e5%81%9a%e6%a3%80%e6%9f%a5" class="header-anchor"&gt;&lt;/a&gt;升级前的必做检查
&lt;/h3&gt;&lt;p&gt;每次升级之前，做一个升级检查清单：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 备份数据库全量数据&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 备份配置文件（所有组件的配置文件）&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 验证回滚方案（在测试环境演练过）&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 确认新版本与现有数据的兼容性&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 通知相关方升级时间窗口&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 确认监控和告警系统正常工作&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;升级最怕的不是升级失败，而是升级失败后没有可靠的回滚方案。每次升级之前，花在回滚方案验证上的时间应该不少于升级本身。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="配置管理避免配置漂移"&gt;&lt;a href="#%e9%85%8d%e7%bd%ae%e7%ae%a1%e7%90%86%e9%81%bf%e5%85%8d%e9%85%8d%e7%bd%ae%e6%bc%82%e7%a7%bb" class="header-anchor"&gt;&lt;/a&gt;配置管理：避免配置漂移
&lt;/h3&gt;&lt;p&gt;私有化部署的一个大坑是&lt;strong&gt;配置漂移&lt;/strong&gt;——部署环境和开发环境的配置不一致，导致&amp;quot;在我这里是好的，到你那里就挂了&amp;quot;。&lt;/p&gt;
&lt;p&gt;解决方案是把所有配置都版本化管理。用一个配置中心（Nacos / Apollo / Consul KV）统一管理所有环境配置，每次修改都有版本记录，可以随时回滚。&lt;/p&gt;
&lt;p&gt;同时，配置文件里的敏感信息（数据库密码、API Key）不能明文存储。用 Vault 或者 K8s Secrets 来管理，实在不行至少做 AES 加密。&lt;/p&gt;
&lt;h2 id="监控与告警部署完只是开始"&gt;&lt;a href="#%e7%9b%91%e6%8e%a7%e4%b8%8e%e5%91%8a%e8%ad%a6%e9%83%a8%e7%bd%b2%e5%ae%8c%e5%8f%aa%e6%98%af%e5%bc%80%e5%a7%8b" class="header-anchor"&gt;&lt;/a&gt;监控与告警：部署完只是开始
&lt;/h2&gt;&lt;h3 id="监控层次"&gt;&lt;a href="#%e7%9b%91%e6%8e%a7%e5%b1%82%e6%ac%a1" class="header-anchor"&gt;&lt;/a&gt;监控层次
&lt;/h3&gt;&lt;p&gt;数据中台的监控需要覆盖五个层次：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;层次&lt;/th&gt;
&lt;th style="text-align: left"&gt;监控对象&lt;/th&gt;
&lt;th style="text-align: left"&gt;工具&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;基础设施&lt;/td&gt;
&lt;td style="text-align: left"&gt;CPU、内存、磁盘、网络&lt;/td&gt;
&lt;td style="text-align: left"&gt;Prometheus Node Exporter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;容器平台&lt;/td&gt;
&lt;td style="text-align: left"&gt;Pod 状态、资源使用、调度&lt;/td&gt;
&lt;td style="text-align: left"&gt;cAdvisor + K8s Metrics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;中间件&lt;/td&gt;
&lt;td style="text-align: left"&gt;MySQL、Redis、ES 的运行状态&lt;/td&gt;
&lt;td style="text-align: left"&gt;各 Exporter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;应用服务&lt;/td&gt;
&lt;td style="text-align: left"&gt;接口响应时间、错误率、QPS&lt;/td&gt;
&lt;td style="text-align: left"&gt;Micrometer + Prometheus&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;数据任务&lt;/td&gt;
&lt;td style="text-align: left"&gt;任务成功率、耗时、数据量&lt;/td&gt;
&lt;td style="text-align: left"&gt;自定义 Dashboard&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="告警策略"&gt;&lt;a href="#%e5%91%8a%e8%ad%a6%e7%ad%96%e7%95%a5" class="header-anchor"&gt;&lt;/a&gt;告警策略
&lt;/h3&gt;&lt;p&gt;告警不是越多越好。告警疲劳是一个真实的问题——当你每天收到 200 条告警，其中 190 条是噪音时，你会开始忽略所有告警，包括那 10 条真正重要的。&lt;/p&gt;
&lt;p&gt;有效的告警策略：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;P0 告警&lt;/strong&gt;（立即处理）：核心服务宕机、数据库主从断开、磁盘使用 &amp;gt; 95%&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;P1 告警&lt;/strong&gt;（30分钟内处理）：服务响应时间异常、任务失败率上升、内存使用 &amp;gt; 90%&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;P2 告警&lt;/strong&gt;（工作时间处理）：证书即将过期、磁盘增长趋势异常、非核心服务重启&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="运维faq那些客户最常问的问题"&gt;&lt;a href="#%e8%bf%90%e7%bb%b4faq%e9%82%a3%e4%ba%9b%e5%ae%a2%e6%88%b7%e6%9c%80%e5%b8%b8%e9%97%ae%e7%9a%84%e9%97%ae%e9%a2%98" class="header-anchor"&gt;&lt;/a&gt;运维FAQ：那些客户最常问的问题
&lt;/h2&gt;&lt;h3 id="q存储空间快满了怎么办"&gt;&lt;a href="#q%e5%ad%98%e5%82%a8%e7%a9%ba%e9%97%b4%e5%bf%ab%e6%bb%a1%e4%ba%86%e6%80%8e%e4%b9%88%e5%8a%9e" class="header-anchor"&gt;&lt;/a&gt;Q：存储空间快满了怎么办？
&lt;/h3&gt;&lt;p&gt;数据中台的存储增长是持续的。几个应对策略：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;冷热分离&lt;/strong&gt;：超过 90 天不访问的数据自动迁移到低成本存储（如归档硬盘或对象存储）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据生命周期管理&lt;/strong&gt;：明确每类数据的保留周期，过期自动清理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;压缩优化&lt;/strong&gt;：HDFS 的 Parquet/ORC 格式比 CSV 节省 70-80% 的空间&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;副本策略调整&lt;/strong&gt;：非核心数据从 3 副本改为 2 副本&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="q某个微服务频繁-oom-怎么办"&gt;&lt;a href="#q%e6%9f%90%e4%b8%aa%e5%be%ae%e6%9c%8d%e5%8a%a1%e9%a2%91%e7%b9%81-oom-%e6%80%8e%e4%b9%88%e5%8a%9e" class="header-anchor"&gt;&lt;/a&gt;Q：某个微服务频繁 OOM 怎么办？
&lt;/h3&gt;&lt;p&gt;OOM（Out of Memory）是 Java 微服务最常见的问题。排查步骤：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先看 JVM 参数配置：&lt;code&gt;-Xmx&lt;/code&gt; 是否合理（通常设为容器内存限制的 75%）&lt;/li&gt;
&lt;li&gt;分析堆转储（Heap Dump）：用 MAT 或 VisualVM 看是哪个对象占了最多内存&lt;/li&gt;
&lt;li&gt;检查是否有内存泄漏：关注那些不断增长的集合（如本地缓存没有设上限）&lt;/li&gt;
&lt;li&gt;检查是否有大查询：一次查询返回了几十万条数据加载到内存中&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="q数据任务跑得很慢怎么优化"&gt;&lt;a href="#q%e6%95%b0%e6%8d%ae%e4%bb%bb%e5%8a%a1%e8%b7%91%e5%be%97%e5%be%88%e6%85%a2%e6%80%8e%e4%b9%88%e4%bc%98%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;Q：数据任务跑得很慢怎么优化？
&lt;/h3&gt;&lt;p&gt;数据任务慢的原因通常有几种：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;原因&lt;/th&gt;
&lt;th style="text-align: left"&gt;表现&lt;/th&gt;
&lt;th style="text-align: left"&gt;优化方式&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;数据倾斜&lt;/td&gt;
&lt;td style="text-align: left"&gt;某个 Task 耗时远超其他&lt;/td&gt;
&lt;td style="text-align: left"&gt;加盐打散、两阶段聚合&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;小文件过多&lt;/td&gt;
&lt;td style="text-align: left"&gt;HDFS 上有大量 &amp;lt; 128MB 的文件&lt;/td&gt;
&lt;td style="text-align: left"&gt;合并小文件，调整分区数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;资源争抢&lt;/td&gt;
&lt;td style="text-align: left"&gt;高峰期所有任务都变慢&lt;/td&gt;
&lt;td style="text-align: left"&gt;队列隔离，关键任务优先&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Shuffle 过大&lt;/td&gt;
&lt;td style="text-align: left"&gt;网络 IO 成为瓶颈&lt;/td&gt;
&lt;td style="text-align: left"&gt;减少 Shuffle，用 Broadcast Join&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;元数据操作慢&lt;/td&gt;
&lt;td style="text-align: left"&gt;NameNode 响应延迟&lt;/td&gt;
&lt;td style="text-align: left"&gt;优化 HDFS 配置，增加 NN 内存&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="q怎么做灾备演练"&gt;&lt;a href="#q%e6%80%8e%e4%b9%88%e5%81%9a%e7%81%be%e5%a4%87%e6%bc%94%e7%bb%83" class="header-anchor"&gt;&lt;/a&gt;Q：怎么做灾备演练？
&lt;/h3&gt;&lt;p&gt;灾备演练不是做一次就行，需要定期进行。建议每季度做一次，覆盖以下场景：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;单节点故障&lt;/strong&gt;：随机关闭一个节点，验证服务自动迁移&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网络分区&lt;/strong&gt;：模拟两个机房之间的网络断开，验证各分区独立可用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据库主从切换&lt;/strong&gt;：手动触发主从切换，验证数据完整性和服务恢复时间&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;全量恢复&lt;/strong&gt;：从备份恢复整个系统，验证 RTO（恢复时间目标）和 RPO（恢复点目标）&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="部署不是终点"&gt;&lt;a href="#%e9%83%a8%e7%bd%b2%e4%b8%8d%e6%98%af%e7%bb%88%e7%82%b9" class="header-anchor"&gt;&lt;/a&gt;部署不是终点
&lt;/h2&gt;&lt;p&gt;私有化部署最大的误区是把它当成一个&amp;quot;项目&amp;quot;来做——部署完、验收完、交接完，就结束了。&lt;/p&gt;
&lt;p&gt;实际上，私有化部署是一个持续运营的过程。数据在增长，业务在变化，技术在演进，你的部署架构也需要跟着调整。&lt;/p&gt;
&lt;p&gt;一个好的私有化部署方案，不只是能&amp;quot;跑起来&amp;quot;，还要能&amp;quot;跑得久&amp;quot;——运维成本可控、扩展路径清晰、升级平滑无感。这才是真正的&amp;quot;全攻略&amp;quot;。&lt;/p&gt;</description></item></channel></rss>