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

訪談嘉賓:

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

這裏寫圖片描述

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


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

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

圖靈訪談:爲什麼選擇數據庫方面的工作?

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

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

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

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

這裏寫圖片描述

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

這裏寫圖片描述

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

阿里雲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以實現不同的業務。微淘社區承載了億級淘寶用戶的社交關係鏈,其中每個用戶都有自己的關注列表,每個商家都有自己的粉絲信息。我用下面的圖來展示整個微淘社區承載的關係鏈。

這裏寫圖片描述

如果選用傳統的關係型數據庫模型表達上面的關係信息,業務設計會變得異常繁雜,也不能獲得良好的性能體驗。使用Redis集羣,微淘社區緩存了存儲社區的關注鏈,簡化了關注信息的存儲,並保證了雙11業務絲滑一般的體驗。微淘社區使用了Hashes存儲用戶之間的關注信息,存儲結構如下圖所示。

這裏寫圖片描述

隨着業務規模的壯大,用戶需要後端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的新特點在於能夠融合多方的技術,在一個獨立的系統中進行實現,同時隨着硬件技術的發展能夠提供更可靠更具有擴展性的數據庫服務。


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

這裏寫圖片描述

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