如何在一台服务器上配置多个数据库服务?

在一台服务器上配置多个数据库服务是常见的需求,通常用于隔离不同应用的数据、测试环境或优化性能。以下是几种主流方案及详细步骤:


一、常见方案对比

方案 适用场景 优点 缺点
多实例(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博客 » 如何在一台服务器上配置多个数据库服务?