簡介
有時候我們需要在一臺機器上安裝部署多個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)。

獲取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處

[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é)果還是不起任何作用的。