明朗北街七万号·数研工坊|扎根雄安新区中关村科技园,专注受限环境下软件搭建与数据平台落地
适用场景#
如果你属于以下任一种情况,这篇对你有用:
- 内网环境需要部署数据平台的核心存储(关系型 + 缓存)
- 一台机器上要同时跑 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 serverplaintext或者是——
systemctl start mysqld
# 启动失败:Initialization of mysqld failedplaintext更常见的是——装是装上了,三四个数据库挤在一台机器上,内存互相抢,跑几天就开始卡。
二、约束#
- 无公网,不能用包管理器在线装(openEuler 源里有部分,但不全)
- 资源受限,可能多库共享一台机器
- 需要满足安全合规(密码策略、最小权限、审计)
- ARM 架构机器需要对应版本的安装包
三、先规划:内存怎么分#
多库共存的第一原则:先分内存,再装库。
假设一台 8G 内存的机器,要跑 MySQL + PG + Redis:
| 组件 | 建议分配 | 配置项 |
|---|---|---|
| MySQL | 3G | innodb_buffer_pool_size=2G + sort_buffer_size=32M |
| PostgreSQL | 2G | shared_buffers=1G + work_mem=64M |
| Redis | 1G | maxmemory 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=1plaintext4.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=mysqlplaintext4.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=utf8mb4plaintext4.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 installplaintext如果嫌编译慢,也可以直接用系统源
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 startplaintext5.3 配置 pg_hba.conf(连接权限)#
PG 的连接控制在这个文件里,内网环境常见配置:
# /data/pgsql/pg_hba.conf
# 本机
local all all trust
# 内网网段
host all all 192.168.1.0/24 md5plaintext改完重启生效:pg_ctl -D /data/pgsql reload
5.4 配置内存上限#
# /data/pgsql/postgresql.conf
shared_buffers = 1G
work_mem = 64MB
maintenance_work_mem = 256MBplaintext5.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 installplaintext6.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 持久化plaintext6.3 启动与验证#
redis-server /etc/redis.conf
redis-cli -a RedisPass!2026 ping
# PONGplaintext⚠️ 内网 Redis 也必须设密码。 曾见过内网 Redis 裸奔被挖矿的案例——内网不是绝对安全,扫描器无处不在。
七、三库对比与选型#
| 维度 | MySQL | PostgreSQL | Redis |
|---|---|---|---|
| 定位 | 通用关系库 | 高级关系库 | 内存缓存 |
| JSON | 支持(8.0 后) | 优秀(jsonb) | — |
| 复杂查询 | 一般 | 强(CTE/窗口函数) | — |
| 地理数据 | 弱 | 强(PostGIS) | — |
| 并发写 | 一般 | 较强 | 极强 |
| 适合场景 | 常规业务 | 复杂业务/分析 | 热点/会话/队列 |
选型口诀:
- 常规业务 → MySQL
- 复杂查询/JSON/地理 → PostgreSQL
- 热点数据/登录态/计数器 → Redis
- 不要为了「潮流」换库,内网环境稳定性 > 技术新鲜度
八、常见坑#
| 坑 | 症状 | 解决 |
|---|---|---|
| MySQL 连不上 | ERROR 2002 | 确认服务启动了,ss -tlnp 看端口 |
| 连接被拒 | ERROR 1130 | 账号 host 是 localhost,改 'app'@'%' |
| PG 无法登录 | password authentication failed | pg_hba.conf 的 md5 密码不匹配,重设 |
| Redis 连上没权限 | NOAUTH | 客户端加密码参数 |
| 内存被吃光 | 三库互相挤 | 显式设置各自内存上限(第三节) |
| 中文乱码 | 数据存进去乱 | MySQL 统一 utf8mb4 |
九、总结#
存储底座部署的核心,其实就三个字:先规划。
先规划内存分配 → 再逐个安装 → 后设置上限与权限plaintext| 组件 | 核心配置 | 必做 |
|---|---|---|
| MySQL | innodb_buffer_pool_size | 改密码 + 建最小权限账号 |
| PG | shared_buffers + pg_hba.conf | 非 root 运行 + 网段放行 |
| Redis | maxmemory + requirepass | 设密码 + 持久化 |
存住数据之后,下一步是给整个平台开一个统一的入口——Nginx。下一篇讲请求入口的部署与配置。
本文首发于掘金 · 作者:七万号 扎根雄安新区中关村科技园,专注受限环境下软件搭建与数据平台落地