各位同行朋友,本篇是本系列的最后一篇,也是最舒服的一篇,因為講內容是自動優化,也就是不需要DBA主動干預,數據庫會沒事就給自己做優化!是不是有種躺贏的感覺?讓本人給大家匯報數據庫到底是怎么實現自動優化的?
柏睿數據內存分布式數據庫RapidsDB的自動優化體現在2個階段:
數據入庫過程
入庫過程的自動優化解決2個常見的OLAP型MPP數據庫問題,傳統的數控則需要外部手段或者手工執行命令來實現相同的優化效果:
1、自動優化小批量寫入(比如單行插入)過程,解決高頻小數據量寫入的性能低下問題;
2、自動優化數據入庫前排序入庫過程,解決因新數據無序寫入產生的查詢性能不高問題。
RapidsDB實現的方式如下:
跟其他友商分布式數據庫的列存儲實現不同,RapidsDB將新寫入的數據先將它們以跳表的方式臨時存儲在內存中。這個操作由數據庫后臺自動處理的,這些以行存方式的跳過列表數據,可以對讀取可見。
具體一點,向列存表插入數據時,數據會先寫入臨時的行存跳表或創建新的列存儲支持行段。至于是臨時表還是新建行段,數據庫引擎需要由根據插入數據量大小和列存儲索引的當前狀態的自動觸發確定的。每個數據分區16 MB,是 INSERT 或 LOAD DATA 寫入數據優化的默認閾值。當超過這個閾值時,當前外部寫入的數據就會在內存經過排序后,直接寫入新建的行段,反之則臨時存放在行存跳表中,經過超時或者新來數據達到閾值后,寫入列存行段中。
經過上述操作,數據入庫過程的自動優化完成。
數據入庫后
入庫過程后的自動優化,就是為了解決傳統分布式數據庫甚至Hadoop平臺也非常常見的:在用戶使用一段時間后,發現如果沒有對數據庫的存儲進行人工定時維護,則會引起性能大幅下降的問題,RapidsDB的3個自動優化手段,就是解決核心的3個性能影響因素:
1、無論做增刪改操作,數據庫都會自動對相關的列存行段中的數據自動重新排序,保證最佳的查詢性能;
2、當列存行段內重新排序完成后,其外的行段組會重新做排序組織,進一步使數據有序,二次優化性能;
3、經過上述2點的優化,有序數據使壓縮率得到提升,數據文件也得到合并,數據文件個數同時也會減少。IO讀寫性能可以在整個使用過程中,一直保存在極高的狀態中。
基本實現手段如下:
我們都知道如果表中的行在所有行段中都是全局排序的,那么列式表的性能最好。實際上,在連續寫入的情況下,維持這樣的順序是極難的。
RapidsDB使用了一種高級的算法,允許它在新增或更新數據時盡可能保持有序。這個過程被稱為background merger,并且為使行段的數據順序能夠得到持續優化,則該過程會一直在后臺自動運行。
當background merger在運行過程中,在庫內數據被增刪改等改變時,它會停止到當前任務并且重新開始。鑒于每次只處理一小塊行段數據,所以被停止的任務影響的只是少量的數據。只有在大量的更新工作負載下,重新排序處理效率才會顯著減慢,這是因為另一個機制pessimistic merger會鎖定當前正在處理的行段。用戶也可以通過運行命令OPTIMIZE TABLE手動觸發pessimistic merger。我們將在下面解釋如何決定是否有必要進行該指令,并如何運行它。
RapidsDB使用sorted row segment group(排序行段組)的概念來描述參與排序的一組行段。即行段重新排序的過程,并且對于一個行段而言,其最小的行號不小于其之前的任何行段中最大的行號,則這些行段形成排序的行段組。這里所描述的一行比另一行小,是代表該行的CLUSTERED COLUMNSTORE鍵的列值比另一行的列值小。
如果數據有一個完美的全局順序,它將由一個排序的行段組組成。如果剛入庫的原始數據是以完全隨機的順序排列的,那么它會包含與行段一樣多的排序行段組。background merger的任務邏輯就是重新組織行段之間的行,即盡量減少排序的行段組的數量。
以下面的例子直觀介紹:
要檢查特定表的已排序行段組的當前狀態,請在CLI環境中運行SHOW COLUMNAR MERGE STATUS FOR來查看:
讓我們仔細看結果的第一行,我們知道存儲在分區0上的表的切片具有3個有序的行段組,一個由741個行段組成,一個由16個行段組成,最后一個由1行段組成,共計758個行段??紤]這種有序的行段組對非常簡單查詢的影響:
根據排序行段組的定義,第一個排序的行段組最多包含一個包含user_group = 15的行的行段,除非user_group = 15位于兩個行段的邊界上,或者如果存在較大數據傾斜并且幾個行段僅由user_group = 15的行組成。類似的,第二排序行段組中最多一個行段包含相關行。這樣,總共758個行段中只有三個將被打開和具體化。雖然本例中的查詢非常簡單,但類似的推理同樣適用于復雜查詢中。
現在我們看一下分區2上有序的行段組。很明顯,它的優化程度遠遠低于剩下的2個,類似上面所示的選擇查詢將會導致物化8個行段。如果啟用了background merger,并且沒有或者少量工作負載同時運行,那么這個分區將會在幾秒鐘內得到優化。然而,在數據庫執行大量的增刪改任務時,background merger的處理性能會被影響。在這種情況下,不如通過手動觸發pessimistic merger,讓增刪改任務和后臺優化任務前后腳獨立完成更合理:
如果當我們執行OPTIMIZE TABLE時運行SHOW COLUMNAR MERGE STATUS,那么我們將會看見其作用:
新出現的一行代表分區3上正在進行一個手動合并,此時已經完成了53.12%的工作任務。
當完成合并任務后,現在情況更好了:
請注意,在本例中,沒有任何分區被合并到單個有序的行段組中。其原因是,兩種不同的合并方式均采用一種高級算法,該算法被優化為在并發寫入的情況下進行小的分批次工作,并將數據保持在幾個有序的行段組中,而不是試圖將所有數據合并到單個有序的行段組中。如果可以犧牲一些數據處理時間來獲得更高的查詢性能,則可以運行手動命令,將每個分區上的數據合并到一個有序的行段組中:
此時,任何選擇查詢將只具體化每一個分區的一個行段。
當向列式表中插入少量行時,使用內存中行存儲支持的段來存儲行。當這個以行存儲為基礎的段被填滿時,后臺刷新程序background flusher會定期將這些行刷新到磁盤中。通過運行OPTIMIZE TABLEFLUSH,可以手動將受行存儲支持的段刷新到磁盤中。
至此,例子中數據表t的后臺自動排序完成了。整個過程中,數據庫無須用戶干預,僅通過自動優化實現了高性能。
目前,RapidsDB已經在國有某大行普惠金融項目應用中運行超過10個月,產品自動優化證明了它的能力和價值。中間經歷過幾次10TB級的數據加載,每天10GB級的數據新增和更新,以及定時的滾動式刪除。過程中,技術團隊無需對數據庫做任何優化干預,相同場景的數據操作沒有任何性能下降的跡象!
免責聲明:市場有風險,選擇需謹慎!此文僅供參考,不作買賣依據。
本站違法和不良信息舉報 聯系郵箱: 5855973@qq.com
關于我們| 客服中心| 廣告服務| 建站服務| 聯系我們
中國焦點日報網 版權所有 滬ICP備2022005074號-20,未經授權,請勿轉載或建立鏡像,違者依法必究。