客戶的一套生產環境採用的架構是Oracle ADG + Keepalived,近期須要進行切換演練,要求我這邊保障。ADG自己切換倒沒啥可說的,但引入keepalived軟件,就須要提早研究下這個架構。其實看了下環境配置,總體思路也很是簡單,說白了就是利用keepalived軟件引入一個VIP,應用側只需配置鏈接這個VIP便可。
依據當前生產環境架構模擬了一套本身的測試環境。html
-------------------------------------------------------- --節點1(192.168.1.124)keepalived.conf文件內容: -------------------------------------------------------- [root@test04 ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived vrrp_script chk_dg_stats { script "/etc/keepalived/check_dataguard.sh" interval 2 weight -5 fall 2 rise 1 } vrrp_instance VI_1 { state MASTER interface eth0 mcast_src_ip 192.168.1.124 virtual_router_id 131 priority 101 inopreempt advert_int 1 authentication { auth_type PASS auth_pass 888888 } virtual_ipaddress { 192.168.1.131 } track_script { chk_dg_stats } } -------------------------------------------------------- --節點2(192.168.1.125)keepalived.conf文件內容: -------------------------------------------------------- [root@test05 ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived vrrp_script chk_dg_stats { script "/etc/keepalived/check_dataguard.sh" interval 2 weight -5 fall 2 rise 1 } vrrp_instance VI_1 { state BACKUP interface eth0 mcast_src_ip 192.168.1.125 virtual_router_id 131 priority 99 inopreempt advert_int 1 authentication { auth_type PASS auth_pass 888888 } virtual_ipaddress { 192.168.1.131 } track_script { chk_dg_stats } } -------------------------------------------------------- --全部節點配置腳本check_dataguard.sh,並確認具備x執行權限: -------------------------------------------------------- # cat /etc/keepalived/check_dataguard.sh #!/bin/bash dbstats=`ps -ef | grep ora_smon | grep -v grep | wc -l` dgstats=`ps -ef | grep ora_mrp | grep -v grep | wc -l` if [ "${dbstats}" -eq 0 ]; then /etc/init.d/keepalived stop elif [[ "${dbstats}" -gt 0 ]] && [[ "${dgstats}" -gt 0 ]]; then /etc/init.d/keepalived stop fi 說明:腳本check_dataguard.sh主要經過對ora_smon和ora_mrp進程的監控,判斷哪一種場景下該關閉keepalived服務: 場景1:當不存在ora_smon進程時(數據庫實例Crash); 場景2:存在ora_smon進程同時存在ora_mrp進程時(已啓動mrp進程的備庫)。 --添加x執行權限: chmod u+x /etc/keepalived/check_dataguard.sh [root@test04 ~]# ls -l /etc/keepalived/check_dataguard.sh -rwxr--r--. 1 root root 282 Jul 14 22:35 /etc/keepalived/check_dataguard.sh [root@test05 ~]# ls -l /etc/keepalived/check_dataguard.sh -rwxr--r--. 1 root root 281 Jul 14 22:36 /etc/keepalived/check_dataguard.sh
1)在switchover正式切換前先在主庫上手工切換幾回日誌,確認DG備庫同步正常: --PRIMARY(主庫192.168.1.124)切換幾回日誌: SQL> alter system switch logfile; alter system switch logfile; alter system switch logfile; --Standby (備庫192.168.1.125)需確認同步正常沒有延遲: SQL> select * from v$dataguard_stats; 2)主庫切換爲備庫 -- 在PRIMARY(主庫192.168.1.124)查詢,確承認切換爲備庫: select OPEN_MODE, DATABASE_ROLE, SWITCHOVER_STATUS, FORCE_LOGGING, DATAGUARD_BROKER, GUARD_STATUS from v$database; -- 在PRIMARY(主庫192.168.1.124)操做,切換爲備庫: ALTER DATABASE COMMIT TO SWITCHOVER TO STANDBY WITH SESSION SHUTDOWN; 3)備庫切換爲主庫 -- 在Standby(備庫192.168.1.125)查詢,確承認切換爲主庫: select OPEN_MODE, DATABASE_ROLE, SWITCHOVER_STATUS, FORCE_LOGGING, DATAGUARD_BROKER, GUARD_STATUS from v$database; -- 在Standby(備庫192.168.1.125)操做,切換爲主庫(根據SWITCHOVER_STATUS值確認用下面哪一個命令): ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY; ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN; 4)新主庫open,新備庫啓動並開啓MRP,新主庫啓動keepalived服務 --NEW PRIMARY(新主庫192.168.1.125)數據庫從mount啓動到open狀態: ALTER DATABASE OPEN; --NEW STANDBY(新備庫192.168.1.124)數據庫startup啓動,開啓DG日誌應用: STARTUP RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT; --確認NEW STANDBY(新備庫192.168.1.124)DG同步正常,沒有延遲: SQL> select * from v$dataguard_stats; 5) 新主庫啓動keepalived服務 --NEW PRIMARY(新主庫192.168.1.125)OS層root用戶啓動keepalived服務: # /etc/init.d/keepalived start
注意:當演練結束後,若須要switchover主備再次切換,只須要按上面規範步驟重複操做便可(注意主備角色的轉換)。面試
RAC 某節點不可用時,對應VIP是否可用
那這裏的環境,一樣是VIP的設置,爲什麼卻能夠經過VIP(192.168.1.131)鏈接呢?sql
[oracle@test03 ~]$ sqlplus sys/oracle@192.168.1.131/demo as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Tue Jul 14 23:45:23 2020 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL>
實際驗證,是由於這裏主備庫的監聽配置統一都是主機名:shell
[oracle@test04 admin]$ cat listener.ora # listener.ora Network Configuration File: /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora # Generated by Oracle configuration tools. LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = test04)(PORT = 1521)) ) ) ADR_BASE_LISTENER = /u01/app/oracle [oracle@test05 admin]$ cat listener.ora # listener.ora Network Configuration File: /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora # Generated by Oracle configuration tools. LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = test05)(PORT = 1521)) ) ) ADR_BASE_LISTENER = /u01/app/oracle SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = jingyus) (ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1) (SID_NAME = jingyu) ) )
若是將主機名修改成具體的IP地址,則測試一樣會報錯(ORA-12541: TNS:no listener)。數據庫