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
多实例部署的方式主要有三种:
1. 使用多个配置文件启动不同的实例进程来实现多实例,这种方式的优点是逻辑简单,配置简单,缺点是管理起来不太方便;
2. 通过官方自带的mysqld_multi工具,使用单独的配置文件来实现多实例,这种方式的优点是管理起来很方便,集中管理;缺点是定制每个实例的配置不太方便;
3. 如果仅仅是用来做POC测试,也可以考虑使用dbdeployer工具来进行部署,这种方式的优点就是部署很简单,管理方便,缺点就是配置调整有点难度;
1. 所有服务共享主机资源;
2. 当服务器资源有剩余时,可以充分利用剩余的资源提供更多的服务。
3. 当某个服务实例服务并发很高时或者开启慢查询时,会发生资源互相抢占问题,高负载实例会消耗更多的内存、CPU、磁盘IO资源,降低服务器上的其他实例的服务质量;
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/data
socket = /mysql/my3310/mysql.sock
pid_file = /mysql/my3310/mysql.pid
log_error = /mysql/my3310/log/error.log
port = 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
----3310:
A temporary password is generated for root@localhost: Y!.B+#su2st>
----3311:
A temporary password is generated for root@localhost: w
----3312:
A 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 mysqld
mysql 98476 96640 0 12:40 pts/0 00:00:00 /bin/sh /mysql/base5722/bin/mysqld_safe --defaults-file=/mysql/my3310/my.cnf
mysql 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=3310
mysql 98637 96640 0 12:41 pts/0 00:00:00 /bin/sh /mysql/base5722/bin/mysqld_safe --defaults-file=/mysql/my3311/my.cnf
mysql 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=3311
mysql 98813 96640 0 12:41 pts/0 00:00:00 /bin/sh /mysql/base5722/bin/mysqld_safe --defaults-file=/mysql/my3312/my.cnf
mysql 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.sock
Enter password: (前面记录的临时密码)
root@MYSQL:[DB((none))]>alter user root@'localhost' identified by 'root1234';
至此,多配置文件的方式我们就介绍完毕了。
我们将三个实例进行关闭:
shutdown;
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_multid
chkconfig mysqld_multid on
2. 创建/etc/my.cnf,在这里,我们将三个实例的配置信息都写在了my.cnf文件里,根据不同的端口号做了区分:
[mysqld]
character_set_server = utf8mb4
collation_server = utf8mb4_bin
basedir = /mysql/base5722
[mysqld_multi]
log = /mysql/multi/log/mysql_multi.log
[mysqld3310]
mysqld = /mysql/base5722/bin/mysqld_safe
mysqladmin = /mysql/base5722/bin/mysqladmin
datadir = /mysqldata/my3310/data
socket = /mysql/my3310/mysql.sock
pid_file = /mysql/my3310/mysql.pid
log_error = /mysql/my3310/log/error.log
port = 3310
[mysqld3311]
mysqld = /mysql/base5722/bin/mysqld_safe
mysqladmin = /mysql/base5722/bin/mysqladmin
datadir = /mysqldata/my3311/data
socket = /mysql/my3311/mysql.sock
pid_file = /mysql/my3311/mysql.pid
log_error = /mysql/my3311/log/error.log
port = 3311
[mysqld3312]
mysqld = /mysql/base5722/bin/mysqld_safe
mysqladmin = /mysql/base5722/bin/mysqladmin
datadir = /mysqldata/my3312/data
socket = /mysql/my3312/mysql.sock
pid_file = /mysql/my3312/mysql.pid
log_error = /mysql/my3312/log/error.log
port = 3312
由于还是刚才的三个数据库,我们在此就不再重新初始化了。
3. 我们直接执行mysqld_multi report命令来查看下:
mysql@Tdongkf[13:01:49]:/mysql$mysqld_multi report
Reporting MySQL servers
MySQL server from group: mysqld3310 is not running
MySQL server from group: mysqld3311 is not running
MySQL 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 report
Reporting MySQL servers
MySQL server from group: mysqld3310 is running
MySQL server from group: mysqld3311 is not running
MySQL 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 report
Reporting MySQL servers
MySQL server from group: mysqld3310 is running
MySQL server from group: mysqld3311 is running
MySQL server from group: mysqld3312 is running
mysql@Tdongkf[13:04:17]:/mysql$
mysql@Tdongkf[13:04:17]:/mysql$ps -ef|grep mysqld |grep 331
mysql 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=3310
mysql 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=3310
mysql 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=3311
mysql 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=3312
mysql 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=3311
mysql 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 stop
mysql@Tdongkf[13:15:50]:~$
mysql@Tdongkf[13:15:51]:~$
mysql@Tdongkf[13:15:51]:~$mysqld_multi report
Reporting MySQL servers
MySQL server from group: mysqld3310 is running
MySQL server from group: mysqld3311 is running
MySQL server from group: mysqld3312 is running
执行完关闭命令,可实例状态还是显示正在运行中,我们看下mysqld_multi的日志:
mysqladmin: connect to server at 'localhost' failed
error: 'Access denied for user 'root'@'localhost' (using password: NO)'
mysqladmin: connect to server at 'localhost' failed
error: 'Access denied for user 'root'@'localhost' (using password: NO)'
mysqladmin: connect to server at 'localhost' failed
error: '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 = root
pass = root1234
log = /mysql/multi/log/mysql_multi.log
再来关闭下:
mysql@Tdongkf[13:47:11]:~$mysqld_multi stop
查看数据库实例状态:
mysql@Tdongkf[13:47:15]:~$mysqld_multi report
Reporting MySQL servers
MySQL server from group: mysqld3310 is not running
MySQL server from group: mysqld3311 is not running
MySQL server from group: mysqld3312 is not running
这次数据库正常停止了,操作系统上进程也不存在了。
如果每个实例的自定义参数列表特别多的话,可以考虑在配置文件中使用defaults-file参数,将参数都独立出来。
defaults-file = /mysql/my3306/my.cnf
启动全部实例:
mysqld_multi start
停止全部实例:
mysqld_multi stop
查看全部实例状态:
mysqld_multi report
启动单个实例:
mysqld_multi start 3310
停止单个实例:
mysqld_multi stop 3311
查看单个实例状态:
mysqld_multi report 3312
至此,通过mysqld_multi方式进行多实例管理就介绍完了。
dbdeployer 是一款十分强大的数据库测试环境部署工具,可实现一键部署不同架构、不同版本的数据库环境。是和 MySQL SandBox 类似的工具
如:MySQL 主从复制、GTID 模式、MySQL 组复制(单主模式、多主模式等)、多源复制等完整的数据库类型支持及版本,并且部署MySQL环境都是秒级别(10-30秒,和实例数量有关),使用起来很方便,还有各种管理命令,该工具不建议在生产环境使用。
该工具的详细使用我们以后的文章再介绍。
我们介绍了三种常见的MySQL数据库多实例部署的方式,如果需要在使用中部署多实例的方式,我们建议使用官方的mysqld_multi方式进行多实例的管理,运维工作更加方便;
完
=end=
以上是关于MySQL多实例管理的主要内容,如果未能解决你的问题,请参考以下文章