基于mysqld_multi实现MySQL 5.7.24多实例多进程配置
MySQL多實(shí)例的原理
mysql多實(shí)例,簡(jiǎn)單理解就是在一臺(tái)服務(wù)器上,mysql服務(wù)開啟多個(gè)不同的端口(如3306、3307、3308)運(yùn)行多個(gè)服務(wù)進(jìn)程。這些 mysql 服務(wù)進(jìn)程通過不同的 socket來監(jiān)聽不同的數(shù)據(jù)端口,進(jìn)而互不干涉的提供各自的服務(wù)。
在同一臺(tái)服務(wù)器上,mysql 多實(shí)例會(huì)去共用一套 mysql 應(yīng)用程序,因此你在部署 mysql 的時(shí)候只需要部署一次mysql程序即可,無需多次部署。但是,mysql多實(shí)例之間會(huì)各自使用不同的 my.cnf配置文件、啟動(dòng)程序和數(shù)據(jù)文件。在提供服務(wù)方面,mysql多實(shí)例在邏輯上看起來是各自獨(dú)立,互不干涉的,并且多個(gè)實(shí)例之間是根據(jù)配置文件的設(shè)定值,來獲取相關(guān)服務(wù)器的硬件資源。
優(yōu)點(diǎn)如下:
當(dāng)單個(gè)服務(wù)器資源過剩時(shí),可以充分利用剩余的資源來提供更多的服務(wù)
當(dāng)公司資金緊張,但數(shù)據(jù)庫(kù)又需要數(shù)據(jù)庫(kù)之間各自提供服務(wù)時(shí),并且還想使用主從同步等技術(shù),此時(shí)多實(shí)例就再好不過了
當(dāng)公司的某個(gè)項(xiàng)目才啟動(dòng)時(shí),啟動(dòng)初期并不一定有很大的用戶量,因此可以先用一組物理數(shù)據(jù)庫(kù)服務(wù)器,在上面部署多個(gè)實(shí)例,方便后續(xù)架構(gòu)擴(kuò)展、遷移
缺點(diǎn)如下:
當(dāng)某個(gè)服務(wù)實(shí)例并發(fā)很高或者有慢查詢時(shí),整個(gè)實(shí)例會(huì)消耗更多的內(nèi)存、CPU和IO資源,這將導(dǎo)致服務(wù)器上的其它實(shí)例提供服務(wù)的質(zhì)量下降
mysql 多實(shí)例在生產(chǎn)環(huán)境下的應(yīng)用場(chǎng)景!
當(dāng)一個(gè)公司業(yè)務(wù)訪問量不太大,又想節(jié)儉成本,并且還希望不同業(yè)務(wù)的數(shù)據(jù)庫(kù)服務(wù)能夠各自盡量獨(dú)立,提供服務(wù)能夠互相不受影響。另外還需要應(yīng)用主從同步等技術(shù)來提供數(shù)據(jù)庫(kù)備份或讀寫分離服務(wù),以及方便后期業(yè)務(wù)量增大時(shí),數(shù)據(jù)庫(kù)架構(gòu)的擴(kuò)展和遷移。此時(shí),Mysql 多實(shí)例就再好不過了。比如,我們可以通過在 3 臺(tái)服務(wù)器部署 6-9 個(gè)實(shí)例,然后交叉做主從同步備份及讀寫分離,來實(shí)現(xiàn) 6-9 臺(tái)服務(wù)器才能夠達(dá)到的效果
公司業(yè)務(wù)訪問量不是太大的時(shí)候,服務(wù)器的資源基本都是過剩狀態(tài)。此時(shí)就很適合 mysql 多實(shí)例的應(yīng)用。如果對(duì) SQL語(yǔ)句優(yōu)化做的比較好,mysql 多實(shí)例是一個(gè)很值得去使用的技術(shù)。即使后期業(yè)務(wù)并發(fā)很大,只要合理分配好系統(tǒng)資源,也不會(huì)有太大的問題
為了規(guī)避 mysql 對(duì) SMP 架構(gòu)不支持的缺陷,我們可以使用 mysql 多實(shí)例綁定處理器的辦法(NUMA處理器必須支持,不過現(xiàn)在大部分處理器都支持的)將不同的數(shù)據(jù)庫(kù)分配到不同的實(shí)例上提供數(shù)據(jù)服務(wù);
傳統(tǒng)游戲行業(yè)的 MMO/MMORPG以及Web Game,會(huì)將每個(gè)服都對(duì)應(yīng)一個(gè)數(shù)據(jù)庫(kù),而且可能經(jīng)常要做很多數(shù)據(jù)查詢和數(shù)據(jù)訂正工作。此時(shí),為了減少維護(hù)而出錯(cuò)的概率,我們也可以采用多實(shí)例的部署方式,按區(qū)的概念來分配數(shù)據(jù)庫(kù)。
Mysql多實(shí)例實(shí)現(xiàn)的3種方式
1、基于多配置文件
通過使用多個(gè)配置文件來啟動(dòng)不同的進(jìn)程,以此來實(shí)現(xiàn)多實(shí)例。
優(yōu)點(diǎn):邏輯簡(jiǎn)單,配置簡(jiǎn)單
缺點(diǎn):管理起來不方便
2、基于mysqld_multi
通過官方自帶的 mysqld_multi 工具,使用單獨(dú)配置文件來實(shí)現(xiàn)多實(shí)例
優(yōu)點(diǎn): 便于集中管理管理
缺點(diǎn): 不方便針對(duì)每個(gè)實(shí)例配置進(jìn)行定制
3、基于IM
使用 MySQL 實(shí)例管理器(MYSQLMANAGER),這個(gè)方法好像比較好不過也有點(diǎn)復(fù)雜
優(yōu)點(diǎn):便于集中管理
缺點(diǎn):耦合度高。IM一掛,實(shí)例全掛/
不方便針對(duì)每個(gè)實(shí)例配置進(jìn)行定制
MySQL本身就可以通過多實(shí)例方式運(yùn)行,只要修改啟動(dòng)腳本和配置文件,把端口、basedir、datadir 文件夾分開后,多個(gè)實(shí)例的運(yùn)行就會(huì)互不影響。但是這種方式操作起來太過繁雜,所以MySQL官方提供了一個(gè)mysqld_multi 的程序來輔助實(shí)現(xiàn)多實(shí)例操作。
一、創(chuàng)建并初始化數(shù)據(jù)目錄
幾個(gè)實(shí)例要分開運(yùn)行,必然要把數(shù)據(jù)庫(kù)文件放到不同目錄中,所以第一步是要建立各個(gè)實(shí)例的數(shù)據(jù)目錄,這里假設(shè)我們要運(yùn)行三個(gè)實(shí)例,端口分別是3306,3307,3308,為了方便維護(hù),我們把數(shù)據(jù)文件夾也按照端口號(hào)來命名:
通過配置文件指定并初始化數(shù)據(jù)目錄
[root@localhost ~]# cp /etc/my.cnf /data/mysql/3308.cnf [root@localhost ~]# vim /data/mysql/3308.cnf [mysqld] port=3308 datadir=/data/mysql/3308/ socket=/tmp/mysql3308.sock symbolic-links=0[mysqld_safe] log-error=/data/mysql/3308.log pid-file=/usr/local/mysql/data/3308.pid[client] port=3308 socket=/tmp/mysql3308.sock[root@localhost ~]# mysqld --defaults-file=/data/mysql/3308.cnf --initialize-insecure --user=mysql初始化完成之后,后續(xù)的配置不需要3308.cnf文件,實(shí)例的參數(shù)會(huì)在my.cnf中集中配置。
注意,data目錄在初始化前,必須為空,不然初始化是會(huì)報(bào)錯(cuò)
重復(fù)上面兩個(gè)步驟,把3307、3306目錄初始化好。
[root@localhost ~]# cat /data/mysql/3306.cnf [mysqld] port=3306 datadir=/data/mysql/3306/ socket=/tmp/mysql3306.sock symbolic-links=0[mysqld_safe] log-error=/data/mysql/3306.log pid-file=/usr/local/mysql/data/3306.pid[client] port=3306 socket=/tmp/mysql3306.sock [root@localhost ~]# cat /data/mysql/3307.cnf [mysqld] port=3307 datadir=/data/mysql/3307/ socket=/tmp/mysql3307.sock symbolic-links=0[mysqld_safe] log-error=/data/mysql/3307.log pid-file=/usr/local/mysql/data/3307.pid[client] port=3307 socket=/tmp/mysql3307.sock [root@localhost ~]# mysqld --defaults-file=/data/mysql/3307.cnf --initialize-insecure --user=mysql [root@localhost ~]# mysqld --defaults-file=/data/mysql/3306.cnf --initialize-insecure --user=mysql二、配置my.cnf文件集中管理多個(gè)實(shí)例
[root@localhost ~]# cp /etc/my.cnf /etc/my.cnf.bak [root@localhost ~]# vim /etc/my.cnf [mysqld_multi] mysqld=/usr/local/mysql/bin/mysqld_safe mysqladmin=/usr/local/mysql/bin/mysqladmin[mysqld1] port=3306 socket=/tmp/mysql3306.sock datadir=/data/mysql/3306/ skip-external-locking log-bin=/data/mysql/3306/mysql-bin server-id=3306 user=mysql[mysqld2] port=3307 socket=/tmp/mysql3307.sock datadir=/data/mysql/3307/ skip-external-locking log-bin=/data/mysql/3307/mysql-bin server-id=3307 user=mysql[mysqld3] port=3308 socket=/tmp/mysql3308.sock datadir=/data/mysql/3308/ skip-external-locking log-bin=/data/mysql/3308/mysql-bin server-id=3308 user=mysql[mysql] no-auto-rehashmysqld_multi的配置文件和一般MySQL配置不同,沒有[mysqld]段,取而代之的是[mysqld1]、[mysqld2]等配置段,每個(gè)配置段代表一個(gè)MySQL實(shí)例。
三、管理多個(gè)MySQL實(shí)例
1,啟動(dòng)多個(gè)MySQL實(shí)例
啟動(dòng)多個(gè)實(shí)例時(shí)需要一個(gè)啟動(dòng)腳本,這個(gè)腳本一般在/usr/local/mysql/support-files目錄下的mysqld_multi.server文件
啟動(dòng)多個(gè)MySQL實(shí)例
[root@localhost ~]# /etc/init.d/mysqld_multi start 1-3啟動(dòng)三個(gè)MySQL實(shí)例,注意這里的數(shù)字和my.cnf中的[mysqldN]對(duì)應(yīng),1-3就是啟動(dòng)[mysqld1]、[mysqld2]、[mysqld3]配置段的MySQL實(shí)例。
[root@localhost ~]# netstat -lnpt | grep -E "3306|3307|3308" tcp6 0 0 :::3306 :::* LISTEN 2744/mysqld tcp6 0 0 :::3307 :::* LISTEN 65502/mysqld tcp6 0 0 :::3308 :::* LISTEN 65499/mysqld查看端口,看MySQL有沒有正常啟動(dòng),如果沒有啟動(dòng)或報(bào)錯(cuò),一般報(bào)錯(cuò)詳細(xì)日志存在各個(gè)實(shí)例data目錄下的主機(jī)名.err文件中,打開此文件查找錯(cuò)誤原因,逐步排錯(cuò)就可以了。
2,關(guān)閉多個(gè)MySQL實(shí)例
[root@localhost ~]# /etc/init.d/mysqld_multi stop 1-3 [root@localhost ~]# netstat -lnpt | grep -E "3306|3307|3308"也可以使用以下命令:
killall -u mysql 或者 kill -9 the-mysql-pid
四、root賬戶管理
前面初始化數(shù)據(jù)庫(kù)時(shí)用的是--initialize-insecure參數(shù),所以我們初始化的數(shù)據(jù)庫(kù),root賬戶是沒有密碼的,要先改密碼為123456:
或者:
mysqladmin -uroot password '123456' -P3306 -h127.0.0.1 mysqladmin -uroot password '123456' -P3307 -h127.0.0.1 mysqladmin -uroot password '123456' -P3308 -h127.0.0.1五、連接mysql多實(shí)例:
[root@localhost ~]# mysql -u root -p123456 -S /tmp/mysql3306.sock [root@localhost ~]# mysql -u root -p123456 -S /tmp/mysql3307.sock [root@localhost ~]# mysql -u root -p123456 -S /tmp/mysql3308.sock轉(zhuǎn)載于:https://blog.51cto.com/crushlinux/2327767
總結(jié)
以上是生活随笔為你收集整理的基于mysqld_multi实现MySQL 5.7.24多实例多进程配置的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AlphaZero进化论:从零开始,制霸
- 下一篇: 使用 Flex 布局与其他普通布局的简单