與小站點相比,大型站點的數(shù)據(jù)庫管理員,需要提前做好以下的事情:
- 提供災難發(fā)生時核心業(yè)務數(shù)據(jù)的恢復計劃。理論上這個過程至少需要執(zhí)行一次。
- 通過采集大量用戶數(shù)據(jù)并監(jiān)控網(wǎng)站各節(jié)點的負載,提供優(yōu)化計劃
- 當用戶數(shù)量急劇增長時的快速橫向擴展計劃
?
為了保證站點可響應和可用性,需要做兩件事:系統(tǒng)的數(shù)據(jù)備份和冗余。備份可以將節(jié)點恢復到它崩潰之前的狀態(tài),備份根據(jù)需求有幾種比如及時恢復(PITR:point-in-time-recovery),在線備份等等;而冗余則保證即使在一個或更多節(jié)點停止服務的情況下,站點仍能繼續(xù)運行,備份一般通過硬件副本來實現(xiàn),讓幾個實例并行運行,并通過復制在幾個機器上保存相同數(shù)據(jù)的多個可用副本。復制的主要應用場景:1)針對高讀寫比的,scale out;2)添加冗余保證高可用性,比如雙主配置(dual-master setup)。
?
二進制日志(binlog)
復制過程需要二進制日志。二進制日志的目的是記錄數(shù)據(jù)庫中表的更改,然后用于復制和PITR,另外少數(shù)審計情況下也會用到。
傳統(tǒng)意義上說,MySQL復制記錄了產(chǎn)生變化的SQL語句,稱為基于語句的復制(statement-based replication)?;谡Z句的復制的缺點是無法保證所有語句都正確復制。所以在5.1版本中,MySQL還提供了基于行的復制(row-based replication)。
查看二進制日志:
# 強制把緩存的東西刷到LOGS中,并產(chǎn)生一個Rotate事件寫入binlog中,后面的寫入會寫到新的binlog中
FLUSH LOGS;
# 正常使用很久的DB不建議使用這個命令,需要加參數(shù),指定具體的binlog文件名 【IN 'xxxx'】
SHOW BINLOG EVENTS\G
二進制日志中事件所包含的字段:
Event_type: 比如Format_desc, Query, Rotate
Server_id : 創(chuàng)建事件的服務器id
Log_name : 存儲事件的文件名,一個事件只能存儲在一個文件中
Pos : 事件在文件中的開始位置,及事件的第一個字節(jié)
End_log_pos:事件在文件中的結(jié)束位置,也就是下一個事件的開始位置
Info : 具體事件的信息,Query的時候就是SQL語句
二進制日志的結(jié)構(gòu)和內(nèi)容:
二進制日志不是一個的單獨的文件,它包括一組存儲實際內(nèi)容的二進制日志文件和一個二進制日志索引文件。每個二進制日志文件都以format description event開始,以rotate event結(jié)束。rotate event包含下一個二進制日志文件的名稱,以告知二進制日志繼續(xù)寫入哪個文件。因此FLUSH LOGS的時候會新建一個新binlog文件。?
獲取當前正在寫入的是哪一個二進制日志文件:
SHOW MASTER STATUS\G
RESET MASTER 命令刪除了所有的二進制日志文件并清空了二進制日志索引文件。 RESET SLAVE 命令刪除了Slave復制所用的所有文件,重新開始。
CHANGE MASTER TO 命令用于改變slave連接master的一些參數(shù),其中就包括slave讀取master二進制日志文件的參數(shù)。比如使用MASTER_LOG_FILE和MASTER_LOG_POS來指定master開始發(fā)送事件的binlog位置。
如何建立新Slave
1 :配置新的Slave
2 :備份Master(或者備份已經(jīng)復制了Master的Slave)
3 :接下該備份相應的binlog位置
4 :在新Slave上恢復備份
5 :配置Slave從這個binlog位置開始復制
區(qū)別就在于第二步,一種是直接從Master進行備份,一種是通過現(xiàn)有Slave備份,下面分別介紹兩種。
1:克隆Master:
# 刷新所有的表并鎖定數(shù)據(jù)庫,防止在檢查binlog位置之前數(shù)據(jù)庫發(fā)生改變
FLUSH TABLES WITH READ LOCK ;
# 獲取當前的binlog文件和pos
SHOW MASTER STATUS\G
# 備份master
mysqldump --all-databases --host=master- 1 >backup.sql
# 解鎖
UNLOCK TABLES;
# 在slave上恢復備份
mysql --host=slave- 1 <backup.sql
# 配置slave
CHANGE MASTER TO
MASTER_HOST = ' master-1 ' ,
MASTER_PORT = 3306 ,
MASTER_USER = ' slave-1 ' ,
MASTER_PASSWORD = ' xxxx ' ,
MASTER_LOG_FILE = ' master-bin.000042 ' ,
MASTER_LOG_POS = 546552 ;
# 啟動slave
START SLAVE;
其實mysqldump命令提供了 master_data 選項,自動把MASTER_LOG_FILE和MASTER_LOG_POS信息dump到backup.sql中
另外:FLUSH TABLES WITH READ LOCK對于InnoDB是不安全的,因為雖然會鎖表,不會產(chǎn)生新事務,但是后臺仍然有一些活動在繼續(xù)進行。
所以安全的創(chuàng)建InnoDB數(shù)據(jù)表的備份可以使用下面的方法。
1 :關(guān)閉服務器,然后復制文件。如果數(shù)據(jù)庫很大 ,最好采取這種方法,因為這時使用mysqldump進行數(shù)據(jù)恢復會很慢
2 :執(zhí)行FLUSH TABLES WITH READ LOCK之后,使用mysqldump
3 :執(zhí)行FLUSH TABLES WITH READ LOCK之后,使用快照的方法,比如LVM(Linux),ZFS(Solaris)快照
?
2:克隆Slave:
# 防止出現(xiàn)不一致的備份映像,備份Slave之前需要先停止replication
STOP SLAVE;
# 確定從哪里開始復制,注意Relay_Master_Log_File和Exec_Master_Log_Pos
SHOW SLAVE STATUS\G
# 配置新的slave,指向master
CHANGE MASTER TO
MASTER_HOST = ' master-1 ' ,
MASTER_PORT = 3306 ,
MASTER_USER = ' slave-1 ' ,
MASTER_PASSWORD = ' xxxx ' ,
MASTER_LOG_FILE = ' master-bin.000042 ' ,
MASTER_LOG_POS = 546632 ;
# 啟動新的slave
START SLAVE
?
---待續(xù)
更多文章、技術(shù)交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
