基于systemd的Mariadb的多实例部署

简介

有时候我们需要在一台机器上安装部署多个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  [email protected]  use_galera_new_cluster.conf

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

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

image.png

[root@node1 ~]# vim /usr/local/mysql/support-files/systemd/[email protected] 

第一处: 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/[email protected] /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的多实例部署)