
MySQL单机多实例部署两种实用方案
在数据库运维场景中,我们经常会遇到服务器硬件资源过剩,而业务又需要逻辑隔离的情况。此时,在单台物理机或虚拟机上部署多个MySQL实例,不仅能最大化利用服务器CPU、内存和磁盘I/O资源,还能有效节省硬件和运维成本。本文将详细介绍MySQL单机多实例部署的两种实用方案,帮助开发者根据实际业务场景灵活选择。
方案一:基于mysqld_multi的多实例部署
mysqld_multi是MySQL官方提供的管理多个MySQL实例的服务脚本。它的核心思想是在同一个配置文件(my.cnf)中,通过不同的段名(如[mysqld1]、[mysqld2])来区分各个实例的配置。这种方式配置集中,管理方便,适合中小规模的多实例需求。
1. 创建数据目录
为每个实例创建独立的数据目录、日志目录和运行目录,确保文件权限归属mysql用户。
mkdir -p /data/mysql/{3306,3307}/{data,logs,tmp}
chown -R mysql:mysql /data/mysql2. 编写配置文件
在/etc/my.cnf中配置多实例参数,需要注意端口、数据目录、Socket文件绝对不能冲突。
[mysqld_multi] mysqld = /usr/sbin/mysqld mysqladmin = /usr/bin/mysqladmin user = multi_admin password = multi_pass [mysqld1] port = 3306 datadir = /data/mysql/3306/data socket = /data/mysql/3306/mysql.sock pid-file = /data/mysql/3306/mysql.pid log-error = /data/mysql/3306/logs/error.log [mysqld2] port = 3307 datadir = /data/mysql/3307/data socket = /data/mysql/3307/mysql.sock pid-file = /data/mysql/3307/mysql.pid log-error = /data/mysql/3307/logs/error.log
3. 初始化数据库与启动
分别对两个实例进行数据库初始化,然后使用mysqld_multi进行统一管理。
# 初始化实例 mysqld --initialize-insecure --user=mysql --datadir=/data/mysql/3306/data mysqld --initialize-insecure --user=mysql --datadir=/data/mysql/3307/data # 启动所有实例 mysqld_multi start # 查看实例状态 mysqld_multi report
方案二:基于独立配置文件的多实例部署
虽然mysqld_multi配置集中,但在生产环境中,如果某个实例需要特殊调优,修改my.cnf时容易影响其他实例,存在误操作风险。基于独立配置文件的方案,让每个实例拥有完全独立的配置文件、启动脚本和Systemd服务,隔离性更强,是目前企业级生产环境更推荐的方案。
1. 规划目录与配置文件
目录规划与方案一相同,但配置文件各自独立存放。
mkdir -p /data/mysql/{3306,3307}/{data,logs,tmp,conf}
chown -R mysql:mysql /data/mysql2. 编写独立配置文件
为3306实例编写配置文件 /data/mysql/3306/conf/my.cnf(3307实例同理,修改对应端口和路径即可)。
[mysqld] user = mysql port = 3306 datadir = /data/mysql/3306/data socket = /data/mysql/3306/mysql.sock pid-file = /data/mysql/3306/mysql.pid log-error = /data/mysql/3306/logs/error.log innodb_buffer_pool_size = 1G
3. 配置Systemd服务管理
为每个实例创建独立的Systemd服务文件,实现开机自启和独立管理。创建 /usr/lib/systemd/system/mysqld@3306.service 文件。
[Unit] Description=MySQL Server 3306 After=network.target [Service] Type=forking User=mysql Group=mysql PIDFile=/data/mysql/3306/mysql.pid ExecStart=/usr/sbin/mysqld --defaults-file=/data/mysql/3306/conf/my.cnf --daemonize ExecStop=/usr/bin/mysqladmin -u root -S /data/mysql/3306/mysql.sock shutdown LimitNOFILE = 65535 Restart=on-failure [Install] WantedBy=multi-user.target
4. 初始化与启动
初始化数据后,通过Systemd加载并启动特定实例。
# 初始化 mysqld --defaults-file=/data/mysql/3306/conf/my.cnf --initialize-insecure --user=mysql # 重载系统服务 systemctl daemon-reload # 启动3306实例 systemctl start mysqld@3306 # 设置开机自启 systemctl enable mysqld@3306
方案对比与选型建议
两种方案各有优劣,具体选型可参考以下对比:
mysqld_multi方案:配置集中在一个文件中,结构清晰,适合实例数量较少(2-3个)、配置差异不大的测试或开发环境。缺点是各实例耦合度高,修改配置需谨慎,且无法直接通过systemctl管理单个实例的自启动状态。
独立配置文件方案:各实例完全解耦,配置独立,排错简单,可以针对不同业务进行深度参数调优。配合Systemd管理,启停操作符合Linux标准运维习惯。适合实例数量较多、对稳定性要求极高的生产环境。这也是目前主流互联网企业广泛采用的部署方式,更多运维规范可以参考 www.ipipp.com 提供的数据库架构标准。
在实际应用中,无论采用哪种方案,都需要注意服务器整体资源的分配,尤其是内存分配。多个实例同时运行时,务必确保所有实例的innodb_buffer_pool_size等内存参数总和不超过服务器物理内存的70%-80%,避免触发OOM导致实例被系统杀掉。同时,多实例共享磁盘I/O,在高负载场景下需关注IOPS瓶颈,必要时可绑定实例到不同的磁盘分区。