所謂多實例,就是在一臺服務器上搭建、運行多個MySQL實例,每一個實例使用不一樣的服務端口,經過不一樣的socket監聽;物理上,每一個實例擁有獨立的參數配置文件及數據庫。mysql
一般狀況下,一臺服務器是不建議運行多個MySQL實例的,尤爲是生產環境,由於這會形成資源相互強佔問題。但在一些高可用環境中,卻有這樣的需求,好比:利用Heartbeat搭建的故障轉移集羣環境,若主備服務器只運行一個MySQL實例,則備用服務器日常處於閒置狀態,形成了資源浪費;若各自運行一個MySQL實例,則在一方故障時,要求另外一方接管其任務,即同時運行兩個MySQL實例。基於這個需求,應合理配置MySQL服務器,使其具有同時運行多個實例的能力。linux
如何才能在一臺服務器上搭建、運行多個MySQL實例,其關鍵在於如何爲每一個實例分配獨立的參數文件,如下是幾種經常使用的多實例方案,分別來學習、熟悉一下。sql
系統環境數據庫
OS:CentOS 5.8 (x86_64) 內核:2.6.18-308.el5 DB:MySQL 5.5.17緩存
一.採用源碼包安裝MySQL實現多實例服務器
源碼包是最靈活的安裝包,可定製編譯一些路徑參數,可安裝到任何路徑,所以可在一臺服務器搭建多個MySQL實例。本例安裝兩個MySQL實例,步驟以下:socket
1. 準備工做函數
從MySQL 5.5開始,改用cmake工具來編譯源碼包,因此要首先安裝它,可參考其它文檔,此處不作講解。另外,編譯以前還需安裝ncurses-devel、bison兩個依賴包,不然會編譯失敗。工具
――安裝依賴包佈局
# rpm -ivh ncurses-devel-5.5-24.20060715.x86_64.rpm
# rpm -ivh bison-2.3-2.1.x86_64.rpm
――建立mysql系統組及用戶
# groupadd -g 497 mysql
# useradd –u 499 -g mysql mysql
――解壓安裝包
# tar -zxvf mysql-5.5.17.tar.gz
# cd mysql-5.5.17
2. 編譯、安裝
l MySQL實例1:
(端口:3306,安裝目錄:/usr/local/mysqla,數據文件目錄:/data/lib/mysqla)
――定製編譯
# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysqla-DMYSQL_TCP_PORT=3306 -DMYSQL_DATADIR=/data/lib/mysqla-DMYSQL_UNIX_ADDR=/data/lib/mysqla/mysql.sock -DSYSCONFDIR=/usr/local/mysqla-DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1-DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1-DWITH_PARTITION_STORAGE_ENGINE=1 -DENABLED_LOCAL_INFILE=1 -DWITH_READLINE=1-DWITH_SSL=yes -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci-DEXTRA_CHARSETS=all
# make
# make install
――建立系統數據庫及系統表
# cd /usr/local/mysqla/
# scripts/mysql_install_db --user=mysql--basedir=/usr/local/mysqla --datadir=/data/lib/mysqla
l MySQL實例2:
(端口:3307,安裝目錄:/usr/local/mysqlb,數據文件目錄:/data/lib/mysqlb)
――刪除舊的緩存及對象文件
再次編譯以前,要清除原來的緩存信息及對象文件,以下:
# cd mysql-5.5.17
# make clean
# rm -rf CMakeCache.txt
――定製編譯
# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysqlb-DMYSQL_TCP_PORT=3307 -DMYSQL_DATADIR=/data/lib/mysqlb-DMYSQL_UNIX_ADDR=/data/lib/mysqlb/mysql.sock -DSYSCONFDIR=/usr/local/mysqlb-DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1-DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1-DWITH_PARTITION_STORAGE_ENGINE=1 -DENABLED_LOCAL_INFILE=1 -DWITH_READLINE=1-DWITH_SSL=yes -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci-DEXTRA_CHARSETS=all
# make
# make install
――建立系統數據庫及系統表
# cd /usr/local/mysqlb/
# scripts/mysql_install_db --user=mysql--datadir=/data/lib/mysqlb
3. 配置參數文件
通過上面兩次編譯並建立系統數據庫,安裝、搭建了兩個MySQL實例,接下來分別爲其配置參數文件。
――查看參數文件缺省位置
# /usr/local/mysqla/bin/mysql --help|grep '/my.cnf'
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysqla/my.cnf ~/.my.cnf
# /usr/local/mysqlb/bin/mysql --help|grep '/my.cnf'
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysqlb/my.cnf ~/.my.cnf
從中能夠看出,兩個MySQL實例的4個缺省參數文件中有3個是相同的,因此不能採用,不然就沒法區分了;固然,多個實例間相同的參數部分可如此配置,只不過不便於管理。
爲了使每一個MySQL實例擁有一個獨立的參數文件,只能採用第3個缺省參數文件,即將參數文件存放到各實例本身的安裝目錄下(basedir)。另外,還需保證不存在第4個參數文件,由於它的優先級別較高,若存在則會覆蓋前面的參數文件設置。
關於參數文件的詳細配置此處不作說明了,假設已爲兩個MySQL實例配置好了各自的參數文件,並分別存放在各自的安裝目錄下,即/usr/local/mysqla|mysqlb目錄下。
4. 啓動實例
啓動MySQL實例,須要爲datadir目錄設置正確的權限,不然實例啓動失敗;這一步缺省應該已經設置,檢查一下,若未設置,則經過以下命令設置。
# chown -R mysql.mysql mysql/
――啓動兩個MySQL實例
# /usr/local/mysqla/bin/mysqld_safe --user=mysql &
# /usr/local/mysqlb/bin/mysqld_safe --user=mysql &
――查看進程
# ps -ef|grep mysql
root 1694 26876 0 13:04 pts/2 00:00:00 more/usr/local/mysqla/support-files/mysql.server
root 2270 13474 0 13:13 pts/1 00:00:00 /bin/sh/usr/local/mysqla/bin/mysqld_safe --user=mysql
mysql 2805 2270 113:13 pts/1 00:00:00 /usr/local/mysqla/bin/mysqld--basedir=/usr/local/mysqla --datadir=/data/lib/mysqla--plugin-dir=/usr/local/mysqla/lib/plugin --user=mysql--log-error=/data/lib/mysqla/mysql.err --pid-file=/data/lib/mysqla/mysql.pid--socket=/data/lib/mysqla/mysql.sock --port=3306
root 2828 13474 0 13:13 pts/1 00:00:00 /bin/sh/usr/local/mysqlb/bin/mysqld_safe --user=mysql
mysql 3361 2828 25 13:13 pts/1 00:00:00 /usr/local/mysqlb/bin/mysqld--basedir=/usr/local/mysqlb --datadir=/data/lib/mysqlb --plugin-dir=/usr/local/mysqlb/lib/plugin--user=mysql --log-error=/data/lib/mysqlb/mysql.err--pid-file=/data/lib/mysqlb/mysql.pid --socket=/data/lib/mysqlb/mysql.sock--port=3307
root 3381 13474 0 13:13 pts/1 00:00:00 grep mysql
能夠看出,成功啓動了兩個MySQL實例(進程)
――若要關閉服務,可執行以下命令
# /usr/local/mysqla/bin/mysqladmin shutdown
# /usr/local/mysqlb/bin/mysqladmin shutdown
5. 修改成服務管理方式
爲了方便管理,將其修改成服務管理方式,以下:
――拷貝服務文件
# cp /usr/local/mysqla/support-files/mysql.server/etc/rc.d/init.d/mysqla
# cp /usr/local/mysqlb/support-files/mysql.server/etc/rc.d/init.d/mysqlb
――添加服務
# chkconfig --add mysqla
# chkconfig --list mysqla
mysqla 0:off 1:off 2:on 3:on 4:on 5:on 6:off
# chkconfig --add mysqlb
# chkconfig --list mysqlb
mysqlb 0:off 1:off 2:on 3:on 4:on 5:on 6:off
――啓動服務
# service mysqla start
Starting MySQL.. [ OK ]
[root@db ~]# service mysqlb start
Starting MySQL.. [ OK ]
至此,咱們經過源碼包成功搭建了兩個MySQL實例,它們擁有獨立的端口、參數文件及數據庫。
二.採用二進制包安裝MySQL實現多實例
二進制包其實就是已通過編譯的源碼包,不能再經過定製參數文件缺省路徑的方法來隔離各個實例的參數文件了;但有一點須要說明的是:第3個參數文件的缺省路徑指的是basedir(安裝目錄),可經過它來隔離各實例的參數文件,所以一臺服務器也就可搭建多個MySQL實例了。
一樣安裝兩個MySQL實例,步驟以下:
1. 準備工做
――建立mysql系統組及用戶
# groupadd -g 497 mysql
# useradd -u 499 -g mysql mysql
――解壓安裝包
將二進制安裝包解壓到/usr/local/目錄中,並更名爲mysql,這是二進制包編譯時basedir參數的缺省目錄。
# tar zxvf mysql-5.5.17-linux2.6-x86_64.tar.gz -C /usr/local/
# cd /usr/local/
# mv mysql-5.5.17-linux2.6-x86_64 mysql
――拷貝解壓後的mysql,生成以下兩個文件夾,以用做兩個實例的安裝目錄
# cd /usr/local/
# cp -R mysql mysqla
# cp -R mysql mysqlb
# ll
備註:此處保留mysql這個目錄,是爲了配置硬鏈接,以便在任何目錄下,均可以訪問mysql客戶端程序。
2. 建立系統數據庫
爲兩個MySQL實例建立系統數據庫,basedir分別爲/usr/loca/mysqla|mysqlb,datadir分別爲/data/lib/mysqla|mysqlb,以下:
# cd /usr/local/mysql/
# scripts/mysql_install_db --user=mysql--basedir=/usr/local/mysqla --datadir=/data/lib/mysqla
# scripts/mysql_install_db --user=mysql--basedir=/usr/local/mysqlb --datadir=/data/lib/mysqlb
3. 配置參數文件
爲了使每一個MySQL實例擁有獨立的參數文件,將其存放在各自的安裝目錄下(basedir),且需保證缺省路徑下不存在參數文件,以防讀取錯誤。
假設參數文件已配置好,端口分別爲330六、3307,basedir分別爲/usr/local/mysqla、/usr/local/mysqlb,datadir分別爲/data/lib/mysqla、/data/lib/mysqlb。
4. 啓動實例
這種狀況下,可在啓動實例時經過--defaults-file爲其指定一個參數文件,以下:
# /usr/local/mysql/bin/mysqld_safe--defaults-file=/usr/local/mysqla/my.cnf &
# /usr/local/mysql/bin/mysqld_safe--defaults-file=/usr/local/mysqlb/my.cnf &
關閉實例時,一樣須要指定其參數文件,不然會失敗。
# /usr/local/mysql/bin/mysqladmin--defaults-file=/usr/local/mysqla/my.cnf shutdown
# /usr/local/mysql/bin/mysqladmin--defaults-file=/usr/local/mysqlb/my.cnf shutdown
5. 修改成服務管理方式
二進制包沒有采用缺省參數文件,因此修改成服務管理方式稍微有點複雜,須要修改服務啓動文件中的basedir、datadir參數,以下:
――拷貝服務文件
# cp /usr/local/mysql/support-files/mysql.server/etc/rc.d/init.d/mysqla
# cp /usr/local/mysql/support-files/mysql.server/etc/rc.d/init.d/mysqlb
――添加服務
# chkconfig --add mysqla
# chkconfig --add mysqlb
――修改服務啓動文件
編輯兩個服務啓動文件,修改basedir、datadir參爲合適的路徑,以下:
# vi /etc/rc.d/init.d/mysqla
basedir=/usr/local/mysqla
datadir=/data/lib/mysqla
# vi /etc/rc.d/init.d/mysqlb
basedir=/usr/local/mysqlb
datadir=/data/lib/mysqlb
備註:經過顯式設置basedir,以使每一個MySQL實例擁有獨立的參數文件。
――啓動服務
# service mysqla start
Starting MySQL.. [ OK ]
# service mysqlb start
Starting MySQL.. [ OK ]
# service mysqlb status
MySQL running (30326) [ OK ]
# service mysqla status
MySQL running (29755) [ OK ]
修改成服務管理方式後,啓動、關閉服務方便了,但在本地登陸數據庫,還需指定socket文件,由於缺省的/tmp/mysql.sock並不存在,如:
# mysql --socket=/data/lib/mysqla/mysql.sock
# mysql --socket=/data/lib/mysqlb/mysql.sock
三.採用RPM包安裝MySQL實現多實例
RPM包的文件佈局是固定的,沒法修改,所以一臺服務器一般只能安裝一個MySQL實例。但咱們知道,不管何種方式,MySQL實例都是經過調用mysqld_safe命令來啓動的,而mysqld_safe命令可經過--defaults-file參數來顯式指定一個參數文件,所以一樣可在一臺服務器安裝、運行多個MySQL實例,只不過要對服務啓動文件作一些調整,下面就來嘗試一下這個方法。
1. 安裝MySQL
――安裝server及client包
# rpm -ivh MySQL-server-5.5.17-1.rhel5.x86_64.rpm
# rpm -ivh MySQL-client-5.5.17-1.rhel5.x86_64.rpm
――啓動服務
# service mysql start
Starting MySQL.. [ OK ]
――查看basedir和datadir參數值
# mysql
mysql> show variables like 'basedir';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| basedir |/usr |
+---------------+-------+
1 row in set (0.00 sec)
mysql> show variables like 'datadir';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| datadir |/var/lib/mysql/ |
+---------------+-----------------+
1 row in set (0.01 sec)
從中能夠看出basedir缺省爲/usr,datadir缺省爲/var/lib/mysql。
2. 建立系統數據庫
缺省狀況下,RPM包已建立了系統數據庫,位於/var/lib/mysql目錄下,拷貝這個目錄到/data/lib目錄下,並分別命名爲mysqla、mysqlb,以此來建立兩個實例的系統數據庫。
# service mysql stop
Shutting down MySQL. [ OK ]
# cp -r /var/lib/mysql/ /data/lib/mysqla
# cp -r /var/lib/mysql/ /data/lib/mysqlb
固然,也可經過mysql_install_db工具來建立,它位於/usr/bin目錄下,以下:
# /usr/bin/mysql_install_db --user=mysql--datadir=/data/lib/mysqla
# /usr/bin/mysql_install_db --user=mysql--datadir=/data/lib/mysqlb
3. 配置參數文件
配置兩個參數文件,分別命名爲mya.cnf、myb.cnf,存放到/etc/目錄下;端口號分別爲330六、3307,datadir路徑分別爲/data/lib/mysqla、/data/lib/mysqlb。
4. 啓動實例
同二進制包多實例同樣,此時啓動、關閉實例時只能經過--defaults-file指定參數文件,以下:
# /usr/bin/mysqld_safe --defaults-file=/etc/mya.cnf &
# /usr/bin/mysqld_safe --defaults-file=/etc/myb.cnf &
# /usr/bin/mysqladmin --defaults-file=/etc/mya.cnf shutdown
# /usr/bin/mysqladmin --defaults-file=/etc/myb.cnf shutdown
5. 修改服務管理方式
爲了方便,仍是要將其修改成服務管理方式,執行以下修改操做。
――建立服務啓動文件
根據服務啓動文件mysql,建立兩個對應服務啓動文件mysqla、mysqlb
# cd /etc/rc.d/init.d/
# cp mysql mysqla
# cp mysql mysqlb
――添加服務
# chkconfig --add mysqla
# chkconfig --add mysqlb
――刪除原來的服務啓動文件及服務(避免誤啓動)
# chkconfig --del mysql
# rm /etc/rc.d/init.d/mysql
――修改服務啓動文件
編輯服務啓動文件,進行以下調整,主要有如下幾個地方:
# vi /etc/rc.d/init.d/mysqla
l 1:添加一個變量,設置爲參數文件
my_cnf=/etc/mya.cnf
l 2:修改extra_args參數值,目的是讓parse_server_arguments函數從中解析出datadir等參數值
(紅色字體爲添加部分)
extra_args=""
if test -r "$basedir/my.cnf"
then
extra_args="-e$basedir/my.cnf"
else
if test -r"$datadir/my.cnf"
then
extra_args="-e$datadir/my.cnf"
else
extra_args="-e $my_cnf"
fi
fi
l 3:在mysqld_safe命令中使用--defaults-file以便顯式指定一個參數文件
$bindir/mysqld_safe--defaults-file=$my_cnf--datadir="$datadir" --pid-file="$mysqld_pid_file_path"$other_args >/dev/null 2>&1 &
注意:必定要將--defaults-file參數緊跟mysqld_safe,中間不能有其餘參數,不然啓動失敗。
l 4:修改lock_file_path,若未修改,雖還不清楚有啥影響,但以防萬一,仍是修改之
lock_file_path="$lockdir/mysqla"
l 5:找到'status',將獲取mysqld進程的命令pidof替換爲ps
#mysqld_pid=`pidof $libexecdir/mysqld`
mysqld_pid=`ps --user=mysql -f|grep "$libexecdir/mysqld--defaults-file=$my_cnf"|awk ''`
說明:pidof命令用於獲取$libexecdir/mysqld的進程號,進而判斷MySQL實例的狀態,因爲路徑及名稱都是固定的,因此沒法區分每一個實例對應的進程,致使Status混亂;用ps命令的過濾功能可實現這個需求,針對每一個實例找到其對應的進程。
按照一樣的方法,爲第二個MySQL實例調整服務啓動文件。
――啓動服務
[root@db mysqla]# service mysqla start
Starting MySQL.. [ OK ]
[root@db mysqla]# service mysqlb start
Starting MySQL.. [ OK ]
至此,咱們經過RPM包在一臺服務器上安裝了兩個MySQL實例。
——————————————————————————————————————————
重慶思莊18年1月OCP週末培訓正在面授,歡迎聯繫試聽!新的OCP週末班將於4月1日開課,火熱報名中!更多詳情訪問思莊網站諮詢在線客服~