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

在一台服务器上配置多个数据库服务,核心在于资源隔离与端口/路径区分。只要确保每个实例监听不同的 TCP 端口、使用不同的数据目录和配置文件,即可实现共存。

以下是针对主流关系型数据库(MySQL/MariaDB)和 NoSQL 数据库(Redis/MongoDB)的具体实操方案,以及关键的注意事项。

一、 核心原则:三不重叠

  1. 端口不重叠:每个数据库实例必须绑定唯一的监听端口(如 MySQL 3306, 3307, 3308)。
  2. 数据目录不重叠:每个实例的数据文件存储在不同路径下,避免冲突或覆盖。
  3. 进程标识不重叠:PID 文件、Socket 文件等运行时标识需独立。

二、 以 MySQL 为例的多实例部署

MySQL 官方推荐使用 mysqld_multi 工具或 systemd 多实例管理方式。这里推荐更现代、易管理的 systemd + 独立配置文件 方式。

步骤 1:创建独立的目录结构

为每个实例创建专属的数据目录、日志目录和配置文件目录。

# 假设我们要部署两个 MySQL 实例:mysql_3306 和 mysql_3307

# 创建目录
sudo mkdir -p /data/mysql_3306/{data,log,conf,tmp}
sudo mkdir -p /data/mysql_3307/{data,log,conf,tmp}

# 设置权限(假设运行用户为 mysql)
sudo chown -R mysql:mysql /data/mysql_*

步骤 2:初始化数据库

分别对每个数据目录进行初始化。

# 初始化第一个实例
sudo mysqld --initialize-insecure --user=mysql --datadir=/data/mysql_3306/data --basedir=/usr

# 初始化第二个实例
sudo mysqld --initialize-insecure --user=mysql --datadir=/data/mysql_3307/data --basedir=/usr

注:--initialize-insecure 表示 root 无密码,生产环境建议去掉此参数并记录临时密码。

步骤 3:编写独立配置文件

每个实例必须有独立的 .cnf 配置文件。

/data/mysql_3306/conf/my.cnf:

[mysqld]
port=3306
datadir=/data/mysql_3306/data
socket=/data/mysql_3306/tmp/mysql.sock
pid-file=/data/mysql_3306/tmp/mysqld.pid
log-error=/data/mysql_3306/log/error.log
user=mysql
bind-address=0.0.0.0

[client]
port=3306
socket=/data/mysql_3306/tmp/mysql.sock

/data/mysql_3307/conf/my.cnf:

[mysqld]
port=3307
datadir=/data/mysql_3307/data
socket=/data/mysql_3307/tmp/mysql.sock
pid-file=/data/mysql_3307/tmp/mysqld.pid
log-error=/data/mysql_3307/log/error.log
user=mysql
bind-address=0.0.0.0

[client]
port=3307
socket=/data/mysql_3307/tmp/mysql.sock

步骤 4:配置 Systemd 服务单元

为了让系统能统一管理这些实例,创建对应的 service 文件。

/etc/systemd/system/mysql@.service (模板服务):

[Unit]
Description=MySQL Server Instance %i
After=network.target

[Service]
Type=forking
User=mysql
Group=mysql
ExecStart=/usr/sbin/mysqld --defaults-file=/data/mysql_%i/conf/my.cnf
ExecStop=/usr/bin/mysqladmin --defaults-file=/data/mysql_%i/conf/my.cnf shutdown
Restart=on-failure
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target

启动命令示例:

# 重载 systemd
sudo systemctl daemon-reload

# 启动特定实例(%i 会被替换为实例名,如 3306)
sudo systemctl start mysql@3306.service
sudo systemctl start mysql@3307.service

# 设置开机自启
sudo systemctl enable mysql@3306.service
sudo systemctl enable mysql@3307.service

验证是否成功:

netstat -tlnp | grep mysql
# 应看到 3306 和 3307 端口均处于 LISTEN 状态

三、 Redis 多实例部署

Redis 配置相对简单,主要依靠修改端口和数据目录。

步骤 1:复制配置模板

cp /etc/redis/redis.conf /etc/redis/redis_6380.conf
cp /etc/redis/redis.conf /etc/redis/redis_6381.conf

步骤 2:修改关键参数

编辑 redis_6380.conf:

  • port 6380
  • dir /var/lib/redis/6380 (需提前创建该目录)
  • dbfilename dump_6380.rdb
  • logfile "/var/log/redis/redis_6380.log"
  • pidfile /var/run/redis/redis_6380.pid

同理修改 redis_6381.conf,将端口改为 6381,文件名相应调整。

步骤 3:创建 Systemd 服务

类似 MySQL,创建 /etc/systemd/system/redis@.service:

[Service]
ExecStart=/usr/bin/redis-server /etc/redis/redis_%i.conf
ExecStop=/usr/bin/redis-cli -p %i shutdown

启动:

sudo systemctl start redis@6380
sudo systemctl start redis@6381

四、 MongoDB 多实例部署

MongoDB 默认单实例,但可通过不同端口和 data/db 路径实现多实例。

步骤 1:创建目录

mkdir -p /data/mongodb_27017 /data/mongodb_27018
chown -R mongod:mongod /data/mongodb_*

步骤 2:启动命令指定参数

可以直接通过命令行启动多个 mongod 进程:

# 实例 1
mongod --port 27017 --dbpath /data/mongodb_27017 --logpath /var/log/mongodb/mongod_27017.log --fork

# 实例 2
mongod --port 27018 --dbpath /data/mongodb_27018 --logpath /var/log/mongodb/mongod_27018.log --fork

若需持久化管理,同样可编写 systemd service 文件,在 ExecStart 中传入对应参数。


五、 关键注意事项与最佳实践

  1. 资源控制(Cgroups)
    多实例共享 CPU、内存、I/O。若无限制,一个实例的慢查询或高负载可能拖垮其他实例。

    • Linux 可使用 systemd 的 MemoryMax=、CPUQuota= 等参数限制单个服务资源。
    • 例如在 MySQL 的 systemd 文件中添加:MemoryMax=2G。
  2. 网络防火墙
    确保云服务器安全组或主机防火墙(iptables/firewalld)开放所有使用的端口(如 3306, 3307, 6380 等),否则远程连接失败。

  3. 备份策略差异化
    每个实例应有独立的备份脚本,避免误操作影响全部数据。

  4. 监控告警
    建议使用 Prometheus + Node Exporter + mysqld_exporter/redis_exporter 等工具,为每个实例单独采集指标,便于定位是哪个实例出现问题。

  5. 云厂商产品替代方案
    如果业务规模较大,不建议自建多实例。国内云厂商(阿里云、腾讯云、华为云等)提供:

    • RDS 多可用区部署:高可用架构。
    • 读写分离集群:自动分流。
    • 容器化部署(Kubernetes):通过 Helm Chart 或 Operator 管理多个 Pod,每个 Pod 一个数据库实例,由 K8s 调度资源,更灵活且易于扩展。

总结

在一台服务器上配置多个数据库服务是可行的,但需严格遵循“端口+路径+配置”三隔离原则。对于小型项目或非核心业务,手动配置多实例成本低、效率高;但对于生产环境核心业务,强烈建议使用云数据库托管服务或 Kubernetes 容器化部署,以提升稳定性、安全性和运维效率。

未经允许不得转载:CLOUD云枢 » 如何在一台服务器上配置多个数据库服务?