七万号·数据平台实战手记

Back

明朗北街七万号·数研工坊|扎根雄安新区中关村科技园,专注受限环境下软件搭建与数据平台落地


适用场景#

如果你属于以下任一种情况,这篇对你有用:

  • 内网环境需要部署数据平台的核心存储(关系型 + 缓存)
  • 一台机器上要同时跑 MySQL、PostgreSQL、Redis,内存分配纠结
  • 想搞清楚「业务库用 MySQL 还是 PG」「缓存什么时候上 Redis」
  • 部署完数据库被连接不上、权限不对、内存不足折磨

应用范围: 数据平台的存储底座。在整体架构里,这一层在 Nginx(请求入口)之下、数据引擎(Flink/Spark)之下,是所有应用的数据最终落脚点。第 8 篇的 Nginx 负责「请求怎么进来」,本篇负责「数据怎么存住」。


架构定位#

先看这张图,理解这三者在一套平台里的分工:

                    ┌─────────────┐
   用户请求  ──────► │   Nginx     │  ← 请求入口(第 8 篇)
                    └──────┬──────┘

                 ┌───────────────────┐
                 │   应用服务(微服务)  │
                 └───────┬───────────┘

          ┌──────────────┼──────────────┐
          ▼              ▼              ▼
   ┌──────────┐   ┌──────────┐   ┌──────────┐
   │  MySQL   │   │    PG    │   │  Redis   │
   │ 核心业务  │   │  复杂业务  │   │ 缓存/会话 │
   └──────────┘   └──────────┘   └──────────┘
     ← 存储底座:三根柱子 →
plaintext
组件定位典型数据
MySQL核心业务库用户、订单、配置等结构化数据
PostgreSQL复杂业务/JSON/地理数据需要高级类型、复杂查询的场景
Redis缓存/会话/队列热数据、登录态、计数器、发布订阅

一、问题#

数据平台跑起来,第一件事就是要有地方存数据。但内网环境装数据库,比想象中坑多:

mysql -h 127.0.0.1 -uroot -p
# ERROR 2002: Can't connect to local MySQL server
plaintext

或者是——

systemctl start mysqld
# 启动失败:Initialization of mysqld failed
plaintext

更常见的是——装是装上了,三四个数据库挤在一台机器上,内存互相抢,跑几天就开始卡。

二、约束#

  • 无公网,不能用包管理器在线装(openEuler 源里有部分,但不全)
  • 资源受限,可能多库共享一台机器
  • 需要满足安全合规(密码策略、最小权限、审计)
  • ARM 架构机器需要对应版本的安装包

三、先规划:内存怎么分#

多库共存的第一原则:先分内存,再装库。

假设一台 8G 内存的机器,要跑 MySQL + PG + Redis:

组件建议分配配置项
MySQL3Ginnodb_buffer_pool_size=2G + sort_buffer_size=32M
PostgreSQL2Gshared_buffers=1G + work_mem=64M
Redis1Gmaxmemory 1gb
系统余量2G

⚠️ 不设上限的后果:PG 的 work_mem 默认 4MB 但会被每个连接放大,MySQL 的 buffer pool 默认占内存 75%。多库共存,必须显式设置内存参数。

四、MySQL 部署#

4.1 安装#

内网环境下,推荐用 tar.gz 二进制包(不依赖系统包管理器,多版本可控):

# 外网下载(以 8.0.36 为例)
wget https://mirrors.tuna.tsinghua.edu.cn/mysql/downloads/MySQL-8.0/mysql-8.0.36-linux-glibc2.12-x86_64.tar.xz

# 内网解压
mkdir -p /usr/local/mysql
tar xJf mysql-8.0.36-linux-glibc2.12-x86_64.tar.xz -C /usr/local/mysql --strip-components=1
plaintext

4.2 初始化#

# 创建数据目录和用户
mkdir -p /data/mysql
useradd -r mysql

# 初始化数据目录
/usr/local/mysql/bin/mysqld --initialize-insecure \
    --basedir=/usr/local/mysql --datadir=/data/mysql \
    --user=mysql

# 启动
/usr/local/mysql/bin/mysqld --daemonize \
    --basedir=/usr/local/mysql --datadir=/data/mysql \
    --user=mysql
plaintext

4.3 初始化后必做三件事#

① 改 root 密码:

mysql -uroot
ALTER USER 'root'@'localhost' IDENTIFIED BY 'StrongPass!2026';
plaintext

② 建业务账号(最小权限):

CREATE USER 'app'@'%' IDENTIFIED BY 'AppPass!2026';
GRANT SELECT,INSERT,UPDATE,DELETE ON biz_db.* TO 'app'@'%';
plaintext

③ 配置 my.cnf(内存上限是关键):

# /etc/my.cnf
[mysqld]
port=3306
datadir=/data/mysql
innodb_buffer_pool_size=2G        # 上限,别超过物理内存 60%
max_connections=500
character-set-server=utf8mb4
plaintext

4.4 验证#

mysql -uapp -p -h 127.0.0.1 -P 3306 -e "SELECT 1"
plaintext

五、PostgreSQL 部署#

5.1 安装#

# 外网下载二进制包
wget https://mirrors.tuna.tsinghua.edu.cn/postgresql/source/v16.2/postgresql-16.2.tar.gz

# 内网编译(PG 编译比较简单,依赖少)
tar xzf postgresql-16.2.tar.gz
cd postgresql-16.2
./configure --prefix=/usr/local/pgsql
make -j$(nproc) && make install
plaintext

如果嫌编译慢,也可以直接用系统源 yum install postgresql-server(openEuler 源里有),但版本可能较旧。

5.2 初始化#

# PG 不允许 root 运行,必须切用户
useradd -r postgres
mkdir -p /data/pgsql
chown postgres:postgres /data/pgsql

su - postgres
/usr/local/pgsql/bin/initdb -D /data/pgsql
/usr/local/pgsql/bin/pg_ctl -D /data/pgsql -l /data/pgsql/log start
plaintext

5.3 配置 pg_hba.conf(连接权限)#

PG 的连接控制在这个文件里,内网环境常见配置:

# /data/pgsql/pg_hba.conf
# 本机
local   all   all                     trust
# 内网网段
host    all   all   192.168.1.0/24    md5
plaintext

改完重启生效:pg_ctl -D /data/pgsql reload

5.4 配置内存上限#

# /data/pgsql/postgresql.conf
shared_buffers = 1G
work_mem = 64MB
maintenance_work_mem = 256MB
plaintext

5.5 验证#

su - postgres -c "/usr/local/pgsql/bin/psql -c 'SELECT version();'"
plaintext

六、Redis 部署#

6.1 安装#

Redis 编译极快(纯 C,几十秒),推荐源码编译:

wget https://download.redis.io/releases/redis-7.2.4.tar.gz
tar xzf redis-7.2.4.tar.gz
cd redis-7.2.4
make -j$(nproc)
# 可选 make test(要几分钟)
make install
plaintext

6.2 配置#

# /etc/redis.conf
bind 0.0.0.0                    # 内网环境监听所有网卡
port 6379
daemonize yes
requirepass RedisPass!2026      # 必设密码!
maxmemory 1gb                   # 上限
maxmemory-policy allkeys-lru    # 淘汰策略
appendonly yes                  # AOF 持久化
plaintext

6.3 启动与验证#

redis-server /etc/redis.conf
redis-cli -a RedisPass!2026 ping
# PONG
plaintext

⚠️ 内网 Redis 也必须设密码。 曾见过内网 Redis 裸奔被挖矿的案例——内网不是绝对安全,扫描器无处不在。

七、三库对比与选型#

维度MySQLPostgreSQLRedis
定位通用关系库高级关系库内存缓存
JSON支持(8.0 后)优秀(jsonb)
复杂查询一般强(CTE/窗口函数)
地理数据强(PostGIS)
并发写一般较强极强
适合场景常规业务复杂业务/分析热点/会话/队列

选型口诀:

  • 常规业务 → MySQL
  • 复杂查询/JSON/地理 → PostgreSQL
  • 热点数据/登录态/计数器 → Redis
  • 不要为了「潮流」换库,内网环境稳定性 > 技术新鲜度

八、常见坑#

症状解决
MySQL 连不上ERROR 2002确认服务启动了,ss -tlnp 看端口
连接被拒ERROR 1130账号 host 是 localhost,改 'app'@'%'
PG 无法登录password authentication failedpg_hba.conf 的 md5 密码不匹配,重设
Redis 连上没权限NOAUTH客户端加密码参数
内存被吃光三库互相挤显式设置各自内存上限(第三节)
中文乱码数据存进去乱MySQL 统一 utf8mb4

九、总结#

存储底座部署的核心,其实就三个字:先规划。

先规划内存分配 → 再逐个安装 → 后设置上限与权限
plaintext
组件核心配置必做
MySQLinnodb_buffer_pool_size改密码 + 建最小权限账号
PGshared_buffers + pg_hba.conf非 root 运行 + 网段放行
Redismaxmemory + requirepass设密码 + 持久化

存住数据之后,下一步是给整个平台开一个统一的入口——Nginx。下一篇讲请求入口的部署与配置。


本文首发于掘金 · 作者:七万号 扎根雄安新区中关村科技园,专注受限环境下软件搭建与数据平台落地

Redis / MySQL / PostgreSQL 内网部署实录——存储底座的三根柱子
https://realcpf.tech/blog/airgapped-db-trio
Author 刘佳成
Published at 2026年8月1日