徐霞婷
(蘇州旅游與財經高等職業技術學校,江蘇 蘇州 215104)
信息化時代下,數據成為繼化石能源之后的重要的資源。當今社會,很多東西都可以數據化,比如存在銀行里面的錢,在銀行卡上體現的就是一組數據;又比如某寶上的交易訂單,提交到商戶那邊的也是一組數據。在我們日常生活、生產過程中,很多傳統的東西漸漸被機械化、電子化取代,數據成為其中重要的憑證,一旦丟失,后果不堪設想。因此,在面對自然、人為的破壞,我們要對數據做好備份。而數據庫作為數據的重要存儲倉庫,很多數據庫系統軟件為防止數據丟失也提供了相應的容災技術。本文將介紹IBM DB2數據庫的容災技術——HADR和DPROP。
市面上的數據庫產品有很多,有傳統的關系型數據庫,如Oracle、DB2、SQL Server等,還有近年來興起的非關系型數據庫,如Redis、MongoDB、Neo4j等。而DB2作為經典的主流數據庫,廣泛應用于金融、通信、煙草等領域[1]。
一個版本的DB2軟件(DB2 Copy)下可以創建多個DB2實例(Instance),一個DB2 實例可以創建多個數據庫(Database),但是一個DB2數據庫只能屬于一個實例,它們之間的關系如圖1所示。在安裝完DB2軟件之后,必須先創建DB2實例,然后才能在實例下創建數據庫。DB2實例又叫數據庫管理器(Database Management Application),是管理數據的DB2代碼[2]。而DB2數據庫同其他關系型數據庫一樣使用表來管理和存儲數據。DB2實例和數據庫的關系,好比鎖和柜子的關系,數據庫好比柜子,實例好比鎖,有了鎖才能打開柜子,沒有鎖,柜子還在卻沒法打開;所以說,只有DB2實例運行時才能訪問數據庫;DB2實例如果掛起或者停止了,數據庫還在,但是不能訪問[1];DB2實例如果被刪除了,數據庫并不會被一起刪除。

圖1 DB2軟件、實例和數據庫關系圖
DB2 HADR是數據庫級別的災備,需要2個數據庫,一個是主庫,一個是備庫,主庫同標準數據庫一樣可以進行增刪改查操作,而備庫只能進行查詢操作(前提是需開啟讀功能,通過db2set DB2_HADR_ROS=ON進行設置,重啟實例生效)。在創建之初,備庫是主庫的一個克隆,兩庫完全相同;在數據庫運行之后,主庫通過將自己的日志傳送給備庫,備庫接受主庫的日志后再應用相關事務的方式來保證與主庫的一致性,主備之間通過TCP/IP進行通行,如圖2所示。主備之間有三種同步模式,分別是SYNC、Near SYNC、ASYNC。SYNC同步模式是,當主庫的事務提交,表示主備庫都完成相關事務,這種模式性能影響較大,生產環境中較少使用;Near SYNC同步模式是,當主庫的事務提交,表示備庫已收到主庫發來的日志,這種模式備庫可能會出現數據丟失的情況;ASYNC同步模式是,當主庫的事務提交,表示主庫已將日志發給備庫,這種模式沒法保證備庫一定收到日志。

圖 2 HADR架構圖
HADR對環境有一些要求,它需要主備庫擁有相同的操作系統版本和DB2軟件版本。備庫沒法進行備份操作,而日志歸檔也只能發生在主庫上。
搭建HADR,首先需要在主機上做一個全備份,然后把這個備份文件在備機上做恢復,最好保持主備的數據庫名字一致,另外,備庫恢復后,讓它處于rollward狀態。然后,配置HADR,主備機IP地址信息、專門HADR端口號、實例名、同步模式等信息。需要設置專門HADR端口號,主備庫日志傳輸是通過這個專門的HADR端口進行的。主備庫之間的同步模式,即用SYNC、Near SYNC、ASYNC三種中的一種進行數據的同步。最后,在備機上啟動HADR,如db2 start hadr on db dbname as standby;再在主機上啟動HADR,如db2 start hadr on db dbname as primary。至此,HADR在主備機上完成搭建。
HADR主備庫之間的角色可以進行切換,即讓主庫成為新的備庫,讓備庫成為新的主庫。當需要切換主備庫時,在當前備庫上使用db2 takeover hadr on database dbname這條命令即可。切換之后,原先主庫成為新的備庫,由于在備庫上最多只能進行讀操作,連接在上面的應用就會被中斷,這個時候,需要把應用的連接切換到新的主庫上,可以選擇手動重新連接,也可以啟動客戶機自動重新路由的方式。當設置好自動重新路由之后,應用所在的客戶機也與主機連接成功過并獲得備用服務器信息了,那么,如果客戶機和主機上的數據庫之間發生通信錯誤,客戶機在嘗試重新連接失敗之后會嘗試與主機上的備用數據庫建立連接。
在HADR環境下DB2的啟停也有講究。如果需要停止DB2,比較推薦的方式是先停主機上的DB2,再停備機上的DB2;如果需要啟動DB2,先啟備機上的DB2,再啟主機上的DB2。如果需要去除HADR,在主備機上分別執行db2 stop hadr on db dbname即可,原先建立HADR關系的2個數據庫也就成為標準數據庫。
DPROP又叫SQL Replication,也是基于日志進行數據復制備份的。它通過Capture和Apply程序實現從源端到目標端的復制。源端和目標端,可以是數據庫之間,也可以是表之間,或者是表的某幾個字段之間進行SQL復制,并且源端和目標端數據庫不一定是DB2數據庫,其他數據庫也能使用DPROP技術。Capture程序運行在源系統中,它通過讀取數據庫的日志文件來發現數據庫中發生變化的數據,并把這些變化的數據保存到中間表(CD表,即change-data table)中。Apply程序一般運行在目標系統中,但也可能出現在源系統中,它從中間表中獲取數據并把數據保存到目標表中;在這個過程中,如果Apply和CD表不在同一個系統中,Apply就通過一個設置在密碼文件中的ID和密碼連接到CD表所在系統,該ID是Apply獲取CD表中數據的方式。DPROP可以是單向的也可以是雙向的。單向DPROP架構圖如圖3所示。在雙向DPROP中,復制的兩端(記為A端和B端)都需要Capture來獲取變化數據,而Apply程序既負責把A端變化的數據復制到B端,也負責把B端變化的數據復制到A端。

圖3 單向DPROP構架圖
雙向DPROP存在數據改動沖突,DPROP在創建時就會設定好主表和復制表,當主表和復制表發生變動沖突時,以主表的變動為準。雙向DPROP設定了相關的沖突檢測機制,Apply程序會將主表的CD表中的鍵列值和復制表的CD表中的鍵列值進行比對,假如兩邊的CD表存在相同的鍵列值,將被視為沖突;為防止這類數據沖突的發生,Apply程序在復制表的CD表中讀取到這類數據時,會撤銷先前事務對復制表提交的修改,并只保留來自主表的修改。
搭建完DPROP之后,第一次啟動需要進行一次全刷,Capture冷啟動,將源表中的數據全部復制到目標表中。全刷成功之后,Capture轉冷啟動為熱啟動,這時DPROP只將源表中變化的數據復制至目標表中。DPROP的啟停類似于HADR,比較推薦的方式是,先停Capture再停Apply,先啟Apply再起Capture。
HADR和DPROP作為DB2數據庫中搭建災備系統可選方案,技術上都較為成熟,兩者也存在著不同。
(1)HADR是數據庫級別的災備,沒法實現單獨表之間的復制。而DPROP既能實現兩個數據庫之間的復制,也能實現單獨兩表、表中某幾個字段之間的復制備份。
(2)擁有HADR特性的兩數據庫,在備庫上最多只能進行讀操作。而擁有DPROP特性的兩數據庫都能像標準數據庫一樣正常使用。
(3)擁有HADR特性的兩數據庫,主備庫之間可以切換角色。而擁有DPROP特性的兩數據庫,源端和目標端沒法自由切換角色,除非重新構建兩者之間的關系。
(4)擁有HADR特性的數據庫之間需要配置專門的HADR端口號供兩邊通信使用,沒有專門的連接ID,主庫是主動將日志推送到HADR專用端口的。而擁有DPROP特性的數據庫之間,需要有專門的ID用于兩者的數據傳輸,Apply程序主動獲取CD表中的數據。
(5)HADR搭建較為簡單,DPROP搭建較為復雜。
數據作為信息化時代下重要的資源,日常需要做好備份,重要數據在數據庫級別要搭建災備環境。IBM DB2作為經典老牌數據庫,容災技術較為成熟,本文所介紹的HADR和DPROP就是DB2中成熟的容災技術,是搭建數據庫級別災備環境的不錯選擇。■