五、價值特性
openGauss相比其它開源資料庫主要有複合應用場景、高效能和高可用等產品特點。
(一)高效能
1. CBO最佳化器
openGauss最佳化器是典型的基於代價的最佳化(Cost-Based Optimization,簡稱CBO)。在這種最佳化器模型下,資料庫根據表的元組數、欄位寬度、NULL記錄比率、唯一值(Distinct Value)、最常見值(Most Common Value, 簡稱MCV)等表的特徵值以及一定的代價計算模型,計算出每一個執行步驟的不同執行方式的輸出元組數和執行代價(cost),進而選出整體執行代價最小/首元組返回代價最小的執行方式進行執行。
CBO最佳化器能夠在眾多計劃中依據代價選出最高效的執行計劃,最大限度的滿足客戶業務要求。
2. 行列混合儲存
openGauss支援行儲存和列儲存2種儲存模型,使用者可以根據應用場景,建表的時候選擇行儲存還是列儲存表。
一般情況下,如果表的欄位比較多(大寬表),查詢中涉及到的列不很多的情況下,適合列儲存。如果表的欄位個數比較少,查詢大部分欄位,那麼選擇行儲存比較好。
在大寬表、資料量比較大的場景中,查詢經常關注某些列,行儲存引擎查詢效能比較差。例如氣象局的場景,單表有200~800個列,查詢經常訪問10個列,在類似這樣的場景下,向量化執行技術和列儲存引擎可以極大的提升效能和減少儲存空間。行存表和列存表各有優劣,建議根據實際情況選擇。
- 行存表。預設建立表的型別。資料按行進行儲存,即一行資料緊挨著儲存。行存表支援完整的增刪改查。適用於對資料需要經常更新的場景。
- 列存表。資料按列進行儲存,即一列所有資料緊挨著儲存。單列查詢IO小,比行存表佔用更少的儲存空間。適合資料批次插入、更新較少和以查詢為主統計分析類的場景。列存表不適合點查詢,insert插入單條記錄效能差。
- 更新頻繁程度。資料如果頻繁更新,選擇行存表。
- 插入頻繁程度。頻繁的少量插入,選擇行存表。一次插入大批次資料,選擇列存表。
- 表的列數。表的列數很多,選擇列存表。
- 查詢的列數。如果每次查詢時,只涉及了表的少數(<50%總列數)幾個列,選擇列存表。
- 壓縮率。列存表比行存表壓縮率高。但高壓縮率會消耗更多的CPU資源。
3. 自適應壓縮
當前主流資料庫通常都會採用資料壓縮技術。資料型別不同,適用於它的壓縮演算法不同。對於相同型別的資料,其資料特徵不同,採用不同的壓縮演算法達到的效果也不相同。自適用壓縮正是從資料型別和資料特徵出發,採用相應的壓縮演算法,實現了良好的壓縮比、快速的入庫效能以及良好的查詢效能。
資料入庫和頻繁的海量資料查詢是使用者的主要應用場景。在資料入庫場景中,自適應壓縮可以大幅度地減少資料量,成倍提高IO操作效率,將資料簇集儲存,從而獲得快速的入庫效能。當使用者進行資料查詢時,少量的IO操作和快速的資料解壓可以加快資料獲取的速率,從而在更短的時間內得到查詢結果。例如,支援類手機號字串的大整數壓縮、支援numeric型別的大整數壓縮、支援對壓縮演算法進行不同壓縮水平的調整。
4. 分割槽
在openGauss系統中,資料分割槽是將例項內部的資料集按照使用者指定的策略做進一步拆分的水平分表,將表按照指定範圍劃分為多個資料互不重疊的部分。
對於大多數使用者使用場景,分割槽表和普通表相比具有以下優點:
- 改善查詢效能:對分割槽物件的查詢可以僅搜尋自己關心的分割槽,提高檢索效率。
- 增強可用性:如果分割槽表的某個分割槽出現故障,表在其它分割槽的資料仍然可用。
- 方便維護:如果分割槽表的某個分割槽出現故障,需要修復資料,只修復該分割槽即可。
- 均衡I/O:可以把不同的分割槽對映到不同的磁碟以平衡I/O,改善整個系統效能。
目前openGauss資料庫支援的分割槽表為範圍分割槽表、列表分割槽表、雜湊分割槽表。
- 範圍分割槽表:將資料基於範圍對映到每一個分割槽,這個範圍是由建立分割槽表時指定的分割槽鍵決定的。這種分割槽方式是最為常用的。範圍分割槽功能,即根據表的一列或者多列,將要插入表的記錄分為若干個範圍(這些範圍在不同的分割槽裡沒有重疊),然後為每個範圍建立一個分割槽,用來儲存相應的資料。
- 列表分割槽表:將資料基於各個分割槽內包含的鍵值對映到每一個分割槽,分割槽包含的鍵值在建立分割槽時指定。列表分割槽功能,即根據表的一列,將要插入表的記錄中出現的鍵值分為若干個列表(這些列表在不同的分割槽裡沒有重疊),然後為每個列表建立一個分割槽,用來儲存相應的資料。
- 雜湊分割槽表:將資料透過雜湊對映到每一個分割槽,每一個分割槽中儲存了具有相同雜湊值的記錄。雜湊分割槽功能,即根據表的一列,透過內部雜湊演算法將要插入表的記錄劃分到對應的分割槽中。
使用者在下發“CREATE TABLE”命令時增加PARTITION引數,即表示針對此表應用資料分割槽功能。
使用者可以在實際使用中根據需要調整建表時的分割槽鍵,使每次查詢結果儘可能儲存在相同或者最少的分割槽內(稱為“分割槽剪枝”),透過獲取連續I/O大幅度提升查詢效能。
實際業務中,時間經常被作為查詢物件的過濾條件。因此,使用者可考慮選擇時間列為分割槽鍵,鍵值範圍可根據總資料量、一次查詢資料量調整。
5. SQL by pass
在典型的OLTP場景中,簡單查詢佔了很大一部分比例,這種查詢的特徵是隻涉及單表和簡單表示式的查詢。為了加速這類查詢,提出了SQL by pass框架:在parse層對這類查詢做簡單的模式判別後,進入到特殊的執行路徑裡,跳過經典的執行器執行框架,包括運算元的初始化與執行、表示式與投影等經典框架,直接重寫一套簡潔的執行路徑,並且直接呼叫儲存介面。這樣可以大大加速簡單查詢的執行速度。
6. 鯤鵬NUMA架構最佳化
- openGauss根據鯤鵬處理器的多核NUMA架構特點,進行針對性一系列NUMA架構相關最佳化。一方面儘量減少跨核記憶體訪問的時延問題,另一方面充分發揮鯤鵬多核算力優勢。所提供的關鍵技術包括重做日誌批次插入、熱點資料NUMA分佈、CLog分割槽等,大幅提升OLTP系統的處理效能。
- openGauss基於鯤鵬晶片所使用的ARMv8.1架構,利用大規模系統擴充套件指令集(Large System Extension,簡稱LSE)實現高效的原子操作,有效提升CPU利用率,從而提升多執行緒間同步效能、XLog寫入效能等。
- openGauss基於鯤鵬晶片提供的更寬的L3快取cacheline,針對熱點資料訪問進行最佳化,有效提高快取訪問命中率,降低Cache快取一致性維護開銷,大幅提升系統整體的資料訪問效能。
(二)高擴充套件
在OLTP領域中,資料庫需要處理大量的客戶端連線。因此,高併發場景的處理能力是資料庫的重要能力之一。
對於外部連線最簡單的處理模式是per-thread-per-connection模式,即來一個使用者連線產生一個執行緒。這個模式好處是架構上處理簡單,但是高併發下,由於執行緒太多,執行緒切換和資料庫輕量級鎖區域的衝突過大導致效能急劇下降,使得系統效能(吞吐量)嚴重下降,無法滿足使用者效能的SLA(Service-Level Agreement,服務等級協議)。
因此,需要透過執行緒資源池化複用的技術來解決該問題。執行緒池技術的整體設計思想是執行緒資源池化、並且在不同連線之間複用。系統在啟動之後會根據當前核數或者使用者配置啟動固定一批數量的工作執行緒,一個工作執行緒會服務一到多個連線會話,這樣把會話和執行緒進行了解耦。因為工作執行緒數是固定的,因此在高併發下不會導致執行緒的頻繁切換,而由資料庫層來進行會話的排程管理。
(三)高可用
1. 主備機
為了保證故障的可恢復,需要將資料寫多份,設定主備多個副本,透過日誌進行資料同步;可以實現在節點故障、停止後重啟等情況下,保證故障之前的資料無丟失,以滿足ACID特性。openGauss可以支援一主多備模式,備機接收主機傳送過來的WAL日誌並進行回訪,保證和主機的資料一致;同時在主機發生故障時,備機可以參照升主機制進行升主。備機過多會消耗過量的資源,而備機太少會降低系統的可用性。
主備之間可以透過“switchover”操作進行角色切換,主機故障後可以透過“failover”操作對備機進行升主。
初始化安裝或者備份恢復等場景中,需要根據主機重建備機的資料,此時需要Build(構建)功能,將主機的資料和WAL日誌傳送到備機。主機故障後重新以備機的角色加入時,也需要Build功能將其資料和日誌與新主拉齊。Build包含全量Build和增量Build;全量Build要全部依賴主機資料進行重建,複製的資料量比較大,耗時比較長;而增量Build只複製差異檔案,複製的資料量比較小,耗時比較短。一般情況下,優先選擇增量Build來進行故障恢復;如果增量Build失敗,再繼續執行全量Build,直至故障恢復。
openGauss除了流複製主備雙機外,還支援邏輯複製。在邏輯複製中把主庫稱為源端庫,備庫稱為目標端資料庫。源端資料庫根據預先指定好的邏輯解析規則對WAL檔案進行解析,把DML操作解析成一定的格式的邏輯日誌(例如可以解析成標準SQL語句)。源端資料庫把邏輯日誌發給目標端資料庫,目標端資料庫收到後進行回放,從而實現資料同步。邏輯複製只有DML操作。邏輯複製可以實現跨版本複製、異構資料庫複製、雙寫資料庫複製、表級別複製等。
2. 邏輯備份
openGauss提供邏輯備份能力,可以將使用者表的資料以通用的text或者使用者自定義格式備份到本地磁碟檔案,並在同構/異構資料庫中恢復該使用者表的資料。
3. 物理備份
openGauss提供物理備份能力,可以將整個例項的資料以資料庫內部格式備份到本地磁碟檔案中,並在同構資料庫中恢復整個例項的資料。
物理備份主要分為全量備份和增量備份,它們的區別如下:全量備份包含備份時刻點上資料庫的全量資料,耗時時間長(和資料庫資料總量成正比),自身即可恢復出完整的資料庫;增量備份只包含從指定時刻點之後的增量修改資料,耗時時間短(和增量資料成正比,和資料總量無關),但是必須要和全量備份資料一起才能恢復出完整的資料庫。當前openGauss同時支援全量備份和增量備份。
4.恢復到指定時間點(PITR)
時間點恢復(Point In Time Recovery,PITR)基本原理是透過基礎熱備 + WAL預寫日誌 + WAL歸檔日誌進行備份恢復。重放WAL記錄的時候可以在任意點停止重放,這樣就有一個在任意時間的資料庫一致的快照。即可以把資料庫恢復到自開始備份以來的任意時刻的狀態。openGauss在恢復時可以指定恢復的停止點位置為LSN(Log Sequence Number,日誌序列號)、時間、XID(Transaction ID,事務ID)以及使用者建立的還原點。
(四)可維護性
1. 支援WDR診斷報告
WDR(Workload Diagnosis Report)基於兩次不同時間點系統的效能快照資料,生成這兩個時間點之間的效能表現報表,用於診斷資料庫核心的效能故障。
- SNAPSHOT效能快照:效能快照可以配置成按一定時間間隔從核心採集一定量的效能資料,持久化在使用者表空間。任何一個SNAPSHOT(快照)可以作為一個效能基線,其它SNAPSHOT與之比較的結果,可以分析出與基線的效能表現。
- WDR Reporter:報表生成工具基於兩個SNAPSHOT,分析系統總體效能表現,並能計算出更多項具體的效能指標在這兩個時間段之間的變化量,生成SUMMARY和DETAIL兩個不同級別的效能資料。
WDR報表是長期效能問題最主要的診斷手段。基於SNAPSHOT的效能基線,從多維度做效能分析,能幫助DBA掌握系統負載繁忙程度,各個元件的效能表現,效能瓶頸。SNAPSHOT也是後續效能問題自診斷和自最佳化建議的重要資料來源。
2. 慢SQL診斷
慢SQL能根據使用者提供的執行時間閾值,記錄所有超過閾值的執行完畢的作業資訊。
歷史慢SQL提供表和函式兩種維度的查詢介面,方便使用者統計慢SQL指標,對接第三方平臺。使用者從介面中能查詢到作業的執行計劃、開始執行時間、結束執行時間、執行查詢的語句、行活動、核心時間、CPU時間、執行時間、解析時間、編譯時間、查詢重寫時間、計劃生成時間、網路時間、IO時間、網路開銷、鎖開銷等。所有資訊都是脫敏的。
慢SQL提供給使用者對於慢SQL診斷所需的詳細資訊,使用者無需透過復現就能離線診斷特定慢SQL的效能問題。
3. 支援一鍵式收集診斷資訊
提供多種套件用於捕獲、收集、分析診斷資料,使問題可以診斷,加速診斷過程。能根據開發和定位人員的需要,從生產環境中將必要的資料庫日誌、資料庫管理日誌、堆疊資訊等提取出來,定位人員根據獲得資訊進行問題的定界定位。
一鍵式收集工具可以根據生產環境中問題的不同,從生產環境中獲取不同的資訊,從而提高問題定位定界的效率。使用者可以透過改寫配置檔案,收集自己想要的資訊:
- 透過作業系統命令收集作業系統相關的資訊。
- 透過查詢系統表或者檢視獲得資料庫系統相關的資訊。
- 資料庫系統執行日誌和資料庫管理相關的日誌。
- 資料庫系統的配置資訊。
- 資料庫相關程式產生的core檔案。
- 資料庫相關程式的堆疊資訊。
- 資料庫程式產生的trace資訊。
- 資料庫產生的redo日誌檔案。
- 計劃復現資訊。
(五) 資料庫安全
1. 訪問控制
管理使用者對資料庫的訪問控制許可權,涵蓋資料庫系統許可權和物件許可權。
openGauss資料庫支援基於角色的訪問控制機制,將角色和許可權關聯起來,透過將許可權賦予給對應的角色,再將角色授予給使用者,可實現使用者訪問控制許可權管理。其中登入訪問控制透過使用者標識和認證技術來共同實現,而物件訪問控制則基於使用者在物件上的許可權,透過物件許可權檢查實現物件訪問控制。使用者在為相關的資料庫使用者分配完成任務所需要的最小許可權從而將資料庫使用風險降到最低。
openGauss資料庫支援三權分立許可權訪問控制模型,資料庫角色可分為系統管理員、安全管理員和審計管理員。其中安全管理員負責建立和管理使用者,系統管理員負責授予和撤銷使用者許可權,審計管理員負責審計所有使用者的行為。
預設情況下,使用基於角色的訪問控制模型。客戶可透過設定引數來選擇是否開啟三權分立控制模型。
2. 控制權和訪問權分離
針對系統管理員使用者,實現表物件的控制權和訪問權分離,提高普通使用者資料安全性,限制管理員物件訪問許可權。
該特性適用於如下場景,即對於有多個業務部門的企業,各部門間使用不同的資料庫使用者進行業務操作,同時存在同級別的資料庫維護部門使用資料庫管理員進行運維操作,業務部門希望在未經授權的情況下,管理員使用者只能對各部門的資料進行控制操作(DROP、ALTER、TRUNCATE),但是不能進行訪問操作(INSERT、DELETE、UPDATE、SELECT、COPY)。即針對管理員使用者,表物件的控制權和訪問權分離,提高使用者資料的安全性。
系統管理員可以在建立使用者時指定INDEPENDENT屬性,表示該使用者為私有使用者。針對該使用者的物件,資料庫管理員(包含初始使用者和其它管理員使用者)在未經其授權前,只能進行控制操作(DROP、ALTER、TRUNCATE),無權進行INSERT、DELETE、SELECT、UPDATE、COPY、GRANT、REVOKE、ALTER OWNER操作。
3. 資料庫加密認證
加密認證過程中採用單向Hash不可逆加密演算法PBKDF2,可有效防止彩虹攻擊。
建立使用者所設定的口令被加密儲存在系統表中。整個認證過程中口令加密儲存和傳輸,透過計算相應的hash值並與服務端儲存的值比較來進行正確性校驗。
統一加密認證過程中的訊息處理流程,可有效防止攻擊者透過抓取報文猜解使用者名稱或者口令的正確性。
4. 資料庫審計
審計日誌記錄使用者對資料庫的啟停、連線、DDL(Data Definition Language,資料定義語言)、DML、DCL(Data Control Language,資料控制語言)等操作。審計日誌機制主要增強資料庫系統對非法操作的追溯及舉證能力。
使用者可以透過引數配置對哪些語句或操作記錄審計日誌。
審計日誌記錄事件的時間、型別、執行結果、使用者名稱、資料庫、連線資訊、資料庫物件、資料庫例項名稱和埠號以及詳細資訊。支援按起止時間段查詢審計日誌,並根據記錄的欄位進行篩選。
資料庫安全管理員可以利用這些日誌資訊,重現導致資料庫現狀的一系列事件,找出非法操作的使用者、時間和內容等。
5. 全密態資料庫等值查詢
密態資料庫,與流資料庫、圖資料庫一樣,就是專門處理密文資料的資料庫系統。資料以加密形態儲存在資料庫伺服器中,資料庫支援對密文資料的檢索與計算,而與查詢任務相關的詞法解析、語法解析、執行計劃生成、事務一致性保證、儲存都繼承原有資料庫能力。
密態資料庫在客戶端進行加密,需要在客戶端進行大量的操作,包括管理資料金鑰、加密敏感資料、解析並修改實際執行的SQL語句,並且識別返回到客戶端的加密的資料資訊。OpenGauss將這一系列的複雜操作,自動化的封裝在前端解析中,對SQL查詢中與敏感資訊的加密替換,使得傳送至資料庫伺服器側的查詢任務也不會洩露使用者查詢意圖,減少客戶端的複雜安全管理及操作難度,實現使用者應用開發無感知。
密態資料庫透過技術手段實現資料庫密文查詢和計算,解決資料庫雲上隱私洩露問題及第三方信任問題。實現雲上資料的全生命週期保護,實現資料擁有者與資料管理者讀取能力分離。
6. 網路通訊安全特性
支援透過SSL(Secure Sockets Layer,安全套接層)加密客戶端和伺服器之間的通訊資料,保證客戶的客戶端與伺服器通訊安全。採用TLS 1.2(Transport Layer Security,傳輸層安全)協議標準,並使用安全強度較高的加密演算法套件。
7. 行級訪問控制
行級訪問控制特性將資料庫訪問粒度控制到資料錶行級別,使資料庫達到行級訪問控制的能力。不同使用者執行相同的SQL查詢操作,按照行訪問控制策略,讀取到的結果可能是不同的。
使用者可以在資料表建立行訪問控制(Row Level Security)策略,該策略是指標對特定資料庫使用者、特定SQL操作生效的表示式。當資料庫使用者對資料表訪問時,若SQL滿足資料表特定的Row Level Security策略,在查詢最佳化階段將滿足條件的表示式,按照屬性(PERMISSIVE | RESTRICTIVE)型別,透過AND或OR方式拼接,應用到執行計劃上。
行級訪問控制的目的是控制表中行級資料可見性,透過在資料表上預定義Filter,在查詢最佳化階段將滿足條件的表示式應用到執行計劃上,影響最終的執行結果。當前行級訪問控制支援的SQL語句包括SELECT、UPDATE、DELETE。
8. 資源標籤
資源標籤(Resource Label)特性透過將資料庫資源按照使用者自定義的方式劃分,實現資源分類管理的目的。管理員可以透過配置資源標籤統一地為一組資料庫資源進行安全策略的配置如審計或資料脫敏。
資源標籤能夠將資料庫資源按照“特徵”、“作用場景”等分組歸類,對指定資源標籤的管理操作即對標籤範圍下所有的資料庫資源的管理操作,能夠大大降低策略配置的複雜度和資訊冗餘度、提高管理效率。
當前資源標籤所支援的資料庫資源型別包括:SCHEMA、TABLE、COLUMN、VIEW、FUNCTION。
9. 動態資料脫敏
為了在一定程度上限制非授權使用者對隱私資料的窺探,可以利用動態資料脫敏(Dynamic Data Masking)特性保護使用者隱私資料。在非授權使用者訪問配置了動態資料脫敏策略的資料時,資料庫將返回脫敏後的資料而達到對隱私資料保護的目的。
管理員可以在資料列上建立動態資料脫敏策略,該策略指出針對特定使用者場景應採取何種資料脫敏方式。在開啟動態資料脫敏功能後,當使用者訪問敏感列資料時,系統將使用者身份資訊例如:訪問IP、客戶端工具、使用者名稱來匹配相應的脫敏策略,在匹配成功後將根據脫敏策略對訪問列的查詢結果實施資料脫敏。
動態資料脫敏的目的是在不改變源資料的前提下,透過在脫敏策略上配置針對的使用者場景(FILTER)、指定的敏感列標籤(LABEL)和對應的脫敏方式(MASKING FUNCTION)來靈活地進行隱私資料保護。
10. 統一審計
統一審計(Unified Auditing)利用策略和條件在資料庫內部有選擇地進行審計,管理員可以對資料庫資源或資源標籤統一地配置審計策略,從而達到簡化管理、針對性地生成審計日誌、減少審計日誌冗餘、提高管理效率的目的。
管理員可以定製化的為操作行為或資料庫資源配置審計策略,該策略針對特定的使用者場景、使用者行為或資料庫資源進行審計。在開啟了統一審計功能後,當使用者訪問資料庫時,系統將根據使用者身份資訊如:訪問IP、客戶端工具、使用者名稱來匹配相應的統一審計策略,之後根據策略資訊對使用者行為按照訪問資源(LABEL)和使用者操作型別(DML | DDL)進行統一審計。
統一審計的目的是將現有的傳統審計行為轉變為針對性的跟蹤審計行為,將目標之外的行為排除在審計之外,從而簡化了管理,提高了資料庫生成審計資料的安全性。
11. 使用者口令強度校驗機制
為了加固客戶賬戶和資料的安全,禁止設定過低強度的口令,當初始化資料庫、建立使用者、修改使用者時需要指定密碼。密碼必須滿足強度校驗,否則會提示使用者重新輸入密碼。
賬戶密碼複雜度對使用者密碼大小寫字母、數字、特殊字元的最少個數,最大最小長度,不能和使用者名稱、使用者名稱倒寫相同,不能是弱口令等進行了限制,從而增強了使用者賬戶的安全性。
其中弱口令指的是強度較低,容易被破解的密碼,對於不同的使用者或群體,弱口令的定義可能會有所區別,使用者需要自己新增定製化的弱口令。
使用者口令強度校驗機制是否開啟由引數password_policy控制,當該引數設定為1時表示採用密碼複雜度校驗,預設值為1。
12. 資料加密儲存
提供對插入資料的加密儲存。為使用者提供資料加解密介面,針對使用者識別的敏感資訊列使用加密函式,使得資料加密後再儲存在表內。
當使用者需要對整張表進行加密儲存處理時,則需要為每一列單獨書寫加密函式,不同的屬性列可使用不用的入參。
當具有對應許可權的使用者需要檢視具體的資料時,可透過解密函式介面對相應的屬性列進行解密處理。
(六)AI能力
1. AI4DB
包括引數智慧調優與診斷、慢SQL發現、索引推薦、時序預測、異常檢測等,能夠為使用者提供更便捷的運維操作和效能提升,實現自調優、自監控、自診斷等功能。
2. DB4AI
相容MADlib生態,支援70+演算法,效能相比MADlib on PostgreSQL 具有數倍提升。新增XGBoost、prophet、GBDT等高階且常用的演算法套件,補充MADlib生態的不足。統一SQL到機器學習的技術棧,實現從資料管理到模型訓練的SQL語句“一鍵驅動”。
六、小結
本章主要從openGauss功能概述、應用場景介紹、系統架構設計、程式碼結構解析和亮點特性闡釋多方面介紹了openGauss資料庫系統的設計,可以加深讀者對openGauss的設計理念與程式碼邏輯有更深入的認識與理解。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69997967/viewspace-2929475/,如需轉載,請註明出處,否則將追究法律責任。