天天看點

老司機的 redis 資料遷移筆記

老伺服器上記憶體一直報警,是以要把一部分<code>redis</code>資料遷移到新伺服器上去。

遷移的方式有兩種,一種是停伺服器,搬遷資料;另一種通過主從同步轉移。

首先在原伺服器上執行<code>redis-cli shutdown</code>指令,該指令會觸發保證寫<code>rdb</code>檔案以及将<code>aof</code>檔案寫入磁盤,不會丢失資料。 如果是<code>kill -9 pid</code>就會丢失資料。

然後将<code>rdb</code>檔案和<code>aof</code>檔案都拷貝到新伺服器上,注意需要與<code>redis.conf</code>檔案中指定<code>rdb</code>檔案名和<code>aof</code>檔案名比對。

最後在新伺服器上啟動<code>redis</code>伺服器。

個人覺得這種方式有點暴力,因為中間将資料儲存到磁盤、拷貝資料、啟動伺服器,将資料從磁盤導入記憶體,會有很長一段時間。這段時間對線上服務造成不小的影響,是以我也沒這麼用。

首先在新伺服器上直接進入<code>redis-cli</code>,執行從庫配置<code>slaveof 192.168.1.100 6379</code>,這裡假設要将<code>192.168.1.100</code>的<code>6379</code>端口的<code>redis</code>服務轉移過來。這樣就已經開始同步了。通過<code>info</code>可以檢視目前伺服器是<code>slave</code>。

然後通過<code>info</code>指令檢視<code>master_link_status</code>,如果為<code>up</code>,表示同步完成。(在同步過程中,執行查詢的時候還是會提示"redis is loading the dataset in memory",這屬于正常情況.把資料從磁盤檔案加載到記憶體中可能會消耗很長的一段時間。)

最後斷開主從關系,在<code>redis-cli</code>指令行下執行<code>slaveof no one</code>提示<code>ok</code>,再通過<code>info</code>檢視,該新伺服器已經自己變成<code>master</code>了。

上面沒有配合說明業務代碼對伺服器的請求切換,但是我們在切換完服務之後肯定需要轉移業務代碼的請求吧。那麼如何确定服務已經完全轉移走了呢?

在舊伺服器上通過<code>netstat</code>指令檢視是否還有請求過來。

有時候<code>netstat</code>的結果也不一定準,因為有些請求已經不在,但是<code>socket</code>狀态還在,比如<code>close_wait</code>狀态最長可持續2小時。同時<code>socket</code>請求太快,也會出現<code>netstat</code>沒資料,但是實際網卡有流量的情況。

我們可以通過<code>tcdump</code>監控網卡在該端口上确實已經沒有流量。

注意排除監控系統對該<code>redis</code>執行個體的請求。

在指令行檢視 info <code>master_link_status:up</code>,則表示同步完成了。

日志檔案也可以看

老司機的 redis 資料遷移筆記

<a href="/go/1/1?postion=1" target="_blank">雲資料庫rds</a>

rds是一種穩定可靠、可彈性伸縮的線上資料庫服務。支援mysql、sql server、postgresql、高度相容oracle。

<a href="/go/1/1?postion=1" target="_blank">了解更多</a>

繼續閱讀