基于systemd的Mariadb的多實例部署

簡介

有時候我們需要在一臺機器上安裝部署多個mysql,多實例意思就是運行多個數(shù)據(jù)庫服務端程序,分別監(jiān)聽不同的TCP套接字,多實例間最好使用不同的數(shù)據(jù)目錄,把數(shù)據(jù)區(qū)分開,而實際上,使用多實例的大多數(shù)都是因為這個需求~,所以在使用多實例時候,一般把(unixSocket文件、pid文件、日志文件、TCP監(jiān)聽端口、數(shù)據(jù)目錄..)等區(qū)分開。在網(wǎng)上有很多的多實例教程都是使用官方提供的腳本來實現(xiàn),這篇文章就嘗試使用systemd來管理和啟動多實例。

實驗說明

在前一篇文章中實現(xiàn)了Mariadb的二進制安裝,數(shù)據(jù)庫的安裝不打算在文章中再次重復,僅僅把多實例的部署方法寫一下。
mariadb的服務程序依舊使用mysql這個用戶來啟動;
數(shù)據(jù)庫目錄在/data/mysql/我打算啟動3個多實例,分別是3306,3307和3308。
即:

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

創(chuàng)建數(shù)據(jù)目錄

[root@node1 ~]# mkdir -pv /data/mysql/{3306,3307,3308}/{log,pid}
mkdir: 已創(chuàng)建目錄 "/data"
mkdir: 已創(chuàng)建目錄 "/data/mysql"
mkdir: 已創(chuàng)建目錄 "/data/mysql/3306"
mkdir: 已創(chuàng)建目錄 "/data/mysql/3306/log"
mkdir: 已創(chuàng)建目錄 "/data/mysql/3306/pid"
mkdir: 已創(chuàng)建目錄 "/data/mysql/3307"
mkdir: 已創(chuàng)建目錄 "/data/mysql/3307/log"
mkdir: 已創(chuàng)建目錄 "/data/mysql/3307/pid"
mkdir: 已創(chuàng)建目錄 "/data/mysql/3308"
mkdir: 已創(chuàng)建目錄 "/data/mysql/3308/log"
mkdir: 已創(chuàng)建目錄 "/data/mysql/3308/pid"


修改數(shù)據(jù)目錄的屬主數(shù)組
[root@node1 ~]# chown mysql.mysql -R /data/mysql

初始化數(shù)據(jù)庫

把數(shù)據(jù)目錄都準備妥當以后,使用官方二進制包提供的腳本mysql_install_db初始化數(shù)據(jù)庫。

[root@node1 ~]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql/3306    #初始化3306數(shù)據(jù)庫

[root@node1 ~]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql/3307    #初始化3307數(shù)據(jù)庫

[root@node1 ~]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql/3308    #初始化3308數(shù)據(jù)庫

獲取systemd的多實例啟動文件

初始化好數(shù)據(jù)庫后,先來解決systemd的啟動文件問題。在官方提供的二進制安裝包中,默認會提供了systemd多實例的啟動文件,使用systemd啟動多實例,和網(wǎng)上普遍的用法上有點區(qū)別,它的多實例配置文件是分開的。并且有點需要注意,如果使用了systemd,mysqld_safe就沒用了即就算你在mysqld_safe的配置段中寫了很多配置,使用systemd來啟動mysqld時,這些配置都不會去讀取并應用。這點在官方的手冊上有體現(xiàn)。


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這個就是多實例的啟動文件,沒有帶@符號的是單實例啟動文件,這點需要區(qū)別開,默認情況下,這個文件的配置應該改改(至少要修改它讀取配置文件的路徑)剩余其他大部分配置都能符合需求(個人覺得)。

修改原因:
默認情況下,這啟動文件要你把配置文件放置在根目錄(個人非常不能理解),所以打算修改為/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
執(zhí)行systemctl daemon-reload

為各實例提供配置文件

在前面的systemd里,修改了啟動文件參數(shù),把啟動配置文件指定到了/etc/my.cnf.d/目錄下,接下來我們需要在此目錄下,創(chuàng)建實例配置文件。

切換目錄
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

查看監(jiān)聽情況:

[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)


繼續(xù)測試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)

總結(jié):

使用systemd實現(xiàn)多實例,和使用serivce腳本實現(xiàn)方法實現(xiàn)有點區(qū)別,systemd通過mariadb@實例名來啟動多實例,而配置文件則通過systemd的多實例啟動文件里的配置參數(shù)前綴+實例名來指定,只要把各實例配置文件集中在一個文件夾中,配置起來還是挺方便的。最后強調(diào)一點:如果使用systemd來啟動mysql,不管是單實例還是多實例,mysqld_safe都會被取締,就算你配置文件中有對mysqld_safe配置語句,但是結(jié)果還是不起任何作用的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容