MySQL多实例多共存环境部署详解

请注意,本文编写于 721 天前,最后修改于 644 天前,其中某些信息可能已经过时。

Linux系统下MySQL多实例多版本共存环境部署,同时运行多个MySQL数据库,MySQL5.7与MySQL8.0版本共存。每个MySQL数据库都具有独立的端口,独立的进程,及独立的目录和配置文件。

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: 3307port=3307
实例3: 3308port=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多实例环境已安装部署完成。
Comments

添加新评论