誰說阿里雲不能跑Oracle,讓駐雲架構師告訴你怎麼辦!

本文做者,繆睿,來自駐雲信息的雲計算資深數據庫架構師。web

如下正文:shell

· 關於阿里雲的HAVIP 數據庫

阿里雲官方文檔的介紹:bash

   私網高可用虛擬IP(Private High-Availability Virtual IP Address,簡稱HaVip),是一種能夠獨立建立和釋放的私網IP資源。這種私網IP的特殊之處在於,用戶能夠在ECS上使用協議進行該IP的宣告。服務器

  1. 一個HaVip對象能夠與最多兩臺ECS實例進行綁定;綁定了的實例能夠經過ARP方式進行該私網IP的宣告。網絡

  2. 一臺ECS實例能夠在持有一個普通私網IP的狀況下,能夠宣告多個HaVip類型的私網IP,從而同時持有多個私網IP。session

  3. 利用可在ECS進行私網IP宣告的功能,能夠 實現基於VRRP協議的高可用方案,包括keepalived、heartbeat等成熟的開源方案。架構

  4. HaVip能夠與EIP進行綁定,從而實現HaVip在ECS實例間切換時,發向EIP的消息也被重定向到新的ECS實例上。oracle

  5. HaVip僅支持VPC網絡環境。Classic網絡環境下不提供HaVip功能。app

     

文字多了理解起來困難,直接看圖。

   在vpc-23c099ge5中有個交換機vsw-23a3275jc的交換機,交換機下有個HAVIP是10.10.1.99,在這個高可用虛擬IP下掛載了兩臺ECS,那10.10.1.99 這個IP地址就能夠在這兩臺ECS上飄來飄去了。

·  Keepalived是什麼?

    keepalived是一個相似於layer三、四、7交換機制的軟件,也就是咱們平時說的第3層、第4層和第7層交換。Keepalived的做用是檢測web服務器的狀態,若是有一臺web服務器死機,或工做出現故障,Keepalived將檢測到,並將有故障的web服務器從系統中剔除,當web服務器工做正常後Keepalived自動將web服務器加入到服務器羣中,這些工做所有自動完成,不須要人工干涉,須要人工作的只是修復故障的web服務器。

    可是在這裏,keepalived的做用是與HAVIP通訊,目的是將HAVIP指向到咱們開啓了keepalived服務的那臺ECS上。

· 關於阿里雲的Oracle的高可用

    有着Oracle背景的DBA們都知道,Oracle的高可用集羣是Real Application Cluster(RAC),可是搭建RAC集羣須要幾個硬性條網絡通信模式得是廣播

  1. 網絡通信模式得是廣播

  2. 必須有兩個網絡分別用於心跳鏈路與公網服務

  3. 共享存儲 (可使用NFS掛載來解決)

 

    這網絡廣播模式在阿里雲上就沒法跳過,更不用說VPC環境下只能有一個網卡地址,只能考慮使用其餘的方案來解決OracleDB的高可用環境。

    有過阿里雲RDS經驗的同窗都知道,RDS的高可用是經過主備庫的服務切換來實現的,當主庫損壞的狀況下,備庫會在很短期內接管服務,其代價就是在切換過程當中session會斷開形成短期的數據庫服務中斷,大概在30秒左右。而咱們在阿里雲上實現Oracle高可用也是相似這種方式實現。

    言歸正傳,接下來咱們說說如何在阿里雲上部署這套高可用方案。

 

    傳統方式下的Dataguard架構以下圖:

通常是由有兩臺ECS,IP地址分別爲10.10.1.2,與10.10.1.3,這兩臺ECS上部署着一套Oracle PRIMARY-STANDBY環境,這套Dataguard方案使用Oracle dgbroker管理,當PRIMARY庫崩潰的時候,Standby會主動的接管服務,可是這裏你們都知道,Oracle database的訪問是須要經過listener的,咱們兩臺ECS默認的IP地址是不一樣的,這樣當standby接管服務後,application的數據庫鏈接池要把IP改成10.10.1.3才能再次鏈接數據庫服務,你們都知道,鏈接池地址的改動是要重啓容器,若是application都須要重啓,就徹底不能稱作高可用了,很慶幸,阿里雲提供了一個叫作havip的服務。

    咱們來看看下面這幅圖

這裏咱們在ECS原IP的基礎上,加入了HAVIP的概念,application 經過10.10.1.99這個IP地址訪問數據庫服務,當PRIMARY與STANDBY角色互換以後。

  application依然仍是經過10.10.1.99訪問數據庫服務,只是這個IP地址已經漂移到咱們曾經的standbyDB了。你們都知道Oracle的RAC環境是必須共享存儲的,也就是說當物理文件損壞的時候,整個數據庫服務依然仍是會崩潰。上面這套HAVIP+Dataguard的方案既實現了數據庫物理層面的災備,同時能夠實現數據庫服務中止後的快速接管。

    以上就是這套方案的框架圖,提及來很簡單,可是實現起來就麻煩了,主要兩個難點:

  1. 若是ECS服務不終止,數據庫角色作切換,havip如何漂移?

  2. 若是ECS服務強制中止了,Havip如何漂移到備用環境?

 

    要解決這兩個問題,咱們就要用到咱們的keepalived了,具體的實現思路,咱們來看看。

·  實現思路

    1:首先咱們先建立一套Dataguard環境,爲了保證切換後鏈接池無需改動,兩臺ECS上的DB的sid必須一致。

2: oracle的dataguard 經過DGbroker管理,當primary db崩潰physical standby db自動切換爲primary;這裏必須把observer啓動在STANDBY上面,咱們試過在管理控制檯上強制關閉ecs,若是observer所在的ECS被強制關閉,dgbroker沒法作主備切換。

3: 接下來,將這兩臺ECS加載到HAVIP服務的集羣掛載進集羣的時候,能夠看到兩臺ECS都是虛線鏈接,並且都是(備),這裏,咱們就要開始部署keepalived服務了。

4:經過keepalived作一個master->backup的配置集羣啓動,這裏貼出兩份配置文件這裏master (10.10.1.2) backup(10.10.1.3)

master配置文件

keepalived.conf

! Configuration File for keepalived

global_defs {

         router_id LVS_DEVEL   #集羣的ID 主備兩臺機器的這名字得同樣

}

#檢查腳本,keepalived會定時的執行shell作檢查

vrrp_script chk_http_port {

     script  "/etc/keepalived/mcheckdb.sh" 

     interval 2

     weight 2

}

      vrrp_instance VI_1 {

          state MASTER

          interface eth0

          virtual_router_id 51

          priority 100

          advert_int 1

          authentication {

              auth_type PASS

              auth_pass 1111

          }

      track_script {

                chk_http_port

         }

          virtual_ipaddress {

              10.10.1.99 dev eth0 label eth0:havip  #havip

         }

          unicast_src_ip 10.10.1.2   #本地IP

          unicast_peer {

                  10.10.1.3   #備機IP

                       }

      }

Backup 配置文件

keepalived.conf

! Configuration File for keepalived

 global_defs {

           router_id LVS_DEVEL

        }

vrrp_script chk_http_port {

     script  "/etc/keepalived/scheckdb.sh"

     interval 2

     weight 2

}

        vrrp_instance VI_1 {

            state BACKUP

            interface eth0

            virtual_router_id 51

            priority 99

            advert_int 1

            authentication {

                auth_type PASS

                auth_pass 1111

            }

      track_script {

         chk_http_port

       }

            virtual_ipaddress {

              10.10.1.99 dev eth0 label eth0:havip

        }

            unicast_src_ip 10.10.1.3

            unicast_peer {

                    10.10.1.2

                         }

        }

這裏咱們假設兩個場景,keepalived啓動後。

 

     一、10.10.1.2使用了master(primary)配置文件,10.10.1.3使用了backup(standby)配置文件。當primary db與standby db互換了角色,而這時候havip依然是與master也就是10.10.1.2這臺綁定。

     二、10.10.1.2使用了master(primary)配置文件,10.10.1.3使用了backup(standby)配置文件。咱們強制關閉了10.10.1.2這臺ECS,這時候havip漂移到了backup機器上,standby db也變成了primary角色,當咱們再次啓動10.10.1.2這臺ECS後,havip又會飄回master配置文件所在的ECS,這時候數據庫服務又沒法經過havip訪問了。

 

    這裏該如何去解決這個問題呢?面對上面的兩個場景,咱們取了個巧。

注意配置文件中的這兩段

這裏shell都會定時的在ECS上執行用於檢查環境配置。那麼既然能夠寫邏輯,還有什麼不能實現?

    說到這,你們是否是很想看看shell的代碼~

    首先咱們看看master的檢查邏輯

mcheckdb.sh

#!/bin/bash

max_sn="PRIMARY"

su - oracle  -c "sh /etc/keepalived/oracle/dbrole.sh"

max_sn=`cat /etc/keepalived/oracle/dbrole`

if [ "$max_sn" != "PRIMARY" ]

then

    cat /etc/keepalived/samples/backup.keepalived.conf > /etc/keepalived/keepalived.conf

    /etc/init.d/keepalived restart

    echo `date` > /etc/keepalived/date

fi;

很簡單的邏輯,切換到oracle用戶執行一個dbrole.sh,這個shell會執行Oracle db的角色查詢,而後把結果寫在/etc/keepalived/oracle/dbrole這個文件中。若是結果不是’PRIMARY’就把/etc/keepalived/samples/backup.keepalived.conf 文件內容替換掉當前keepalived進程使用的配置文件,而後再重啓keepalived 服務。到這兒,你們應該知道如何作了吧。

scheckdb.sh

#!/bin/bash

max_sn="PHYSICAL STANDBY"

su - oracle  -c "sh /etc/keepalived/oracle/dbrole.sh"

max_sn=`cat /etc/keepalived/oracle/dbrole`

if [ "$max_sn" = "PRIMARY" ]

then

    cat /etc/keepalived/samples/master.keepalived.conf > /etc/keepalived/keepalived.conf

    /etc/init.d/keepalived restart

    #echo "stop keepalived"

#打開監聽

#su - oracle  -c " lsnrctl start listener2"

fi;

scheckdb.sh的內容大同小異樣,不過多了一步,打開監聽listener2,這listener2,就是開啓HAVIP的監聽地址。

    咱們能夠在兩臺ECS上都準備好master與backup 兩份配置文件,這樣不但解決了上面兩個場景的問題,還直接讓havip能夠根據數據庫的角色作漂移,保證在dataguard可用的前提下,時刻漂移在咱們的primary database。

 

    最後,給你們提供一些代碼與一個小工具。

Keepalived 的各類配置文件:

 

下載地址:http://jiagouyun-cn.oss-cn-hangzhou.aliyuncs.com/oracle/keepalived/keepalived.zip

 

    解壓後把整個keepallived 目錄直接放到/etc下,注意其中有個oracle目錄,包括其中的文件必須改爲oracle用戶的權限。

 

    再提供提供一個配置DG的shell工具,你們沒事能夠用用,腳本有針對性,僅用於學習不建議配置生產環境時使用。

 

下載地址:http://jiagouyun-cn.oss-cn-hangzhou.aliyuncs.com/oracle/dataguard.1.3.zip

相關文章
相關標籤/搜索