在一台服务器上配置多个数据库服务是常见的需求,通常用于隔离不同应用的数据、测试环境或优化性能。以下是几种主流方案及详细步骤:
一、常见方案对比
| 方案 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 多实例(Multi-Instance) | 同种数据库多个独立实例 | 资源隔离好、管理清晰 | 占用更多系统资源 |
| 同一实例多数据库 | 轻量级隔离 | 资源利用率高、配置简单 | 无进程级隔离,故障影响范围大 |
| 容器化部署(Docker/K8s) | 现代云原生架构 | 隔离性强、易扩展、版本灵活 | 需要容器运行时支持 |
| 虚拟机/物理机隔离 | 高安全要求、合规场景 | 完全隔离 | 资源开销大、成本高 |
✅ 推荐:大多数场景下,多实例或容器化是最佳选择。
二、以 MySQL 为例的多实例配置
方案1:MySQL 多实例(使用不同端口和数据目录)
1. 创建多个数据目录
sudo mkdir -p /var/lib/mysql2 /var/lib/mysql3
sudo chown -R mysql:mysql /var/lib/mysql2 /var/lib/mysql3
sudo chmod 750 /var/lib/mysql2 /var/lib/mysql3
2. 为每个实例创建配置文件
/etc/my.cnf.d/multi-instance.cnf
[mysqld_multi]
mysqld = /usr/bin/mysqld_safe
mysqladmin = /usr/bin/mysqladmin
user = admin
password = your_password
[mysqld3306]
port = 3306
socket = /var/lib/mysql/mysql.sock
datadir = /var/lib/mysql
pid-file = /var/run/mysqld/mysqld.pid
[mysqld3307]
port = 3307
socket = /var/lib/mysql2/mysql.sock
datadir = /var/lib/mysql2
pid-file = /var/run/mysqld/mysqld3307.pid
user = mysql
[mysqld3308]
port = 3308
socket = /var/lib/mysql3/mysql.sock
datadir = /var/lib/mysql3
pid-file = /var/run/mysqld/mysqld3308.pid
user = mysql
3. 初始化新实例
# 初始化第二个实例
mysqld --initialize-insecure --user=mysql --datadir=/var/lib/mysql2
# 初始化第三个实例
mysqld --initialize-insecure --user=mysql --datadir=/var/lib/mysql3
4. 启动所有实例
# 启动指定实例
mysqld_multi start 3307
mysqld_multi start 3308
# 或启动所有实例
mysqld_multi start
# 查看状态
mysqld_multi report
5. 设置 root 密码(可选但推荐)
mysql -u root -S /var/lib/mysql2/mysql.sock
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
FLUSH PRIVILEGES;
方案2:使用 Docker 容器化部署(更推荐)
1. 安装 Docker
sudo apt update && sudo apt install docker.io docker-compose -y
sudo systemctl enable --now docker
2. 创建 docker-compose.yml
version: '3.8'
services:
mysql-primary:
image: mysql:8.0
container_name: mysql-primary
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: primary_root_pass
MYSQL_DATABASE: app_db
volumes:
- mysql_primary_data:/var/lib/mysql
restart: unless-stopped
mysql-secondary:
image: mysql:8.0
container_name: mysql-secondary
ports:
- "3307:3306"
environment:
MYSQL_ROOT_PASSWORD: secondary_root_pass
MYSQL_DATABASE: test_db
volumes:
- mysql_secondary_data:/var/lib/mysql
restart: unless-stopped
volumes:
mysql_primary_data:
mysql_secondary_data:
3. 启动服务
docker compose up -d
# 验证
docker ps
mysql -h 127.0.0.1 -P 3306 -u root -p
mysql -h 127.0.0.1 -P 3307 -u root -p
优势:
- 完全隔离(进程、文件系统、网络)
- 易于备份、迁移、版本升级
- 可轻松扩展到 Kubernetes
三、PostgreSQL 多实例配置
方案1:使用 pg_ctlcluster(Debian/Ubuntu)
# 创建新集群
sudo pg_createcluster 14 data2 --start
sudo pg_createcluster 14 data3 --start
# 查看集群列表
pg_lsclusters
# 停止/启动特定集群
sudo pg_ctlcluster 14 data2 stop
sudo pg_ctlcluster 14 data2 start
方案2:手动多实例
# 创建数据目录
mkdir -p /var/lib/postgresql/14/data2 /var/lib/postgresql/14/data3
# 初始化
sudo -u postgres initdb -D /var/lib/postgresql/14/data2
sudo -u postgres initdb -D /var/lib/postgresql/14/data3
# 修改 postgresql.conf 和 pg_hba.conf(分别设置不同 port)
# 启动
sudo -u postgres pg_ctl -D /var/lib/postgresql/14/data2 start
sudo -u postgres pg_ctl -D /var/lib/postgresql/14/data3 start
四、MongoDB 多实例配置
# mongod-config1.yaml
storage:
dbPath: /data/db1
net:
port: 27017
systemLog:
destination: file
path: /var/log/mongodb/mongod1.log
# mongod-config2.yaml
storage:
dbPath: /data/db2
net:
port: 27018
systemLog:
destination: file
path: /var/log/mongodb/mongod2.log
mongod --config /etc/mongod-config1.yaml &
mongod --config /etc/mongod-config2.yaml &
五、关键注意事项
1. 资源规划
- 监控 CPU、内存、磁盘 I/O
- 确保每个实例有足够资源(建议至少 1GB RAM/实例)
- 使用 cgroups/systemd 限制资源
2. 网络安全
- 防火墙仅开放必要端口
- 禁用远程 root 登录
- 使用强密码 + SSL/TLS 加密连接
3. 备份策略
- 每个实例独立备份
- 自动化备份脚本 + 异地存储
4. 监控告警
- 使用 Prometheus + Grafana 监控各实例指标
- 配置告警规则(CPU > 80%、连接数过多等)
5. 权限最小化
- 每个应用使用独立数据库用户
- 遵循最小权限原则
六、快速决策指南
是否需要严格隔离?
├── 是 → 使用 Docker/Kubernetes 或 VM
└── 否 → 是否同种数据库?
├── 是 → 多实例配置(MySQL Multi-Instance / PostgreSQL Clusters)
└── 否 → 各自独立安装,注意端口冲突和资源分配
如需针对特定数据库(如 Redis、Elasticsearch、SQL Server 等)或多数据库混合部署的详细步骤,请提供具体需求,我可以给出更精准的方案。
ECLOUD博客