阿里雲資料庫專家白宸:Redis帶你盡享絲滑!(圖靈訪談)

劉敏ituring發表於2017-04-19

訪談嘉賓:

本名鄭明杭,現阿里雲NoSQL資料庫技術專家。先後從事Tair分散式系統、Memcached雲服務及阿里雲Redis資料庫雲服務開發,關注分散式系統及NoSQL儲存技術前沿。

阿里雲資料庫專家白宸:Redis帶你盡享絲滑!(圖靈訪談)

作為嘉賓,曾在飛馬網&中生代技術嘉年華上發表題為《ApsaraDB for Redis雲資料庫技術棧詳解》的演講內容,獲得觀眾一致叫好!


邀請白宸做客,我們主要聊了些:

  • 從事資料庫工作的原因
  • 阿里雲Redis資料庫跟其他有商相比的優勢
  • Redis最得意和最痛的點
  • 分散式系統儲存技術的前沿——NewSQL
  • 資料庫實現的方法
  • ......

圖靈訪談:為什麼選擇資料庫方面的工作?

資料庫是產品應用的基礎。直播、共享單車等每個火爆產品的背後都是大量關係型資料庫、NoSQL型別資料庫在支撐。另外,中小企業為了專注自身業務的發展都會選擇雲端計算,將基礎設定的建設交給雲服務商。雲服務商為了提供高效能、高可用的資料庫產品需要投入足夠多的研發精力。在資料庫研發過程中,資料庫研發者既可以深入核心、網路、儲存裝置進行深度的優化改進,又能夠在資料庫層面擴充套件出分散式、異地容災等不同的產品形態,同時結合不同型別的業務進行不同的深度優化。

選擇資料庫開發工作主要是為了能夠結合計算機理論知識,實踐分散式、儲存、資料庫、核心,反過來在實踐開發過程中鞏固提高自己。

圖靈訪談:阿里雲的Redis資料庫和其他雲端計算廠商相比,有何優點?

阿里雲的Redis雲服務整體架構在ApsaraDB上,具有完善的任務管理、監控運維、高可用體系,能夠支撐海量的例項管理及不同的產品需求。阿里雲Redis資料庫提供了主從雙副本、主從單副本、叢集雙副本等多樣的產品供使用者選擇。

enter image description here

主從雙副本版本要求主從雙機熱備,將資料持久化到磁碟,當主庫發生故障的時候快速切換到備庫上以保證服務的可用性。相比開源Redis及其他廠商的Redis,阿里雲對Redis的故障探測進行了更深度地優化:通過專門的探測埠來避免Redis單執行緒阻塞的影響,通過對磁碟、CPU、記憶體等硬體的檢測提前發現故障隱患進行主動切換,優化原生的主備複製機制,採用增量日誌加記憶體buffer的方式進行同步,避免弱網情況下主備複製頻繁斷開及全量同步。

enter image description here

主從單副本是雲資料庫 Redis 推出的一種全新系列,採用單個資料庫節點部署架構。與雙副本版本相比,它只包含一個節點,沒有備用節點實時同步資料,不提供資料持久化和備份策略,適用於對資料可靠性要求不高的純快取業務場景。與其他雲廠商相比,阿里雲Redis單副本能夠保證在主庫發生故障的時候快速切換到新節點,但是這個新節點是沒有資料的,使用者需要在切換完成之後進行資料預熱避免資料庫的打穿。

enter image description here

阿里雲Redis叢集完全採用自研的技術體系,設計的時候充分考慮到使用者能夠從主從版本平滑遷移過來的需求。Redis叢集架構引入了Proxy、Config模組,Proxy負責資料的分發及路由,Config負責資料的遷移及路由表管理。多個無狀態的Proxy、Config模組可以保證整個鏈路的高可用,避免單點問題。與其他雲廠商相比,阿里雲Redis叢集能夠保證更高的相容性,使用者可以在主從版本和Redis叢集之間進行無縫切換,不需要去更改使用者的程式碼。同時,阿里雲Redis叢集還支援多db的模式,相比大部分開源的Redis叢集方案有較大的優勢。

為了更好的服務使用者,後續阿里雲Redis產品還會推出讀寫分離、異地容災、異地多活等產品形態供使用者進行選擇。最近阿里雲Redis又推出了256MB的主從雙副本例項,適用於PHP快取、論壇加速、資料庫加速等,隨著業務的發展使用者還可以進一步擴容。活動期間可以享受99元包年的優惠

圖靈訪談:先後接觸過Tair,Memcached和Redis後,在雲服務開發中有哪些深刻的體會?

作為基礎服務開發工程師,資料庫的穩定性、效能是第一要位的。使用者對資料庫的高可用及穩定性都有很高要求的,我們在開發過程中需要選用合理的架構,在架構上避免單點問題,避免故障無法恢復問題。對於雲服務需要做到足夠的隔離,避免不同租戶的互相影響,同時在設計雲服務過程中需要考慮到可擴充套件性。公有云服務的每個業務都有自己的特點,會催生出不同的業務需求,所以在初步設計的時候需要保留支援多種業務模式的能力。

圖靈訪談:在阿里雲內部,Redis技術最得意的應用場景是什麼?使用過程中存在哪些痛點?

阿里內部大量使用了阿里雲Redis服務,比如手淘、高德、CDN業務、菜鳥等都大量使用了Redis以實現不同的業務。微淘社群承載了億級淘寶使用者的社交關係鏈,其中每個使用者都有自己的關注列表,每個商家都有自己的粉絲資訊。我用下面的圖來展示整個微淘社群承載的關係鏈。

enter image description here

如果選用傳統的關係型資料庫模型表達上面的關係資訊,業務設計會變得異常繁雜,也不能獲得良好的效能體驗。使用Redis叢集,微淘社群快取了儲存社群的關注鏈,簡化了關注資訊的儲存,並保證了雙11業務絲滑一般的體驗。微淘社群使用了Hashes儲存使用者之間的關注資訊,儲存結構如下圖所示。

enter image description here

隨著業務規模的壯大,使用者需要後端Redis雲服務能夠做到動態擴容。阿里雲Redis叢集例項提供了資源變配功能,使用者可以在需要的時候進行變配以應對容量的增加。另外,對於淘寶業務來說,每年的雙11都是重中之重,我們在雙11之前都會跟業務方確認當年的訪問量和業務量,同時提前進行雙11的全鏈路壓測,保證業務絲滑般的體驗。

在使用開源Redis的過程中,我們也碰到了很多問題,比如原生Redis的同步依賴於記憶體buffer,這會帶來一個問題:在弱網情況下,如果記憶體buffer溢位,原生Redis需要進行一次全量同步。為此阿里雲Redis對主備同步進行了優化,通過binlog日誌加記憶體buffer的形式解決掉弱網全量同步的缺陷。另外,在雲服務開發運維過程中難免需要對Redis服務進行升級管理,但原生的Redis核心不能很好地支援熱升級機制,如果直接重啟會對使用者的訪問產生很大的影響。阿里雲Redis通過拆分動態庫的形式做到了3ms內對一個例項進行熱升級,而且升級過程中對使用者的訪問不會有任何影響。

圖靈訪談:關係型和非關係型資料庫在實現上有哪些主要區別?各自面向的應用領域和作用是什麼?

簡單來說,關係型資料庫是指採用關係模型來組織的資料庫。傳統的關係型資料庫由二維表模型來組織,表與表之間具有一定聯絡,業務可以通過SQL語句對資料庫進行更新、查詢、刪除。非關係型資料庫(NoSQL)的最初定義是沒有SQL的輕量級資料庫,並且不保證遵循ACID原則的資料儲存系統。

關係型和非關係型最大的區別在於是否保持事務的一致性,雖然像Redis這樣的非關係型資料庫也有事務的說法,不過Redis事務是相對簡單的事務模型,而傳統關係型的資料庫是要求讀寫操作來保證事務一致性的,因為關係型的資料庫具有更多的應用場景,並且多用於對資料一致性有強烈要求的系統中。非關係型資料庫裡的key—value結構具有極高的併發讀寫效能,所以常常用於快取記憶體中,作為傳統資料庫的快取提供更高的併發訪問。

圖靈訪談:新手如何選擇資料庫型別,傳統關係型資料庫還是非關係型資料庫?

兩種資料庫型別是相輔相成的,關係型資料庫可以用於對資料一致性有更高要求的場景,同時能夠支撐複雜型別的關聯查詢,而非關係型的資料庫可以用於資料庫的快取,或者用於結構簡單的業務場景。另外,由於Redis提供了更多複雜型別的資料結構,所以也可以將Redis用於更豐富的業務場景,比如用List結構來實現推送系統、彈幕系統等。

圖靈訪談:資料庫的實現相當複雜,如果想要研究如何實現資料庫系統,即學習造輪子,您有什麼建議?

如果要研究資料庫的實現可以先從應用層的應用開始,先熟悉資料庫的應用場景,也可以先閱讀資料庫相關的基礎知識,瞭解資料庫的SQL解析、持久化機制、資料同步、資料庫索引等掌握資料庫實現的設計原理。學習過程中,我們可以閱讀優秀開源資料庫的原始碼實現,跟蹤除錯瞭解整個資料庫命令執行的過程;根據資料庫命令的每一步執行,在程式碼跟進過程中思考如何優化和增加新功能。積極融入開源社群的各種活動,定期檢視社群的問題。在解決社群使用者彙報問題的過程中,對資料庫知識做到整體地把握,著重深入某一具體方面的知識。

以NOSQL資料庫的學習為例,我們可以通過閱讀Redis資料庫原始碼,瞭解每種資料結構在記憶體裡的組織方式,思考如何更好地儲存複雜型別的資料結構。跟Memcached進行比較,分析兩種做法的優劣。

為了更好地研究資料庫的實現,我們需要多動手,在實際專案中瞭解資料庫的實現,通過開發新功能、優化老功能來鞏固知識,同時兼顧資料庫理論知識的學習。

圖靈訪談:如何保證快取資料和資料庫資料的一致性?

在大資料、高併發的情況下,很多業務系統都會採用“快取+資料庫”的方式,對快取副本和資料庫資料做同步處理。同步的方式主要有以下幾種。

  • 自動失效: 通過設定過期時間讓快取中的資料自動失效,對資料一致性要求更高的業務,可以將過期時間設定得短一點

  • 定時重新整理: 通過後臺設定定時重新整理的執行緒,定時將資料庫的資料同步到快取中,這種模式適合對一致性要求不是很高的業務

  • 同步更新:在更新完成資料庫之後,直接更新快取的資料。這樣快取的資料就永遠在資料庫之後更新,能夠保證資料的一致性

  • 中介軟體更新:通過中介軟體訂閱資料庫的binlog服務,感知資料庫資訊的變化在中介軟體上對快取進行更新,這種模式能夠快速感知資料庫的變化並且不需要業務方去管理快取,方便業務接入快取系統

圖靈訪談:談談分散式系統儲存技術未來的方向?

由於傳統單機資料庫在可擴充套件性上面臨著巨大的挑戰,而NoSQL並不能很好地支援關係型的資料庫模型,NewSQL成為了目前分散式資料庫儲存技術最前沿的一個方向。NewSQL具有海量資料的儲存管理並且能夠保持傳統資料庫的ACID及SQL特性。

NewSQL採用了大量的新技術。在儲存方面,NewSQL採用以記憶體為主的儲存,將主要的資料快取於記憶體中,能夠維持記憶體和持久化儲存的資料比例,提高系統的效能;為了支援資料庫的可擴充套件性,NewSQL通過資料分片的模式將資料分佈到不同的group中,同時能夠支援不同group的資料進行熱遷移以達到資料的負載均衡;NewSQL在複製方面需要保證資料的一致性,事務的寫入必須在被確認提交之前被確認並安裝到所有副本;要做到高可用就需要從崩潰中恢復,相比傳統的故障恢復,NewSQL還希望儘量減少故障恢復的時間。

從技術角度來講,NewSQL與傳統資料庫並不是完全不同的架構,NewSQL的新特點在於能夠融合多方的技術,在一個獨立的系統中進行實現,同時隨著硬體技術的發展能夠提供更可靠更具有擴充套件性的資料庫服務。


——更多訪談


更多精彩,加入圖靈訪談微信!

相關文章