多实例 MySQL 部署
多实例 MySQL 部署
多实例 MySQL(MySQL Multi-Instance)是指在一台物理服务器或虚拟机上,同时运行多个独立的 MySQL 服务进程。每个实例拥有独立的配置文件、数据目录、端口号、进程 ID(PID)文件和日志文件,逻辑上等同于多台独立的 MySQL 服务器,但共享底层硬件资源(CPU、内存、磁盘 I/O)。
一、核心概念:多实例的 “独立性” 与 “共享性”
多实例的本质是 “逻辑独立,物理共享”,其核心特征可拆解为两方面:
特征维度 | 具体表现 |
---|---|
独立性(逻辑) | 1. 独立端口(如 3306、3307、3308,避免端口冲突)2. 独立数据目录(各实例数据文件完全隔离,互不干扰)3. 独立配置文件(或单配置文件中的独立段,如[mysqld1] 、[mysqld2] )4. 独立进程(每个实例对应一个mysqld 进程)5. 独立权限体系(各实例的用户、权限、数据库完全独立)6. 独立日志(错误日志、慢查询日志、二进制日志等均分开存储) |
共享性(物理) | 1. 共享 CPU 资源(多实例竞争 CPU 核心)2. 共享内存(需手动分配各实例的innodb_buffer_pool_size 等内存参数,避免争抢)3. 共享磁盘 I/O(多实例读写同一磁盘时,I/O 密集型实例会影响其他实例性能)4. 共享操作系统资源(如文件句柄、进程数限制) |
二、多实例mysql部署
1. 部署yum源(配置国内镜像源,加速软件下载)
# 替换系统默认的yum源为阿里云CentOS 7镜像源,提高软件包下载速度
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
# 安装epel-release扩展源(提供额外的开源软件包)
yum -y install epel-release
2. 安装编译安装MySQL的工具包(安装依赖组件)
# 安装编译MySQL所需的工具和依赖库
# bzip2:压缩/解压工具;vim:文本编辑器;make:编译工具
# wget:下载工具;openssl-devel:加密相关开发库
# pcre-devel、expat-devel:正则表达式及XML解析库
# libtool:编译辅助工具;gcc/gcc-c++:C/C++编译器
# libxml2-devel:XML处理库;perl:脚本语言(MySQL部分脚本依赖)
# libncurses*:终端交互库;libaio:异步I/O库(MySQL性能依赖)
yum -y install bzip2 vim make wget openssl-devel pcre-devel expat-devel libtool gcc gcc-c++ libxml2-devel perl libncurses* libaio
3. 创建mysql用户(安全加固,避免使用root运行服务)
# 创建mysql用户组(-r:创建系统组)
groupadd -r mysql
# 创建mysql用户(-M:不创建家目录;-s /sbin/nologin:禁止登录系统;-g mysql:指定所属组)
# 目的:使用专用用户运行MySQL服务,降低权限风险
useradd -M -s /sbin/nologin mysql -g mysql
4. 配置MySQL(安装文件与数据目录准备)
# 解压MySQL安装包到/usr/local/(&>/dev/null:屏蔽输出信息)
# 注意:需提前下载mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz包
tar -zxvf mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz -C /usr/local/ &>/dev/null# 创建软链接,简化MySQL安装目录的访问路径(后续命令可直接使用/usr/local/mysql)
ln -s /usr/local/mysql-5.7.37-linux-glibc2.12-x86_64 /usr/local/mysql &>/dev/null# 创建3个实例的数据目录(3306/3307/3308对应端口号,便于区分)
mkdir -p /opt/data/{3306..3308}# 修改MySQL安装目录和数据目录的权限为mysql用户(确保服务有权访问)
chown -R mysql.mysql /usr/local/mysql
chown -R mysql.mysql /opt/data
5. 配置mysql变量环境(简化命令调用)
# 将MySQL的bin(命令目录)和lib(库目录)添加到系统环境变量PATH
# 这样可以直接使用mysql、mysqld等命令,无需输入完整路径
echo 'export PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH' >> /etc/profile# 使环境变量立即生效(无需重启系统)
source /etc/profile
6. 初始化数据库(生成实例初始文件)
# 初始化3306实例(--initialize-insecure:不生成随机密码,初始密码为空;--user:指定运行用户;--datadir:指定数据目录)
mysqld --initialize-insecure --user=mysql --datadir=/opt/data/3306
# 初始化3307实例
mysqld --initialize-insecure --user=mysql --datadir=/opt/data/3307
# 初始化3308实例
mysqld --initialize-insecure --user=mysql --datadir=/opt/data/3308# 创建MySQL头文件软链接(便于其他程序引用MySQL开发库)
ln -s /usr/local/mysql/include/ /usr/local/include/mysql &>/dev/null# 配置MySQL库文件路径(让系统能识别MySQL的动态链接库)
echo '/usr/local/mysql/lib'>/etc/ld.so.conf.d/mysql.conf
# 刷新系统动态链接库缓存
ldconfig
7. 编辑mysql配置文件(多实例核心配置)
# 创建/etc/my.cnf配置文件,定义多实例参数
cat > /etc/my.cnf << EOF
[mysqld_multi]
# 指定mysqld_safe(MySQL安全启动程序)路径
mysqld = /usr/local/mysql/bin/mysqld_safe
# 指定mysqladmin(MySQL管理工具)路径
mysqladmin = /usr/local/mysql/bin/mysqladmin# 3306实例配置
[mysqld3306]
basedir = /usr/local/mysql # MySQL安装目录
datadir = /opt/data/3306 # 数据目录
socket = /tmp/mysql3306.sock # 本地连接socket文件(唯一标识实例)
port = 3306 # 端口号
pid-file = /opt/data/3306/mysql_3306.pid # 进程ID文件
log-error = /var/log/3306.log # 错误日志文件# 3307实例配置(与3306类似,路径和端口唯一)
[mysqld3307]
basedir = /usr/local/mysql
datadir = /opt/data/3307
socket = /tmp/mysql3307.sock
port = 3307
pid-file = /opt/data/3307/mysql_3307.pid
log-error = /var/log/3307.log# 3308实例配置
[mysqld3308]
basedir = /usr/local/mysql
datadir = /opt/data/3308
socket = /tmp/mysql3308.sock
port = 3308
pid-file = /opt/data/3308/mysql_3308.pid
log-error = /var/log/3308.log
EOF
启动mysql服务(启动多实例)
# 通过mysqld_multi工具启动3306实例
mysqld_multi start 3306
# 启动3307实例
mysqld_multi start 3307
# 启动3308实例
mysqld_multi start 3308
设置数据库密码(初始化安全配置)
# 连接3306实例并设置root密码(-S:指定socket文件;-e:执行SQL命令;password(3edc4rfv):设置密码为3edc4rfv)
mysql -uroot -S /tmp/mysql3306.sock -e "set password=password('3edc4rfv')"
# 设置3307实例密码
mysql -uroot -S /tmp/mysql3307.sock -e "set password=password('3edc4rfv')"
# 设置3308实例密码
mysql -uroot -S /tmp/mysql3308.sock -e "set password=password('3edc4rfv')"
登入测试(验证多实例可用性)
# 连接3306实例测试(-p:指定密码;-S:指定socket文件)
[root@hrz1 ~]# mysql -uroot -p3edc4rfv -S /tmp/mysql3306.sock
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.37 MySQL Community Server (GPL)
...
mysql> quit; # 退出连接
Bye# 连接3307实例测试
[root@hrz1 ~]# mysql -uroot -p3edc4rfv -S /tmp/mysql3307.sock
...
mysql> quit;
Bye# 连接3308实例测试
[root@hrz1 ~]# mysql -uroot -p3edc4rfv -S /tmp/mysql3308.sock
...
mysql> quit
Bye