Oracle 關係型分布式內存資料庫

內存計算那點事

迄今為止,內存還是我們目前能用到的最快的存儲設備,把數據儘可能放進內存成為各種應用提高數據訪問性能的最有效途徑。對於很多關鍵業務系統而言,內存又是一種“揮發性”的和大小非常有限的存儲設備,如何在保證性能的同時使數據能持久化,如何把有限的內存投入到無限的待處理數據上是程序設計的一個重大課題。

Oracle的內存TimesTen內存數據庫為有高併發,低延時和高可用要求的關鍵業務系統提供了一個接近完美的解決方案:把數據放進內存,使用SQL簡化開發,應用開發者可以更加專注在業務實現上而不用關心底層的內存分配。TimesTen在大併發的環境中還能提供媲美Oracle數據庫的數據完整性,一致性和可恢復性,內存的“揮發性”缺點也被克服,維護工作也極大地簡化了。因此Oracle TimesTen被廣泛地應用於電信,金融等行業已經有20多年的歷史。

Oracle 关系型分布式内存数据库

基於內存計算的另外一個問題始終困擾著業內人士——內存有限而數據相對無限:單一服務器的內存遠遠不足以存儲需要處理的數據,頻繁的內存交換消耗太多資源,用戶不得不使用手工分庫的方式把數據分散到多個服務器上來處理,這又帶來了管理、開發複雜,擴展性差等諸多問題。

隨著技術的發展,分佈式內存網格技術也開始被用於加速數據訪存的速度,比如Redis,Oracle Coherence等。分佈式內存網格技術採用key-value的內存數據存儲方式可以方便把磁盤型數據庫的數據分佈到集群系統的各個節點上緩存,為簡單的數據查詢和事務提供了很高的性能。但這類技術的問題是:數據的強一致性,數據持久化,複雜報表和統計,大併發事務處理等。

分佈式的關係型內存數據庫——理想的內存數據庫

對於一個高併發,實時響應需求的關鍵業務系統而言,一個分佈式的關係型數據庫是最理想的選擇:它既具有關係型數據ACID的特性,可以處理高併發的用戶請求,可以實時響應業務的數據訪問請求,擁有完善的備份恢復和容災機制,同時和NoSQL的內存網格技術一樣,可以把需要處理的數據分散到一個集群上的所有節點上,可以根據需要擴展集群中的數據處理節點。今年5月初,Oracle分佈式內存數據庫——這個理想中的,綜合了內存計算,分佈式處理,關係型數據庫的分佈式內存數據庫終於正式推向市場。

TimesTen 18.1 Scaleout的特點

Oracle的分佈式內存數據庫使用了已經20多年曆史的TimesTen的內核來構建,正式發行版為被稱為TimesTen 18.1 Scaleout,版本號的含義為2018年的第一個主要發行版。

首先TimesTen 18.1 Scaleout是一個嚴格意義上的關係型數據庫;它擁有和Oracle 數據庫一樣的ACID特性,比如:事務的原子性和持久性,事務的提交和回滾,基於版本的併發控制,讀寫操作互不阻塞等等。

其次,作為一個分佈式的內存數據庫它是一個邏輯上單一,物理上分散的分佈式內存數據庫,TimesTen 18.1 Scaleout中的數據分散存儲到數據庫集群的各個節點中,應用從任何一點接入數據庫都可以訪問到全部數據,應用不需要知道數據存放的位置。這一點也不同於市場上的分片式數據庫,這樣的設計極大地簡化了應用開發和數據庫管理的難度。

Oracle 关系型分布式内存数据库

TimesTen Scaleout的幾個基本概念

一組內部互聯的運行Oracle TimesTen Scaleout的服務器我們稱為一個Grid,運行中TimesTen Scaleout代碼稱為實例,TimesTen Scaleout的實例又分為數據實例和管理實例,數據實例的的概念和Oracle數據庫的實例是非常類似的,它包括數據緩存和後臺進程。

Oracle 关系型分布式内存数据库

每個TimesTen Scaleout數據實例包含一個我們稱之為Element的數據持久化最小的單位,Element擁有整個數據庫中一部分數據和這個數據庫中完整用戶信息和 schema信息;每個element有自己的持久化檢查點文件和事務日誌文件, Element可以使用副本來實現高可用性和容災。

在一個集群中,一般配置有1到2個管理實例來跟蹤監控整個集群的運行狀態。

數據分佈的方式

那麼如何把所有數據分配到每一個Element中呢?通常來說有以下方法:

DISTRIBUTE

基於一致性哈希算法分佈,通常用於大數據庫表,比如:基於Cust_ID 的哈希值,比如我們把CUSTOMER表中各行分佈到所有elements 當中可以使用如下語句:

CREATETABLECUSTOMER(

IDNUMBERNOTNULLPRIMARYKEY,

NAMEVARCHAR2(100),

)DISTRIBUTEBYHASH;

Oracle 关系型分布式内存数据库

REFERENCE

子表與父表相關聯的行共存於相同element,優化本地事務將 ORDERS 表中與CUSTOMER相關聯的行存放於相同element當中。

Oracle 关系型分布式内存数据库

DUPLICATE

查詢為主的小表在每個element存放完整數據,優化本地事務。如將 PRODUCT 表在所有 elements 當中都存一份全量數據,這種情況適用於比較小的,同時變更不是很頻繁的表

Oracle 关系型分布式内存数据库

高可用的實現

前面提到了TimesTen 18.1 Scaleout是通過Element的多副本方式實現高可用性的,這種機制稱為K-Safety(K>1),見下圖:

Oracle 关系型分布式内存数据库

一個完整的數據集稱為Data Space, 它包含這個數據庫所有的Elements,上圖的Dataspace Group1 包含的Element 1和Element 3 構成了一個完整的數據庫。擁有相同的Element的集合被稱為Replica Set,它們互為對方的拷貝,比如上圖的 Replica Set1包含的Element 1和Element 2,它們位於不同的機器上從而實現數據的高可用性。

互為拷貝的Element是雙活的,也就是說應用可以在其中任意一個Element上發起讀寫的事務操作而不相互影響,數據庫系統負責這兩個Element的數據同步。

在這種架構下,即使多個Element發生異常,只要有一套完整可用的副本對應用就不會有影響。如果整個replica set 發生異常,應用也可以選擇接受只返回剩餘數據的結果集。

集中化安裝與管理

TimesTen 18.1 Scaleout的管理操作都均可通過一個主機用圖形界面或者命令行的方式通過一個接入點完成集群地所有操作,包括:

軟件安裝

補丁應用

配置管理

數據庫創建與管理

數據庫監控

備份與恢復

日誌蒐集

Oracle的幾種內存緩存技術的比較

隨著TimesTen 18.1 Scaleout的推出,Oracle進一步完善了實時內存數據處理的拼圖,傳統的面向OLTP的TimesTen也升級了到了18.1,這個版本稱為TimesTen 18.1 Classic。讓我們看一下他們之間使用場景有什麼不同:

1.TimesTen18.1 Classic

Oracle 关系型分布式内存数据库

使用場景: 用於實時,準實時的OLTP系統加速。如果TimesTen18.1 Classic的機器內存足夠存放需要處理的數據,TimesTen 18.1 Classic可以提供更高的數據處理實時性。

部署:可以單獨運行或者作為Oracle數據庫的緩衝,使用CacheGroup 或者其它方式和Oracle數據庫同步數據。

2.TimesTen 18.1 Scaleout

Oracle 关系型分布式内存数据库

使用場景:分佈式、容錯、彈性伸縮的關係型內存數據庫 ,用於高併發,低延時的OLTP 為主的關鍵業務系統;單機內存無法存放需要實時處理處理的全部數據,不得不手工分庫的場景。

部署:使用服務器集群部署。

3.Oracle Database In-Memory Option

Oracle 关系型分布式内存数据库

使用場景:Oracle12.1.02數據庫引入的數據列式內存技術,主要用於加速數據分析和報表的速度。

部署:用戶可以把數據庫中需要做分析和報表的數據庫表加上列式內存存儲的選項,數據會在數據庫啟動或者第一次查詢這個表的時候把數據以列式或者列式壓縮的方式緩存到Oracle數據庫的SGA區的In Memory Area中:優化器會自動優化SQL的訪問路徑,讓需要訪問列式內存數據的SQL從In Memory Area中獲取數據。

4.Oracle Coherence

Oracle 关系型分布式内存数据库

使用場景:Oracle Coherence是分佈式內存網格技術,一般用於中間層數據訪問加速。

部署:數據以Key Value的方式存放在內存中,使用RESTAPI訪問。

總結

在大數據和雲時代,實時數據處理有多種方式,Oracle 提供了多種內存技術的產品和技術加速數據訪問和處理的速度,這次TimesTen 18.1 Scaleout的推出進一步完善了Oracle 內存計算產品家族,它繼承了久經考驗的TimesTen內存數據庫的內核,又吸收了No SQL數據庫的一些設計理念,必將在很多對實時數據處理有很高要求的關鍵業務系統上得到應用。


分享到:


相關文章: