MySQL多實例介紹及配置

1、MySQL多實例介紹

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

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

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

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

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

[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

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

[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

四、配置mysql多實例的文件權限
4.一、經過下面命令,受權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.二、經過下面命令,受權mysql多實例全部啓動文件的mysql可執行,設置700權限最佳,注意不要用755權限,由於啓動文件裏有數據庫管理員密碼,會被讀取到。centos

[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

五、mysql相關命令加入全局路徑的配置
5.一、配置全局路徑的意義
若是不爲mysql的命令配置全局路徑,就沒法直接在命令行輸入mysql這樣的命令,只能用全路徑命令(/application/mysql/bin/mysql),這種帶着路徑輸入命令的方式很麻煩。
5.二、配置mysql全局路徑的方法
5.2.一、確認mysql命令所在路徑,命令以下:安全

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

5.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

六、初始化mysql多實例的數據庫文件
6.一、初始化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.二、初始化數據庫的原理及結果說明
初始化數據庫的實質就是建立基礎的數據庫系統的庫文件,例如:生成mysql庫表等。
初始化數據庫後查看對應實例的數據目錄,能夠看到多了以下文件:app

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

七、啓動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))

八、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'.
...省略部分...

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

一、配置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

二、登陸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

三、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"

四、多實例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用戶作了受權。

相關文章
相關標籤/搜索