本文由秀依林楓提供友情贊助,首發於爛泥行天下。
mysql5.5數據庫多實例部署,我們可以分以下幾個步驟來完成。
1、 mysql多實例的原理
2、 mysql多實例的特點
3、 mysql多實例應用場景
4、 mysql5.5多實例部署方法
一、mysql多實例的原理
mysql多實例,簡單的說,就是在一台服務器上開啟多個不同的mysql服務端口(如3306,3307),運行多個mysql服務進程。這些服務進程通過不同的socket監聽不同的服務端口,來提供各自的服務。
這些mysql實例共用一套mysql安裝程序,使用不同的my.cnf配置文件、啟動程序、數據文件。在提供服務時,mysql多實例在邏輯上看來是各自獨立的,各個實例之間根據配置文件的設定值,來取得服務器的相關硬件資源。
二、mysql多實例的特點
2.1 有效的利用服務器資源
當單個服務器資源有剩余時,可以充分利用剩余的服務器資源來提供更多的服務。
2.2 節約服務器資源
當公司資金緊張,但是數據庫需要各自提供獨立服務,而且需要主從同步等技術時,使用多實例就最好了。
2.3 出現資源互相搶占問題
當某個實例服務並發很高或者有慢查詢時,會消耗服務器更多的內存、CPU、磁盤IO等資源,這時就會導致服務器上的其它實例提供訪問的質量下降,出現服務器資源互相搶占的現象。
三、mysql多實例應用場景
3.1 資金緊張型公司的選擇
當公司業務訪問量不太大,又捨不得花錢,但同時又希望不同業務的數據庫服務各自獨立,而且需要主從同步進行等技術提供備份或讀寫分離服務時,使用多實例是最好不過的。
3.2 並發訪問不是特別大的業務
當公司業務訪問量不太大,服務器資源基本閒置的比較多,這是就很適合多實例的應用。如果對SQL語句優化的好,多實例是一個很值得使用的技術。即使並發很大,只要合理分配好系統資源,也不會有太大問題。
四、mysql5.5多實例部署方法
4.1 mysql5.5多實例部署方法
mysql5.5多實例部署方法一個是通過多個配置文件啟動多個不同進程的方法,第二個是使用官方自帶的mysqld_multi來實現。
第一種方法我們可以把各個實例的配置文件分開,管理比較方便。第二種方法就是把多個實例都放到一個配置文件中,這個管理不是很方便。所以在此我們選擇第一種方法,而且以下實驗我們全部是在此方法下進行的。
4.2 mysql5.5的安裝及配置
要配置mysql5.5多實例,我們首先要安裝mysql5.5,有關mysql5.5的安裝可以查看《爛泥:mysql5.5數據庫cmake源碼編譯安裝》這篇文章。
mysql5.5安裝完畢後,我們不要啟動mysql,因為此時mysql是單實例的。
4.3 創建mysql多實例的數據目錄
現在我們來創建mysql5.5多實例的數據目錄,在此我們創建兩個mysql實例3306和3307。創建各自的數據目錄,如下:
mkdir -p /data/{3306,3307}/data
tree -L 2 /data/
4.4 修改mysql5.5多實例my.cnf文件
實例3306和3307的數據目錄創建完畢後,我們來配置實例3306與3307的my.cnf配置文件。
復制mysql5.5安裝目錄support-files下的my-medium.cnf為my.cnf,並把內容修改為下。現在以3306這個實例為例,如下:
[client]
port = 3306
socket = /data/3306/mysql.sock
[mysqld]
port = 3306
socket = /data/3306/mysql.sock
basedir = /usr/local/mysql
datadir = /data/3306/data
skip-external-locking
key_buffer_size = 16M
max_allowed_packet = 1M
table_open_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
skip-name-resolve
log-bin=mysql-bin
binlog_format=mixed
max_binlog_size = 500M
server-id = 1
[mysqld_safe]
log-error=/data/3306/ilanni.err
pid-file=/data/3306/ilanni.pid
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
[myisamchk]
key_buffer_size = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
注意圖中黃色標記出來的部分,就是我們主要修改的,其他默認保持不變。
以上是實例3306的my.cnf配置文件,現在我們來配置實例3307的my.cnf。實例3307的配置文件my.cnf我們直接復制實例3306的my.cnf文件,然後通過sed命令把該文件中的3306修改為3307即可。如下:
cp /data/3306/my.cnf /data/3307/my.cnf
sed -i 's/3306/3307/g' /data/3307/my.cnf
或者
sed -e 's/3306/3307/g' /data/3306/my.cnf >/data/3307/my.cnf
4.5 初始化mysql多實例
實例3306和3307的my.cnf配置文件修改完畢後,我們需要來初始化這兩個實例,使用mysql_install_db命令。如下:
/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/data/3306/data --user=mysql
/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/data/3307/data --user=mysql
注意mysql5.5的mysql_install_db在mysql5.5的/usr/local/mysql/scripts/mysql_install_db目錄下。
查看實例初始化後的情況,如下:
tree -L 3 /data/
通過上圖我們可以看到mysql實例在初始化後會創建基本的數據庫。
現在再來看看初始化創建文件的屬性,如下:
通過上圖可以看到初始化創建的文件都是屬於mysql這個用戶的。
為什麼會是這樣呢?
這個是因為我們初始化加入--user=mysql這個選項。當然這個也是我們所需要的,因為這增加了mysql的安全性。
4.6 修改mysql實例的數據庫目錄權限
mysql實例初始化完畢後,我們現在把實例3306和實例3307的數據目錄權限重新賦予給mysql用戶。如下:
chown -R mysql:mysql /data/3306
chown -R mysql:mysql /data/3307
這個地方建議一定要操作一遍,否則在啟動mysql實例時,會提示出錯。導致mysql實例無法啟動。
4.7 啟動mysql5.5多實例
我們現在來啟動實例。使用如下命令:
/usr/local/mysql/bin/mysqld_safe --defaults-file=/data/3306/my.cnf &
/usr/local/mysql/bin/mysqld_safe --defaults-file=/data/3307/my.cnf &
ps aux |grep mysqld
通過上圖,我們可以看到實例3306和3307 都已經正常啟動。也說明我們的mysql5.5多實例已經配置成功。
其實單實例mysql的啟動也是通過mysqld_safe命令來啟動。它默認會加載/etc/my.cnf文件。
4.8 登錄mysql5.5多實例
登錄多實例數據庫時,我們需要加入該實例的socket文件,才能正常登錄。現在以3306實例為例。
本地登錄3306實例,如下:
mysql -uroot -p -S /data/3306/mysql.sock
本地登錄進去後,我們在實例3306上創建一個ilanni3306的數據庫。如下:
create database ilanni3306;
show databases;
現在我們遠程登錄實例3306,並查看剛剛新建的數據庫。如下:
mysql -h192.168.1.213 -uroot -p -S /data/3306/mysql.sock
通過上圖,我們可以看到遠程也是可以連接3306實例的。
4.9 修改mysql5.5多實例root密碼
修改實例3306的root密碼,使用mysqladmin命令。如下:
mysqladmin -uroot -p password 123456 -S /data/3306/mysql.sock
到此我們的mysql多實例部署就已經完成。