概述
在做web應用系統中,如果數據庫出現了性能瓶頸,而你又是使用的MySQL數據庫,那麼就可以考慮采用數據庫集群的方式來實現查詢負載了。因為一般來講一個系統中數據庫的查詢操作比更新操作要多的多,因此通過多台查詢服務器將數據庫的查詢分擔到不同的查詢數據庫從而提高數據庫的查詢效率。
MySQL數據庫支持數據庫的主從復制功能,使用主數據庫進行數據的插入、刪除與更新操作,而從數據庫則專門用來進行數據庫查詢,從數據庫還可以建立多台,通過負載均衡來實現查詢,這樣就可以將更新操作與查詢操作分離到不同的數據庫上,從而提高查詢的效率,降低系統的負載。
配置
一、主數據庫配置
修改mysql的配置文件(對於Windows就是MySQL安裝目錄下的my.ini文件,對於Linux通常就
是 /etc/my.cnf文件),在配置文件中加入(或修改)
server-id = 1
log-bin=MySQL-bin
binlog-do-db=dbname --要同步的數據庫名稱
binlog-ignore-db=dbname --不要同步的數據庫名稱
注:MySQL進行主從復制是通過二進制的日志文件來進行,所以我們必須開啟MySQL的日志功能,即我們上面的log-bin,同時每一台數據庫服務器都需要指定一個唯一的server-id,通常主數據庫服務器我們指定為1。
給主數據庫授予一個可以進行復制的用戶,如下:
grant replication slave on *.* to repuser@'host' identifIEd by '123456';
replication slave——MySQL數據庫中表示復制的權限名稱
repuser——從數據庫服務器登陸到主數據庫服務器時用到的用戶名稱
host——從數據庫IP地址
123456——登陸密碼
如果上述權限設置後,無法同步,可將其改為
grant select,insert,update,delete,replication slave on *.* to identifIEd by '123456';
配置完上述步驟後,就可以啟動主數據庫了。
二、從數據庫配置
修改配置文件
server-id=2
log-bin=MySQL-bin --在從服務器上啟動日志記錄,不是必須,但是官方建議
master-host=主機 --主數據庫服務器的IP地址
master-user=用戶名 --執行復制的用戶名稱,就是grant的用戶,即repuser
master-passWord=密碼 --復制用戶的密碼,就是grant的用戶密碼,即123456
master-port=端口 --主數據庫服務器的端口,默認是3306
replicate-do-db=dbname --需要同步的數據庫
#replicate-ignore-db=dbname --不需要同步的數據庫
現在可以重啟從數據庫,啟動後,還需要啟動復制線程
slave start
查看復制線程的狀態
show slave status;
我們還可以在從數據庫服務器上動態的改變對主數據庫的配置信息,通過如下命令來進行:
CHANGE MASTER TO MASTER_HOST='主數據庫服務器的IP地址',MASTER_PORT=3306,MASTER_USER='主數據庫上的復制帳號',MASTER_PASSWord='密碼';
三、啟動與監控
1、監控主數據庫服務器
show master status; --運行於主數據庫
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | | MySQL-bin.000003 | 370558 | | | 1 row in set (0.00 sec)
其中File是表示日志記錄的文件,而Position則是表示當前日志在文件中的位置,這個也是從數據庫服務器上執行復制操作必須的標識,後面的兩個字段分別表示要記錄的數據庫名稱和不需要記錄的數據庫名稱,我們也可以在配置文件中進行配置。
2、監控從數據庫服務器
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 | 10.20.20.194 | 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)
紅色的部分,分別表示的是Master_Log_File和Read_Master_Log_Pos,即主數據庫服務器上的日志文件和要讀取的主數據庫服務器上的日志的位置,通常這個Read_Master_Log_Pos是和主數據庫服務器上的Position是一致的(同步以後),如果從數據庫服務器還沒有同步完畢,那麼這個值通常比主數據庫服務器上的要小。
注:如果從數據庫服務器在同步的過程中出現了問題,那麼我們可以通過reset slave來重置從數據庫服務器的復制線程。
從數據庫常用命令:
Slave start; --啟動復制線程
Slave stop; --停止復制線程
Reset slave; --重置復制線程
Show slave status; --顯示復制線程的狀態
Show slave status\G; --顯示復制線程的狀態(分行顯示)
Show master status\G; --顯示主數據庫的狀態(分行顯示)
Show master logs --顯示主數據庫日志,需在主數據庫上運行
Change master to; --動態改變到主數據庫的配置
Show processlist --顯示有哪些線程在運行
四、常見問題與解答
1、現象:修改完配置後,重啟mysql,提示MySQL manager or server PID file could not be found
解決:查找進程中的MySQL,kill掉
> service MySQL restart
> ps -aux|grep myslq
> kill 進程號
# service MySQL start
注:mysql.sock文件在mysql啟動後才會生成,位置為/tmp下或/var/lib/MySQL/下
2、現象:從數據庫無法同步,show slave status顯示Slave_SQL_Running為No,Seconds_Behind_Master為null
原因:a.程序可能在slave上進行了寫操作
b.也可能是slave機器重起後,事務回滾造成的.
解決:方法一:
MySQL> slave stop;
MySQL> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
MySQL> slave start;
方法二:slave stop; --停掉slave服務
進入master
mysql> show master status; | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | | MySQL-bin.000040 | 324 | | | 然後到slave服務器上執行手動同步
MySQL> change master to
> master_host='10.20.20.194',
> master_user='repuser',
> master_passWord='123456',
> master_port=3306,
> master_log_file='MySQL-bin.000040',
> master_log_pos=324;
啟動slave服務
MySQL> slave start;
通過show slave status查看Slave_SQL_Running為Yes,Seconds_Behind_Master為0,即為正常。
注:手動同步需要停止master的寫操作!
3、現象:從數據庫無法同步,show slave status顯示Slave_IO_Running為No,Seconds_Behind_Master為null
解決:重啟主數據庫
service MySQL restart
mysql> show master status; | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | | MySQL-bin.000001 | 98 | | |
+------------------+----------+--------------+------------------+
MySQL> slave stop;
mysql> change master to Master_Log_File='MySQL-bin.000001',Master_Log_Pos=98
MySQL> slave start;