美文网首页
基于systemd的Mariadb的多实例部署

基于systemd的Mariadb的多实例部署

作者: li_zw | 来源:发表于2019-01-03 19:17 被阅读0次

    简介

    有时候我们需要在一台机器上安装部署多个mysql,多实例意思就是运行多个数据库服务端程序,分别监听不同的TCP套接字,多实例间最好使用不同的数据目录,把数据区分开,而实际上,使用多实例的大多数都是因为这个需求~,所以在使用多实例时候,一般把(unixSocket文件、pid文件、日志文件、TCP监听端口、数据目录..)等区分开。在网上有很多的多实例教程都是使用官方提供的脚本来实现,这篇文章就尝试使用systemd来管理和启动多实例。

    实验说明

    在前一篇文章中实现了Mariadb的二进制安装,数据库的安装不打算在文章中再次重复,仅仅把多实例的部署方法写一下。
    mariadb的服务程序依旧使用mysql这个用户来启动;
    数据库目录在/data/mysql/我打算启动3个多实例,分别是3306,3307和3308。
    即:

    3306:/data/mysql/3306
    3307:/data/mysql/3307
    3308:/data/mysql/3308
    

    创建数据目录

    [root@node1 ~]# mkdir -pv /data/mysql/{3306,3307,3308}/{log,pid}
    mkdir: 已创建目录 "/data"
    mkdir: 已创建目录 "/data/mysql"
    mkdir: 已创建目录 "/data/mysql/3306"
    mkdir: 已创建目录 "/data/mysql/3306/log"
    mkdir: 已创建目录 "/data/mysql/3306/pid"
    mkdir: 已创建目录 "/data/mysql/3307"
    mkdir: 已创建目录 "/data/mysql/3307/log"
    mkdir: 已创建目录 "/data/mysql/3307/pid"
    mkdir: 已创建目录 "/data/mysql/3308"
    mkdir: 已创建目录 "/data/mysql/3308/log"
    mkdir: 已创建目录 "/data/mysql/3308/pid"
    
    
    

    修改数据目录的属主数组
    [root@node1 ~]# chown mysql.mysql -R /data/mysql

    初始化数据库

    把数据目录都准备妥当以后,使用官方二进制包提供的脚本mysql_install_db初始化数据库。

    [root@node1 ~]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql/3306    #初始化3306数据库
    
    [root@node1 ~]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql/3307    #初始化3307数据库
    
    [root@node1 ~]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql/3308    #初始化3308数据库
    
    

    获取systemd的多实例启动文件

    初始化好数据库后,先来解决systemd的启动文件问题。在官方提供的二进制安装包中,默认会提供了systemd多实例的启动文件,使用systemd启动多实例,和网上普遍的用法上有点区别,它的多实例配置文件是分开的。并且有点需要注意,如果使用了systemd,mysqld_safe就没用了即就算你在mysqld_safe的配置段中写了很多配置,使用systemd来启动mysqld时,这些配置都不会去读取并应用。这点在官方的手册上有体现。


    image.png

    获取systemd的多实例启动文件
    该文件位置在二进制包的support-files中。

    [root@node1 ~]# ls /usr/local/mysql/support-files/systemd
    mariadb.service  mariadb@.service  use_galera_new_cluster.conf
    
    

    其中mariadb@.service这个就是多实例的启动文件,没有带@符号的是单实例启动文件,这点需要区别开,默认情况下,这个文件的配置应该改改(至少要修改它读取配置文件的路径)剩余其他大部分配置都能符合需求(个人觉得)。

    修改原因:
    默认情况下,这启动文件要你把配置文件放置在根目录(个人非常不能理解),所以打算修改为/etc/my.cnf.d目录下,需要修改3处

    image.png
    [root@node1 ~]# vim /usr/local/mysql/support-files/systemd/mariadb@.service 
    
    第一处: ConditionPathExists=/etc/my.cnf.d/my%I.cnf 
    第二处:ExecStartPre=/bin/sh -c "[ ! -e /usr/local/mysql/bin/galera_recovery ] && VAR= || \
     VAR=`/usr/local/mysql/bin/galera_recovery --defaults-file=/etc/my.cnf.d/my%I.cnf`; [ $? -eq 0 ] \
     && systemctl set-environment _WSREP_START_POSITION%I=$VAR || exit 1"
    
    第三处:ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf.d/my%I.cnf
    
    
    
    

    值得注意的是:
    /etc/my.cnf.d/my%I.cnf %I是一个引用
    因为多实例在启动的时候命令是这样的
    systemctl start mariadb@xxx 此时,%I就代表了xxx。

    坦白讲:
    systemctl start mariadb@xxx它的配置文件就是/etc/my.cnf.d/myxxx.cnf

    修改好systemd的多实例启动文件后,复制到systemd的目录下
    [root@node1 my.cnf.d]# cp /usr/local/mysql/support-files/systemd/mariadb@.service /usr/lib/systemd/system
    执行systemctl daemon-reload

    为各实例提供配置文件

    在前面的systemd里,修改了启动文件参数,把启动配置文件指定到了/etc/my.cnf.d/目录下,接下来我们需要在此目录下,创建实例配置文件。

    切换目录
    cd /etc/my.cnf.d/

    编辑第一个实例配置文件

    [root@node1 my.cnf.d]# vim my3306.cnf 
    [mysqld]
    datadir=/data/mysql/3306
    socket=/data/mysql/3306/mysql.sock
    log-error=/data/mysql/3306/log/mariadb.log
    pid-file=/data/mysql/3306/pid/mariadb.pid
    port=3306
    

    编辑第二个实例配置文件

    [root@node1 my.cnf.d]# vim my3307.cnf 
    [mysqld]
    datadir=/data/mysql/3307
    socket=/data/mysql/3307/mysql.sock
    log-error=/data/mysql/3307/log/mariadb.log
    pid-file=/data/mysql/3307/pid/mariadb.pid
    port=3307
    

    编辑第三个实例配置文件

    [root@node1 my.cnf.d]# vim my3308.cnf 
    [mysqld]
    datadir=/data/mysql/3308
    socket=/data/mysql/3308/mysql.sock
    log-error=/data/mysql/3308/log/mariadb.log
    pid-file=/data/mysql/3308/pid/mariadb.pid
    port=3308
    

    值得注意的是配置文件的my3306.cnfmy3307.cnfmy3308.cnf
    前面的my是因为在编写systemd启动文件的时候指定的,my%I.cnf %I是实例名称,对应的配置文件就是my实例名称.cnf

    启动并测试实例

    当配置文件都没问题后,直接启动实例,启动命令是:systemctl start mariadb@实例名

    启动三实例

    [root@node1 my.cnf.d]# systemctl start mariadb@3306
    [root@node1 my.cnf.d]# systemctl start mariadb@3307
    [root@node1 my.cnf.d]# systemctl start mariadb@3308
    

    查看监听情况:

    [root@node1 my.cnf.d]# ss -tan | grep 330
    LISTEN     0      80          :::3306                    :::*                  
    LISTEN     0      80          :::3307                    :::*                  
    LISTEN     0      80          :::3308                    :::* 
    

    最后测试一下

    首先连接3306的实例,使用3306的socket文件

    [root@node1 my.cnf.d]# mysql -S /data/mysql/3306/mysql.sock
    MariaDB [(none)]> SHOW VARIABLES LIKE 'port';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | port          | 3306  |
    +---------------+-------+
    1 row in set (0.002 sec)
    
    
    

    继续测试3307

    [root@node1 my.cnf.d]# mysql -S /data/mysql/3307/mysql.sock 
    MariaDB [(none)]> SHOW VARIABLES LIKE 'port';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | port          | 3307  |
    +---------------+-------+
    1 row in set (0.002 sec)
    
    

    最后测试3308

    [root@node1 my.cnf.d]# mysql -S /data/mysql/3308/mysql.sock 
    MariaDB [(none)]> SHOW VARIABLES LIKE 'port';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | port          | 3308  |
    +---------------+-------+
    1 row in set (0.002 sec)
    
    

    总结:

    使用systemd实现多实例,和使用serivce脚本实现方法实现有点区别,systemd通过mariadb@实例名来启动多实例,而配置文件则通过systemd的多实例启动文件里的配置参数前缀+实例名来指定,只要把各实例配置文件集中在一个文件夹中,配置起来还是挺方便的。最后强调一点:如果使用systemd来启动mysql,不管是单实例还是多实例,mysqld_safe都会被取缔,就算你配置文件中有对mysqld_safe配置语句,但是结果还是不起任何作用的。

    相关文章

      网友评论

          本文标题:基于systemd的Mariadb的多实例部署

          本文链接:https://www.haomeiwen.com/subject/uguqrqtx.html