暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL多实例管理

数据库知多少 2021-04-26
952
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/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#p/h(&lo5B*
                    ----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_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进行多实例管理命令

                                                             

                                                          启动全部实例:

                                                            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=

                                                                      文章转载自数据库知多少,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                                                      评论