Instagram如何跨大洋拆分有狀態服務

在最近舉行的Large Installation System Administration(LISA)2018大會上,Instagram產品工程師Sherry Xiao解釋了他們的團隊如何將Instagram服務分散在美國和歐洲的數據中心。他們使用了Facebook工程團隊的工具,在有狀態服務(Cassandra和TAO)中解決了數據本地性(locality)問題。

Facebook在2012年收購了Instagram,後者遷移到了Facebook的基礎設施上。Instagram的基礎設施只部署在美國,而Facebook的數據中心位於美國和歐洲。Instagram的技術棧主要包括Django、Cassandra、TAO分佈式數據存儲、Memcached和Celery異步作業。他們不得不在美國和歐盟數據中心之間拆分服務,以解決數據存儲空間限制問題。Cassandra quorum調用的高延遲,爲數據本地性劃分數據集,在歐盟區域內進行故障轉移以及爲TAO進行主副本同步,這些都是團隊在進行服務拆分時必須克服的挑戰。

image圖片來源——https://www.youtube.com/watch?v=2GInt9E3vrU

Instagram使用Cassandra作爲通用的鍵值存儲服務。他們將Cassandra與其他組件從AWS轉移到Facebook自己的數據中心。Cassandra在數據中心使用法定數量的副本來實現讀寫一致性。維護歐洲數據中心的數據副本會導致存儲浪費,而quorum請求需要跨洋,延遲太高,不可取。Instagram團隊改爲使用名爲Akkio的工具對數據進行分區,這樣美國用戶的數據位於美國數據中心,歐盟用戶的數據位於歐盟的三個數據中心。Akkio是一款由Facebook開發的數據佈局工具,可以對數據檢索進行優化。它通過將數據分組爲邏輯集來實現佈局,然後將邏輯集存儲在最靠近經常訪問它們的最終用戶的數據中心。Xiao說,Akkio“跟蹤最終用戶的訪問模式並觸發數據遷移”。

這種架構消除了在每個數據中心存儲所有數據副本的必要。美國和歐盟的數據中心可以獨立運作,quorum請求可以留在同一個大陸。Instagram還使用Social Hash分區器將請求路由到正確的存儲桶,尤其是對於擁有大量關注者的帳戶。

Instagram也使用了Facebook的TAO來存儲社交圖數據。在分片模式下,TAO的每個分片都有一個主節點。寫入操作只會被轉發給運行在美國數據中心的主節點,副本是隻讀的。該團隊修改了TAO,讓它可以將寫入操作傳給歐盟地區的本地主節點,避免跨洋調用。爲什麼不在這裏使用Akkio?Xiao解釋說,“與Cassandra相比,TAO擁有不同的數據模型。大多數用例都是使用用戶ID作爲鍵,數據屬於用戶”。相比之下,TAO處理的對象可以被全球各地的用戶訪問,因此Akkio無法實現最佳的數據本地性。

在最終的架構中,在前端有一個無狀態的Django層,後面是分區的Cassandra和TAO,數據被寫入本地主節點。遷移需要改變災難恢復(DR)計劃,因爲延遲以及不同的數據集會導致無法實現跨洋的災難恢復。Xiao說,每個地區都能夠通過在每個數據中心保持20%的空閒容量來處理來自故障數據中心的負載。

查看英文原文:

https://www.infoq.com/news/2018/11/instagram-across-continents

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章