# Spanner-關于程序員使用 NoSQL 規模的 SQL 語義構建應用程序
> 原文: [http://highscalability.com/blog/2012/10/22/spanner-its-about-programmers-building-apps-using-sql-semant.html](http://highscalability.com/blog/2012/10/22/spanner-its-about-programmers-building-apps-using-sql-semant.html)
很多人似乎都非常討厭 [NewSQL](http://blogs.the451group.com/information_management/2011/04/06/what-we-talk-about-when-we-talk-about-newsql/) 這個詞,或者幾乎是這個詞的任何新造詞,但是在看過高級軟件工作人員 Alex Lloyd 之后 Google 工程師,就 Building Spanner 進行了精彩的演講 [ ,這是最適合 Spanner 的術語。](http://vimeo.com/43759726)
Spanner 將 OldSQL 的 SQL +事務模型包裝在全球分布式 NoSQL 系統的重新設計的骨骼上。 在我看來,這是 NewSQL。
由于 Spanner 不是 BigTable 的近親,因此 NoSQL 組件應該不足為奇。 Spanner 負責在任意數量的地理分布數據中心內跨越數百萬臺計算機。 令人驚訝的是,OldSQL 是如何被接受的。 Alex 在 HotStorage 會議上發表的 [](http://static.usenix.org/event/hotstorage11/tech/slides/lloyd.pdf)早期演講中,采用 OldSQL 的原因是希望使程序員更輕松,更快速地構建應用程序 。 主要思想似乎很熟悉:
* 小型復雜數據庫與龐大,可擴展,簡單的數據庫之間存在錯誤的二分法。 我們可以擁有功能并對其進行擴展。
* 復雜性可以保留,可以放到某個地方,因此,如果不在數據庫中,則將其推送給開發人員。
* 將復雜性降低到堆棧中,以便開發人員可以專注于構建功能而不是數據庫而不是基礎結構。
* 創建快速發展的應用團隊的關鍵:ACID 交易; 全局可序列化; 編寫第一步交易,而不是十步工作流程; 編寫查詢而不是代碼循環; 加盟 沒有用戶定義的沖突解決功能; 標準化同步; 即付即用,獲得可預期的性能所需的費用。
Spanner 并非以成為 NewSQL 明星為目標。 Spanner 最初是 BigTable 克隆,帶有分布式文件系統隱喻。 然后,Spanner 演變為全局 ProtocolBuf 容器。 最終,Spanner 受到 Google 內部客戶的推動,以變得與關系和應用程序程序員更加友好。
顯然,在 Google 內部使用 [Dremel](http://highscalability.com/blog/2010/8/4/dremel-interactive-analysis-of-web-scale-datasets-data-as-a.html) 已向開發人員表明,可以大規模使用 OLAP 和 SQL,他們希望 OLTP 應用具有相同的易用性和上市時間。 看來 Google 有很多應用程序可供開發,程序員不喜歡處理在最終一致的系統之上生產可靠產品的現實世界中的復雜性。
訣竅是弄清楚如何使 SQL 真正大規模地工作。 為了表明我們仍處于編程經驗階段的深度,該過程甚至花費了 Google 五年的開發時間。 亞歷克斯說,真正的工作實際上是建立一個復雜的,可靠的分布式系統。 那是很難正確的部分。
在談論原子鐘等所有內容時,您可能會感到系統中存在魔力。 您可以進行巨大的跨表,跨數百萬條記錄的數據中心事務處理而不會受到任何損失。 那是不對的。 Spanner 是 OLTP 系統。 它使用兩階段提交,因此長時間的大型更新仍將鎖定和阻止,程序員仍處于進入和退出的困境。 想法是這些限制值得程序員提高生產力,并且確實出現的任何瓶頸都可以逐案處理。 通過演講,我逐漸感覺到,Spanner 的域中將包含諸如 pub-sub 之類的專用應用程序域。 盡管事務方面可能是常規事務,但除了所有的全局重新分區魔術在幕后透明進行之外,它們的事務時間戳方法在讀取路徑上確實具有很多不錯的功能。
為說明每個 Paxos 組很難擴展到大量副本的困難,Alex 轉向了水文隱喻:
> 您可以將 Spanner 分區用作一種有序的 pub-sub 方案,在該方案中,您在某個分區的所有位置都有只讀副本,并且您正試圖使用??它來以有序方式將數據分配給很多 不同的數據中心。 這帶來了不同的挑戰。 如果您沒有足夠的帶寬訪問那些數據中心的某些子集,該怎么辦? 您不希望數據在領導者中緩沖太久。 如果您將其溢出到磁盤上,那么當帶寬可用時,您就不會招致搜索損失。 它變得像水文學。 您需要將所有這些數據在不同的時間發送到不同的位置,并且希望在變化的條件下使所有流平穩地移動。 平穩地意味著更少的服務器重啟,意味著更好的延遲尾部,意味著更好的編程模型。
這也許是我最喜歡的部分。 我只是喜歡數據流過的圖像,就像水滴從數百萬臺機器和網絡中滴落,暫時聚集在內存和磁盤的洞穴中,總是分裂,總是重組,總是不斷變化,總是不斷進步,是巨大的不斷流動的一部分 [數據周期](http://en.wikipedia.org/wiki/Water_cycle)永不丟失。 太棒了。
如果您有機會觀看視頻,我強烈建議您這樣做,這的確很好,根本沒有什么毛病。 關于在分布式事務中使用時鐘的部分做得特別好。 但是,如果您時間緊缺,可以參考以下內容:
* 5 年的努力。
* NoSQL 規模的 SQL 語義。
* 試圖獲得一個看起來像單個巨型 MySQL 的抽象。
* 關系數據庫是一個非常熟悉的生產環境,可以在其中建立應用程序。
* Spanner 是存在證明,可以將關系數據庫擴展到全局分布式存儲系統。
* 編寫應用時無需考慮事務語義。 正確無誤。 然后,您返回并優化一些高事務寫入,這些優化將真正獲得回報。
* 希望向應用程序開發人員提供真正直接的語義。 應用程序開發人員應考慮業務邏輯而不是并發性。
* 他們這樣做的方式是通過構建具有絕對絕對誤差的時鐘。 然后將它們與時間戳分配集成在并發控制中:
* 時間戳的總順序遵循事務的部分順序。 如果交易 A 在交易 B 之前發生,我們知道交易 A 的時間戳小于交易 B 的時間戳。
* 這意味著對所有內容進行有效的可序列化查詢。 您可以將跨越數十個數據中心的 PB 級數據庫的總和提高到一分錢。 可能需要一段時間才能獲取所有數據。 但是您可以期望答案是正確的。
* BigTable 早期的 NoSQL 數據庫。 論文于 2006 年問世。
* MegaStore 建立在 BigTable 之上。 它添加了 Paxos 同步層和更豐富的數據模型。 論文在 2011 年問世。
* 底層架構中的 Spanner 很像 BigTable。 更新會附加到數據中心本地分布式文件系統中的日志中。 定期將它們壓縮為不可變的 b 樹(SSTables),并定期將這些 SSTable 合并在一起。 Leveldb 是一個開源版本。
* 開發人員仍必須考慮如何對數據進行分區以提高效率,但開發人員應盡可能地專注于業務邏輯。
* 目標不是數據重新分區的停機時間。 **Google 所做的一切都與數據移動息息相關,因為在數據中心之間移動用戶和重新分片是一項持續的后臺活動。** **因為這是一個連續的過程,所以各種并發性錯誤不斷出現**。 事務有助于正確地分配其連續的分區流邏輯。 在進行交易之前,他們有很多錯誤,這就是為什么花了 5 年的時間的一部分。
* 希望程序員減少在設計過程中早期做出的分區決策的束縛。
* 希望獲得 Megastore 最成功的部分:
* 處理大規模數據中心中斷,而不會給用戶帶來明顯影響。
* 處理單元內部較小的中斷,微中斷。 示例:底層平板電腦因過載或損壞而中斷,僅一個機架上的電源就中斷了,等等。
* 用戶可能會在計時器觸發時看到延遲增加,并且他們移至另一個數據中心,但看不到對事務語義的影響。
* 但是 Megastore 有一些問題:
* 數據庫被劃分為一堆實體組。 實體組是他們自己的交易域,您不能跨實體組進行交易。
* 它使用樂觀并發。 當副本之間的傳播間隔為 50 毫秒,而您正在執行同步復制時,寫入將至少花費 50 毫秒,這將為樂觀并發故障創建一個很大的漏洞窗口。
* 將分層系統整合為單個集成系統的好處。 與 Megastore 和 Bigtable 之間的接口相比,Spanner 與物理存儲之間的接口要豐富和優化。
* 向 SQL 的文化轉變
* 基于 SQL 的分析系統 Dremel 在 Google 上進行了許多 SQL 轉換,因為它可以將查詢的語義向下推送到存儲系統中,并讓其確定該怎么做。
* 這種文化根深蒂固,您可以擴展,也可以使用 SQL。 Dremel 表明,對于分析,您可以同時擁有。 Spanner 顯示您可以同時使用 OLTP。
* 由于業務問題,人們要求簡化地理分區。 例如,將用戶數據從一個區域移動到另一區域。
* 法律問題
* 產品增長意味著您想要盡可能高效地將多少人放到
* 扳手的數據模型
* 并不總是具有關系模型。 與 Jeff Dean 在 2009 年提出的內容完全不同。
* 帶有單個用戶關系表的示例,每個用戶都有一個名稱和家庭區域。
* User 數據庫可以分為幾個分區。 美國的一個只讀分區,歐洲的另一個分區。 大型數據庫將具有數百萬個分區。 分區 1 在美國將具有三個副本。 另一個分區在歐洲具有三個副本。 美國有一個只讀副本。 這很有用,因此您可以在歐洲擁有一個書面仲裁,這意味著您永遠不會阻塞跨大西洋的 RPC 調用,但是在美國,盡管它可能有些陳舊,但您仍然可以查詢所有數據。
* 主細節層次結構在物理上被聚在一起。 在分布式系統上,更為重要的是記錄將存儲在其他服務器上。
* 關系抽象的底層是程序員如何將密鑰手動編碼到 Bigtable 中。 每個表格單元格都只有一個條目,例如:
* @ 10 部分是時間戳。
* 在 Bob 記錄開始之前,Alice 的訂單將與 Alice 一起存儲。
* 并發
* 在較高級別,Spanner 使用兩階段鎖定和快照隔離的組合。
* 并未嘗試創建瘋狂的新模型。 旨在找出如何擴展已驗證模型的目標。
* 此模型最適合讀取為主的工作負載。 您將大部分時間花在便宜的快照隔離讀取上,而不花大量時間在悲觀主義事務寫入上。
* Blogger 示例,它首先擔心正確性,然后擔心優化。
* Blogger 有 280 個 Servlet。 低頻高復雜度操作,例如用戶通過發送文本消息來創建博客,然后他們希望將該博客合并到現有博客中。
* 花費大量的時間才能將其創建為由精心設計的工作流程精心安排的一系列冪等操作。
* 使用 ACID 交易,Blogger 會更快。 在沒有性能優勢的情況下花費在這些復雜的編程任務上的時間本來可以減少某些高頻頁面的 50 毫秒,從而產生更大的整體影響。
* 與在單臺計算機上編程相同的過程。 您從互斥鎖開始,然后才嘗試原子操作。
* 僅執行弱一致性的 NoSQL 數據庫正在對整個系統實施廣泛應用的過早優化。 應該選擇值得的頁面。
* 在 Google 看到的模式中保留提交順序
* 他們在設計過程中考慮的經驗法則:
* 如果 T1 在 T2 之前完成,那么他們想保留這一事實。 T2 與 T1 之間存在提交順序相關性。
* 假設 T3 寫了一些 T4 讀取的內容,因此存在傳統的數據依賴性,因此 T3 必須始終在 T4 之前發生。
* T1 和 T2 在 T3 和 T4 之間沒有關系。
* **系統性能來自并發運行沒有依賴性的事務。**
* **目標是保留與原始歷史記錄相同的依存順序。**
* 可序列化是一個帶有大量變化的重載術語。
* 線性化是從并發編程中借鑒的一種思想,并且很好地適用于在分布式數據庫之上對分布式系統進行編程。
* 包含可序列化性,無法上下班提交順序。
* 即使沒有可檢測的依存關系,即使一筆交易發生在另一筆交易之前,也必須保留該訂單,即使該交易發生在不同的機器上。
* 示例架構:
* 一個分區是購買的廣告表。 在美國寫仲裁,在歐洲寫只讀副本。
* 這些廣告的展示在美國的一個分區。 例如,在 2:00 和 2:01,有人觀看了小狗廣告。
* 歐洲的一個分區,用于展示廣告。
* **在美國有一個只讀的歐洲數據副本,反之亦然。 這樣可以使雙方進行過時的讀取和快速的寫入,而無需越過池塘。 您仍然可以在任何一側高效地使用 MapReduce。**
* 交易示例:
* 交易 1:用戶購買了廣告。
* 在后臺,廣告投放系統正在不斷掃描分區以顯示廣告,并發送檢索廣告查詢。
* 廣告投放系統會隨著時間累積其要保存在數據庫中的一批展示次數。
* 事務 2:服務器寫入印象分區以記錄印象。
* 這是兩個不同的分區,不同的副本,不同的數據中心以及潛在的不同大陸。
* 現在,您想編寫一個 SQL 查詢來審核小時級別的展示次數。 選擇一個時間戳。
* 根據時間戳記只有三個合法結果:
* 既看不到廣告也看不見。
* 看到廣告,但沒有展示。
* 查看添加和所有展示。
* 在所有系統中,他們都在替換 MapReduce 或查詢必須容忍結果的無限變化。
* 它可能會看到展示,但看不到廣告。
* **針對這種弱語義編寫查詢意味著很難分辨出腐敗,錯誤或并發異常之間的區別。**
* 解決此問題的方法是通過單個中央服務器序列化每個更新。 如果更新位于一起,則有效,但不適用于分區遍布全球的分散式模型。
* 在全球分布式數據庫中擴展 Spanner 所需語義的選項:
* **一個分區模型** 。 大量的 WAN 通信。 將所有分區都包含在每個事務中。
* **集中時間戳預言** 。 如果您同時在兩個不同的大陸上進行更新,則效果不佳。
* **Lamport 時鐘** 。 通過每個外部系統和協議傳播時間戳。 如果您的系統數量和協議數量都不足,則此方法有效,當您擁有大量不受控制的分布式系統或協議(例如與貿易伙伴一起使用)或它們只是協議時,您將無法正常工作 不碰。 在 Google 進行了幾次嘗試,但是在復雜的系統中始終無法成功完成時間戳。
* **建立一個分布式時間戳預告片** 。 其中的一個 TrueTime 是 Google 常規時間清理產生的。 時間有一個 epsilon 時間,因此您知道進行現在呼叫的實時時間在該時間間隔內。 源自一堆不同數據中心中的 GPS 接收器,這些數據中心由原子鐘備份。 GSP 系統有時確實存在錯誤。 一次代碼推送可以消除大量衛星,因此備份非常有用。
* TrueTime
* 目標不變式:寫 A 和 B,如果 A 發生在 B 之前,則意味著 A 在 B 開始之前完成,那么 A 的時間戳應小于 B。完成意味著任何人都可以看到效果。 不僅是客戶,還有 Paxos 奴隸。
* 使用此不變式,意味著您可以說在特定時間戳記下的快照讀取是可序列化的。
* TrueTime 與天體導航的工作原理類似,只是那是硬錯誤界限,而不僅僅是猜測。
* 每臺 Google 服務器中都有一個時間守護程序,每臺服務器中都有一個水晶,每個數據中心都有一些來自不同制造商的 GPS 的時間主控器,以解決錯誤的多樣性,其中一些具有原子鐘來交叉檢查 GPS。
* 守護程序每 30 秒與時間主對話,并獲得時間修復。 在兩者之間,死者根據自己的晶體進行偵察。 服務器錯誤容限隨著時間的推移而擴大,他們選擇了百萬分之 200。
* 現在幾點了? 在本地計算機上讀取時間。 將 GetTime 發送到時間主機。 返回時間為 T。再次讀取本地服務器時間。 你得到一些增量。 然后,您可以擴展該增量以獲得所需的任何誤差范圍。 回來了一個ε。 現在您可以說時間在[t t + e)]中。 時間不早于 t,因為時間主因您收到 t 的回應而報告了 t 的因果關系。 但是會有很多偏差,因為郵件可能是在 epsilon 之前發送的。 您不知道往返 t 產生的位置。 開始漂移之前的主要錯誤是與主設備的往返時間。
* 您可以建立 GPS 以外的其他系統來分配時間。 例如,LED 閃爍并為所有系統提供時鐘脈沖。 使用心跳系統,該系統定期與中央服務器對話,并且在這些心跳之間,所有服務器都認為時間是固定的。 GPS 在那并且可以工作。 原子鐘是一種方便的交叉檢查。 而且所有硬件都不貴。
* 當 Paxos 領導程序從客戶端接收到提交請求時,該分區的 Paxos 領導程序流
* 接收開始提交。
* 獲取事務鎖定。 任何兩階段提交系統中的典型值。 抓住讀寫鎖,以確保沖突的事務不會同時執行。
* 選擇一個時間戳記,以使 true.max 大于當前時間。
* 并行執行兩件事:運行 Paxos 以就寫入內容達成共識,等待真正的時間肯定超過該寫入時間戳記。
* 通常,Paxos 將花費比等待更長的時間,因此它不會增加額外的開銷。
* 通知 Paxos 奴隸解鎖。
* 確認返回客戶端。
* 為什么起作用? 通過等到提交時間戳記過去,我們將所有將來的事務推向更大的時間戳記。 保證下一個事務的時間戳大于前一個事務的時間戳。 **每個事務都同意選擇一個比其起始點大的時間戳,并且每個事務都同意將其提交推遲到自己的提交時間戳記過去。**
* 當 Paxos 進行得太快或只有一個副本,而您只是要提交到本地磁盤時,TrueTime epsilon 可能比提交該提交所需要的時間大。
* 當 TrueTime epsilon 達到峰值時發生,例如 TrueTime 母版下降并且您必須轉到更遠程的 TrueTime 母版的情況下。 或者當 Paxos 副本異常關閉時。
* 現實中的 epsilon 在 1 到 7 毫秒之間反彈。
* 當通過使用具有更高 QoS 的時間數據包來改進網絡時,尾部延遲降低了。 < SDN 的一個論點,即通過系統以更高的 QoS 獲得諸如時間和 Paxos 之類的控制數據包。
* 通過更頻繁地輪詢時間主數據,以高 QoS 輪詢,改善內核處理,在 NIC 驅動程序中記錄時間戳,購買更好的振蕩器,注意內核錯誤(節能模式(您使用的時鐘))來減少 epsilon。
## 讀取路徑
* 類型:
* 在讀取-修改事務中,看起來與標準的兩階段鎖定相同,只是它發生在 Paxos 領導者身上。 獲取讀鎖。
* 不屬于事務的強讀取,客戶端不會基于該讀取進行寫入。 Spanner 將選擇一個更大的時間戳并在該時間戳上進行讀取。
* 當您只想知道數據已使用 5 或 10 秒時,就會讀取陳舊的數據。 Spanner 將選擇落入陳舊范圍內的最大已提交時間戳。
* MapReduce /批量讀取-不在乎數據是否新鮮。 例如,讓客戶選擇一個時間戳并說我想知道所有事情。
* 為強讀而選擇的時間戳記:
* 問 TrueTime,現在的時間比現在大。 您知道這也大于所有先前提交的事務的提交時間戳。 并非總是最好的時間戳,因為您希望最大化能夠在該時間戳上進行讀取的副本。
* 查看提交歷史記錄。 從最近的文章中選擇一個時間戳。
* 強制聲明預讀的范圍。 例如,這 5 個用戶和該系列產品。 范圍的概念高于分區的概念。
* 準備的分布式事務。 由于分布式事務必須在每個分區上同時提交時間戳,因此存在一個不確定性窗口,在此窗口中,您不會為某些對象提交什么數據來提交時間戳。
* 有效使用原則:
* 數據局部性仍然很重要。 從一臺機器上讀取一堆東西比從一堆機器上讀取要好。 將客戶和訂單放在同一分區中。
* 大用戶將跨越多個分區,但是跨分區在事務級別上不會產生語義影響。
* 設計應用的正確性。 處理數百個需要處理但不需要那么快的細膩堅硬的角落案件。 例如,您一天更改幾次 Gmail 過濾器?
* 放寬仔細審核的高流量查詢的語義。 也許在某些情況下,閱讀會過時。 您過去讀得越遠,越能提供更多副本。
* Spanner 中的默認語義是它們是可線性化的。
* 使用閃存備份將允許毫秒寫入。
* 第一個大用戶:F1
* 已將對收入至關重要的共享 MySQL 實例遷移到 Spanner。 對 Spanner 數據模型的影響很大。 F1 需要一個強大的 MySQL。
* Spanner 最初是 BigTable 之子
* 包含許多分叉的 BigTable 代碼,并帶有分布式文件系統隱喻。 您有一棵目錄樹,每個目錄都是地理位置的單位。 這與建立數據庫的人無關。
* 他們添加了結構化密鑰,但最終他們只是在構建下一個 Megastore。
* 他們決定 Spanner 需要更豐富的數據模型,從而確定 Spanner 是協議緩沖區的存儲庫。 Spanner 將是一個巨大的協議緩沖區。 這似乎是合理的,但同樣,它不是用戶建模數據的方式。
* 他們認為 F1 是更好的模型,因此最終他們轉向了關系數據模型。
## 他們現在在做什么?
* **完善 SQL 引擎**。 時間戳加迭代器的位置足以重啟跨分區查詢。 如果查詢需要一分鐘,并且負載平衡器在那一刻將您依賴的平板電腦移動到另一臺服務器,或者該服務器被搶占,因為您正在共享單元中運行,并且搶占迫使這些平板電腦移動,查詢會 不必中止,也不必扔掉工作。 像這樣移動服務器很難工作,但對用戶而言確實有價值。
* **對內存使用情況的精細控制**,因此您無需創建分布式死鎖,因為當一堆服務器都依賴于它們時,它們都需要內存才能取得進展,而它們都需要取得進展才能釋放該內存 。
* **細粒度的 CPU 調度**。 即使出現大得慢的大查詢,也要保持快的查詢快。應該對無希望的慢查詢進行時間劃分,以使快的查詢保持快。 保持延遲的尾巴。
* **基于快照隔離的強讀取仍然非常綠色**。 這些正在以越來越多的用例進入生產。
* **縮放到每個 Paxos 組**的大量副本。 您可以將 Spanner 分區用作嚴格有序的 pub-sub 方案,在該方案中,您在某個分區的所有位置都有只讀副本,并且您正嘗試使用它來以有序方式將數據分配到許多不同的數據中心。 這帶來了不同的挑戰。 如果您沒有足夠的帶寬訪問那些數據中心的某些子集,該怎么辦? 您不希望數據在領導者中緩沖太久。 如果您將其溢出到磁盤上,那么當帶寬可用時,您就不會招致搜索損失。 它變得像水文學。 您需要將所有這些數據在不同的時間發送到不同的位置,并且希望在變化的條件下使所有流平穩地移動。 平穩地意味著更少的服務器重啟,意味著更好的延遲尾部,意味著更好的編程模型。
## Q & A
* 您如何證明交易之間沒有依賴關系? 假設某人通過電子郵件向某人發送了一些數據,然后該人單擊了基于該數據的鏈接,從而導致了另一個數據中心的寫入。 很難說兩個不同中心之間的交易之間沒有因果關系。 他們希望您能夠在整個系統之間建立因果關系的前提下關聯整個系統中事務的順序。
* 最終的一致性和交易模型的空間。
* 移動是一種情況,用戶在更新本地緩存,并且數據將其返回服務器,因此您不必依賴事務,因此必須具有某種最終的一致性機制來合并更改并處理沖突。
* 允許并發編輯的 Google 文檔是另一種情況。 您有五個打開的窗口,它們每個都在進行本地更新。 這些更新異步地冒泡回到服務器。 應用用于合并更新的可操作轉換代數,然后才將這些更新應用于數據庫的規范副本。
## 相關文章
* [Alex Lloyd-建筑扳手](http://vimeo.com/43759726) 視頻( [幻燈片](http://berlinbuzzwords.de/sites/berlinbuzzwords.de/files/slides/alex_lloyd_keynote_bbuzz_2012.pdf) )
* [Google Spanner 的最令人驚訝的啟示:NoSQL 出現了,NewSQL 出現了](http://highscalability.com/blog/2012/9/24/google-spanners-most-surprising-revelation-nosql-is-out-and.html)
* [面板:大數據,無需 SQL,大問題,無需擔心](http://static.usenix.org/multimedia/hotstorage11seltzer) ( [幻燈片](http://static.usenix.org/event/hotstorage11/tech/slides/lloyd.pdf) )( [視頻](https://www.usenix.org/conference/hotstorage11/panel-big-data-no-sql-big-problems-no-worries) )
* [互聯網規模的企業問題](http://static.usenix.org/event/hotstorage11/tech/slides/lloyd.pdf)
偉大的帖子托德。 這些方法正在合并!
您的文章內容豐富,但有時我會覺得有些困惑。 謝謝托德。
- LiveJournal 體系結構
- mixi.jp 體系結構
- 友誼建筑
- FeedBurner 體系結構
- GoogleTalk 架構
- ThemBid 架構
- 使用 Amazon 服務以 100 美元的價格構建無限可擴展的基礎架構
- TypePad 建筑
- 維基媒體架構
- Joost 網絡架構
- 亞馬遜建筑
- Fotolog 擴展成功的秘訣
- 普恩斯的教訓-早期
- 論文:Wikipedia 的站點內部,配置,代碼示例和管理問題
- 擴大早期創業規模
- Feedblendr 架構-使用 EC2 進行擴展
- Slashdot Architecture-互聯網的老人如何學會擴展
- Flickr 架構
- Tailrank 架構-了解如何在整個徽標范圍內跟蹤模因
- Ruby on Rails 如何在 550k 網頁瀏覽中幸存
- Mailinator 架構
- Rackspace 現在如何使用 MapReduce 和 Hadoop 查詢 TB 的數據
- Yandex 架構
- YouTube 架構
- Skype 計劃 PostgreSQL 擴展到 10 億用戶
- 易趣建筑
- FaceStat 的禍根與智慧贏得了勝利
- Flickr 的聯合會:每天進行數十億次查詢
- EVE 在線架構
- Notify.me 體系結構-同步性
- Google 架構
- 第二人生架構-網格
- MySpace 體系結構
- 擴展 Digg 和其他 Web 應用程序
- Digg 建筑
- 在 Amazon EC2 中部署大規模基礎架構的六個經驗教訓
- Wolfram | Alpha 建筑
- 為什么 Facebook,Digg 和 Twitter 很難擴展?
- 全球范圍擴展的 10 個 eBay 秘密
- BuddyPoke 如何使用 Google App Engine 在 Facebook 上擴展
- 《 FarmVille》如何擴展以每月收獲 7500 萬玩家
- Twitter 計劃分析 1000 億條推文
- MySpace 如何與 100 萬個并發用戶一起測試其實時站點
- FarmVille 如何擴展-后續
- Justin.tv 的實時視頻廣播架構
- 策略:緩存 404 在服務器時間上節省了洋蔥 66%
- Poppen.de 建筑
- MocoSpace Architecture-一個月有 30 億個移動頁面瀏覽量
- Sify.com 體系結構-每秒 3900 個請求的門戶
- 每月將 Reddit 打造為 2.7 億頁面瀏覽量時汲取的 7 個教訓
- Playfish 的社交游戲架構-每月有 5000 萬用戶并且不斷增長
- 擴展 BBC iPlayer 的 6 種策略
- Facebook 的新實時消息系統:HBase 每月可存儲 135 億條消息
- Pinboard.in Architecture-付費玩以保持系統小巧
- BankSimple 迷你架構-使用下一代工具鏈
- Riak 的 Bitcask-用于快速鍵/值數據的日志結構哈希表
- Mollom 體系結構-每秒以 100 個請求殺死超過 3.73 億個垃圾郵件
- Wordnik-MongoDB 和 Scala 上每天有 1000 萬個 API 請求
- Node.js 成為堆棧的一部分了嗎? SimpleGeo 說是的。
- 堆棧溢出體系結構更新-現在每月有 9500 萬頁面瀏覽量
- Medialets 體系結構-擊敗艱巨的移動設備數據
- Facebook 的新實時分析系統:HBase 每天處理 200 億個事件
- Microsoft Stack 是否殺死了 MySpace?
- Viddler Architecture-每天嵌入 700 萬個和 1500 Req / Sec 高峰
- Facebook:用于擴展數十億條消息的示例規范架構
- Evernote Architecture-每天有 900 萬用戶和 1.5 億個請求
- TripAdvisor 的短
- TripAdvisor 架構-4,000 萬訪客,200M 動態頁面瀏覽,30TB 數據
- ATMCash 利用虛擬化實現安全性-不變性和還原
- Google+是使用您也可以使用的工具構建的:閉包,Java Servlet,JavaScript,BigTable,Colossus,快速周轉
- 新的文物建筑-每天收集 20 億多個指標
- Peecho Architecture-鞋帶上的可擴展性
- 標記式架構-擴展到 1 億用戶,1000 臺服務器和 50 億個頁面視圖
- 論文:Akamai 網絡-70 個國家/地區的 61,000 臺服務器,1,000 個網絡
- 策略:在 S3 或 GitHub 上運行可擴展,可用且廉價的靜態站點
- Pud 是反堆棧-Windows,CFML,Dropbox,Xeround,JungleDisk,ELB
- 用于擴展 Turntable.fm 和 Labmeeting 的數百萬用戶的 17 種技術
- StackExchange 體系結構更新-平穩運行,Amazon 4x 更昂貴
- DataSift 體系結構:每秒進行 120,000 條推文的實時數據挖掘
- Instagram 架構:1400 萬用戶,1 TB 的照片,數百個實例,數十種技術
- PlentyOfFish 更新-每月 60 億次瀏覽量和 320 億張圖片
- Etsy Saga:從筒倉到開心到一個月的瀏覽量達到數十億
- 數據范圍項目-6PB 存儲,500GBytes / sec 順序 IO,20M IOPS,130TFlops
- 99designs 的設計-數以千萬計的綜合瀏覽量
- Tumblr Architecture-150 億頁面瀏覽量一個月,比 Twitter 更難擴展
- Berkeley DB 體系結構-NoSQL 很酷之前的 NoSQL
- Pixable Architecture-每天對 2000 萬張照片進行爬網,分析和排名
- LinkedIn:使用 Databus 創建低延遲更改數據捕獲系統
- 在 30 分鐘內進行 7 年的 YouTube 可擴展性課程
- YouPorn-每天定位 2 億次觀看
- Instagram 架構更新:Instagram 有何新功能?
- 搜索技術剖析:blekko 的 NoSQL 數據庫
- Pinterest 體系結構更新-1800 萬訪問者,增長 10 倍,擁有 12 名員工,410 TB 數據
- 搜索技術剖析:使用組合器爬行
- iDoneThis-從頭開始擴展基于電子郵件的應用程序
- StubHub 體系結構:全球最大的票務市場背后的驚人復雜性
- FictionPress:在網絡上發布 600 萬本小說
- Cinchcast 體系結構-每天產生 1,500 小時的音頻
- 棱柱架構-使用社交網絡上的機器學習來弄清您應該在網絡上閱讀的內容
- 棱鏡更新:基于文檔和用戶的機器學習
- Zoosk-實時通信背后的工程
- WordPress.com 使用 NGINX 服務 70,000 req / sec 和超過 15 Gbit / sec 的流量
- 史詩般的 TripAdvisor 更新:為什么不在云上運行? 盛大的實驗
- UltraDNS 如何處理數十萬個區域和數千萬條記錄
- 更簡單,更便宜,更快:Playtomic 從.NET 遷移到 Node 和 Heroku
- Spanner-關于程序員使用 NoSQL 規模的 SQL 語義構建應用程序
- BigData 使用 Erlang,C 和 Lisp 對抗移動數據海嘯
- 分析數十億筆信用卡交易并在云中提供低延遲的見解
- MongoDB 和 GridFS 用于內部和內部數據中心數據復制
- 每天處理 1 億個像素-少量競爭會導致大規模問題
- DuckDuckGo 體系結構-每天進行 100 萬次深度搜索并不斷增長
- SongPop 在 GAE 上可擴展至 100 萬活躍用戶,表明 PaaS 未通過
- Iron.io 從 Ruby 遷移到 Go:減少了 28 臺服務器并避免了巨大的 Clusterf ** ks
- 可汗學院支票簿每月在 GAE 上擴展至 600 萬用戶
- 在破壞之前先檢查自己-鱷梨的建筑演進的 5 個早期階段
- 縮放 Pinterest-兩年內每月從 0 到十億的頁面瀏覽量
- Facebook 的網絡秘密
- 神話:埃里克·布魯爾(Eric Brewer)談銀行為什么不是堿-可用性就是收入
- 一千萬個并發連接的秘密-內核是問題,而不是解決方案
- GOV.UK-不是你父親的書庫
- 縮放郵箱-在 6 周內從 0 到 100 萬用戶,每天 1 億條消息
- 在 Yelp 上利用云計算-每月訪問量為 1.02 億,評論量為 3900 萬
- 每臺服務器將 PHP 擴展到 30,000 個并發用戶的 5 條 Rockin'Tips
- Twitter 的架構用于在 5 秒內處理 1.5 億活躍用戶,300K QPS,22 MB / S Firehose 以及發送推文
- Salesforce Architecture-他們每天如何處理 13 億筆交易
- 擴大流量的設計決策
- ESPN 的架構規模-每秒以 100,000 Duh Nuh Nuhs 運行
- 如何制作無限可擴展的關系數據庫管理系統(RDBMS)
- Bazaarvoice 的架構每月發展到 500M 唯一用戶
- HipChat 如何使用 ElasticSearch 和 Redis 存儲和索引數十億條消息
- NYTimes 架構:無頭,無主控,無單點故障
- 接下來的大型聲音如何使用 Hadoop 數據版本控制系統跟蹤萬億首歌曲的播放,喜歡和更多內容
- Google 如何備份 Internet 和數十億字節的其他數據
- 從 HackerEarth 用 Apache 擴展 Python 和 Django 的 13 個簡單技巧
- AOL.com 體系結構如何發展到 99.999%的可用性,每天 800 萬的訪問者和每秒 200,000 個請求
- Facebook 以 190 億美元的價格收購了 WhatsApp 體系結構
- 使用 AWS,Scala,Akka,Play,MongoDB 和 Elasticsearch 構建社交音樂服務
- 大,小,熱還是冷-條帶,Tapad,Etsy 和 Square 的健壯數據管道示例
- WhatsApp 如何每秒吸引近 5 億用戶,11,000 內核和 7,000 萬條消息
- Disqus 如何以每秒 165K 的消息和小于 0.2 秒的延遲進行實時處理
- 關于 Disqus 的更新:它仍然是實時的,但是 Go 摧毀了 Python
- 關于 Wayback 機器如何在銀河系中存儲比明星更多的頁面的簡短說明
- 在 PagerDuty 遷移到 EC2 中的 XtraDB 群集
- 擴展世界杯-Gambify 如何與 2 人組成的團隊一起運行大型移動投注應用程序
- 一點點:建立一個可處理每月 60 億次點擊的分布式系統的經驗教訓
- StackOverflow 更新:一個月有 5.6 億次網頁瀏覽,25 臺服務器,而這一切都與性能有關
- Tumblr:哈希處理每秒 23,000 個博客請求的方式
- 使用 HAProxy,PHP,Redis 和 MySQL 處理 10 億個請求的簡便方法來構建成長型啟動架構
- MixRadio 體系結構-兼顧各種服務
- Twitter 如何使用 Redis 進行擴展-105TB RAM,39MM QPS,10,000 多個實例
- 正確處理事情:通過即時重放查看集中式系統與分散式系統
- Instagram 提高了其應用程序的性能。 這是如何做。
- Clay.io 如何使用 AWS,Docker,HAProxy 和 Lots 建立其 10 倍架構
- 英雄聯盟如何將聊天擴大到 7000 萬玩家-需要很多小兵。
- Wix 的 Nifty Architecture 技巧-大規模構建發布平臺
- Aeron:我們真的需要另一個消息傳遞系統嗎?
- 機器:惠普基于憶阻器的新型數據中心規模計算機-一切仍在變化
- AWS 的驚人規模及其對云的未來意味著什么
- Vinted 體系結構:每天部署數百次,以保持繁忙的門戶穩定
- 將 Kim Kardashian 擴展到 1 億個頁面
- HappyPancake:建立簡單可擴展基金會的回顧
- 阿爾及利亞分布式搜索網絡的體系結構
- AppLovin:通過每天處理 300 億個請求向全球移動消費者進行營銷
- Swiftype 如何以及為何從 EC2 遷移到真實硬件
- 我們如何擴展 VividCortex 的后端系統
- Appknox 架構-從 AWS 切換到 Google Cloud
- 阿爾及利亞通往全球 API 的憤怒之路
- 阿爾及利亞通往全球 API 步驟的憤怒之路第 2 部分
- 為社交產品設計后端
- 阿爾及利亞通往全球 API 第 3 部分的憤怒之路
- Google 如何創造只有他們才能創造的驚人的數據中心網絡
- Autodesk 如何在 Mesos 上實施可擴展事件
- 構建全球分布式,關鍵任務應用程序:Trenches 部分的經驗教訓 1
- 構建全球分布式,關鍵任務應用程序:Trenches 第 2 部分的經驗教訓
- 需要物聯網嗎? 這是美國一家主要公用事業公司從 550 萬米以上收集電力數據的方式
- Uber 如何擴展其實時市場平臺
- 優步變得非常規:使用司機電話作為備份數據中心
- 在不到五分鐘的時間里,Facebook 如何告訴您的朋友您在災難中很安全
- Zappos 的網站與 Amazon 集成后凍結了兩年
- 為在現代時代構建可擴展的有狀態服務提供依據
- 細分:使用 Docker,ECS 和 Terraform 重建基礎架構
- 十年 IT 失敗的五個教訓
- Shopify 如何擴展以處理來自 Kanye West 和 Superbowl 的 Flash 銷售
- 整個 Netflix 堆棧的 360 度視圖
- Wistia 如何每小時處理數百萬個請求并處理豐富的視頻分析
- Google 和 eBay 關于構建微服務生態系統的深刻教訓
- 無服務器啟動-服務器崩潰!
- 在 Amazon AWS 上擴展至 1100 萬以上用戶的入門指南
- 為 David Guetta 建立無限可擴展的在線錄制活動
- Tinder:最大的推薦引擎之一如何決定您接下來會看到誰?
- 如何使用微服務建立財產管理系統集成
- Egnyte 體系結構:構建和擴展多 PB 分布式系統的經驗教訓
- Zapier 如何自動化數十億個工作流自動化任務的旅程
- Jeff Dean 在 Google 進行大規模深度學習
- 如今 Etsy 的架構是什么樣的?
- 我們如何在 Mail.Ru Cloud 中實現視頻播放器
- Twitter 如何每秒處理 3,000 張圖像
- 每天可處理數百萬個請求的圖像優化技術
- Facebook 如何向 80 萬同時觀看者直播
- Google 如何針對行星級基礎設施進行行星級工程設計?
- 為 Mail.Ru Group 的電子郵件服務實施反垃圾郵件的貓捉老鼠的故事,以及 Tarantool 與此相關的內容
- The Dollar Shave Club Architecture Unilever 以 10 億美元的價格被收購
- Uber 如何使用 Mesos 和 Cassandra 跨多個數據中心每秒管理一百萬個寫入
- 從將 Uber 擴展到 2000 名工程師,1000 個服務和 8000 個 Git 存儲庫獲得的經驗教訓
- QuickBooks 平臺
- 美國大選期間城市飛艇如何擴展到 25 億個通知
- Probot 的體系結構-我的 Slack 和 Messenger Bot 用于回答問題
- AdStage 從 Heroku 遷移到 AWS
- 為何將 Morningstar 遷移到云端:降低 97%的成本
- ButterCMS 體系結構:關鍵任務 API 每月可處理數百萬個請求
- Netflix:按下 Play 會發生什么?
- ipdata 如何以每月 150 美元的價格為來自 10 個無限擴展的全球端點的 2500 萬個 API 調用提供服務
- 每天為 1000 億個事件賦予意義-Teads 的 Analytics(分析)管道
- Auth0 體系結構:在多個云提供商和地區中運行
- 從裸機到 Kubernetes
- Egnyte Architecture:構建和擴展多 PB 內容平臺的經驗教訓
- 縮放原理
- TripleLift 如何建立 Adtech 數據管道每天處理數十億個事件
- Tinder:最大的推薦引擎之一如何決定您接下來會看到誰?
- 如何使用微服務建立財產管理系統集成
- Egnyte 體系結構:構建和擴展多 PB 分布式系統的經驗教訓
- Zapier 如何自動化數十億個工作流自動化任務的旅程
- Jeff Dean 在 Google 進行大規模深度學習
- 如今 Etsy 的架構是什么樣的?
- 我們如何在 Mail.Ru Cloud 中實現視頻播放器
- Twitter 如何每秒處理 3,000 張圖像
- 每天可處理數百萬個請求的圖像優化技術
- Facebook 如何向 80 萬同時觀看者直播
- Google 如何針對行星級基礎設施進行行星級工程設計?
- 為 Mail.Ru Group 的電子郵件服務實施反垃圾郵件的貓捉老鼠的故事,以及 Tarantool 與此相關的內容
- The Dollar Shave Club Architecture Unilever 以 10 億美元的價格被收購
- Uber 如何使用 Mesos 和 Cassandra 跨多個數據中心每秒管理一百萬個寫入
- 從將 Uber 擴展到 2000 名工程師,1000 個服務和 8000 個 Git 存儲庫獲得的經驗教訓
- QuickBooks 平臺
- 美國大選期間城市飛艇如何擴展到 25 億條通知
- Probot 的體系結構-我的 Slack 和 Messenger Bot 用于回答問題
- AdStage 從 Heroku 遷移到 AWS
- 為何將 Morningstar 遷移到云端:降低 97%的成本
- ButterCMS 體系結構:關鍵任務 API 每月可處理數百萬個請求
- Netflix:按下 Play 會發生什么?
- ipdata 如何以每月 150 美元的價格為來自 10 個無限擴展的全球端點的 2500 萬個 API 調用提供服務
- 每天為 1000 億個事件賦予意義-Teads 的 Analytics(分析)管道
- Auth0 體系結構:在多個云提供商和地區中運行
- 從裸機到 Kubernetes
- Egnyte Architecture:構建和擴展多 PB 內容平臺的經驗教訓