MySQL多实例管理

Posted 数据库知多少

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL多实例管理相关的知识,希望对你有一定的参考价值。

      现在MySQL数据库使用的场景越来越多,通常我们都是在每台配置不同的虚拟机上单独部署一套MySQL数据库来使用。如果是使用物理机,配置很高的情况下,我们通常会考虑部署多套实例的方式。

MySQL多实例就是在一台机器上开启多个不同的服务端口(如:3306,3307、3308),来运行多个MySQL服务进程,通过不同的socket监听不同的服务端口来提供不同的数据库服务。

数据库信息

Current user: root@localhost

Server version: 5.7.22 MySQL Community Server - GPL

Protocol version: 10

Connection:  Localhost via UNIX socket

MySQL多实例


多实例部署的方式主要有三种:

1. 使用多个配置文件启动不同的实例进程来实现多实例,这种方式的优点是逻辑简单,配置简单,缺点是管理起来不太方便;

2. 通过官方自带的mysqld_multi工具,使用单独的配置文件来实现多实例,这种方式的优点是管理起来很方便,集中管理;缺点是定制每个实例的配置不太方便;

3. 如果仅仅是用来做POC测试,也可以考虑使用dbdeployer工具来进行部署,这种方式的优点就是部署很简单,管理方便,缺点就是配置调整有点难度;


MySQL多实例的特点


1. 所有服务共享主机资源;

2. 当服务器资源有剩余时,可以充分利用剩余的资源提供更多的服务。

3. 当某个服务实例服务并发很高时或者开启慢查询时,会发生资源互相抢占问题,高负载实例会消耗更多的内存、CPU、磁盘IO资源,降低服务器上的其他实例的服务质量;


MySQL多实例部署注意事项


1. 配置文件的安装路径不能相同;

2. 数据库生成文件目录不能相同;

3. 数据库启动脚本不能同名;

4. 数据库启动端口号不能相同;

5. socket文件的生成路径不能相同;


方式一:多配置文件方式


配置环境变量:---所有操作均在mysql用户下

在.bash_profile文件中增加如下路径,其中,/mysql/base5722/bin是MySQL软件路径,配置完成后,即可直接使用MySQL相关命令,执行命令无须写全部路径。

PATH=/mysql/base5722/bin:$PATH

创建相关目录

1. 软件目录,官网下载二进制源码包解压后放在如下目录:

mkdir /mysql/base5722

2. 配置文件及日志目录

mkdir -p /mysql/my3310/log  /mysql/my3311/log /mysql/my3312/log

3. 创建数据文件和binlog目录

mkdir -p /mysqldata/my3310/{data,log,tmp}mkdir -p /mysqldata/my3311/{data,log,tmp}mkdir -p /mysqldata/my3312/{data,log,tmp}

4. 创建MySQL数据库配置文件,同理创建3311/3312的配置文件

vi /mysql/my3310/my.cnf[mysqld]datadir = /mysqldata/my3310/datasocket = /mysql/my3310/mysql.sockpid_file  = /mysql/my3310/mysql.pidlog_error = /mysql/my3310/log/error.logport      = 3310

5. 初始化 MySQL数据库

/mysql/base5722/bin/mysqld --defaults-file=/mysql/my3310/my.cnf --initialize
/mysql/base5722/bin/mysqld --defaults-file=/mysql/my3311/my.cnf --initialize
/mysql/base5722/bin/mysqld --defaults-file=/mysql/my3312/my.cnf --initialize

6. 记录临时密码(后面登录使用)

cat /mysql/my3310/log/error.log |grep pass----3310A temporary password is generated for root@localhost: Y!.B+#su2st>----3311A temporary password is generated for root@localhost: w#p/h(&lo5B*----3312A temporary password is generated for root@localhost: Gf0Kj5f3kX-s

7. 启动 MySQL实例

nohup /mysql/base5722/bin/mysqld_safe --defaults-file=/mysql/my3310/my.cnf &
nohup /mysql/base5722/bin/mysqld_safe --defaults-file=/mysql/my3311/my.cnf &
nohup /mysql/base5722/bin/mysqld_safe --defaults-file=/mysql/my3312/my.cnf &

8 . 查看MySQL进程

mysql@Tdongkf[12:43:57]:/mysql/my3311$ps -ef|grep mysqldmysql 98476 96640 0 12:40 pts/0 00:00:00 /bin/sh /mysql/base5722/bin/mysqld_safe --defaults-file=/mysql/my3310/my.cnfmysql 98609 98476 0 12:40 pts/0 00:00:00 /mysql/base5722/bin/mysqld --defaults-file=/mysql/my3310/my.cnf --basedir=/mysql/base5722 --datadir=/mysqldata/my3310/data --plugin-dir=/mysql/base5722/lib/plugin --log-error=/mysql/my3310/log/error.log --pid-file=/mysql/my3310/mysql.pid --socket=/mysql/my3310/mysql.sock --port=3310mysql 98637 96640 0 12:41 pts/0 00:00:00 /bin/sh /mysql/base5722/bin/mysqld_safe --defaults-file=/mysql/my3311/my.cnfmysql 98766 98637 0 12:41 pts/0 00:00:00 /mysql/base5722/bin/mysqld --defaults-file=/mysql/my3311/my.cnf --basedir=/mysql/base5722 --datadir=/mysqldata/my3311/data --plugin-dir=/mysql/base5722/lib/plugin --log-error=/mysql/my3311/log/error.log --pid-file=/mysql/my3311/mysql.pid --socket=/mysql/my3311/mysql.sock --port=3311mysql 98813 96640 0 12:41 pts/0 00:00:00 /bin/sh /mysql/base5722/bin/mysqld_safe --defaults-file=/mysql/my3312/my.cnfmysql     98942  98813  0 12:41 pts/0    00:00:00 /mysql/base5722/bin/mysqld --defaults-file=/mysql/my3312/my.cnf --basedir=/mysql/base5722 --datadir=/mysqldata/my3312/data --plugin-dir=/mysql/base5722/lib/plugin --log-error=/mysql/my3312/log/error.log --pid-file=/mysql/my3312/mysql.pid --socket=/mysql/my3312/mysql.sock --port=3312

可以看到三个MySQL实例都已经正常启动了。

由于默认的root用户密码是已经过期了,需要进行更改,我们连接三个数据库实例进行调整;

mysql@Tdongkf[12:43:10]:/mysql/my3311$mysql -uroot -p --socket=/mysql/my3311/mysql.sockEnter password: (前面记录的临时密码)root@MYSQL:[DB((none))]>alter user root@'localhost' identified by 'root1234';

至此,多配置文件的方式我们就介绍完毕了。

我们将三个实例进行关闭:

shutdown;
方式二:mysqld_multi多实例管理


mysqld_multi:是用于管理多实例的一个脚本集。

mysqld_multi会读取配置文件中的[mysqld_multi]、[mysqld]、[mysqldN],N是一个整数,建议用端口号表示,该部分配置会覆盖[mysqld]部分中的配置。

[mysqld] 通用的参数配置

[mysqldN] 针对特定实例的参数配置

1. 复制mysqld_multi文件到init.d目录,用操作系统root用户执行:

cp /mysql/base5722/support-files/mysqld_multi.server /etc/init.d/mysqld_multidchkconfig mysqld_multid on

2. 创建/etc/my.cnf,在这里,我们将三个实例的配置信息都写在了my.cnf文件里,根据不同的端口号做了区分:

[mysqld]character_set_server = utf8mb4collation_server = utf8mb4_binbasedir = /mysql/base5722
[mysqld_multi]log = /mysql/multi/log/mysql_multi.log
[mysqld3310]mysqld = /mysql/base5722/bin/mysqld_safemysqladmin = /mysql/base5722/bin/mysqladmindatadir = /mysqldata/my3310/datasocket = /mysql/my3310/mysql.sockpid_file = /mysql/my3310/mysql.pidlog_error = /mysql/my3310/log/error.logport = 3310
[mysqld3311]mysqld = /mysql/base5722/bin/mysqld_safemysqladmin = /mysql/base5722/bin/mysqladmindatadir = /mysqldata/my3311/datasocket = /mysql/my3311/mysql.sockpid_file = /mysql/my3311/mysql.pidlog_error = /mysql/my3311/log/error.logport = 3311
[mysqld3312]mysqld = /mysql/base5722/bin/mysqld_safemysqladmin = /mysql/base5722/bin/mysqladmindatadir = /mysqldata/my3312/datasocket = /mysql/my3312/mysql.sockpid_file = /mysql/my3312/mysql.pidlog_error = /mysql/my3312/log/error.logport = 3312

由于还是刚才的三个数据库,我们在此就不再重新初始化了。

3. 我们直接执行mysqld_multi report命令来查看下:

mysql@Tdongkf[13:01:49]:/mysql$mysqld_multi reportReporting MySQL serversMySQL server from group: mysqld3310 is not runningMySQL server from group: mysqld3311 is not runningMySQL server from group: mysqld3312 is not running

mysqld_multi已经识别出来三个MySQL数据库了,下面我们通过mysqld_multi提供的命令来管理数据库实例:

4. 启动3310实例

mysql@Tdongkf[13:03:15]:/mysql$mysqld_multi start 3310

5. 再来看下report的状态:

mysql@Tdongkf[13:03:21]:/mysql$mysqld_multi reportReporting MySQL serversMySQL server from group: mysqld3310 is runningMySQL server from group: mysqld3311 is not runningMySQL server from group: mysqld3312 is not running

6. 3310已经启动了,其它两个还没有启动,我们都启动下:

mysql@Tdongkf[13:03:32]:/mysql$mysqld_multi start

7. report命令已经显示三个实例都启动了,操作系统上MySQL进程也都有了。

mysql@Tdongkf[13:04:14]:/mysql$mysqld_multi reportReporting MySQL serversMySQL server from group: mysqld3310 is runningMySQL server from group: mysqld3311 is runningMySQL server from group: mysqld3312 is runningmysql@Tdongkf[13:04:17]:/mysql$mysql@Tdongkf[13:04:17]:/mysql$ps -ef|grep mysqld |grep 331mysql 99911 1 0 13:03 pts/0 00:00:00 /bin/sh /mysql/base5722/bin/mysqld_safe --datadir=/mysqldata/my3310/data --socket=/mysql/my3310/mysql.sock --pid_file=/mysql/my3310/mysql.pid --log_error=/mysql/my3310/log/error.log --port=3310mysql 100076 99911 0 13:03 pts/0 00:00:00 /mysql/base5722/bin/mysqld --basedir=/mysql/base5722 --datadir=/mysqldata/my3310/data --plugin-dir=/mysql/base5722/lib/plugin --log-error=/mysql/my3310/log/error.log --pid-file=/mysql/my3310/mysql.pid --socket=/mysql/my3310/mysql.sock --port=3310mysql 100156 1 0 13:04 pts/0 00:00:00 /bin/sh /mysql/base5722/bin/mysqld_safe --datadir=/mysqldata/my3311/data --socket=/mysql/my3311/mysql.sock --pid_file=/mysql/my3311/mysql.pid --log_error=/mysql/my3311/log/error.log --port=3311mysql 100175 1 0 13:04 pts/0 00:00:00 /bin/sh /mysql/base5722/bin/mysqld_safe --datadir=/mysqldata/my3312/data --socket=/mysql/my3312/mysql.sock --pid_file=/mysql/my3312/mysql.pid --log_error=/mysql/my3312/log/error.log --port=3312mysql 100630 100156 3 13:04 pts/0 00:00:00 /mysql/base5722/bin/mysqld --basedir=/mysql/base5722 --datadir=/mysqldata/my3311/data --plugin-dir=/mysql/base5722/lib/plugin --log-error=/mysql/my3311/log/error.log --pid-file=/mysql/my3311/mysql.pid --socket=/mysql/my3311/mysql.sock --port=3311mysql    100631 100175  3 13:04 pts/0    00:00:00 /mysql/base5722/bin/mysqld --basedir=/mysql/base5722 --datadir=/mysqldata/my3312/data --plugin-dir=/mysql/base5722/lib/plugin --log-error=/mysql/my3312/log/error.log --pid-file=/mysql/my3312/mysql.pid --socket=/mysql/my3312/mysql.sock --port=3312

8. 但是,此时如果我们关闭数据库是不成功的:

mysql@Tdongkf[13:15:45]:~$mysqld_multi stopmysql@Tdongkf[13:15:50]:~$mysql@Tdongkf[13:15:51]:~$mysql@Tdongkf[13:15:51]:~$mysqld_multi reportReporting MySQL serversMySQL server from group: mysqld3310 is runningMySQL server from group: mysqld3311 is runningMySQL server from group: mysqld3312 is running

执行完关闭命令,可实例状态还是显示正在运行中,我们看下mysqld_multi的日志:

mysqladmin: connect to server at 'localhost' failederror: 'Access denied for user 'root'@'localhost' (using password: NO)'mysqladmin: connect to server at 'localhost' failederror: 'Access denied for user 'root'@'localhost' (using password: NO)'mysqladmin: connect to server at 'localhost' failederror: 'Access denied for user 'root'@'localhost' (using password: NO)'mysqld_multi log file version 2.16; run: Thu Feb 18 13:15:54 2021

用户连接报错,那看来就是跟用户密码有关系了,我们在配置中增加用户信息:

mysqld_multi]user = rootpass = root1234log  = /mysql/multi/log/mysql_multi.log

再来关闭下:

mysql@Tdongkf[13:47:11]:~$mysqld_multi stop

查看数据库实例状态:

mysql@Tdongkf[13:47:15]:~$mysqld_multi reportReporting MySQL serversMySQL server from group: mysqld3310 is not runningMySQL server from group: mysqld3311 is not runningMySQL server from group: mysqld3312 is not running

这次数据库正常停止了,操作系统上进程也不存在了。

如果每个实例的自定义参数列表特别多的话,可以考虑在配置文件中使用defaults-file参数,将参数都独立出来。

defaults-file = /mysql/my3306/my.cnf


mysqld_multi进行多实例管理命令

   

启动全部实例:

mysqld_multi start

停止全部实例:

mysqld_multi stop

查看全部实例状态:

mysqld_multi report

启动单个实例:

mysqld_multi start 3310 

停止单个实例:

mysqld_multi stop 3311

查看单个实例状态:

mysqld_multi report 3312

至此,通过mysqld_multi方式进行多实例管理就介绍完了。


方式三:dbdeployer 


dbdeployer 是一款十分强大的数据库测试环境部署工具,可实现一键部署不同架构、不同版本的数据库环境。是和 MySQL SandBox 类似的工具

如:MySQL 主从复制、GTID 模式、MySQL 组复制(单主模式、多主模式等)、多源复制等完整的数据库类型支持及版本,并且部署MySQL环境都是秒级别(10-30秒,和实例数量有关),使用起来很方便,还有各种管理命令该工具不建议在生产环境使用

该工具的详细使用我们以后的文章再介绍。


总结 



我们介绍了三种常见的MySQL数据库多实例部署的方式,如果需要在使用中部署多实例的方式,我们建议使用官方的mysqld_multi方式进行多实例的管理,运维工作更加方便

=end=

以上是关于MySQL多实例管理的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 多实例管理

技术分享 | 利用systemd管理MySQL单机多实例

mysql体系结构服务组成连接管理多实例部署

MySQL单机多实例配置实战

MySQL多实例部署

MySQL多实例部署