在一台服务器上配置多个数据库服务,核心在于资源隔离与端口/路径区分。只要确保每个实例监听不同的 TCP 端口、使用不同的数据目录和配置文件,即可实现共存。
以下是针对主流关系型数据库(MySQL/MariaDB)和 NoSQL 数据库(Redis/MongoDB)的具体实操方案,以及关键的注意事项。
一、 核心原则:三不重叠
- 端口不重叠:每个数据库实例必须绑定唯一的监听端口(如 MySQL 3306, 3307, 3308)。
- 数据目录不重叠:每个实例的数据文件存储在不同路径下,避免冲突或覆盖。
- 进程标识不重叠: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 6380dir /var/lib/redis/6380(需提前创建该目录)dbfilename dump_6380.rdblogfile "/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 中传入对应参数。
五、 关键注意事项与最佳实践
-
资源控制(Cgroups)
多实例共享 CPU、内存、I/O。若无限制,一个实例的慢查询或高负载可能拖垮其他实例。- Linux 可使用
systemd的MemoryMax=、CPUQuota=等参数限制单个服务资源。 - 例如在 MySQL 的 systemd 文件中添加:
MemoryMax=2G。
- Linux 可使用
-
网络防火墙
确保云服务器安全组或主机防火墙(iptables/firewalld)开放所有使用的端口(如 3306, 3307, 6380 等),否则远程连接失败。 -
备份策略差异化
每个实例应有独立的备份脚本,避免误操作影响全部数据。 -
监控告警
建议使用 Prometheus + Node Exporter + mysqld_exporter/redis_exporter 等工具,为每个实例单独采集指标,便于定位是哪个实例出现问题。 -
云厂商产品替代方案
如果业务规模较大,不建议自建多实例。国内云厂商(阿里云、腾讯云、华为云等)提供:- RDS 多可用区部署:高可用架构。
- 读写分离集群:自动分流。
- 容器化部署(Kubernetes):通过 Helm Chart 或 Operator 管理多个 Pod,每个 Pod 一个数据库实例,由 K8s 调度资源,更灵活且易于扩展。
总结
在一台服务器上配置多个数据库服务是可行的,但需严格遵循“端口+路径+配置”三隔离原则。对于小型项目或非核心业务,手动配置多实例成本低、效率高;但对于生产环境核心业务,强烈建议使用云数据库托管服务或 Kubernetes 容器化部署,以提升稳定性、安全性和运维效率。
CLOUD云枢