在做web應用系統中,如果資料庫出現了效能瓶頸,而你又是使用的MySQL資料庫,那麼就可以考慮採用資料庫叢集的方式來實現查詢負載了。因為一般來 講任何一個系統中資料庫的查詢操作比更新操作要多的多,因此通過多台查詢服務器將資料庫的查詢分擔到不同的查詢資料庫從而提高資料庫的查詢效率。
MySQL資料庫支援資料庫的主從複製功能,使用主要資料庫進行資料的插入、刪除與更新操作,而從資料庫則專門用來進行資料庫查詢,這樣就可以將更新操作與查詢操作分離到不同的資料庫上,從而提高查詢的效率。
1、主要資料庫配置
MySQL任何一台資料庫伺服器都可以作為主要資料庫伺服器,我們只需要簡單的修改設定檔就可以使之成為主要資料庫伺服器。我們開啟MySQL的設定檔 (對於windows就是MySQL安裝目錄下的my.ini檔案,對於linux通常就是/etc/my.cnf檔案),我們在設定檔中加入如下兩 行:
server-id = 1
log-bin=mysql-bin
注意,MySQL進行主從複製是通過二進位的記錄檔來進行,所以我們必須開啟MySQL的日誌功能,即我們上面的log-bin,同時每一台資料庫服 務器都需要指定一個唯一的server-id,通常主要資料庫伺服器我們指定為1。主要資料庫伺服器的配置就是如此了,然後我們還需要給主要資料庫授予一個可以 進行複製的使用者,命令如下:
GRANT replication slave ON *.* TO 'repuser'@'%' IDENTIFIED BY '123456';
replication slave是MySQL資料庫中表示複製的許可權名稱,repuser則是表示從資料庫伺服器登陸到主要資料庫伺服器時用到的使用者名稱稱,123456表示登陸 密碼。這樣,我們就在主要資料庫伺服器上建立了一個可以進行複製的使用者帳號了。然後我們啟動主要資料庫伺服器就可以了。
2、從資料庫配置
從資料庫伺服器的配置稍微多一點,主要也是修改MySQL的設定檔,加入如下行:
server-id=2
log-bin=mysql-bin --在從伺服器上開機記錄記錄,不是必須,但是官方建議
master-host=主機 --主要資料庫伺服器的IP地址
master-user=使用者名稱 --執行複製的使用者名稱稱,就是grant的使用者
master-password=密碼 --複製使用者的密碼,就是grant的使用者密碼
master-port=連接埠 --主要資料庫伺服器的連接埠,預設是3306
相關的配置參數意義已做了說明,主要就是多了配置主要資料庫伺服器上的複製帳號的資訊。然後我們啟動從資料庫伺服器,注意啟動從資料庫伺服器後,並沒有啟動複製線程,我們需要在命令列中執行如下命令來啟動複製功能:
slave start
啟動後,我們就可以通過如下命令來查看複製的狀態了:
show slave status;
然後我們就可以看到系統的輸出,第一個就是Slave_IO_State,它的值通常就是Waiting for master to send event,然後我們也還可以看到我們剛才配置的主要資料庫伺服器的IP地址、複製帳號等資訊。
我們還可以在從資料庫伺服器上動態改變對主要資料庫的配置資訊,通過如下命令來進行:
CHANGE MASTER TO MASTER_HOST=’主要資料庫伺服器的IP地址’, MASTER_PORT=3306,MASTER_USER=’主要資料庫上的複製帳號’, MASTER_PASSWORD=’密碼’;
3、啟動與監控
監控主要資料庫伺服器的狀態,我們可以通過showmaster status來查看主要資料庫伺服器的狀態,它的輸出如下:
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 370558 | | |
+------------------+----------+--------------+------------------+
1 row IN SET (0.00 sec)
其中File是表示日誌記錄的檔案,而Position則是表示當前日誌在檔案中的位置,這個也是從資料庫伺服器上執行複製操作必須的標識,後面的兩個欄位分別表示要記錄的資料庫名稱和不需要記錄的資料庫名稱,我們也可以在設定檔中進行配置。
監控從資料庫伺服器的狀態,我們可以通過show slave status來查看從資料庫伺服器的狀態,它的基本輸出如下:
+----------------------------------+---------------+-------------+-------------+---------------+------------------+---------------------+-----------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+
| Slave_IO_State | Master_Host | Master_User | Master_Port | Connect_Retry | Master_Log_File |Read_Master_Log_Pos | Relay_Log_File | Relay_Log_Pos | Relay_Master_Log_File | Slave_IO_Running | Slave_SQL_Running | Replicate_Do_DB | Replicate_Ignore_DB | Replicate_Do_Table | Replicate_Ignore_Table | Replicate_Wild_Do_Table | Replicate_Wild_Ignore_Table | Last_Errno | Last_Error | Skip_Counter | Exec_Master_Log_Pos | Relay_Log_Space | Until_Condition | Until_Log_File | Until_Log_Pos | Master_SSL_Allowed | Master_SSL_CA_File | Master_SSL_CA_Path | Master_SSL_Cert| Master_SSL_Cipher | Master_SSL_Key | Seconds_Behind_Master |
+----------------------------------+---------------+-------------+-------------+---------------+------------------+---------------------+-----------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+
| Waiting FOR master TO send event | 172.16.11.221 | repuser | 3306 | 60 | mysql-bin.000003 |370558 | WEB2-relay-bin.000206 | 12251 | mysql-bin.000003 | Yes | Yes | | | | | | | 0 | | 0 | 370558 | 12251 | None | | 0 | No | | | | | | 0 |
+----------------------------------+---------------+-------------+-------------+---------------+------------------+---------------------+-----------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+
1 row IN SET (0.00 sec)
上面顯示的結果中的mysql-bin.000003和370558分 別表示的是Master_Log_File和Read_Master_Log_Pos,即主要資料庫伺服器上的記錄檔和要讀取的主要資料庫伺服器上的日誌的 位置,通常這個Read_Master_Log_Pos是和主要資料庫伺服器上的Position是一致的,當然這個是指同步以後的,如果從資料庫伺服器還 沒有同步完畢,那麼這個值通常比主要資料庫伺服器上的要小。
如果從資料庫伺服器在同步的過程中出現了問題,那麼我們可以通過reset slave來重設從資料庫伺服器的複製線程,從資料庫伺服器上的通常操作命令有:
Slave start; --啟動複製線程
Slave stop; --停止複製線程
Reset slave; --重設複製線程
Show slave status; --顯示複製線程的狀態
Change master to; --動態改變到主要資料庫的配置
至此,我們就完成了mysql的主從資料庫的配置,這也也為我們的應用在叢集中的使用打下了一個基礎。