從大資料談起2 分片和分層

2021-06-15 05:22:10 字數 2422 閱讀 4351

在網際網路的發展過程中,當開始碰到資料庫訪問瓶頸時,僅僅是單張資料表到了一定的容量時,比如某網際網路公司有了千萬級別的使用者時,查詢操作就開始變慢。之後某位牛x的技術人員想出了乙個很好的解決方案,就是分表,按照使用者的id把使用者表分拆成好幾個,這就是分表。分表還僅僅是一台機器上的事情,當表記錄到了數億級別,一台機器放不下了,某位牛x的程式設計師又想起分庫。總之通過分治的策略,可以很好的將資料分散,利用hash或者類似的方式來找到應用需要的資料介質來獲取資料。由此產生了乙個最原始而有效的概念就是拆分。

垂直拆分:是指按功能模組拆分,比如可以將群組相關表和**相關表存放在不同的資料庫中,這種方式多個資料庫之間的表結構不同。比如在設計大型論壇時,我們可以把不同版面的資料儲存到不同的資料庫表或者不同的資料庫中。

水平拆分:而水平拆分是將同乙個表的資料進行分塊儲存到不同的資料庫中,這些資料庫中的表結構完全相同。剛才說到的千萬級的使用者表所用到的辦法就是水平拆分。

垂直拆分和水平拆分是網際網路公司的一般做法,沒有什麼太大的技術亮點,說出來簡單的嚇人。但是隨著資料量的幾何指數增長,原來幾百mb的資料,已經增長到了幾百pb,但是分治的思想和實現方法也在這個過程中,發生了更加精彩的蛻變。

首先是劃分方式,基本的水平劃分方式是很隨機很原始的,即使是用上一致性hash等技術,仍然存在擴容困難的問題,但是好處也很明顯,不需要儲存集群的拓撲結構,不需要存分布資訊,讀寫操作效率也高。

衍生的分片方式需要先對資料進行一定的處理,比如要先排序或者對主鍵進行range操作。劃分之後,再將資料劃分成若干個虛擬頁,一般來說虛擬頁要比實際物理的儲存節點要多,比如我們預先將某資料劃分成60000頁(下面稱為page),再投影到200臺機器(下面叫chunknode)中。相當於每台機器儲存了300多頁的資料。當然,為了冗餘和備份,實際儲存的資料頁應該是原資料的三倍以上大小(參考hadoop),即每台機器至少需要存放900頁。這裡就包含了兩層對映,即原始資料-虛擬頁-儲存節點,這樣就需要增加乙個儲存資料位置的節點(下面叫masternode)來管理資料的儲存(hbase裡叫hmaster)。這種兩段對映的好處是便於做擴容、容錯和查詢優化:

便於做服務擴充套件,是指增加chunknode時,只需要將部分頁拷貝到新的機器,再把源來儲存節點的資料刪除,然後再去masternode修改一下虛擬分頁資料的實際儲存位置即可,且擴容時源資料還可以支援讀寫操作,不需要停服。

較好的容錯性:masternode裡包含了所有集群的拓撲結構,只需要將每個page複製三份放到不同的chunknode就進行完善的冗餘備份。

能支援更好的查詢優化:每個page裡的資料可以計算一些基本count、max、min等字段來便於檢索,一旦發現不符合查詢條件,就可以忽略這個page裡的資料,大幅度增加查詢速度。

在實際專案裡,也可以使用動態分片來增加虛擬頁的個數。

很容易發現,所謂的page只是資料的乙個單位,在實現上很隨意,可以是mysql的乙個表,或者自己實現的sstable,也可以是乙個文字檔案,反正只是資料載體,能夠支援查詢就好了。說到查詢,乙個較好的oltp系統應該能夠支援sql查詢,不支援的話上面的應用開發者就苦逼了,他們甚至希望最好能夠相容mysql客戶端連線,這就需要對sql客戶端協議進行一定的研究了。但是好的開源工具基本都能做到。

分層主要是為了劃分資料儲存介質,比如最實時的資料,會放到記憶體裡,不太實時的資料,比如小時庫和日庫,就放到ssd上。再大一點且不怎麼更新的就放到海量硬碟,這些個海量的硬碟甚至不需要電源,直接找個機架壘起來連上就好了。這個方式能很好的處理實時資料和非實時資料,節省了不必要的機器開銷。

再拿**開源的oceanbase來說,oceanbase提到自己要支援acid,那麼在分布式基礎上怎麼支援事務呢,答案就是不怎麼行。不過呢,oceanbase找了變通的法子,它要求系統必須有個大記憶體的伺服器作為實時資料和事務的處理機器(realtimenode),rn負責實時的更新操作,並分成add和del操作,在一台機器上來支援事務就簡單多了,效率也很高。

唯一的麻煩是需要定期合併。rn因為是純記憶體的方式,所以它必須要定期將資料flush到chunknode上。在合併過程中,rn中的資料會被凍結乙份供合併操作,再另開乙份新的記憶體供新的資料進來。這時mergenode需要將新資料、凍結資料和cn中的資料合併起來提供查詢結果,這裡有個問題就是mn怎麼才能知道哪些資料合併過,所以需要在資料塊裡記乙個版本資訊。通過檢查rn和cn的版本號是否連續,比如rn是3,cn是2,說明資料已經合併到cn上。而cn如果是1的話,說明凍結資料裡還有版本為2的資料,需要去凍結資料塊裡查詢。

從生活談起

你有了目標,你開始了幾點一線的生活。慢慢的你發現,活著,就是為了掙大錢。可是畢竟人生不是一帆風順,你找不到喜歡的工作,遇不到志同道合的同事,這時候你開始無措,想回到小時候,想找人訴苦,甚至你還想過自殺。慶幸的是,你發現,你還有個溫暖的家。有的人一生真的很不容易,但是他們卻活的很幸福,他們不奢求錦衣玉...

從機器學習談起

在本篇文章中,我將對機器學習做個概要的介紹。本文的目的是能讓即便完全不了解機器學習的人也能了解機器學習,並且上手相關的實踐。這篇文件也算是easypr開發的番外篇,從這裡開始,必須對機器學習了解才能進一步介紹easypr的核心。當然,本文也面對一般讀者,不會對閱讀有相關的前提要求。在進入正題前,我想...

從記憶體分配談起

來自 言歸正傳,大家在平時的開發過程中,發生記憶體錯誤是件非常麻煩的事情,編譯器不能自動發現這些錯誤,只有在程式執行時才會 捉到,而這些錯誤大多沒有明顯的症狀,時隱時現,來無影,去無蹤,在面對這些問題時,要想做到望聞診切,然後藥到病除,不如,讓我們從頭理一理記憶體的那些個事兒。記憶體是cpu和硬碟進...