基于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  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配置语句,但是结果还是不起任何作用的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容