摘要:經歷了微博數據庫各個階段的架構改造,包括服務保障及體系建設微博多機房部署微博平臺化改造等項目。第二階段爆發階段微博上線之后,隨著用戶活躍度的增加,數據庫的壓力也與日俱增。
非商業轉載請注明作譯者、出處,并保留本文的原始鏈接:http://www.ituring.com.cn/article/211461
肖鵬,微博研發中心技術經理,主要負責微博數據庫(MySQL/Reids/HBase/Memcached)相關的業務保障、性能優化、架構設計,以及周邊的自動化系統建設。經歷了微博數據庫各個階段的架構改造,包括服務保障及SLA體系建設、微博多機房部署、微博平臺化改造等項目。10年互聯網數據庫架構和管理經驗,專注于數據庫的高性能和高科用技術保障方向。
問:您是如何與MySQL結緣,并成為數據庫方面的專家的?
與MySQL結緣主要也是源于興趣,第一份工作在一家小公司,各個領域的工作都會有接觸,全都做下來發現還是對數據庫最感興趣,所以就一直從事和數據庫相關的技術工作了。隨著工作年限的增加,我在數據庫方面積累的經驗也逐步增加,越來越發現數據庫管理員(DBA)是一個偏實踐的工種,很多理論上的東西在現實中會有各種的變化,比如「反范式」設計等等。所以我建議大家:如果想成為數據庫方面的專家,一定要挑選好環境,大平臺很多時候會由于量變引發質變產生很多有挑戰的問題,而解決這些問題是成為技術專家的必經之路。
問:一路走來,微博的數據規模和業務場景都發生了很大的改變,請問新浪MySQL集群結構發展到今天都經歷了哪些階段?
微博到今天已經有6年了,非常有幸全程參與了這6年的變化。新浪的MySQL集群結構主要經歷了3次重大的變化。
第一階段:初創階段
初期微博作為一個內部創新產品,功能比較簡潔,而數據庫架構也采用1M2S1MB的標準結構,按照讀寫分離設計,主庫承擔寫入,而從庫承擔訪問。如果訪問壓力過大,可以通過擴容從庫的數量獲得scale out的能力。
第二階段:爆發階段
微博上線之后,隨著用戶活躍度的增加,數據庫的壓力也與日俱增。我們首先通過采購高性能的硬件設備來對單機性能進行scale up,以滿足支撐業務的高速發展的需求。然后,通過使用高性能設備爭取來的時間對微博進行整體上的業務垂直拆分,將用戶、關系、博文、轉發、評論等功能模塊分別獨立存儲,并在垂直拆分的基礎上,對一些預期會產生海量數據的業務模塊再次進行了二次拆分。
以博文為例,博文是微博用戶主要產生的內容,可以預見會隨著時間維度不斷增大,最終會變得非常巨大。如何在滿足業務性能需求的情況下,盡可能使用較少的成本存儲,這是我們面臨的一個比較有挑戰的問題。
首先,我們將索引同內容進行了拆分,因為索引所需存儲的空間較少,而內容存儲所需空間較大,且對這兩者的使用需求也不盡相同。
然后,分別對索引和內容采用hash,然后再按照時間維度拆分的方式進行水平拆分,盡量保障每張表的容量在可控范圍之內,保障查詢的性能指標。
最后,業務先通過索引獲得實際所需內容id,然后再通過內容庫獲得實際的內容,并通過部署memcached來加速整個過程。雖然看上去步驟變多,但是實際效果完全可以滿足業務需求。
第三階段:沉淀階段
在上一個階段,微博的數據庫經歷了很多的拆分改造,這也就直接造成了規模的成倍增長,而隨著業務經歷了高速增長之后,也開始趨于穩定。在這個階段,我們開始著重進行自動化的建設。將之前在快速擴張期間積攢下來的經驗轉變為自動化工具,對外形成標準化和流程化的平臺服務。我們相繼改造了備份系統、監控系統、AutoDDL系統、MHA系統、巡檢系統、慢查系統、maya中間件系統等。為了提高業務使用效率和降低溝通成本,相對于內部管理系統而言,我們重新開發了iDB系統對數據庫平臺的用戶使用。通過iDB系統,用戶可以便捷地了解自己業務數據庫的運行狀態,并可以直接提交對數據庫的DDL修改需求。DBA僅需點擊審核通過,即可交由Robot在線上執行,不但提高了工作效率,也提高了安全性和規范性。
問:在過去的2015年,新浪數據庫平臺都做了哪些重大的改進和優化?
數據庫平臺并不僅有MySQL,還有Redis、Memcached、HBase等數據庫服務,而在緩存為王的趨勢下,2015年我們重點將研發精力投入在Redis上。
Redis中間件
2015年,我們自研的Redis中間件tribe系統完成了開發和上線。tribe采用有中心節點的proxy架構設計,通過configer server管理集群節點,并借鑒官方Redis cluster的slot分片設計思路來完成數據存儲。最終實現了路由、分片、自動遷移、fail over等功能,并且預留了操作和監控的API接口,以便同其他的自動化運維系統對接。
Databus
由于我們先有MySQL后有Redis和HBase等數據庫,所以存在一種場景,就是目前數據已經寫入到MySQL中,但是需要將這些數據同步到其他數據庫軟件中。為此我們開發了Databus,可以基于MySQL的binlog將數據同步到其他異構的數據庫中,并且支持自定義業務邏輯。目前已經實現了MySQL到Redis和MySQL到HBase的數據流向,下一步計劃開發Redis到MySQL的數據流向。
問:微博用戶庫設計采用了反范式設計,但是反范式設計也有自己的問題,比如在規模龐大時,數據冗余多,編碼及維護的困難增加。請問你們是如何解決這些問題的?
反范式設計帶來便利的同時確實也帶來了一些問題,尤其是在數據規模變大之后,通常來說會有如下幾種解決方案。
預拆分,接到需求的時候提前針對于容量進行評估,并按照先垂直后水平進行拆分,如果可以按照時間維度設計,那就納入歸檔機制。通過數據庫的庫表拆分,解決容量存儲問題。
引入消息隊列,利用隊列的一寫多讀特性或多隊列來滿足冗余數據的多份寫入需求,但僅能保障最終的一致性,中間可能會出現數據延遲。
引入接口層,通過不同業務模塊的接口將數據進行匯總之后再返回給應用層,降低應用層開發的編碼復雜度。
問:微博平臺當前在使用并維護著可能是世界上最大的Redis集群,在應用Redis的過程中,你們都產生了哪些具有獨創性的解決方案?
微博使用Redis的時間較早,并且一開始量就很大,于是在實際使用過程中遇到了很多實際的問題,我們的內部分支版本都是針對這些實際問題進行優化的。比較有特點的有如下三個。
增加基于pos位同步功能
在2.4版本中,Redis的同步一旦出現中斷就會重新將主庫的數據全部傳輸到從庫上,這就會造成瞬時的網絡帶寬峰值,并且對于數據量較大的業務,其從庫恢復的時間較為緩慢。為此我們聯合架構組的同事借鑒MySQL的主從同步復制機制,將Redis的aof改造為記錄pos位,并讓從庫記錄已經同步的pos位置。這樣,在網絡出現波動的時候,即使重傳也只是一部分數據,并不會影響到業務。
在線熱升級
使用初期,由于很多新功能的加入,Redis版本不斷升級,每次升級時為了不影響業務都需要進行主庫切換,這對于運維帶來了很大的挑戰。于是我們開發了熱升級機制,通過動態加載libredis.so來實現版本的改變,不再需要進行主庫切換,極大地提升了運維的效率,也降低了變更帶來的風險。
定制化改造
在使用Redis的后期,由于微博產品上技術類的需求非常多,所以我們為此專門開發了兼容Redis的redisscounter存儲技術類的數據。通過使用array替換hash table極大降低了內存占用。而在此之后,我們開發了基于bloom filter的phantom解決判斷類場景需求。
問:在一次分享中您曾經透露新浪數據庫備份系統正計劃結合水位系統實現智能擴容,請問現在實現到哪一步了?
目前這個事情的進展不是很理想,主要是我們發現MySQL的擴容速度跟不上業務的變化,有些時候擴容完畢之后業務的高峰已經過去了,接下來就需要做縮容,等于做了無用功。所以,目前我們的思路改為擴縮容cache層。首先實現cache層的自動擴縮容,然后同業務監控系統或者接入層的自動化系統進行聯通,比如,如果計算節點擴容100個node,那么我們的cache層就聯動擴容20node,以此來達到業務聯動。
問:未來5年內新浪數據庫還將做出什么樣的改變?
隨著業務的發展,會遇到越來越多的場景,我們希望可以引進最適合的數據庫來解決場景問題,比如PostgreSQL、SSDB等。同時,利用MySQL新版本的特性(比如5.7的并行復制、GTID、動態調整BP),不斷優化現有服務的性能和穩定性。
另外,對于現有的NoSQL服務,推進服務化,通過使用proxy將存儲節點進行組織之后對外提供服務。對外降低開發人員的開發復雜度和獲取資源的時間,對內提高單機利用率并解決資源層橫向擴展的瓶頸問題。
同時,嘗試利用各大云計算的資源,實現cache層的動態擴縮容;充分利用云計算的彈性資源,解決業務訪問波動的問題。
問:您如何看待新興的NewSQL?
數據庫圈子的變化確實很快,NoSQL還剛剛方興未艾,NewSQL又開始你方唱罷我登場。我個人并不認為某種數據庫會取代另一種數據庫,就如同NoSQL剛剛興起的時候很多聲音認為它會徹底取代MySQL,但是從實際情況看依然還是互依并存的關系。以我負責的集群來說,反倒是MySQL更多一些。我個人認為,每種數據庫都有其最擅長的場景,在特定場景下它就是最佳的數據庫,但是如果脫離了場景則很難說誰優誰劣。
問:能否請您橫向對比一下MySQL、MongoDB以及PostgreSQL?
我個人對MySQL使用得較多,MongoDB和PostgreSQL都有過一些接觸,MySQL作為LAMP中的一員,老實說對大部分場景都是合適的,尤其是在并發和數據庫量并沒有達到一個很大值的時候。但是,在某些場景下MongoDB和PostgreSQL確實更勝一籌。
比如我們在門戶的新聞發布系統中使用了MongoDB,其schema less的設計模式和新聞非常貼合,而其sharding功能又解決了容量上的橫向擴張問題,在這個場景下,MySQL并不具備什么優勢。
而在LBS(基于地理位置信息服務)相關的方面,PostgreSQL和PostGIS更具有優勢,利用其空間數據索引R-tree和實體類型點、線、線段、方形,以及特定的函數,可以很方便地實現空間計算需求。
就我個人來說,每種數據庫都有其擅長的場景。如果沒有特殊的架構需求,一般選擇MySQL都不會出問題。如果有特殊的架構需求,那么就需要根據需求的特點來選擇不同的數據庫。
問:對于想要掌握MySQL的同學,您有哪些學習上的建議?
首先,多讀書,至少將High Performance MySQL通讀一遍。
其次,有條件的話,最好找一些大平臺歷練一下,在很多情況下經驗和能力等同于你解決過的問題的廣度和深度,而環境決定你遇到的問題。
最后,有機會的話多做一些技術分享,很多知識點自己明白和能給別人講明白是兩個完全不同的境界。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/61685.html
摘要:不久,傳說中的月影大大進入了視線。目前擔任奇虎副總監技術委員會委員兼前端技術委員會主席,前端最大團隊奇舞團負責人,顧問。圖靈訪談我知道月影大大在前端方面特別有名,圖靈社區的好多留言也都感嘆終于有機會訪談到月影大大了。 本文僅用于學習和交流,不用于商業目的。非商業轉載請注明作譯者、出處,并保留本文的原始鏈接:http://www.ituring.com.cn/Art... 編者語 通往...
摘要:不久,傳說中的月影大大進入了視線。目前擔任奇虎副總監技術委員會委員兼前端技術委員會主席,前端最大團隊奇舞團負責人,顧問。圖靈訪談我知道月影大大在前端方面特別有名,圖靈社區的好多留言也都感嘆終于有機會訪談到月影大大了。 本文僅用于學習和交流,不用于商業目的。非商業轉載請注明作譯者、出處,并保留本文的原始鏈接:http://www.ituring.com.cn/Art... 編者語 通往...
摘要:不久,傳說中的月影大大進入了視線。目前擔任奇虎副總監技術委員會委員兼前端技術委員會主席,前端最大團隊奇舞團負責人,顧問。圖靈訪談我知道月影大大在前端方面特別有名,圖靈社區的好多留言也都感嘆終于有機會訪談到月影大大了。 本文僅用于學習和交流,不用于商業目的。非商業轉載請注明作譯者、出處,并保留本文的原始鏈接:http://www.ituring.com.cn/Art... 編者語 通往...
閱讀 3267·2021-11-22 14:44
閱讀 1113·2021-11-16 11:53
閱讀 1264·2021-11-12 10:36
閱讀 699·2021-10-14 09:43
閱讀 3685·2019-08-30 15:55
閱讀 3399·2019-08-30 14:14
閱讀 1734·2019-08-26 18:37
閱讀 3410·2019-08-26 12:12