在数据库服务运行过程中,是可以存在多实例运行概念的,什么是数据库服务的多实例呢?

一般在一个系统环境中,可以运行多个相同的服务程序信息,并且产生不同的进程和网络端口信息,就可以称为多实例概念;

在数据库服务运行过程中,也可以启动多个数据库服务程序,产生多个数据库服务进程和不同的服务端口,形成多实例;

多个数据库服务实例信息中存储的数据库信息是相互隔离和独立的,并且利用数据库服务多实例可以实现测试与分布式架构需求;

企业数据库服务多实例应用架构设计:(主要用于支持多套业务场景)

Day001-数据库服务安装配置过程-图35

一、相同版本(8.0)的数据库服务多实例配置实现

环境准备

上传数据库程序软件包

[root@master ~]# cd /usr/local
[root@master local]# rz -y

解压数据库服务软件程序压缩包

[root@master local]# tar xf mysql-8.0.26-linux-glibc2.12-x86_64.tar.xz

创建数据库服务程序目录的软链接

[root@master local]# ln -s mysql-8.0.26-linux-glibc2.12-x86_64 mysql

配置数据库服务程序环境变量

末尾处添加如下内容

[root@master local]# vim /etc/profile
…
…
export PATH=/usr/local/mysql/bin:$PATH

验证

[root@master local]# tail -1 /etc/profile
export PATH=/usr/local/mysql/bin:$PATH

环境变量生效

[root@master local]# source /etc/profile

获取数据库服务版本信息

[root@master local]# mysql -V
mysql  Ver 8.0.26 for Linux on x86_64 (MySQL Community Server - GPL)

创建数据库服务管理用户信息

[root@master local]# useradd mysql

步骤一:多实例部署环境规划

实例信息编号 实例服务端口 实例存储路径 实例配置文件 套接字文件
mysql-01 端口信息:3307 /data/3307/data /data/3307/data/my.cnf /tmp/mysql3307.sock
mysql-02 端口信息:3308 /data/3308/data /data/3308/data/my.cnf /tmp/mysql3308.sock
mysql-03 端口信息:3309 /data/3309/data /data/3309/data/my.cnf /tmp/mysql3309.sock

步骤二:多实例部署环境准备

# 创建数据库多实例所需目录
[root@master ~]# mkdir -p /data/330{7..9}/data

# 授权数据库多实例所需权限
[root@master ~]# chown -R mysql. /data/*

步骤三:多实例初始数据信息

# 多实例初始化配置前调整操作
[root@master ~]# mv /etc/my.cnf /tmp

# 多实例初始化操作过程
[root@master ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3307/data
[root@master ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3308/data
[root@master ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3309/data

步骤四:多实例配置文件编写

[root@master ~]# vim /data/3307/data/my.cnf
[mysql]
socket=/tmp/mysql3307.sock
[mysqld]
user=mysql
port=3307
basedir=/usr/local/mysql
datadir=/data/3307/data
socket=/tmp/mysql3307.sock

[root@master ~]# vim /data/3308/data/my.cnf
[mysqld]
user=mysql
port=3308
basedir=/usr/local/mysql
datadir=/data/3308/data
socket=/tmp/mysql3308.sock

[root@master ~]# vim /data/3309/data/my.cnf
[mysqld]
user=mysql
port=3309
basedir=/usr/local/mysql
datadir=/data/3309/data
socket=/tmp/mysql3309.sock

步骤五:多实例服务运行启动

[root@master ~]# mysqld_safe --defaults-file=/data/3307/data/my.cnf &
[root@master ~]# mysqld_safe --defaults-file=/data/3308/data/my.cnf &
[root@master ~]# mysqld_safe --defaults-file=/data/3309/data/my.cnf &

步骤六:多实例服务端口查看

[root@master ~]# ss -lntup|grep mysqld
tcp    LISTEN     0      128    [::]:3306               [::]:*                   users:(("mysqld",pid=1643,fd=23))
tcp    LISTEN     0      128    [::]:3307               [::]:*                   users:(("mysqld",pid=2543,fd=22))
tcp    LISTEN     0      128    [::]:3308               [::]:*                   users:(("mysqld",pid=2715,fd=22))
tcp    LISTEN     0      128    [::]:3309               [::]:*                   users:(("mysqld",pid=2887,fd=22))
tcp    LISTEN     0      70     [::]:33060              [::]:*                   users:(("mysqld",pid=1643,fd=21))

步骤七:进入数据库

#常用方法
[root@master ~]# mysql -S /tmp/mysql3307.sock

#不常用方法
[root@master ~]# mysql --defaults-file=/data/3307/data/my.cnf

说明:使用这种方法需要提前在/data/3307/data/my.cnf文件中添加socket=/tmp/mysql3307.sock内容,要不然无法进入

通过端口验证当前所在实例

mysql> select @@port;
+--------+
| @@port |
+--------+
|   3307 |
+--------+
1 row in set (0.00 sec)

mysql> select @@port;
+--------+
| @@port |
+--------+
|   3308 |
+--------+
1 row in set (0.00 sec)

mysql> select @@port;
+--------+
| @@port |
+--------+
|   3309 |
+--------+
1 row in set (0.00 sec)

步骤八:实现数据库服务多实例被systemd管理

#编写配置文件
[root@master ~]# vim /etc/systemd/system/mysqld3307.service
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/data/3307/data/my.cnf
LimitNOFILE=5000

[root@master ~]# vim /etc/systemd/system/mysqld3308.service
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/data/3308/data/my.cnf
LimitNOFILE=5000

[root@master ~]# vim /etc/systemd/system/mysqld3309.service
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/data/3309/data/my.cnf
LimitNOFILE=5000

#依次启动多实例数据库
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl start mysqld3307
[root@master ~]# systemctl start mysqld3308
[root@master ~]# systemctl start mysqld3309

#验证
[root@master ~]# ss -lntup | grep mysql
tcp    LISTEN     0      70     [::]:33060              [::]:*                   users:(("mysqld",pid=5442,fd=21))
tcp    LISTEN     0      128    [::]:3307               [::]:*                   users:(("mysqld",pid=5442,fd=23))
tcp    LISTEN     0      128    [::]:3308               [::]:*                   users:(("mysqld",pid=5497,fd=21))
tcp    LISTEN     0      128    [::]:3309               [::]:*                   users:(("mysqld",pid=5548,fd=21))

二、不同版本(5.6、5.7、8.0)的数据库服务多实例配置实现

环境准备

上传5.6、5.7和8.0版本的数据库程序软件包

[root@master ~]# cd /usr/local
[root@master local]# rz -y

解压5.6、5.7和8.0版本的数据库服务软件程序压缩包

[root@master local]# tar xf mysql-5.6.48-linux-glibc2.12-x86_64.tar.gz
[root@master local]# tar xf mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz
[root@master local]# tar xf mysql-8.0.26-linux-glibc2.12-x86_64.tar.xz

创建数据库服务程序目录的软链接

[root@master local]# ln -s mysql-5.6.48-linux-glibc2.12-x86_64 mysql56
[root@master local]# ln -s mysql-5.7.30-linux-glibc2.12-x86_64 mysql57
[root@master local]# ln -s mysql-8.0.26-linux-glibc2.12-x86_64 mysql

步骤一:多实例部署环境规划

实例信息编号 实例服务端口 实例存储路径 实例配置文件 套接字文件
mysql-01 端口信息:3306 /data/3306/data /etc/my80.cnf /tmp/mysql3306.sock
mysql-02 端口信息:3356 /data/3356/data /etc/my56.cnf /tmp/mysql3356.sock
mysql-03 端口信息:3357 /data/3357/data /etc/my57.cnf /tmp/mysql3357.sock

步骤二:多实例部署环境准备(进行初始化操作)

# 创建数据库多实例所需目录
[root@master ~]# mkdir -p /data/3306/data
[root@master ~]# mkdir -p /data/335{6,7}/data

# 授权数据库多实例所需权限
[root@master ~]# chown -R mysql. /data/*

步骤三:多实例初始数据信息

# 多实例初始化配置前调整操作
[root@master ~]# mv /etc/my.cnf /tmp

# 多实例初始化操作过程
[root@master ~]# rm -rf /data/3356/data/*
[root@master ~]# rm -rf /data/3357/data/*
[root@master ~]# rm -rf /data/3306/data/*
[root@master ~]# /usr/local/mysql56/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql56/ --datadir=/data/3356/data/
[root@master ~]# /usr/local/mysql57/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql57/ --datadir=/data/3357/data/
[root@master ~]# /usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql/ --datadir=/data/3306/data/

步骤四:多实例配置文件编写

[root@master ~]# vim /etc/my56.cnf
[mysqld]
server_id=3356
port=3356
user=mysql
basedir=/usr/local/mysql56
datadir=/data/3356/data
socket=/tmp/mysql3356.sock
innodb_fast_shutdown=0

[root@master ~]# vim /etc/my57.cnf
[mysqld]
port=3357
server_id=3357
user=mysql
basedir=/usr/local/mysql57
datadir=/data/3357/data
socket=/tmp/mysql3357.sock
innodb_fast_shutdown=0

[root@master ~]# vim /etc/my80.cnf
[mysqld]
port=3306
server_id=3306
user=mysql
basedir=/usr/local/mysql
datadir=/data/3306/data
socket=/tmp/mysql3306.sock
innodb_fast_shutdown=0

步骤五:实现数据库服务多实例被systemd管理

#编写配置文件
[root@master ~]# vim /etc/systemd/system/mysqld56.service
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql56/bin/mysqld --defaults-file=/etc/my56.cnf
LimitNOFILE=5000

[root@master ~]# vim /etc/systemd/system/mysqld57.service
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql57/bin/mysqld --defaults-file=/etc/my57.cnf
LimitNOFILE=5000

[root@master ~]# vim /etc/systemd/system/mysqld.service
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my80.cnf
LimitNOFILE=5000

步骤六:多实例服务运行启动

[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl start mysqld56
[root@master ~]# systemctl start mysqld57
[root@master ~]# systemctl start mysqld

步骤七:多实例服务端口查看

[root@master ~]# ss -lntup|grep mysqld
tcp    LISTEN     0      70     [::]:33060              [::]:*                   users:(("mysqld",pid=3067,fd=21))
tcp    LISTEN     0      128    [::]:3306               [::]:*                   users:(("mysqld",pid=3067,fd=24))
tcp    LISTEN     0      80     [::]:3356               [::]:*                   users:(("mysqld",pid=3030,fd=10))
tcp    LISTEN     0      80     [::]:3357               [::]:*                   users:(("mysqld",pid=3187,fd=20))

步骤八:进入数据库

常用方法

#进入8.0版本
[root@master ~]# mysql -S /tmp/mysql3306.sock

#进入5.6版本
[root@master ~]# mysql -S /tmp/mysql3356.sock

#进入5.7版本
[root@master ~]# mysql -S /tmp/mysql3357.sock

不常用方法

#进入8.0版本
[root@master ~]# mysql --defaults-file=/etc/my80.cnf

#进入5.6版本
[root@master ~]# mysql --defaults-file=/etc/my56.cnf

#进入5.7版本
[root@master ~]# mysql --defaults-file=/etc/my57.cnf

说明:使用这种方法需要提前在/etc/my80.cnf文件中添加socket=/tmp/mysql3306.sock内容,要不然无法进入

通过端口验证当前所在实例

#进入8.0版本验证
mysql> select @@port;
+--------+
| @@port |
+--------+
|   3306 |
+--------+
1 row in set (0.00 sec)

#进入5.6版本验证
mysql> select @@port;
+--------+
| @@port |
+--------+
|   3356 |
+--------+
1 row in set (0.00 sec)

#进入5.7版本验证
mysql> select @@port;
+--------+
| @@port |
+--------+
|   3357 |
+--------+
1 row in set (0.00 sec)