內(nèi)存計算那點事
迄今為止,內(nèi)存還是我們目前能用到的最快的存儲設(shè)備,把數(shù)據(jù)盡可能放進(jìn)內(nèi)存成為各種應(yīng)用提高數(shù)據(jù)訪問性能的最有效途徑。對于很多關(guān)鍵業(yè)務(wù)系統(tǒng)而言,內(nèi)存又是一種“揮發(fā)性”的和大小非常有限的存儲設(shè)備,如何在保證性能的同時使數(shù)據(jù)能持久化,如何把有限的內(nèi)存投入到無限的待處理數(shù)據(jù)上是程序設(shè)計的一個重大課題。
Oracle的內(nèi)存TimesTen內(nèi)存數(shù)據(jù)庫為有高并發(fā),低延時和高可用要求的關(guān)鍵業(yè)務(wù)系統(tǒng)提供了一個接近完美的解決方案:把數(shù)據(jù)放進(jìn)內(nèi)存,使用SQL簡化開發(fā),應(yīng)用開發(fā)者可以更加專注在業(yè)務(wù)實現(xiàn)上而不用關(guān)心底層的內(nèi)存分配。TimesTen在大并發(fā)的環(huán)境中還能提供媲美Oracle數(shù)據(jù)庫的數(shù)據(jù)完整性,一致性和可恢復(fù)性,內(nèi)存的“揮發(fā)性”缺點也被克服,維護(hù)工作也極大地簡化了。因此Oracle TimesTen被廣泛地應(yīng)用于電信,金融等行業(yè)已經(jīng)有20多年的歷史。
基于內(nèi)存計算的另外一個問題始終困擾著業(yè)內(nèi)人士——內(nèi)存有限而數(shù)據(jù)相對無限:單一服務(wù)器的內(nèi)存遠(yuǎn)遠(yuǎn)不足以存儲需要處理的數(shù)據(jù),頻繁的內(nèi)存交換消耗太多資源,用戶不得不使用手工分庫的方式把數(shù)據(jù)分散到多個服務(wù)器上來處理,這又帶來了管理、開發(fā)復(fù)雜,擴展性差等諸多問題。
隨著技術(shù)的發(fā)展,分布式內(nèi)存網(wǎng)格技術(shù)也開始被用于加速數(shù)據(jù)訪存的速度,比如Redis,Oracle Coherence等。分布式內(nèi)存網(wǎng)格技術(shù)采用key-value的內(nèi)存數(shù)據(jù)存儲方式可以方便把磁盤型數(shù)據(jù)庫的數(shù)據(jù)分布到集群系統(tǒng)的各個節(jié)點上緩存,為簡單的數(shù)據(jù)查詢和事務(wù)提供了很高的性能。但這類技術(shù)的問題是:數(shù)據(jù)的強一致性,數(shù)據(jù)持久化,復(fù)雜報表和統(tǒng)計,大并發(fā)事務(wù)處理等。
分布式的關(guān)系型內(nèi)存數(shù)據(jù)庫——理想的內(nèi)存數(shù)據(jù)庫
對于一個高并發(fā),實時響應(yīng)需求的關(guān)鍵業(yè)務(wù)系統(tǒng)而言,一個分布式的關(guān)系型數(shù)據(jù)庫是最理想的選擇:它既具有關(guān)系型數(shù)據(jù)ACID的特性,可以處理高并發(fā)的用戶請求,可以實時響應(yīng)業(yè)務(wù)的數(shù)據(jù)訪問請求,擁有完善的備份恢復(fù)和容災(zāi)機制,同時和NoSQL的內(nèi)存網(wǎng)格技術(shù)一樣,可以把需要處理的數(shù)據(jù)分散到一個集群上的所有節(jié)點上,可以根據(jù)需要擴展集群中的數(shù)據(jù)處理節(jié)點。今年5月初,Oracle分布式內(nèi)存數(shù)據(jù)庫——這個理想中的,綜合了內(nèi)存計算,分布式處理,關(guān)系型數(shù)據(jù)庫的分布式內(nèi)存數(shù)據(jù)庫終于正式推向市場。
TimesTen 18.1 Scaleout的特點
Oracle的分布式內(nèi)存數(shù)據(jù)庫使用了已經(jīng)20多年歷史的TimesTen的內(nèi)核來構(gòu)建,正式發(fā)行版為被稱為TimesTen 18.1 Scaleout,版本號的含義為2018年的第一個主要發(fā)行版。
首先TimesTen 18.1 Scaleout是一個嚴(yán)格意義上的關(guān)系型數(shù)據(jù)庫;它擁有和Oracle 數(shù)據(jù)庫一樣的ACID特性,比如:事務(wù)的原子性和持久性,事務(wù)的提交和回滾,基于版本的并發(fā)控制,讀寫操作互不阻塞等等。
其次,作為一個分布式的內(nèi)存數(shù)據(jù)庫它是一個邏輯上單一,物理上分散的分布式內(nèi)存數(shù)據(jù)庫,TimesTen 18.1 Scaleout中的數(shù)據(jù)分散存儲到數(shù)據(jù)庫集群的各個節(jié)點中,應(yīng)用從任何一點接入數(shù)據(jù)庫都可以訪問到全部數(shù)據(jù),應(yīng)用不需要知道數(shù)據(jù)存放的位置。這一點也不同于市場上的分片式數(shù)據(jù)庫,這樣的設(shè)計極大地簡化了應(yīng)用開發(fā)和數(shù)據(jù)庫管理的難度。
TimesTen Scaleout的幾個基本概念
一組內(nèi)部互聯(lián)的運行Oracle TimesTen Scaleout的服務(wù)器我們稱為一個Grid,運行中TimesTen Scaleout代碼稱為實例,TimesTen Scaleout的實例又分為數(shù)據(jù)實例和管理實例,數(shù)據(jù)實例的的概念和Oracle數(shù)據(jù)庫的實例是非常類似的,它包括數(shù)據(jù)緩存和后臺進(jìn)程。
每個TimesTen Scaleout數(shù)據(jù)實例包含一個我們稱之為Element的數(shù)據(jù)持久化最小的單位,Element擁有整個數(shù)據(jù)庫中一部分?jǐn)?shù)據(jù)和這個數(shù)據(jù)庫中完整用戶信息和 schema信息;每個element有自己的持久化檢查點文件和事務(wù)日志文件, Element可以使用副本來實現(xiàn)高可用性和容災(zāi)。
在一個集群中,一般配置有1到2個管理實例來跟蹤監(jiān)控整個集群的運行狀態(tài)。
數(shù)據(jù)分布的方式
那么如何把所有數(shù)據(jù)分配到每一個Element中呢?通常來說有以下方法:
DISTRIBUTE
基于一致性哈希算法分布,通常用于大數(shù)據(jù)庫表,比如:基于Cust_ID 的哈希值,比如我們把CUSTOMER表中各行分布到所有elements 當(dāng)中可以使用如下語句:
CREATETABLE?CUSTOMER?(?
ID?NUMBER?NOT?NULL?PRIMARY?KEY,?
NAME?VARCHAR2(100),?
…?
)?DISTRIBUTE?BY?HASH;?
REFERENCE
子表與父表相關(guān)聯(lián)的行共存于相同element,優(yōu)化本地事務(wù)將 ORDERS 表中與CUSTOMER相關(guān)聯(lián)的行存放于相同element當(dāng)中。
DUPLICATE
查詢?yōu)橹鞯男”碓诿總€element存放完整數(shù)據(jù),優(yōu)化本地事務(wù)。如將 PRODUCT 表在所有 elements 當(dāng)中都存一份全量數(shù)據(jù),這種情況適用于比較小的,同時變更不是很頻繁的表
高可用的實現(xiàn)
前面提到了TimesTen 18.1 Scaleout是通過Element的多副本方式實現(xiàn)高可用性的,這種機制稱為K-Safety(K>1),見下圖:
一個完整的數(shù)據(jù)集稱為Data Space, 它包含這個數(shù)據(jù)庫所有的Elements,上圖的Dataspace Group1 包含的Element 1和Element 3 構(gòu)成了一個完整的數(shù)據(jù)庫。擁有相同的Element的集合被稱為Replica Set,它們互為對方的拷貝,比如上圖的 Replica Set1包含的Element 1和Element 2,它們位于不同的機器上從而實現(xiàn)數(shù)據(jù)的高可用性。
互為拷貝的Element是雙活的,也就是說應(yīng)用可以在其中任意一個Element上發(fā)起讀寫的事務(wù)操作而不相互影響,數(shù)據(jù)庫系統(tǒng)負(fù)責(zé)這兩個Element的數(shù)據(jù)同步。
在這種架構(gòu)下,即使多個Element發(fā)生異常,只要有一套完整可用的副本對應(yīng)用就不會有影響。如果整個replica set 發(fā)生異常,應(yīng)用也可以選擇接受只返回剩余數(shù)據(jù)的結(jié)果集。
集中化安裝與管理
TimesTen 18.1 Scaleout的管理操作都均可通過一個主機用圖形界面或者命令行的方式通過一個接入點完成集群地所有操作,包括:
軟件安裝
補丁應(yīng)用
配置管理
數(shù)據(jù)庫創(chuàng)建與管理
數(shù)據(jù)庫監(jiān)控
備份與恢復(fù)
日志搜集
Oracle的幾種內(nèi)存緩存技術(shù)的比較
隨著TimesTen 18.1 Scaleout的推出,Oracle進(jìn)一步完善了實時內(nèi)存數(shù)據(jù)處理的拼圖,傳統(tǒng)的面向OLTP的TimesTen也升級了到了18.1,這個版本稱為TimesTen 18.1 Classic。讓我們看一下他們之間使用場景有什么不同:
?1.TimesTen18.1 Classic
使用場景: 用于實時,準(zhǔn)實時的OLTP系統(tǒng)加速。如果TimesTen18.1 Classic的機器內(nèi)存足夠存放需要處理的數(shù)據(jù),TimesTen 18.1 Classic可以提供更高的數(shù)據(jù)處理實時性。
部署:可以單獨運行或者作為Oracle數(shù)據(jù)庫的緩沖,使用CacheGroup 或者其它方式和Oracle數(shù)據(jù)庫同步數(shù)據(jù)。
2.TimesTen 18.1 Scaleout
使用場景:分布式、容錯、彈性伸縮的關(guān)系型內(nèi)存數(shù)據(jù)庫 ,用于高并發(fā),低延時的OLTP 為主的關(guān)鍵業(yè)務(wù)系統(tǒng);單機內(nèi)存無法存放需要實時處理處理的全部數(shù)據(jù),不得不手工分庫的場景。
部署:使用服務(wù)器集群部署。
?3.Oracle Database In-Memory Option
使用場景:Oracle12.1.02數(shù)據(jù)庫引入的數(shù)據(jù)列式內(nèi)存技術(shù),主要用于加速數(shù)據(jù)分析和報表的速度。
部署:用戶可以把數(shù)據(jù)庫中需要做分析和報表的數(shù)據(jù)庫表加上列式內(nèi)存存儲的選項,數(shù)據(jù)會在數(shù)據(jù)庫啟動或者第一次查詢這個表的時候把數(shù)據(jù)以列式或者列式壓縮的方式緩存到Oracle數(shù)據(jù)庫的SGA區(qū)的In Memory Area中:優(yōu)化器會自動優(yōu)化SQL的訪問路徑,讓需要訪問列式內(nèi)存數(shù)據(jù)的SQL從In Memory Area中獲取數(shù)據(jù)。
?4.Oracle Coherence
使用場景:Oracle Coherence是分布式內(nèi)存網(wǎng)格技術(shù),一般用于中間層數(shù)據(jù)訪問加速。
部署:數(shù)據(jù)以Key Value的方式存放在內(nèi)存中,使用RESTAPI訪問。
總結(jié)
在大數(shù)據(jù)和云時代,實時數(shù)據(jù)處理有多種方式,Oracle 提供了多種內(nèi)存技術(shù)的產(chǎn)品和技術(shù)加速數(shù)據(jù)訪問和處理的速度,這次TimesTen 18.1 Scaleout的推出進(jìn)一步完善了Oracle 內(nèi)存計算產(chǎn)品家族,它繼承了久經(jīng)考驗的TimesTen內(nèi)存數(shù)據(jù)庫的內(nèi)核,又吸收了No SQL數(shù)據(jù)庫的一些設(shè)計理念,必將在很多對實時數(shù)據(jù)處理有很高要求的關(guān)鍵業(yè)務(wù)系統(tǒng)上得到應(yīng)用。
評論
查看更多