【乾貨】分佈式內存數據庫新架構,極速OLTP應用新利器

下載網站:www.SyncNavigator.CN 
 客服QQ1793040
----------------------------------------------------------node


關於HKROnline SyncNavigator 註冊機價格的問題linux

 

 

HKROnline SyncNavigator 8.4.1 非破解版 註冊機 受權激活教程
 數據庫

 

 

 

最近一直在研究數據庫同步的問題,在網上查了不少資料,也請教了不少人,找到了一種經過快照複製的方法。研究了一番後發現以前就是用的這個方法,效果不是很好,果斷放棄。通過了一番尋覓和他人指點,最後從一位熱心網友那裏得知一款很好用的軟件—— SyncNavigator。編程

 

 

好東西就要拿出來跟你們分享,因此今天向你們介紹一下這款軟件,及其一些使用方法。下面先看看它有什麼強大的功能吧!緩存

 

SyncNavigator的基本功能:網絡

 

自動同步數據/定時同步數據
不管是實時同步/24小時不間斷同步,仍是根據計劃任務(每小時/每日/每週/等)定時自動同步都能徹底勝任。架構

完整支持 Microsoft SQL Server
完整支持 Microsoft SQL Server 2000 2005 2008 數據庫類型。並能在不一樣數據庫版本之間相互同步數據。併發

支持 MySQL 4.1 以上版本
支持 MySQL 4.1 5.0 5.1 5.4 5.5。並能在不一樣數據庫版本之間相互同步數據。oracle

無人值守和故障自動恢復
當數據庫故障或網絡故障之後,無需人工干預(或操做)自動恢復同步並確保數據徹底準確,可靠。異步

同構數據庫同步/異構數據庫同步
SQL Server to SQL Server, MySQL to MySQL, SQL Server to MySQL 等都能輕鬆實現。

斷點續傳和增量同步
當同步完成(或中斷)後,再次同步時能繼續上一次的位置增量同步,避免每次都須要從頭開始的問題。

TimesTen Scaleout,它其實是一款關係型數據庫,不過是在運行的期間,把數據全量加載到內存當中來進行實現。

【乾貨】分佈式內存數據庫新架構,極速OLTP應用新利器

Oracle TimesTen

先簡單的說一下TimesTen Scaleout的歷史,它其實是一款關係型數據庫,不過是在運行的期間,把數據全量加載到內存當中來進行實現。TimesTen從1998年開始在全球做爲首款內存關係型數據庫上市,到如今已通過去了20年,這些年裏咱們一直在作的一件事,縱向的提升它的性能。

由於你們都知道,從過去20年的發展歷程來看,硬件的資源自己容量愈來愈大,性能愈來愈好,價格愈來愈便宜。所以TimesTen爲了應對硬件變動的需求,須要不斷提升縱向性能,隨之從單機的方式實現到過渡的分佈式。

可是如今又有不少的新挑戰來臨了,如今不少的客戶不僅僅是要縱向的擴容,並且但願橫向的擴展。爲了應對這個需求,咱們提供了分佈式的全新解決方案。咱們強調同一款產品,兩種部署方式,也就是說你從網上下載的軟件,實際上就是一個安裝包。安裝包解壓縮以後,能夠按照本身的須要以基於主備備的傳統的方式來實現縱向的擴容能力,也可使用咱們提供全新的分佈式的方式來管理數據。

這二者之間應對的方向是有區別的,單機的處理能力也很是好,並且對應用來講很是簡單。在主備這樣的傳統的部署方式下咱們能提供一個超低延時的能力。可是若是要作分片、分佈,提升高併發的讀寫的能力,可能還須要引入網絡。這種狀況下,能夠考慮在稍微犧牲網絡延遲,以提升吞吐量。

TimesTen Classic內核技術

剛纔強調了TimesTen是一款關係型數據庫,這裏可能須要重申一下什麼叫關係型數據庫。在分佈狀況下,咱們強調的是原子性一致性,隔離性和持久性。支持標準的SQL,同時整個數據庫運行在內存當中,能夠經過應用進程嵌入式的訪問數據庫,來實現微秒級響應的能力。

咱們知道常規的計算下,要求一個IO的響應時間是1/1000秒,至關因而微秒級。磁盤的響應式微秒級,那內存的響應實際上是納秒級的。因此說在內存計算裏面,咱們能作到微秒級的數據庫級別的響應,伴隨單位時間內的超高的吞吐量,這就是TimesTen過去20年一直在作的一個縱向的吞吐的能力。

做爲企業級的產品,實際上TimesTen在中國已經有差很少十年的歷史,從0七、08年開始中國的各大運營商都陸續地採用TimesTen做爲計費的系統來控制餘額。相似這些服務在後臺,實際上使用的不少都是TimesTen的技術。他們在使用時候有持有化的要求,TimesTen一樣可以很好的知足。

此外咱們對Oracle數據庫也有很好的兼容性,包括對Oracle的數據類型,PL/以及豐OCI的接口都有良好的一個集成。同時對Oracle後臺的數據交互,也能夠作到用緩存方式部署的集成。

架構圖:Classic Instance

從18.1開始,咱們的安裝方式發生了一點的變化,在分佈式架構下,解壓縮即安裝。咱們實例有別Oracle的實例,Oracle的實例是在內存中運算的一個程式,可是TimesTen裏面它至關於Oracle_home有一系列的可修改的軟件包,裏面包含一系列可執行文件,同時有一組進程,這一組進程自己只支持一套或多套數據庫的。

【乾貨】分佈式內存數據庫新架構,極速OLTP應用新利器

這是什麼意思呢?咱們來看一下上圖,首先有這樣一個硬件環境,而後咱們定義一個實例。在這個實例裏面,安裝解壓縮完以後,建立實例啓動了一個守護進程,它會拉起一個內存結構,內存結構就是TimesTen內存數據庫,這個數據庫會被subdaemon進程接管,subdaemon進程自己還會去作持久化的相關的維護,

數據庫構建起來以後要開放給應用鏈接,所以咱們會有一個server的進程,相似於oracle的監聽程序。監聽進程打開以後,能夠作不少的應用訪問。若是說有高可用需求的話,也能夠經過複製的代理程序去跟遠端的主備備進程作一個實時的複製。

對於oracle數據庫,咱們還開放一個緩存的能力,能夠緩存oracle數據庫裏面的熱點數據子集到TimesTen。這樣就能加速響應時間,而且減小了對oracle的負載壓力。

同時做爲一個比較成熟的內核引擎,咱們還支持的豐富的這監控管理工具,這是產品自己自帶的。對於微秒級響應的能力,其實是建議將應用跟TimesTen部署在同一臺機器上,經過一個本地庫文件的連接,它會將這個進程直接嵌入到TimesTen裏面進行訪問。這樣的話就徹底去除了網絡開銷,徹底沒有網絡只是內存對內存的一個指針變量的偏移巡視,因此性能會很是好。

應用鏈接

從應用角度來說,使用TimesTen可使用直連的模式進行訪問,這個性能是最好的,只不過它須要將應用程序跟TimesTen部署在同一臺機器上。若是說有遠端的解耦的架構,能夠部署在其餘的主機上,裝TimesTen的客戶端,而後經過調用TimesTen的TCP/IP的方式去訪問數據庫,數據庫最後解析也會經過server變成一個直連到TimesTen本地。

應用開發

鏈接的接口也是很是豐富的,在過去20年的沉澱裏面,咱們基本支持當前主流的全部的API的接口,基於oracle OCA的支持的能力,得以支持主流的 Python、nodeJs、Ruby、Go等編程語言的接口。

鏈接方式方面,爲了哪些沒有使用過TimesTen的客戶,能力開放的相對標準。直連的話,能夠經過修改JDBC,就像鏈接oracle同樣,將鏈接串指向TimesTen數據庫名就能夠了。若是是cs的方式,只需客戶端去配置一個鏈接串,就能夠鏈接了。

內存結構

【乾貨】分佈式內存數據庫新架構,極速OLTP應用新利器

說到內核技術,先要談一談咱們的內存數據庫的內存結構,內存結構自己在從TimesTen設計的第一天開始,就將數據全量加載到內存做爲一個前提進行運算。因此咱們在打造的時候,其實是先有內存結構,再有磁盤的異步鏡像。

咱們在打造的時候,實際上先構建了一個DbHdr,用於存取數據庫的基礎信息,而後有一個永久區域,這個永久區域是被持久化的。裏面包含的就是用戶真正關心的數據,以及系統中相對關鍵的一些原數據,包括表、索引。

這裏面強調一點,在內存裏邊,咱們用的詞不是以block的方式存儲,而是以page的方式存存儲。在TimesTen內存結構裏面,頁的大小是不固定的,咱們定義的是存取一個page,會存取256行的數據,行數是基於行存儲的技術,而行存儲技術自己取決column。

接下來就是一個臨時區域,裏面存放了大量的臨時的信息,它是不被持久化的。好比說建的一些臨時表,臨時索引用來作編譯,有一些鎖的資源排序的資源,包括鏈接的一些基本信息和咱們緩存的一些SQL命令,

最後就是做爲關係數據庫,須要記錄DML的變化,TimesTen在這裏有一個log nuffer的區域,經過多軌的方式來進行內存當中的保留。因此說從應用角度來說的話,訪問任何數據在內存裏面只是作一個指針的偏移,返回給應用。

TimesTen是基於行的內存數據庫技術,這樣的內存技術,首先在操做系統層面上須要用huge的方式來鎖定住的內容結構,尤爲是在linux市場,若是是大於256G的容量,從產品角度自己沒有一個設計的上線,共享內存段的大小,能夠隨着操做系統硬件資源釋放出來的。可是須要在操做系統上配置一下,linux上的內存段默認限制是256G的。

此外在超大單機處理能力的狀況下,還須要考慮NUMA的這樣的多核技術,好比說如今的操做系統,支持多槽位的cpu處理,這些槽位之間的CPU處理,在CPU級別的一級緩存,二級緩存之間,所存取的信息是不被共享內存自己共享的。所以咱們建議綁定4槽位cpu,以這樣的方式來避免NUMA的影響,綁定實例到對應的cpu的槽位。

持久化——檢查點

從企業角度來說,不少客戶都會關心一個問題,掉電了怎麼辦? 這裏就來說一講TimesTen是怎麼處理這個問題。

舉個例子,剛纔都提到了TimesTen自己是經過檢查點的方式來作數據文件的在磁盤上的存放,實際上這個檢查點是內存的一個實時鏡像,也就是說內存的快照。

接下來主要講的是在事務處理的變化過程當中的刷出的機制,前面提到到了持久化的區域是DbHdr加永久區域,永久區域裏面的數據是按頁的方式來存取的,每一個頁裏面存儲的是某個對應表裏面的256行中的部分行數的信息。這些信息有可能被修改, 在被修改的過程當中,會發生什麼狀況呢?

【乾貨】分佈式內存數據庫新架構,極速OLTP應用新利器

假設T0時刻數據庫已經持久化了一次到ds1文件上,在T1時刻咱們發現有一些事物進來了,對page 0進行了修改,page 0裏面的信息是ds1裏剛纔沒有的一些髒數據。Page 2對 ds0來講也進行了修改,DS0尚未被作下一次檢查點,因此說它在作檢查點以前,對於ds0來講page 2裏面是髒數據。

這個時刻咱們發生了一個檢查點的觸發操做,默認是十分鐘,由於DbHdr有一些鏈接信息,因此會被持久化。Page 2裏面的信息因爲是被標記成了髒數據,因此它是按頁的髒數據的方式去刷出到ds0的文件裏面,這是一個增量刷出的過程,以後它以前被標記的髒數據就會被清除掉。

接下來在T3時刻咱們又作了一些修改,髒字節也標記到對應的頁上了。以後咱們會針對標記的頁進行檢查點的觸發。觸發的時候,咱們會把對應的髒數據刷出到ds1文件,他們是交替着寫,也就意味着在同一個時間點,極限場景下會有一個正在寫出的一個ds1,同時還有一個ds0,ds0配合事務日誌的方式,就能夠實現恢復。

持久化——事物日誌

事務日誌在內存結構裏面是有一個log buffer區域,它是經過多軌的方式進行一個刷出,刷出是在操做系統文件上承載了很多天的文件。文件寫滿以後會增長,增長的大小是可配置的。

事務日誌的刷新分爲兩種,第一種是默認的異步的刷新,任何一個事務過來都會按期的觸發刷新。刷出的過程是多條的性能最好的這樣方式。可是有些場景,好比說金融客戶有些關鍵的業務須要持久化到磁盤再返回給應用,這種狀況下咱們也支持同步的刷出。

異步和同步之間是在數據庫級別進行了默認配置,你也能夠在鏈接級別、事務級別,進行修改。

持久化——恢復

對於數據的加載咱們有檢查點文件,配合的事務日誌文件在磁盤上,數據庫的從新加載須要讀取內存鏡像,若是是髒的checkpoint文件,能夠讀到連續的共享終端中,由於它是一個快照,因此說會直接把以前的結構在內存裏面作一個鏡像的回放。

構建到內存段以後的話,還能夠基於日誌作事務的前滾和回滾,最後達到一個一致性的點,一直讀到事務日誌的最後收尾的標記,以後,該回滾的回滾。

在探測裏面若是說檢查點中沒有包含的數據發生了索引的改變,好比checkpoint的檢查點作完以後,又作了一些事務的變化,這個變化影響到了某些索引,索引再從新加載的時候,它是沒有被持久化的,須要被重建,重建的過程也是能夠並行執行的。只有髒頁索引纔會被重建,不是全部的索引都會被重建。以後仍然會把能力開放給應用進行正常的訪問。

併發能力

做爲OLTP優化的關係型數據庫。咱們也是又隔離機制的,經過Read committed的方式默認進行這樣的行爲的,也就是說讀寫之間不互斥。

在讀寫的過程當中,若是讀操做還沒讀取到目標前,目標就已經被寫入了,這時候寫的操做實際上會影射出來一個新的版本,這個版本自己是沒有被提交的,因此讀取的時候讀的是早期的版本,一旦目標被修改提交以後,後續發起的全部的讀取操做,讀取的數據就是修改過的數據。

同時TimesTen也支持隔離機制,採用線性隔離的方式,這種方式對會對單線程有很大的優化,可是對併發來,它會有不少的共享鎖排查鎖這樣的機制,因此要儘量在高併發系統上避免隔離機制。

索引

數據庫事務處理的應用確定須要修改數據庫,修改以後的數據查找,就涉及到索引。TimesTen支持兩種主要類型的查找,第一個查找的方式是基於哈希索引,這種方式對等值查詢的性能是最好,可是對範圍查詢來講不太適合。

缺點在於它須要維護一個哈希鏈表,這個哈希鏈表的估值是整個表全量值的一個超集,不能小於總行數。

另外一種方式是咱們默認的索引建立,它可以很好的作範圍查找,等值查找的性能也不會特別差。更主要的是在高併發的維護狀況下,這種新的索引模式對讀徹底沒有鎖。對寫來講,因爲B-tree索引是分節點的維護,減小了熱點徵用,以細粒度閂鎖的設計,來減小對整個b-tree鎖的對併發的影響。

TimesTen Scaleout

市場上有不少的客戶對分佈式的強烈需求,同時客戶本身自己也在作各類的分片的一個嘗試來應對他們海量數據高併發的處理。

這種狀況下,TimesTen進行了內核的改造,改造的量並非特別大,咱們引入了管理實例的概念。管理實例有點相似於剛纔介紹的傳統模式,可是它裏面存放的東西只是元數據,實際的數據是放在數據實例裏面進行管理的。

【乾貨】分佈式內存數據庫新架構,極速OLTP應用新利器

這個圖裏面惟一有一個變化的地方,僅僅是database變成了database Element。Element只是整個分佈式集羣裏面的一個節點,裏面存放的只是N分之一的數據,數據是打散的。

爲了解決分佈式裏面的全局一致性的問題,咱們引入了一個叫Epoch的機制,它配合着全局事務的概念,可以作到在分佈式裏面保證原子性。基於這個前提就能夠作到分佈式裏面的強一致性。

基於這樣的全新的架構基礎上,咱們作了不少的封裝,在實例級別能夠跟內部通道,跟其餘的實例進行自動的內部的交互。

同時還引入了管理實例的概念,因此管理實例會直接跟TimesTen實例進行通訊,來作實時狀態的變動和集羣拓撲關係的變動。

這樣的能力使得咱們能夠實如今一個位置在管理實例上,一鍵安裝一鍵管理。對數據庫來講,無論是十個節點,20個節點,30個節點,只用在管理節點上執行一個命令進行配置,剩下的任務是由管理實例自動的去作,不須要登陸到具體的數據實例進行配置。

High Availability

在企業級的需求裏邊,他們對TimesTen早期有一個很強的訴求,就是不用複製的方式幫實現高可用。

雖然TimesTen從引擎來說的話,原生支持複製,可是咱們在分佈式架構裏面作了很大的改造,讓它支持多副本的技術。在Aynchronous的架構下面,首先配置的主機,用Data Space Group來隔離物理位置, 以後在一對機房的兩個節點,能夠分配成一個副本,這樣兩個副本就實時同步了。

在這個基礎上,咱們整個數據庫是基於多個副本級的方式來呈現給這個應用的。副本集如今支持的是兩副本,後續會支持三副本。

基於以前介紹的內核的原理,咱們的實例級別和數據庫級別有持久化能力,這些能力開放到分佈式裏面,就是一個個的節點,叫作Element。Element有本身的持久化,存放的數據是一小部分的數據單元,而且有能力接受應用的訪問,這就意味着全部的節點,即便在高可用的方式下,都是全讀全寫的能力開放給應用。

內部由於咱們要作一致性的OLTP的應用訪問,因此是基於優化的兩階段提交,來實現事務的強一致性。

TimesTen Scaleout Architecture Overview

【乾貨】分佈式內存數據庫新架構,極速OLTP應用新利器

TimesTen的軟件安裝,須要先準備zookeeper。它是做爲輕量級的成員管理的角色來管理實例之間的行爲。咱們建議使用內外網的架構,固然咱們也支持單網卡,不過單網卡的吞吐量會混雜內部事務和外部的應用鏈接。所以仍是建議使用雙網卡,作兩個內網和外網的隔離。以後能夠選一個節點做爲的管理節點,管理節點自己在生產環境上,可使用高可用的方式進行儲備,這都是自動能夠配置的。

以後選擇一個拓普關係,建立數據實例的屬性,一旦配置好以後就能夠在管理實力上進行一鍵的安裝配置把數據庫拉起來。

若是須要一鍵日誌收集或者一鍵的備份,能夠配一個資料庫。經過管理節點的命令了,來實現整個的自動化的管理。

對於圖形化管理,可使用SQL DEVELOPER工具,經過SSh的方式連到管理實例上進行管理。

性能小貼士通用篇

首先講一下普世性的優化貼士,好比在使用內存技術的時候,咱們須要儘量節省你的內存空間,因此建議在TimesTen裏面使用原生的字段。對於變長的字段合理使用Inline和out of line。

做爲關係數據庫的確定要作到合理使用的索引,經過咱們的索引指南來選擇是使用哈希哈斯範圍索引,同時還須要更新優化器的統計信息,由於TimesTen自己也是基於成本的優化器,對於SQL來講的也須要作好正常的數據量變動以後的更新同信息的收集,讓數據庫真實的執行計劃可以反映數據的實際狀況。

最後就是數據庫自己的配置,包括基於目標負載和硬件等優化數據庫參數,使用HDD存儲須要將檢查點文件和事務日誌文件隔離I/O,避免I/O爭用,使用huge pages,沒法使用的狀況下,則考慮在內存中鎖定數據庫。

Scaleout篇

在分佈式裏面首先引入的是網絡,咱們建議是使用萬兆網進行內部的配置。儘量的是選擇大容量的主機要好於低配的小組機,由於你有更少的網絡開銷,可以充分發揮的縱向的併發的能力。

優化方面,對於表的分佈,若是是超大表的解決方案,可能要考慮用哈希的分佈打散。

在分佈式中,TimesTen還追加了全局索引和本地索引的概念。在分佈鍵選擇的時候能夠選擇某一個主鍵,或者是任何的組合鍵,做爲哈希分佈的分佈鍵。

應用篇

在應用開發角度咱們也有必定的優化建議的。好比說使用參數化的SQL,而不是用硬寫的方式將絕對的查詢值寫到SQL的變量中。並且咱們建議在每一次發起鏈接的時候作一個parse,這樣生成的執行計劃就避免了硬解析和軟解析,甚至會複用它的執行計劃到其餘的鏈接,由此性能方面會減小不少的沒必要要的開銷。

有時候SQL中還會涉及隱含的數據類型或者字符集的轉換,若是能的避免的話,也能夠減小沒必要要的開銷。

同時剛纔強調了TimesTen裏面的內存結構是以256行做爲一個page存放。因此從插入批處理的角度來說,咱們能夠以256行的倍數進行批處理,這樣的話可以充分利用它page的能力,減小行插入的性能損耗。

適用場景

若是低延遲需求,好比要求的響應時間在一毫秒,或者是幾毫秒這樣很是苛刻的場景下,咱們建議使用TimesTen傳統的方式進行部署, 這樣即便在單機的狀況下也能達到每秒千萬級的查詢能力。咱們的主備備方式,能夠實現縱向的企業的能力的擴展。在橫向能實現讀的能力的擴展。

若是有oracle數據庫作加速,能夠經過read-only或者read-write-caching的方式進行配置,將oracle的熱點數據子集加載到TimesTen當中進行運算,數據的同步是由緩存的代理和複製代理來實現。

若是說在亞毫秒級或者是十毫秒以上容忍度的狀況下,對高併發有上億次的TS需求。TimesTen如今極限的場景測試能達到10億每秒的查詢能力。

因此說這種分佈式的架構裏面響應時間不是他的優點,可是在多節點同步的高併發處理上,他有絕對的讀寫擴展的能力,這是須要你們綜合考量的點。

相關文章
相關標籤/搜索