思考線上如何既保證不影響查詢,又能做更新操作

王滔發表於2014-11-02

目前遇到的情況有:

 

一、資料庫進行線上ddl(修改表結構和欄位)

也是使用重名錶名的方式。複製一張表,包括裡面的資料,假設名稱為tmp。在這張tmp表上面執行dll語句操作。此時要記錄某個時刻開始對資料庫的更新操作sql,快取起來。

執行dll操作完畢。就把之前快取起的sql放到這個tmp表中執行一遍。

 

二、sphinx重建索引。此時要不能關掉shpinx,要保證能夠進行正常的查詢服務

使用的是重名名的方式。把最新的索引結果儲存在一個.new這樣的檔案中。原來的所以檔案假設是master,那麼現在要把這個master用.new來替換掉,因為索引更新了。

 

怎麼保證,替換操作進行的同時,不影響客戶端查詢sphinx索引呢。不可能關掉sphinx服務吧。

傳送傳送SIGHUP 給searchd,等待所以子程式退出,退出後才執行下面的步驟

master>重新命名為>old

把new檔案重新命名為master,以便提供給正在使用的sphinx查詢使用。

然後讓sphinx程式載入替換後的所以檔案。如果載入成功。就正常。載入失敗,則回滾:

searchd會把.old檔案回滾為當前檔案,並把剛建立的新索引重新命名為 .new

 

 

三、redis主從同步資料時候,主伺服器此時有更新操作。怎麼辦。

現在看到redis針對這種情況的處理是:先把更新的命令快取起來。然後把這些命令同步到從伺服器去執行。

具體是:同步的時候,先把當前記憶體資料庫的資料做一個快照儲存在磁碟上,目的是把這個檔案中的資料發給從伺服器。從伺服器然後載入到記憶體中。在這個同步檔案的過程中。

主要伺服器仍然能夠接受客戶端的查詢操作和更新(寫入)操作。執行更新操作,會額外把把這些更新命令快取起來。等到資料庫快照同步完畢後,就會把這些命令發給從伺服器去執行。

相當於主伺服器執行哪些更新操作,從伺服器把這些更新操作在那邊也執行一遍。當然是在之前資料庫快照的基礎上去執行更新操作才會正確。

 

最終結果是,從伺服器就是主伺服器的redis資料的一個快照。然後把命令重新執行一遍。

相關文章