基於mysqld_multi實現MySQL多實例配置


環境:

操作系統  CentOS7.5(已安裝MySQL)

主機名    localhost

本機安裝路徑為 /usr/local/mysql

 

實驗初始配置:所有主機關閉防火牆與selinux

[root@localhost ~]# iptables -F

[root@localhost ~]# systemctl stop firewalld

 

[root@localhost ~]# setenforce 0

 

MySQL多實例的原理

 

mysql多實例,簡單理解就是在一台服務器上,mysql服務開啟多個不同的端口(如3306、3307、3308)運行多個服務進程。這些 mysql 服務進程通過不同的 socket來監聽不同的數據端口,進而互不干涉的提供各自的服務。

在同一台服務器上,mysql 多實例會去共用一套 mysql 應用程序,因此你在部署 mysql 的時候只需要部署一次 mysql程序即可,無需多次部署。但是,mysql多實例之間會各自使用不同的 my.cnf 配置文件、啟動程序和數據文件。在提供服務方面,mysql多實例在邏輯上看起來是各自獨立,互不干涉的,並且多個實例之間是根據配置文件的設定值,來獲取相關服務器的硬件資源。

 

優點如下:

有效利用服務器資源

當單個服務器資源過剩時,可以充分利用剩余的資源來提供更多的服務

節約服務器資源

當公司資金緊張,但數據庫又需要數據庫之間各自提供服務時,並且還想使用主從同步等技術,此時多實例就再好不過了

方便后期架構擴展

當公司的某個項目才啟動時,啟動初期並不一定有很大的用戶量,因此可以先用一組物理數據庫服務器,在上面部署多個實例,方便后續架構擴展、遷移

缺點如下:

資源互相搶占問題

當某個服務實例並發很高或者有慢查詢時,整個實例會消耗更多的內存、CPU和IO資源,這將導致服務器上的其它實例提供服務的質量下降

 

mysql 多實例在生產環境下的應用場景!

當一個公司業務訪問量不太大,又想節儉成本,並且還希望不同業務的數據庫服務能夠各自盡量獨立,提供服務能夠互相不受影響。另外還需要應用主從同步等技術來提供數據庫備份或讀寫分離服務,以及方便后期業務量增大時,數據庫架構的擴展和遷移。此時,Mysql 多實例就再好不過了。比如,我們可以通過在 3 台服務器部署 6-9 個實例,然后交叉做主從同步備份及讀寫分離,來實現 6-9 台服務器才能夠達到的效果

公司業務訪問量不是太大的時候,服務器的資源基本都是過剩狀態。此時就很適合 mysql 多實例的應用。如果對 SQL語句優化做的比較好,mysql 多實例是一個很值得去使用的技術。即使后期業務並發很大,只要合理分配好系統資源,也不會有太大的問題

為了規避 mysql 對 SMP 架構不支持的缺陷,我們可以使用 mysql 多實例綁定處理器的辦法(NUMA處理器必須支持,不過現在大部分處理器都支持的)將不同的數據庫分配到不同的實例上提供數據服務;

傳統游戲行業的 MMO/MMORPG以及Web Game,會將每個服都對應一個數據庫,而且可能經常要做很多數據查詢和數據訂正工作。此時,為了減少維護而出錯的概率,我們也可以采用多實例的部署方式,按區的概念來分配數據庫。

 

 

Mysql多實例實現的3種方式

 

1、基於多配置文件

通過使用多個配置文件來啟動不同的進程,以此來實現多實例。

優點:邏輯簡單,配置簡單

缺點:管理起來不方便

 

2、基於mysqld_multi

通過官方自帶的 mysqld_multi 工具,使用單獨配置文件來實現多實例

優點: 便於集中管理管理

缺點: 不方便針對每個實例配置進行定制

3、基於IM

使用 MySQL 實例管理器(MYSQLMANAGER),這個方法好像比較好不過也有點復雜

優點:便於集中管理

缺點:耦合度高。IM一掛,實例全掛

      不方便針對每個實例配置進行定制

        MySQL本身就可以通過多實例方式運行,只要修改啟動腳本和配置文件,把端口、basedir、datadir 文件夾分開后,多個實例的運行就會互不影響。但是這種方式操作起來太過繁雜,所以MySQL官方提供了一個mysqld_multi 的程序來輔助實現多實例操作。

 

一、創建並初始化數據目錄

       幾個實例要分開運行,必然要把數據庫文件放到不同目錄中,所以第一步是要建立各個實例的數據目錄,這里假設我們要運行三個實例,端口分別是3306,3307,3308,為了方便維護,我們把數據文件夾也按照端口號來命名:

[root@localhost ~]# mkdir -p /data/mysql/{3306,3307,3308}

[root@localhost ~]# chown mysql:mysql /data/mysql/{3306,3307,3308}

[root@localhost ~]# ls -ld /data/mysql/{3306,3307,3308}

drwxr-xr-x 2 mysql mysql 6 12月  7 16:37 /data/mysql/3306

drwxr-xr-x 2 mysql mysql 6 12月  7 16:37 /data/mysql/3307

drwxr-xr-x 2 mysql mysql 6 12月  7 16:37 /data/mysql/3308

 

通過配置文件指定並初始化數據目錄

[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

 

初始化完成之后,后續的配置不需要3308.cnf文件,實例的參數會在my.cnf中集中配置。

注意,data目錄在初始化前,必須為空,不然初始化時會報錯

 

重復上面兩個步驟,把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文件集中管理多個實例

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

 

mysqld_multi的配置文件和一般MySQL配置不同,沒有[mysqld]段,取而代之的是[mysqld1]、[mysqld2]等配置段,每個配置段代表一個MySQL實例。

 

三、管理多個MySQL實例

1,啟動多個MySQL實例

啟動多個實例時需要一個啟動腳本,這個腳本一般在/usr/local/mysql/support-files目錄下的mysqld_multi.server文件

[root@localhost ~]# cp /usr/local/mysql/support-files/mysqld_multi.server /etc/init.d/mysqld_multi

 

啟動多個MySQL實例

[root@localhost ~]# /etc/init.d/mysqld_multi start 1-3

 

啟動三個MySQL實例,注意這里的數字和my.cnf中的[mysqldN]對應,1-3就是啟動[mysqld1]、[mysqld2]、[mysqld3]配置段的MySQL實例。

 

[root@localhost ~]# netstat -lpnt | grep mysql

tcp6    0     0 :::3306          :::*            LISTEN      2828/mysqld        

tcp6    0     0 :::3307          :::*            LISTEN      2835/mysqld        

tcp6    0     0 :::3308          :::*            LISTEN      2839/mysqld        

查看端口,看MySQL有沒有正常啟動,如果沒有啟動或報錯,一般報錯詳細日志存在各個實例data目錄下的 主機名.err文件中,打開此文件查找錯誤原因,逐步排錯就可以了。

 

2,關閉多個MySQL實例

[root@localhost ~]# /etc/init.d/mysqld_multi stop 1-3

[root@localhost ~]# netstat -lnpt | grep mysqld

 

也可以使用以下命令:

killall -u mysql   或者   kill -9 the-mysql-pid

 

四、root賬戶管理

前面初始化數據庫時用的是--initialize-insecure參數,所以我們初始化的數據庫,root賬戶是沒有密碼的,要先改密碼為123456:(如果之前忘了初始化的話,在前面用mysqld_multi啟動服務的時候,會自動初始化;到時記住初始化密碼利用ALTER USER命令重置即可。

比如  ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';)

設置密碼:

mysqladmin -uroot password '123456' -S /tmp/mysql3306.sock

mysqladmin -uroot password '123456' -S /tmp/mysql3307.sock

mysqladmin -uroot password '123456' -S /tmp/mysql3308.sock

 

或者:

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多實例:

[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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM