MySQL多实例简介
- 什么是MySQL多实例?
即在同一个系统环境下,运行有多个MySQL服务,如同时运行MySQL双版本/多版本。
MySQL多实例-优点
- 可以有效利用服务器资源,可以充分利用剩余资源提供更多的服务,且可以实现资源的逻辑隔离。
- 节约成本,且还可以用到主从复制等技术。
MySQL多实例-缺点
- 会存在资源互相抢占的问题,当某个数据库实例并发很高或查询较慢时,会大量消耗系统的CPU,磁盘I/O等资源;导致服务器其它数据库实例服务质量一起下降。
多实例适用于哪些场景?
- 资金紧张的公司
- 用户访问量不大的业务
MySQL多实例安装
部署系统环境:CentOS 7.6
MySQL版本:MySQL 5.7 Community
每个实例均为相同的MySQL版本,当然也可以5.7和8.0共存。
每个实例都有单独的:配置文件
,启动脚本
,数据目录
。
基于一个MySQL应用,初始化三次,生产3个独立的MySQL数据目录,即为三个MySQL独立的实例。
获取MySQL二进制包代码
# 从阿里云镜像站下载MySQL二进制安装包
wget https://mirrors.aliyun.com/mysql/MySQL-5.7/mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz
# 解压二进制包, -C 指定解压缩的目录
tar zxvf mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz -C /application/
安装MySQL运行所需的基础依赖包
# RHEL/Centos
yum install ncurses-devel libaio-devel gcc make cmake -y
# Debian/Ubuntu
sudo apt install ncurses-devel libaio-devel gcc make cmake -y
旧版本环境清理
# 清空PATH有关的mysql
echo $PATH
netstat -tunlp |grep mysql # 查看MySQL服务运行状态
/etc/init.d/mysqld stop # 停止MySQL服务
创建MySQL用户
id mysql # 查看当前系统是否存在该用户,没有则创建
useradd mysql # 创建账户:mysql
创建MySQL多实例目录
mkdir -p /my_mysql/{3306|3307|3308} # 创建三个实例目录,路径及名称可自定义
mkdir -p /my_mysql/{3306|3307|3308}/data # 在实例目录下分别创建data/ 数据目录
创建多实例-配置文件
在三个数据目录下创建/my_mysql/{3306/3307/3308}/my.cnf
文件并写入以下对应的配置信息:
vim /my_mysql/3306/my.cnf # 创建实例1配置文件
vim /my_mysql/3307/my.cnf # 创建实例2配置文件
vim /my_mysql/3308/my.cnf # 创建实例3配置文件
:set paste # 开启vim粘贴模式,即可直接粘贴到vim编辑窗口中
实例1: 3306的配置文件
# my_mysql/3306/my.cnf
[client]
[mysqld]
port=3306 #端口不能重复
socket=/my_mysql/3306/mysql.socket
basedir=/application/mysql-5.7.37-linux-glibc2.12-x86_64/ # 以实际目录路径为准
datadir=/my_mysql/3306/data
log-bin=/my_mysql/3306/mysql-bin
server-id=1 #不同实例id不能重复
[mysql_safe]
log-error=/my_mysql/3306/mysql_3306_error.log
pid-file=/my_mysql/3306/mysql_3306.pid
实例2: 3307的配置文件
# my_mysql/3307/my.cnf
[client]
[mysqld]
port=3307
socket=/my_mysql/3307/mysql.socket
basedir=/application/mysql-5.7.37-linux-glibc2.12-x86_64/ # 以实际目录路径为准
datadir=/my_mysql/3307/data
log-bin=/my_mysql/3307/mysql-bin
server-id=2
[mysql_safe]
log-error=/my_mysql/3307/mysql_3307_error.log
pid-file=/my_mysql/3307/mysql_3307.pid
实例3: 3308的配置文件
# my_mysql/3308/my.cnf
[client]
[mysqld]
port=3308
socket=/my_mysql/3308/mysql.socket
basedir=/application/mysql-5.7.37-linux-glibc2.12-x86_64/ # 以实际目录路径为准
datadir=/my_mysql/3308/data
log-bin=/my_mysql/3308/mysql-bin
server-id=3
[mysql_safe]
log-error=/my_mysql/3308/mysql_3308_error.log
pid-file=/my_mysql/3308/mysql_3308.pid
编辑初始化启停脚本
port=3306
mysql_user="mysql"
Cmdpath="/application/mysql-5.7.37-linux-glibc2.12-x86_64/bin" #路径根据实际版本填写
mysql_sock="/my_mysql/${port}/mysql.sock"
mysql_pid_file_path=/my_mysql/${port}/mysqld_${port}.pid
start(){
if [ ! -e "$mysql_sock" ];then
printf "Starting MySQL...\n"
/bin/sh ${Cmdpath}/mysqld_safe --default-file=/my_mysql/${port}/my.cnf --pid-file=$mysqld_pid_file_path 2>&1 > /dev/null &
sleep 3 # linux系统下, sleep单位是秒,Windows下是毫秒
else
printf "MySQL is running...\n"
exit 1
fi
}
stop(){
if [ ! -e "$mysql_sock" ];then
printf "MySQL is stopped...\n"
exit 1
else
printf "Stoping MySQL...\n"
mysqld_pid=`cat "$mysqld_pid_file_path"`
if (kill -0 $mysqld_pid 2>/dev/null)
then
kill $mysqld_pid
sleep 2
fi
fi
}
restart(){
printf "Restarting MySQL...\n"
stop
sleep 2
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
prinf "Usage: /data/${port}/mysql{start|stop|restart}\n"
esac
实例2和实例3的启停脚本,只需要更改各自启停脚本首行 port=3307|3308
对应的端口即可。
实例 | 端口 |
---|---|
实例2: 3307 | port=3307 |
实例3: 3308 | port=3308 |
为脚本添加执行权限:
chmod +x /my_mysql/3306/my.cnf # 不指定用户对象,即默认所有用户都添加执行权限
用户,组授权管理
因为所有实例的启停管理脚本都是Linux系统用户创建的,所以为了权限划分,方便安全管理,全部脚本都会将文件所有者变更为之前创建的用户:mysql
。
# 将所属用户及用户组变更为:mysql
chown -R mysql.mysql /my_mysql/
PATH配置
vim /etc/profile # 此文件的环境变量是 系统全局的,对所有用户生效。
命令模式下按G
键跳转到最后一行,摁o
键光标在下一行进入插入编辑模式,在文件末行添加:
export PATH=/application/mysql-5.7.37-linux-glibc2.12-x86_64/bin/:$PATH
如果忘记了MySQL安装在哪,可以用which
查找下,找到安装目录下/bin/的绝对路径,再添加进去:
which mysql
添加完成后,需使其生效,如下两种方法:
#A 注销退出,重新登陆终端
logout
#B source读取
source /etc/profile
MySQL多实例初始化
在创建数据目录之前,譬如实例1/my_mysql/3306/data/
数据文件夹是为空的,没有任何文件及数据。
ls /my_mysql/3306/data/ # 可以查看到该目录文件夹为空
以实例1为例 进行数据初始化,生产mysql运行所需的初始数据:
/application/mysql-5.7.37-linux-glibc2.12-x86_64/scripts/mysql_install_db --default-file=/my_mysql/3306/my.cnf --basedir=/application/mysql-5.7-xxxx-x86_64 --datadir=/my_mysql/3306/data/ --user=mysql
mysql-5.7-xxxx.x86_64
请根据实际目录填写。用
mysql_install_db
脚本进行初始化,添加默认的配置文件
my.cnf
添加默认的数据目录
/data/
添加默认的用户
mysql
执行后,出现两个OK
,表示正常初始化。可以检查下数据目录:
ls /my_mysql/3306/data/ # 可以查看到该目录文件夹为空
实例2 3307和实例3 3308的初始化,只需要将初始化脚本内容中的,配置文件路径和数据路径更改成对应的即可。3306对应3306的配置文件,3307对应3307 的数据目录,依此类推,不做多赘述。如实例2 3307初始化:
/application/mysql-5.7.37-linux-glibc2.12-x86_64/scripts/mysql_install_db --default-file=/my_mysql/3307/my.cnf --basedir=/application/mysql-5.7.37-linux-glibc2.12-x86_64 --datadir=/my_mysql/3307/data/ --user=mysql
启动MySQL数据库实例
所有多实例初始化完成后,现在开始启动数据库实例:
/my_mysql/3306/mysql_3306 start
/my_mysql/3307/mysql_3307 start
/my_mysql/3308/mysql_3308 start
查看监听的网络服务进程
netstat -tunlp
# 可以看到不同端口3306~3308的mysqld服务已经启动
登录MySQL实例
这里可以使用Socket套接字服务登录MySQL,多个实例可以多个终端窗口登录:
# 登录实例1 3306
mysql -S /my_mysql/3306/mysql.sock
# 登录其余实例
mysql -S /my_mysql/3307/mysql.sock
mysql -S /my_mysql/3308/mysql.sock
总结
- 如果想多版本共存,把其中的某个实例版本更换成MySQL8.0版本,方法是一样的,只是改改配置信息参数即可。
- 当你在操作实例1的数据库时,实例2等其它MySQL实例的数据均不会受影响,因为它们都有独立的端口,独立的进程,及独立的目录和配置文件。
- 也可以选择用MySQL源码安装,然后再配置多实例,看个人选择。至此,MySQL多实例环境已安装部署完成。