zoukankan      html  css  js  c++  java
  • Ubuntu上MySQL多实例部署

    Ubuntu 18.04

    MySQL 5.7.21

    ---

    MySQL多实例 即在 一台计算机中运行多个MySQL服务器,不同服务器通过不同端口区分,这样可以充分利用服务器的资源。

    按照 参考文档4 的说法,有三种方式实现 MySQL多实例:

    1)一个实例一个配置文件

    2)多个实例共享一个配置文件

    使用mysqld_multi

    3)使用MYSQLMANAGER——实例管理器

    三种方式各自优缺点,请看 参考文档4

    本文介绍在Ubuntu上使用上面的 方式2 实现MySQL多实例部署。来自博客园

    说明,本文的MySQL使用apt-get安装:

    sudo apt-get install mysql-server mysql-client

    安装后,mysqld命令位于 /usr/sbin,而其它 mysql命令位于 /usr/bin,默认配置文件位于 /etc/mysql:

    /etc/mysql目录结构
    ben@ben-VirtualBox:/etc/mysql$ tree
    .
    ├── conf.d
    │   ├── mysql.cnf
    │   └── mysqldump.cnf
    ├── debian.cnf
    ├── debian-start
        // 这里的 my.cnf 包含了 同级的 conf.d、mysql.conf.d 文件夹下的配置
    ├── my.cnf -> /etc/alternatives/my.cnf
    ├── my.cnf.fallback
    ├── mysql.cnf
    └── mysql.conf.d
        ├── mysqld.cnf
        ├── mysqld_safe_syslog.cnf

    MySQL服务安装后,放了一个 名为mysq的脚本 l到 /etc/init.d/ 目录中,服务启动的秘密全在这里——使用了哪些命令、使用了哪些配置。

    安装后,系统自动建立了用户mysql、用户组mysql。来自博客园

    >>开始...

    默认的配置文件中,有一个名为 [mysqld] 的区段(/etc/mysql/mysql.conf.d/mysqld.cnf 中),其包含了默认的MySQL服务器(实例)的配置信息。

    注意其中的 pid-file、socket、datadir 等配置,本文部署时踩到了一些坑——和权限有关。

    在 家目录下,建立新的配置文件 trymulti.cnf:来自博客园

    注意配置文件中的 /data/mysql/、/var/lib/mysql2/、/var/log/mysql/等目录

    [mysqld_multi]
    # 实际使用 mysqld_safe脚本启动
    mysqld = /usr/bin/mysqld_safe
    # 管理实例命令
    mysqladmin = /usr/bin/mysqladmin
    
    # 实例1-端口3307
    [mysqld3307]
    datadir = /data/mysql/replica01
    port = 3307
    socket = /tmp/mysqld3307.sock
    pid-file = /var/lib/mysql2/mysqld3307.pid
    log-error = /var/log/mysql/mysql3307.log
    user=mysql
    
    # 实例2-端口3308
    [mysqld3308]
    datadir = /data/mysql/replica02
    port = 3308
    socket = /tmp/mysqld3308.sock
    pid-file = /var/lib/mysql2/mysqld3308.pid
    log-error = /var/log/mysql/mysql3308.log
    user=mysql

    将新建配置文件的拥有者改为mysql:来自博客园

    # 用户ben的家目录下 新建
    ben@ben-VirtualBox:~$ vim trymulti.cnf
    # 查看
    ben@ben-VirtualBox:~$ ls -l trymulti.cnf
    -rw-rw-r-- 1 ben ben 444 9月   9 16:19 trymulti.cnf
    ben@ben-VirtualBox:~$
    # 改拥有者及组为 mysql
    ben@ben-VirtualBox:~$ sudo chown mysql:mysql trymulti.cnf
    [sudo] password for ben:
    ben@ben-VirtualBox:~$
    ben@ben-VirtualBox:~$ ls -l trymulti.cnf
    -rw-rw-r-- 1 mysql mysql 444 9月   9 16:19 trymulti.cnf
    

    初始化服务器的数据目录(datadir,要和 已有的MySQL实例 分开):

    # 非安全insecure
    sudo ./mysqld  --initialize-insecure --explicit_defaults_for_timestamp --datadir=/var/lib/mysql-replica01
    sudo ./mysqld  --initialize-insecure --explicit_defaults_for_timestamp --datadir=/var/lib/mysql-replica02

    踩到坑了

    执行上面的命令时,出现了下面的一些异常信息,导致 初始化数据目录失败

    即使把 /data/mysql/ 目录的 拥有者改为 mysql:mysql 也不行。来自博客园

    $ sudo mysqld --initialize-insecure --explicit_defaults_for_timestamp --datadir=/data/mysql/replica01
    mysqld: Can't create directory '/data/mysql/replica01/' (Errcode: 13 - Permission denied)
    2021-09-09T02:57:38.865764Z 0 [ERROR] Aborting

    看了 参考文档5 才解决了问题:

    使用 journalctl -xe 查看日志:

    9月 09 10:34:30 ben-VirtualBox kernel: audit: type=1400 audit(1631154870.248:88): apparmor="DENIED" operation="mkdir" profile="/usr/sbin/mysqld" name="/data/mysql/replica01/" pid=4993 c
    9月 09 10:34:30 ben-VirtualBox audit[4993]: AVC apparmor="DENIED" operation="mkdir" profile="/usr/sbin/mysqld" name="/data/mysql/replica01/" pid=4993 comm="mysqld" requested_mask="c" de

    意思是 mysqld命令 操作 数据目录 /data/mysql/replica01 的权限不足,被拒绝了。

    解决方法就是:修改服务 apparmor 中 mysqld的配置——usr.sbin.mysqld文件疑问,apparmor是什么?有什么用?第一次注意到

    ben@ben-VirtualBox:/etc/apparmor.d$ ls -l | grep mysql
    -rw-r--r-- 1 root root  1668 9月   9 15:03 usr.sbin.mysqld

    修改:2行,每行末尾都需要添加 英文逗号!来自博客园

      /data/mysql/ rw,
      /data/mysql/** rwk,
    

    在解决上面的问题前,执行 mysqld --initialize-insecure 不会在 /data/mysql目录下建立任何文件。

    解决后,生成了数据目录 /data/mysql/replica01、/data/mysql/replica02,但是,又提示错误(坑)了。此时,按照 参考文档5 的介绍,将新建的 数据目录 的拥有者改为 mysql即可:

    sudo chown mysql:mysql /var/lib/mysql-replica0*
    
    ben@ben-VirtualBox:/etc/apparmor.d$ ls -l /data/mysql/
    total 8
    drwxr-x--- 5 mysql mysql 4096 9月   9 15:04 replica01
    drwxr-x--- 5 mysql mysql 4096 9月   9 15:04 replica02
    ben@ben-VirtualBox:/etc/apparmor.d$
    ben@ben-VirtualBox:/etc/apparmor.d$ sudo ls -l /data//mysql/replica01
    total 122908
    -rw-r----- 1 mysql mysql       56 9月   9 11:18 auto.cnf
    -rw-r----- 1 mysql mysql      420 9月   9 11:18 ib_buffer_pool
    -rw-r----- 1 mysql mysql 12582912 9月   9 15:04 ibdata1
    -rw-r----- 1 mysql mysql 50331648 9月   9 15:04 ib_logfile0
    -rw-r----- 1 mysql mysql 50331648 9月   9 11:18 ib_logfile1
    -rw-r----- 1 mysql mysql 12582912 9月   9 15:10 ibtmp1
    drwxr-x--- 2 mysql mysql     4096 9月   9 11:18 mysql
    drwxr-x--- 2 mysql mysql     4096 9月   9 11:18 performance_schema
    drwxr-x--- 2 mysql mysql    12288 9月   9 11:18 sys
    

    可以看到,数据目录下生成了一些文件。

    就这样,数据目录初始化的坑踩完了

    一切就绪了吗?那就使用 mysqld_multi 脚本来启动多实例吧——预期是2个实例都启动成功。

    但是,失败了...

    一切都和权限有关系。来自博客园

    解决措施:

    1)pid-file 的权限

    /var/lib/mysql2目录及其下的文件:

    # 这的权限应该给太多了
    执行 sudo chmod 777 /var/lib/mysql2/
    
    ben@ben-VirtualBox:~$ ls -l /var/lib/ | grep mysql2
    drwxrwxrwx  2 mysql         mysql         4096 9月   9 16:59 mysql2
    ben@ben-VirtualBox:~$
    ben@ben-VirtualBox:~$
    ben@ben-VirtualBox:~$ ls -l /var/lib/mysql2/ | grep mysql
    -rw-r----- 1 mysql mysql 6 9月   9 16:59 mysqld3307.pid
    -rw-r----- 1 mysql mysql 6 9月   9 16:59 mysqld3308.pid
    

    还需要修改 /etc/apparmor.d/usr.sbin.mysqld文件:

      /var/lib/mysql2/ rw,
      /var/lib/mysql2/** rwk,

    pid-file部分的修改完毕。

    2)log-error 的权限

    /var/log/mysql/ 的权限:

    疑问:来自博客园

    这里有个 adm用户组不清楚是干啥的,admin 管理员 缩写?TODO

    接下来,执行 mysqld_multi脚本 启动多实例MySQL:

    # 为什么要用 sudo?
    # mysqld_multi --help 可以看到脚本的帮助信息
    # start 后面无参数 启动 配置文件中的 所有实例
    ben@ben-VirtualBox:~$ sudo mysqld_multi --defaults-file=/home/ben/trymulti.cnf --no-log start
    mysqld_multi log file version 2.16; run: Wide character in print at /usr/bin/mysqld_multi line 160.
    四 9月  9 16:59:23 2021
    
    Starting MySQL servers
    ben@ben-VirtualBox:~$ 2021-09-09T08:59:23.363309Z mysqld_safe Logging to syslog.
    2021-09-09T08:59:23.362861Z mysqld_safe Logging to syslog.
    2021-09-09T08:59:23.375880Z mysqld_safe Logging to '/var/log/mysql/mysql3307.log'.
    2021-09-09T08:59:23.375519Z mysqld_safe Logging to '/var/log/mysql/mysql3308.log'.
    2021-09-09T08:59:23.433185Z mysqld_safe Starting mysqld daemon with databases from /data/mysql/replica02
    2021-09-09T08:59:23.432528Z mysqld_safe Starting mysqld daemon with databases from /data/mysql/replica01
    
    # 启动成功,但是,多了两个 用户为root的进程——使用mysqld_safe,
    # 然后才是用户为 mysql使用mysqld启动的进行
    ben@ben-VirtualBox:~$
    ben@ben-VirtualBox:~$ ps -ef | grep mysql
    mysql     1035     1  0 14:23 ?        00:00:08 /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid
    root     10521     1  0 16:59 pts/1    00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/data/mysql/replica01 --port=3307 --socket=/tmp/mysqld3307.sock --pid-file=/var/lib/mysql2/mysqld3307.pid --log-error=/var/log/mysql/mysql3307.log --user=mysql
    root     10527     1  0 16:59 pts/1    00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/data/mysql/replica02 --port=3308 --socket=/tmp/mysqld3308.sock --pid-file=/var/lib/mysql2/mysqld3308.pid --log-error=/var/log/mysql/mysql3308.log --user=mysql
    mysql    10829 10527  2 16:59 pts/1    00:00:00 /usr/sbin/mysqld --basedir=/usr --datadir=/data/mysql/replica02 --plugin-dir=/usr/lib/mysql/plugin --user=mysql --log-error=/var/log/mysql/mysql3308.log --pid-file=/var/lib/mysql2/mysqld3308.pid --socket=/tmp/mysqld3308.sock --port=3308 --log-syslog=1 --log-syslog-facility=daemon --log-syslog-tag=
    mysql    10830 10521  2 16:59 pts/1    00:00:00 /usr/sbin/mysqld --basedir=/usr --datadir=/data/mysql/replica01 --plugin-dir=/usr/lib/mysql/plugin --user=mysql --log-error=/var/log/mysql/mysql3307.log --pid-file=/var/lib/mysql2/mysqld3307.pid --socket=/tmp/mysqld3307.sock --port=3307 --log-syslog=1 --log-syslog-facility=daemon --log-syslog-tag=
    ben      10888  3247  0 16:59 pts/1    00:00:00 grep --color=auto mysql
    ben@ben-VirtualBox:~$
    
    # report检查服务是否运行(最开始测试时,一直是 is not running,好烦啊,现在是 is running了,太棒了!)
    ben@ben-VirtualBox:/var/log$ mysqld_multi --defaults-file=/home/ben/trymulti.cnf report
    WARNING: Log file disabled. Maybe directory or file isn't writable?
    mysqld_multi log file version 2.16; run: Wide character in print at /usr/bin/mysqld_multi line 160.
    四 9月  9 17:15:35 2021
    Reporting MySQL servers
    MySQL server from group: mysqld3307 is running
    MySQL server from group: mysqld3308 is running
    ben@ben-VirtualBox:/var/log$

    更多:停止——单个、多个或所有、重启操作

    停止重启等操作
    ben@ben-VirtualBox:/var/log$ sudo mysqld_multi --defaults-file=/home/ben/trymulti.cnf --no-log stop 3307
    [sudo] password for ben:
    mysqld_multi log file version 2.16; run: Wide character in print at /usr/bin/mysqld_multi line 160.
    四 9月  9 17:18:20 2021
    
    Stopping MySQL servers
    ben@ben-VirtualBox:/var/log$
    ben@ben-VirtualBox:/var/log$ 2021-09-09T09:18:24.404660Z mysqld_safe mysqld from pid file /var/lib/mysql2/mysqld3307.pid ended
    
    ben@ben-VirtualBox:/var/log$ mysqld_multi --defaults-file=/home/ben/trymulti.cnf report
    WARNING: Log file disabled. Maybe directory or file isn't writable?
    mysqld_multi log file version 2.16; run: Wide character in print at /usr/bin/mysqld_multi line 160.
    四 9月  9 17:18:36 2021
    Reporting MySQL servers
    MySQL server from group: mysqld3307 is not running
    MySQL server from group: mysqld3308 is running
    ben@ben-VirtualBox:/var/log$
    ben@ben-VirtualBox:/var/log$
    ben@ben-VirtualBox:/var/log$ sudo mysqld_multi --defaults-file=/home/ben/trymulti.cnf --no-log stop 3308
    mysqld_multi log file version 2.16; run: Wide character in print at /usr/bin/mysqld_multi line 160.
    四 9月  9 17:18:42 2021
    
    Stopping MySQL servers
    ben@ben-VirtualBox:/var/log$ 2021-09-09T09:18:45.494643Z mysqld_safe mysqld from pid file /var/lib/mysql2/mysqld3308.pid ended
    
    ben@ben-VirtualBox:/var/log$
    ben@ben-VirtualBox:/var/log$ mysqld_multi --defaults-file=/home/ben/trymulti.cnf report
    WARNING: Log file disabled. Maybe directory or file isn't writable?
    mysqld_multi log file version 2.16; run: Wide character in print at /usr/bin/mysqld_multi line 160.
    四 9月  9 17:18:52 2021
    Reporting MySQL servers
    MySQL server from group: mysqld3307 is not running
    MySQL server from group: mysqld3308 is not running
    ben@ben-VirtualBox:/var/log$
    ben@ben-VirtualBox:/var/log$
    ben@ben-VirtualBox:/var/log$ sudo mysqld_multi --defaults-file=/home/ben/trymulti.cnf --no-log start
    mysqld_multi log file version 2.16; run: Wide character in print at /usr/bin/mysqld_multi line 160.
    四 9月  9 17:19:01 2021
    
    Starting MySQL servers
    ben@ben-VirtualBox:/var/log$ 2021-09-09T09:19:01.856440Z mysqld_safe Logging to syslog.
    2021-09-09T09:19:01.861155Z mysqld_safe Logging to syslog.
    2021-09-09T09:19:01.869447Z mysqld_safe Logging to '/var/log/mysql/mysql3307.log'.
    2021-09-09T09:19:01.873328Z mysqld_safe Logging to '/var/log/mysql/mysql3308.log'.
    2021-09-09T09:19:01.923713Z mysqld_safe Starting mysqld daemon with databases from /data/mysql/replica01
    2021-09-09T09:19:01.926987Z mysqld_safe Starting mysqld daemon with databases from /data/mysql/replica02
    
    ben@ben-VirtualBox:/var/log$
    ben@ben-VirtualBox:/var/log$ mysqld_multi --defaults-file=/home/ben/trymulti.cnf report
    WARNING: Log file disabled. Maybe directory or file isn't writable?
    mysqld_multi log file version 2.16; run: Wide character in print at /usr/bin/mysqld_multi line 160.
    四 9月  9 17:19:12 2021
    Reporting MySQL servers
    MySQL server from group: mysqld3307 is running
    MySQL server from group: mysqld3308 is running
    
    
    ben@ben-VirtualBox:/var/log$ mysqld_multi --defaults-file=/home/ben/trymulti.cnf report
    WARNING: Log file disabled. Maybe directory or file isn't writable?
    mysqld_multi log file version 2.16; run: Wide character in print at /usr/bin/mysqld_multi line 160.
    四 9月  9 17:20:52 2021
    Reporting MySQL servers
    MySQL server from group: mysqld3307 is running
    MySQL server from group: mysqld3308 is running
    ben@ben-VirtualBox:/var/log$
    
    # 重启服务:所有
    ben@ben-VirtualBox:/var/log$ sudo mysqld_multi --defaults-file=/home/ben/trymulti.cnf --no-log reload
    mysqld_multi log file version 2.16; run: Wide character in print at /usr/bin/mysqld_multi line 160.
    四 9月  9 17:20:57 2021
    
    Reloading MySQL servers
    ben@ben-VirtualBox:/var/log$
    ben@ben-VirtualBox:/var/log$ mysqld_multi --defaults-file=/home/ben/trymulti.cnf report
    WARNING: Log file disabled. Maybe directory or file isn't writable?
    mysqld_multi log file version 2.16; run: Wide character in print at /usr/bin/mysqld_multi line 160.
    # 时间有变化了
    四 9月  9 17:21:18 2021
    Reporting MySQL servers
    MySQL server from group: mysqld3307 is running
    MySQL server from group: mysqld3308 is running
    
    

    实例虽然启动了,能不能用呢?使用客户端命令mysql试试不就知道了!来自博客园

    注意,之前 初始化数据目录时,使用的是 --initialize-insecure 选项,这样的话,两个新实例是没有用户密码的。

    登录实例3307
    ben@ben-VirtualBox:~$ mysql -P3307 -uroot
    ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
    ben@ben-VirtualBox:~$
    ben@ben-VirtualBox:~$ mysql -P3307 -uroot -hlocalhost
    ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
    ben@ben-VirtualBox:~$
    
    # -h必须是 127.0.0.1
    # 不需要 -p(小写,大写指端口)
    ben@ben-VirtualBox:~$ mysql -P3307 -uroot -h127.0.0.1
    Welcome to the MySQL monitor.  Commands end with ; or g.
    Your MySQL connection id is 7
    Server version: 5.7.21-1ubuntu1 (Ubuntu)
    ...
    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
    
    mysql>
    mysql>
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    4 rows in set (0.01 sec)
    
    # 默认用户
    mysql> select user,host from mysql.user;
    +---------------+-----------+
    | user          | host      |
    +---------------+-----------+
    | mysql.session | localhost |
    | mysql.sys     | localhost |
    | root          | localhost |
    +---------------+-----------+
    3 rows in set (0.00 sec)
    
    # 实例状态信息
    mysql> status
    --------------
    mysql  Ver 14.14 Distrib 5.7.21, for Linux (x86_64) using  EditLine wrapper
    
    Connection id:          7
    Current database:
    Current user:           root@localhost
    SSL:                    Not in use
    Current pager:          stdout
    Using outfile:          ''
    Using delimiter:        ;
    Server version:         5.7.21-1ubuntu1 (Ubuntu)
    Protocol version:       10
    Connection:             127.0.0.1 via TCP/IP
    Server characterset:    latin1
    Db     characterset:    latin1
    Client characterset:    utf8
    Conn.  characterset:    utf8
    TCP port:               3307
    Uptime:                 7 min 58 sec
    
    Threads: 1  Questions: 13  Slow queries: 0  Opens: 106  Flush tables: 1  Open tables: 99  Queries per second avg: 0.027
    --------------
    
    # 更多实例信息 可以使用 show variables; 查看

    登录后,请修改root用户的密码。

    疑问:来自博客园

    前面使用的 socket 配置 是在 /tmp 目录下,要是配置到其它目录,是否也需要配置权限呢?TODO

    更进一步:

    1、新的服务器实例的配置优化,连接数、缓存等——哪些配置是多实例共享的,哪些不是?实例之间如何互相影响性能?

    2、将默认实例3306也加入多实例部署;

    3、更精准的权限配置,各个配置涉及到的文件如何精确配置权限;

    4、让配置随机启动,怎么弄呢?来自博客

    5、CentOS上有什么不同?

    6、使用源码安装MySQL会有什么不同?

    7、官方文档是怎么介绍多实例部署的?

    ...

    》》》全文完《《《

    多实例搭建好了,之后就是 主从复制、分库分表、Apache的Sharding-JDBC 的使用了。

    对了,补补基础课:

    1、/var/log/syslog 的使用,可以用来定位操作错误的问题(因为不懂,浪费了若干精时,累啊);

    2、apparmor 是什么?Ubuntu专用的?来自博客园

    3、journalctl -xe 是干嘛的?查看的日志来自 1?

    参考文档

    1、MySQL破解root账户密码,及多实例自动部署

    2、mysqld_multi配置

    3、怎样查看ubuntu系统日志

    4、基于mysqld_multi实现MySQL多实例配置

    5、执行mysqld --initialize-insecure错误:"mysqld: Can't create directory

    6、

  • 相关阅读:
    实用的SpringBoot生成License方案
    实用的jar包加密方案
    整合Atomikos、Quartz、Postgresql的踩坑日记
    CentOS7使用NTP搭建时间同步服务器
    初探Mysql架构和InnoDB存储引擎
    postgresql常用命令
    闲聊CAP、BASE与XA
    还原面试现场-ACID与隔离级别
    图片拖动并交换图片-使用观察者模式
    图片拖动并交换图片
  • 原文地址:https://www.cnblogs.com/luo630/p/15247325.html
Copyright © 2011-2022 走看看