本文僅用於學習和交流目的,不得用於商業目的。非商業轉載請註明做譯者、出處,並保留本文的原始連接:http://www.ituring.com.cn/art...php
本名鄭明杭,現阿里雲NoSQL數據庫技術專家。前後從事Tair分佈式系統、Memcached雲服務及阿里雲Redis數據庫雲服務開發,關注分佈式系統及NoSQL存儲技術前沿。html
做爲嘉賓,曾在飛馬網&中生代技術嘉年華上發表題爲《ApsaraDB for Redis雲數據庫技術棧詳解》的演講內容,得到觀衆一致叫好!redis
下圖是白宸的演講圖片。數據庫
從事數據庫工做的緣由後端
阿里雲Redis數據庫跟其餘有商相比的優點緩存
Redis最得意和最痛的點微信
分佈式系統存儲技術的前沿——NewSQL網絡
數據庫實現的方法數據結構
......架構
數據庫是產品應用的基礎。直播、共享單車等每一個火爆產品的背後都是大量關係型數據庫、NoSQL類型數據庫在支撐。另外,中小企業爲了專一自身業務的發展都會選擇雲計算,將基礎設置的建設交給雲服務商。雲服務商爲了提供高性能、高可用的數據庫產品須要投入足夠多的研發精力。在數據庫研發過程當中,數據庫研發者既能夠深刻內核、網絡、存儲設備進行深度的優化改進,又可以在數據庫層面擴展出分佈式、異地容災等不一樣的產品形態,同時結合不一樣類型的業務進行不一樣的深度優化。
選擇數據庫開發工做主要是爲了可以結合計算機理論知識,實踐分佈式、存儲、數據庫、內核,反過來在實踐開發過程當中鞏固提升本身。
阿里雲的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元包年的優惠!
做爲基礎服務開發工程師,數據庫的穩定性、性能是第一要位的。用戶對數據庫的高可用及穩定性都有很高要求的,咱們在開發過程當中須要選用合理的架構,在架構上避免單點問題,避免故障沒法恢復問題。對於雲服務須要作到足夠的隔離,避免不一樣租戶的互相影響,同時在設計雲服務過程當中須要考慮到可擴展性。公有云服務的每一個業務都有本身的特色,會催生出不一樣的業務需求,因此在初步設計的時候須要保留支持多種業務模式的能力。
阿里內部大量使用了阿里雲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的新特色在於可以融合多方的技術,在一個獨立的系統中進行實現,同時隨着硬件技術的發展可以提供更可靠更具備擴展性的數據庫服務。