本文做者,繆睿,來自駐雲信息的雲計算資深數據庫架構師。web
如下正文:shell
· 關於阿里雲的HAVIP 數據庫
阿里雲官方文檔的介紹:bash
私網高可用虛擬IP(Private High-Availability Virtual IP Address,簡稱HaVip),是一種能夠獨立建立和釋放的私網IP資源。這種私網IP的特殊之處在於,用戶能夠在ECS上使用協議進行該IP的宣告。服務器
一個HaVip對象能夠與最多兩臺ECS實例進行綁定;綁定了的實例能夠經過ARP方式進行該私網IP的宣告。網絡
一臺ECS實例能夠在持有一個普通私網IP的狀況下,能夠宣告多個HaVip類型的私網IP,從而同時持有多個私網IP。session
利用可在ECS進行私網IP宣告的功能,能夠 實現基於VRRP協議的高可用方案,包括keepalived、heartbeat等成熟的開源方案。架構
HaVip能夠與EIP進行綁定,從而實現HaVip在ECS實例間切換時,發向EIP的消息也被重定向到新的ECS實例上。oracle
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集羣須要幾個硬性條網絡通信模式得是廣播
網絡通信模式得是廣播
必須有兩個網絡分別用於心跳鏈路與公網服務
共享存儲 (可使用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的方案既實現了數據庫物理層面的災備,同時能夠實現數據庫服務中止後的快速接管。
以上就是這套方案的框架圖,提及來很簡單,可是實現起來就麻煩了,主要兩個難點:
若是ECS服務不終止,數據庫角色作切換,havip如何漂移?
若是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