简介
有时候我们需要在一台机器上安装部署多个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时,这些配置都不会去读取并应用。这点在官方的手册上有体现。
获取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处
[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.cnf
、my3307.cnf
、my3308.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配置语句,但是结果还是不起任何作用的。