學習環境:
操做系統
|
IP地址
|
主機名
|
軟件包
|
備註
|
CentOS7.5
|
192.168.200.111
|
localhost
|
|
|
實驗初始配置:全部主機關閉防火牆與selinux
[root@localhost ~]# iptables -F
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# sed -i '/SELINUX/ s/enforcing/disabled/g' /etc/sysconfig/selinux
基於mysqld_multi實現MySQL 5.7.24多實例多進程配置
MySQL多實例的原理
- mysql多實例,簡單理解就是在一臺服務器上,mysql服務開啓多個不一樣的端口(如330六、330七、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種方式
一、基於多配置文件
經過使用多個配置文件來啓動不一樣的進程,以此來實現多實例。
優勢:邏輯簡單,配置簡單
缺點:管理起來不方便
二、基於mysqld_multi
經過官方自帶的 mysqld_multi 工具,使用單獨配置文件來實現多實例
優勢: 便於集中管理管理
缺點: 不方便針對每一個實例配置進行定製
三、基於IM
使用 MySQL 實例管理器(MYSQLMANAGER),這個方法好像比較好不過也有點複雜
優勢:便於集中管理
缺點:耦合度高。IM一掛,實例全掛
不方便針對每一個實例配置進行定製
MySQL自己就能夠經過多實例方式運行,只要修改啓動腳本和配置文件,把端口、basedir、datadir 文件夾分開後,多個實例的運行就會互不影響。可是這種方式操做起來太過繁雜,因此MySQL官方提供了一個mysqld_multi 的程序來輔助實現多實例操做。
1、建立並初始化數據目錄
幾個實例要分開運行,必然要把數據庫文件放到不一樣目錄中,因此第一步是要創建各個實例的數據目錄,這裏假設咱們要運行三個實例,端口分別是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目錄在初始化前,必須爲空,否則初始化是會報錯
重複上面兩個步驟,把330七、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
2、配置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實例。
3、管理多個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 -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有沒有正常啓動,若是沒有啓動或報錯,通常報錯詳細日誌存在各個實例data目錄下的 主機名.err文件中,打開此文件查找錯誤緣由,逐步排錯就能夠了。
2,關閉多個MySQL實例
[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
4、root帳戶管理
前面初始化數據庫時用的是--initialize-insecure參數,因此咱們初始化的數據庫,root帳戶是沒有密碼的,要先改密碼爲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
5、鏈接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