參考資料:
Oracle技術網:https://www.oracle.com/technetwork/cn/tutorials/smiley-fsfo-088047-zhs.html
DataGuard日志傳輸模式:http://blog.itpub.net/12679300/viewspace-1973194/
DataGuard自動切換:http://blog.itpub.net/26736162/viewspace-1811944/
DataGuard傳輸模式:http://blog.itpub.net/12679300/viewspace-1973194/
fast-start failover(FSFO):http://blog.itpub.net/28211342/viewspace-2138894/
TAF:https://blog.csdn.net/wll_1017/article/details/9469063
TAF:http://blog.itpub.net/26736162/viewspace-1811944/
===========================
Oracle RAC
===========================
Oracle Real Application Clusters (簡稱RAC)是屢獲獎項的 Oracle Database Enterprise Edition 的一個選件。Oracle RAC采用共享緩存體系結構的數據庫集群。一組Oracle RAC數據庫服務器組成一個集群,他們之間通過高速內網互聯,共享緩存。用戶通過外部網絡連接到數據庫集群,當數據庫服務器有單點故障時,上層用戶不會受到任何影響。數據庫集群共享下層的SAN存儲。
Oracle Extended Distance Cluster是 Oracle RAC的一種部署模式,通過將集群中的服務器部署在物理分隔的位置。Oracle Extended Distance Cluster提供更勝於本地Oracle RAC的可用性。Oracle Extended Distance Cluster對距離、時延等都有較嚴格的要求,因此在現有的網絡技術及存儲技術的前提下,建議最遠的距離不超過100km,兩節點之間采用裸光纖。
Oracle異地RAC不適合於全量災備恢復,只適合防范停電,空難,洪水等災難性事故。更推薦的異地高可靠性方式是本地RAC + 異地DataGuard。
===========================
Oracle DataGuard
===========================
1、 DataGuard重做日志同步原理
主數據庫的LGWR進程將重做數據寫入到自己的ORL,同時DataGuard的LNS (Log Network Server)進程捕獲日志寫入器寫入的重做數據,並以同步或異步方式將重做數據傳輸到備用數據庫。
備用數據庫Data Guard的RFS(Remote File Server)接收重做數據,然后將其寫入一個名為備用重做日志(Standby Redo Log,SRL)文件的順序文件中。備用數據庫端的MRP(Managed Recovery Process)進程或者LSP進程在備用數據庫上應用這些日志,進而同步數據。
DateGuard支持一主多備間通過重做日志方式同步。
DataGuard的重做日志傳輸是支持兩種方式:
- 同步重做傳輸 (SYNC)
要求主數據庫上的日志寫入器等待 LNS 確認備用數據庫已經接收重做數據並已將其寫入備用重做日志,然后才能確認到客戶端應用程序的提交。這確保了提交的所有事務都在磁盤上,並在備用位置受到保護;但是影響了主庫的性能。
- 用戶提交一個事務,事務在SGA 中創建一個重做記錄。LGWR從日志緩沖區中讀取重做記錄,寫入ORL,然后等待LNS 的確認。
- LNS 從日志緩沖區中讀取相同的重做記錄,通過Oracle Net 服務傳給備用數據庫。備用數據庫上的RFS 接收重做數據,然后將其寫入備用重做日志文件中。
- 當RFS 從磁盤接收到一個寫完消息時,會將一個確認消息傳回給主數據庫上的LNS進程,LNS 接着通知LGWR 傳輸完成。LGWR 接着向用戶發送提交確認信息。
- 異步重做傳輸 (ASYNC)
不要求主數據庫上的日志寫入器等待備用數據庫確認重做已被寫入磁盤。確認到客戶端應用程序的提交與重做傳輸是異步進行的。
異步傳輸方式會根據場景的不同,調節讀取日志的方式不同:
- LNS的讀取速度跟得上重做日志產生的速度,LNS進程從日志緩沖池中讀取重做日志,然后通過Oracle Net服務傳給備用數據庫。
- 當LNS趕不上SGA重做日志的產生速度,在將重做數據傳給備用數據庫前就回收了日志緩沖區,LNS將自行轉為從ORL讀取和發送重做數據,當LNS趕上進度后,將自行轉回到直接從日志緩沖區中讀取/發送。
- 如果主數據庫和備用數據庫斷開連接(網絡故障或備用服務器故障),主數據庫將繼續處理事務並累積不能傳輸到備用數據庫的重做數據積壓並按文件歸檔,直到能建立新的網絡連接為止(稱為歸檔日志差異)。在這種狀態下,DataGuard在主數據庫上使用ARCH進程連續Ping備用數據庫來確定其狀態。當還原與備用數據庫的通信后,ARCH進程會查詢備用控制文件(通過其RFS進程),來確定備用數據庫從主數據庫收到的最后一個完整日志文件。DataGuard確定需要哪些日志文件來重新同步備用數據庫,然后立即開始使用其他ARCH進程傳輸相應文件。
DataGuard支持配置三種數據保護模式,以實現成本、可用性、性能和數據保護的平衡:
保護模式 |
主數據庫出現故障時的數據丟失風險 |
重做傳輸 |
最大保護 |
零數據丟失
|
SYNC |
最高可用性(maximum availability mode) |
零數據丟失 — 假設出現故障之前主數據庫提交事務時的同步通信沒有中斷
|
SYNC |
最高性能(maximum performance mode) |
最小數據丟失 — 只有幾秒,具體取決於網絡帶寬
|
ASYNC |
2、 DataGuard實現自動切換
Oracle DataGuard支持使用快速啟動故障切換FSFO(fast-start failover)特性來自動將故障數據庫Failover到遠程容災節點,數據庫RTO與FastStartFailoverLagLimit參數有關,可小於30秒。
當Primary數據庫故障后,FSFO會自動地快速把原Standby數據庫切換為為Primary數據庫操作。FSFO的觸發條件:
- 當數據庫以正常模式(shutdown immediate/normal/transactional)關閉Primaty數據庫時,系統不會觸發FSFO。
- 使用非正常方式shutdown abort關閉Primaty數據庫時,會觸發FSFO。
FSFO只支持DataGuard配置在最高可用性(maximum availability mode)、最高性能(maximum performance mode)模式下:
- 最高可用性模式下,在切換時可以保證無數據丟失(切換之前主數據庫提交事務時的同步通信沒有中斷)。
- 在maximum performance mode下面,會有數據丟失,丟失多少數據由FastStartFailoverLagLimit這個參數來配置。
3、 TAF實現數據庫切換后客戶端無縫連接
TAF(Transparent Application Failover),透明應用程序故障轉移,當客戶端和Oracle數據庫建立連接后,正在執行某個應用,此時客戶端連接的某個實例突然宕機,那么客戶端的連接就會被轉移到其他健康實例上去。對於客戶端的TAF,如果執行的是update、insert等事物語句,那么就會回退,如果是select語句,那么會轉移到新的實例繼續執行,這個過程不需要用戶的的介入,是透明的。
TAF配置參考(http://blog.itpub.net/26736162/viewspace-1811944/):
1) 在主庫上配置一個TAF的Service
此Service在數據庫出現故障時會發送通知給客戶端,允許查詢語句在故障轉移發生后繼續運行。
2) 建立一個存儲過程,調度TAF的Service,確保Service只在主庫運行
3) 創建一個觸發器,確保讓數據庫在啟動和角色轉換時運行此存儲過程
重啟數據庫、或當數據庫切換后,執行存儲過程,觸發主庫啟動TAF的Service。
4) 在主庫手工啟動TAF的Service(或重啟數據庫,重啟數據會觸發 觸發器->存儲過程->TAF的Service)
執行成功后,可以看到TAF的Service
5) 在備庫查詢,確保備庫已經存在觸發器和存儲過程
6) 客戶端配置
樣例1:
dg_taf =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = tcp)(HOST = 192.168.59.130)(PORT = 1521))
(ADDRESS = (PROTOCOL = tcp)(HOST = 192.168.59.131)(PORT = 1521))
(LOAD_BALANCE = yes)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = dg_taf_lhr.lhr.com)
(FAILOVER_MODE =
(TYPE = session)
(METHOD = basic)
(RETRIES = 180)
(DELAY = 5)
)
)
)
樣例2:(73/74是主站點主庫的RAC、75/76是備站點備庫的RAC)
iccc =
(DESCRIPTION_LIST=(LOAD_BALANCE=off) (FAILOVER=on)
(DESCRIPTION= (CONNECT_TIMEOUT=5)(TRANSPORT_CONNECT_TIMEOUT=3)(RETRY_COUNT=3)
(ADDRESS_LIST= (LOAD_BALANCE=on)
(ADDRESS=(PROTOCOL=TCP)(HOST=10.10.11.73)(PORT=1526))
(ADDRESS=(PROTOCOL=TCP)(HOST=10.10.11.74)(PORT=1526))
)
(CONNECT_DATA=(SERVICE_NAME=service_ora))
)
(DESCRIPTION= (CONNECT_TIMEOUT=5)(TRANSPORT_CONNECT_TIMEOUT=3)(RETRY_COUNT=3)
(ADDRESS_LIST= (LOAD_BALANCE=on)
(ADDRESS=(PROTOCOL=TCP)(HOST=10.10.11.75)(PORT=1526))
(ADDRESS=(PROTOCOL=TCP)(HOST=10.10.11.76)(PORT=1526))
)
(CONNECT_DATA=(SERVICE_NAME=service_ora))
)
)