天天看點

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

目前遇到的情況有:

一、資料庫進行線上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資料的一個快照。然後把指令重新執行一遍。