MySQL多實例介紹及配置

一、MySQL多實例介紹

1、什麼是mysql多實例?
mysql多實例就是在一臺服務器上同時開啓多個不同的服務器端口(如:3306、3307),同時運行多個mysql服務進程,這些服務進程通過不同的socket監聽不同的服務器端口來提供服務。
這些mysql多實例共用一套mysql安裝程序,使用不同的my.cnf(也可以相同)配置文件、啓動命令(也可以相同)和數據文件。在提供服務時,多實例mysql在邏輯上看起來是各自獨立的,它們根據配置文件的對應設定值,獲得服務器相應數量的硬件資源。
打個比方,mysql多實例就相當於房子的多個臥室,每個實例可以看做一間臥室,整個服務器就是一套房子,服務器的硬件資源(CPU、Mem、Disk)、軟件資源(centos操作系統)可以看作房子的衛生間、廚房、客廳,是房子的共用資源。
2、mysql多實例的作用與問題
作用:
2.1、有效利用服務器資源
當單個服務器資源有剩餘時,可以充分利用剩餘的資源提供更多的服務,且可以實現資源的邏輯隔離。
2.2、節約服務器資源
當公司資金緊張,但是數據庫又需要各自盡量獨立的提供服務,而且,需要主從複製等技術時,多實例就再好不過了。
問題:
存在資源互相搶佔的問題。
當某個數據庫實例併發很高或有SQL慢查詢時,整個實例會消耗大量的系統CPU、磁盤I/O等資源,導致服務器上的其他數據庫實例提供服務的質量一起下降。
3、mysql多實例的生產應用場景
3.1、資金緊張型公司的選擇
若公司資金緊張,公司業務訪問量不太大,但又希望不同業務的數據庫服務各自盡量獨立的提供服務而互相不受影響,同時,還需要主從複製等技術提供備份或讀寫分離服務,那麼,多實例就再好不過了。例如:可以通過3臺服務器部署9~15個實例,交叉做主從複製、數據備份及讀寫分離,這樣就可以達到9~15臺服務器每個只裝一個數據庫纔有的效果。強調:所謂的儘量獨立是相對的。
3.2、併發訪問不是特別大的業務
當公司業務訪問量不太大的時候,服務器的資源基本上都浪費了,這時就適合多實例的應用,如果對SQL語句的優化做的比較好,mysql多實例會是一個很值得使用的技術,即使併發很大,合理分配好系統資源,搭配好服務,也不會有太大問題。
3.3、門戶網站應用mysql多實例場景
門戶網站通常都會使用多實例,因爲配置硬件好的服務器,可節省IDC機櫃空間,同時,跑多實例也會減少硬件資源跑不滿的浪費。

二、安裝並配置多實例mysql數據庫

1、創建mysql多實例的數據文件目錄
以/data目錄作爲mysql多實例總的根目錄,然後規劃不同的數字(即mysql實例端口號)作爲/data下面的二級目錄,不同的二級目錄對應的數字就作爲mysql實例的端口號,以區別不同的實例,數字對應的二級目錄下包含mysql的數據文件,配置文件和啓動文件。

[root@mysql-server tools]# mkdir -p /data/{3306,3307}/data/
[root@mysql-server tools]# tree /data
/data
├── 3306
│   └── data
├── 3307
│   └── data

2、創建mysql多實例的配置文件(data.zip 拿好早已配置的模板通過rz上傳到相關目錄下)
爲了讓mysql多實例之間彼此獨立,要爲每一個實例建立一個my.cnf配置文件和一個啓動文件mysql,讓它們分別對應自己的數據文件目錄data。

[root@mysql-server tools]# unzip data.zip 
Archive:  data.zip
   creating: data/
   creating: data/3306/
  inflating: data/3306/my.cnf        
  inflating: data/3306/mysql         
   creating: data/3307/
  inflating: data/3307/my.cnf        
  inflating: data/3307/mysql         
[root@mysql-server tools]# cp data/3306/my.cnf /data/3306/
[root@mysql-server tools]# cp data/3307/my.cnf /data/3307/
[root@mysql-server tools]# tree /data
/data
├── 3306
│   ├── data
│   └── my.cnf
└── 3307
    ├── data
    └── my.cnf

4 directories, 2 files

3、創建mysql多實例的啓動文件(data.zip 拿好早已配置的模板通過rz上傳到相關目錄下)

[root@mysql-server tools]# cp data/3306/mysql /data/3306/
[root@mysql-server tools]# cp data/3307/mysql /data/3307/ 
[root@mysql-server tools]# tree /data
/data
├── 3306
│   ├── data
│   ├── my.cnf
│   └── mysql
└── 3307
    ├── data
    ├── my.cnf
    └── mysql

4 directories, 4 files

4、配置mysql多實例的文件權限
4.1、通過下面命令,授權mysql用戶和組管理整個多實例的根目錄/data

[root@mysql-server tools]# chown -R mysql.mysql /data
[root@mysql-server tools]# find /data -type f -name "mysql"|xargs ls -l
-rw-r--r-- 1 mysql mysql 1307 4月   8 21:07 /data/3306/mysql
-rw-r--r-- 1 mysql mysql 1307 4月   8 21:07 /data/3307/mysql

4.2、通過下面命令,授權mysql多實例所有啓動文件的mysql可執行,設置700權限最佳,注意不要用755權限,因爲啓動文件裏有數據庫管理員密碼,會被讀取到。

[root@mysql-server tools]# find /data -type f -name "mysql"|xargs chmod 700
[root@mysql-server tools]# find /data -type f -name "mysql"|xargs ls -l
-rwx------ 1 mysql mysql 1307 4月   8 21:07 /data/3306/mysql
-rwx------ 1 mysql mysql 1307 4月   8 21:07 /data/3307/mysql

5、mysql相關命令加入全局路徑的配置
5.1、配置全局路徑的意義
如果不爲mysql的命令配置全局路徑,就無法直接在命令行輸入mysql這樣的命令,只能用全路徑命令(/application/mysql/bin/mysql),這種帶着路徑輸入命令的方式很麻煩。
5.2、配置mysql全局路徑的方法
5.2.1、確認mysql命令所在路徑,命令如下:

[root@mysql-server tools]# ls /application/mysql/bin/mysql
/application/mysql/bin/mysql

5.2.2、在PATH變量前面增加/application/mysql/bin路徑,並追加到/etc/profile文件中,命令如下:

[root@mysql-server tools]# echo 'export PATH=/application/mysql/bin:$PATH' >>/etc/profile
[root@mysql-server tools]# tail -1 /etc/profile
PATH="/application/mysql/bin:$PATH"
[root@mysql-server tools]# source /etc/profile
[root@mysql-server tools]# echo $PATH
/application/mysql/bin:/usr/local/java/jdk1.8.0_60/bin:/usr/local/java/jdk1.8.0_60/jre/bin:/application/mysql/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/bin:/root/bin

6、初始化mysql多實例的數據庫文件
6.1、初始化mysql數據庫,命令如下:

cd /application/mysql/scripts/
./mysql_install_db --basedir=/application/mysql --datadir=/data/3306/data --user=mysql
./mysql_install_db --basedir=/application/mysql --datadir=/data/3307/data --user=mysql
##### --basedir=/application/mysql 是mysql安裝路徑,--datadir是不同的實例數據目錄。

6.2、初始化數據庫的原理及結果說明
初始化數據庫的實質就是創建基礎的數據庫系統的庫文件,例如:生成mysql庫表等。
初始化數據庫後查看對應實例的數據目錄,可以看到多瞭如下文件:

[root@mysql-server scripts]# tree /data
/data
├── 3306
│   ├── data
│   │   ├── mysql
│   │   │   ├── columns_priv.frm
│   │   │   ├── columns_priv.MYD
│   │   │   ├── columns_priv.MYI
│   │   │   ├── db.frm
...省略部分...

7、啓動mysql多實例數據庫
第一個實例3306的啓動命令如下:

[root@mysql-server scripts]# /data/3306/mysql start
Starting MySQL...

第二個實例3307的啓動命令如下:

[root@mysql-server scripts]# /data/3307/mysql start 
Starting MySQL...

檢查mysql多實例數據庫是否成功啓動,命令如下:

[root@mysql-server scripts]# ss -lntup|grep 330
tcp    LISTEN     0      128                    *:3306                  *:*      users:(("mysqld",2804,12))
tcp    LISTEN     0      128                    *:3307                  *:*      users:(("mysqld",3522,11))

8、mysql多實例啓動故障排錯說明
如果mysql多實例有服務沒有啓動,排查辦法如下:
1)、如果發現沒有顯示mysql對應實例的端口,請稍微等待幾秒再檢查,mysql服務的啓動比web服務慢一些。
2)、如果還不行,查看mysql服務對應實例的錯誤日誌,錯誤日誌路徑在my.cnf配置的最下面定義。例如,3306實例的錯誤日誌爲:

[root@mysql-server 3306]# grep log-error my.cnf|tail -1
log-error=/data/3306/mysql_oldboy3306.err
[root@mysql-server 3306]# tail -10 /data/3306/mysql_oldboy3306.err 
180408 22:14:09 InnoDB: 5.5.32 started; log sequence number 0
180408 22:14:09 [Note] Server hostname (bind-address): '0.0.0.0'; port: 3306
180408 22:14:09 [Note]   - '0.0.0.0' resolves to '0.0.0.0';
180408 22:14:09 [Note] Server socket created on IP: '0.0.0.0'.
...省略部分...

三、配置及管理mysql多實例數據庫

1、配置mysql多實例數據庫開機自啓動

[root@mysql-server 3306]# echo "/data/3306/mysql start" >> /etc/rc.local 
[root@mysql-server 3306]# echo "/data/3307/mysql start" >> /etc/rc.local 
[root@mysql-server 3306]# tail -2 /etc/rc.local 
/data/3306/mysql start
/data/3307/mysql start

2、登錄mysql及管理方法
mysql安裝完成後,默認情況下,mysql管理員的賬號root是無密碼的。登錄不同的實例需要指定不同實例的mysql.sock文件路徑,這個mysql.sock是在my.cnf配置文件裏指定的。
下面是無密碼登錄數據庫的方法,關鍵點是-S參數及後面指定的/data/3306/mysql.sock,注意,不同實例的sock雖然名字相同,但是路徑是不同的,因此是不同的文件。

[root@mysql-server 3306]# mysql -S /data/3306/mysql.sock 
[root@mysql-server 3306]# mysql -S /data/3307/mysql.sock  

下面是重啓對應實例數據庫的命令:

/data/3306/mysql stop
/data/3306/mysql start

3、mysql安全配置
mysql管理員的賬號root密碼默認爲空,極不安全,可以通過mysqladmin命令爲mysql不同實例的數據庫設置獨立的密碼,命令如下:

[root@mysql-server 3306]# mysqladmin -u root -S /data/3306/mysql.sock password '123456'
[root@mysql-server 3306]# mysqladmin -u root -S /data/3307/mysql.sock password '123456' 
登錄3306實例的命令如下:

[root@mysql-server 3306]# mysql -uroot -p -S /data/3306/mysql.sock
登錄3307實例的命令如下:
[root@mysql-server 3306]# mysql -uroot -p -S /data/3307/mysql.sock
若要重啓多實例數據庫,也需要進行相應的如下配置。在重啓數據庫前,需要調整不同實例啓動文件裏對應的數據庫密碼。

[root@mysql-server 3306]# sed -n '13p' /data/3306/mysql /data/3307/mysql
mysql_pwd="oldboy"
[root@mysql-server 3306]# sed -i '13 s#oldboy#123456#g' /data/3306/mysql /data/3307/mysql
[root@mysql-server 3306]# sed -n '13p' /data/3306/mysql /data/3307/mysql
mysql_pwd="123456"

4、多實例mysql登錄問題分析
1)、多實例本地登錄mysql
多實例本地登錄一般通過socket文件來指定具體登錄到哪個實例,此文件的具體位置是在mysql編譯過程或my.cnf文件中指定的。在本地登錄數據庫時,登錄程序會通過socket文件來判斷登錄的是哪個數據庫實例。
2)、遠程連接登錄mysql多實例
遠程登錄mysql多實例中的一個實例時,通過TCP端口來指定所要登錄的mysql實例,此端口的配置是在mysql配置文件my.cnf中指定的。
例如:在 mysql -uoldboy -p'oldboy' -h 10.0.0.7 -P 3307 中,-P爲端口參數,後面接具體的實例端口,端口是一種“邏輯連接位置”,是客戶端程序被分派到計算機上特殊服務程序的一種方式,強調提前在10.0.0.7上對oldboy用戶做了授權。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章