2016-09-22 42 views
2

我們有一個相當大的redis數據庫(〜40GB),在我們的主機託管設施中,我們希望遷移到AWS的ElastiCache Redis服務。面臨的挑戰是數據在生產中經常更新(每分鐘數萬次的寫入操作),因此將RDB文件上傳到ElastiCache會導致已過期的ElastiCache實例。將大型/動態Redis數據庫導入AWS ElastiCache

亞馬遜的文檔建議導入現有數據庫的RDB文件 - 這很好。但是,我們如何導入在我們獲取RDB快照之間發生的成千上萬次寫操作,將它們上載到S3並將其導入到ElastiCache實例中? ElastiCache似乎不支持SLAVEOF,因此我們不能簡單地將其作爲從屬設備,然後將其切換到主設備。

有什麼選擇可以使ElastiCache redis實例與外部redis服務器保持大致同步,直到我們準備好翻轉交換機並使ElastiCache服務器成爲主Redis服務器爲止?

+0

作爲後續 - 我們結束了使用我們配置redis的常規EC2實例。我們只是從原始源中複製EC2實例,然後將其提升爲主。 ElastiCache似乎不能支持這個簡單的任務。 – Dan

回答

1

個人而言,我認爲最簡單的解決方案是停止服務,將數據移動到ElastiCache並重新啓動服務。

如果您無法停止該服務,則可以將增量移動數據至ElastiCache。但是,這是一個複雜得多的解決方案,您需要實現PROXY以將請求分派到舊的Redis實例和新的ElasticCache,並使用DATA-MOVER遞增移動數據。 DATA-MOVER的工作原理如下:

  1. 開始時,代理會將所有請求分派給Redis。
  2. 使用scan命令從Redis獲取一些密鑰。
  3. 獲取這些密鑰的值。如果你有複雜的數據結構,例如list,set,您可能需要type,zsan,sscan,hscan命令來獲取值。
  4. 將這些鍵和值寫入ElasticCache。
  5. 代理將對這些密鑰的請求分派給ElasticCache,並將其他密鑰的請求分派給Redis
  6. 轉到步驟2,直到所有密鑰已移至ElasticCache。

每次我們只將一小部分數據移動到ElasticCache(這就是爲什麼它被稱爲增量移動)。當這些數據被移動到ElasticCache時,新的更新將被寫入ElasticCache。所以你不會失去太多更新。

如果你的密鑰有一些特殊的模式,這對增量移動和請求分派可能會有幫助。說,首先,您可以移動帶有前綴aaa:的密鑰,然後,您可以移動帶有前綴bbb:的密鑰,依此類推。

如果您的密鑰沒有任何特殊模式,則可以使用散列函數爲每個密鑰計算散列密鑰,並根據散列密鑰移動數據。例如:首先,移動滿足以下條件的所有密鑰:hash(key1) mod 10 == 0,然後移動滿足以下條件的所有密鑰:hash(key2) mod 10 == 1,依此類推。

正如我所提到的,這是一個非常非常複雜的解決方案。您可能仍然喜歡最簡單的:)