Using Oracle Clusterware 11.2 to Protect 3rd Party Applications
To protect your standard application you may need the following:
- Clustered filesystem like ACFS
- Failover and automatic restart capabilities by avoiding any single point of failure
In the sample below we will harden the standard Apache application by using the following Software Versions :
- GRID: 11.2.0.3.4
- OEL 6.3
- VirtualBox 4.2.14
- Apache/2.2.15 (Unix)
Following Clusterware parts are used :
- Create a VIP
- Create a Server Pool
- Create a Cluster Resource with CARDINALITY=1
Network VIP used for Apache Listener : 192.168.1.91 -Verify that ping returns an error # ping 192.168.1.91 PING 192.168.1.91 (192.168.1.91) 56(84) bytes of data. From 192.168.1.61 icmp_seq=1 Destination Host Unreachable From 192.168.1.61 icmp_seq=2 Destination Host Unreachable Create our VIP - by checking the current Network and creating the related VIP $ srvctl config network Network exists: 1/192.168.1.0/255.255.255.0/eth0, type dhcp # $GRID_HOME/bin/appvipcfg create -network=1 -ip=192.168.1.91 -vipname=MyTestVIP -user=root Production Copyright 2007, 2008, Oracle.All rights reserved 2013-08-07 13:07:46: Creating Resource Type 2013-08-07 13:07:46: Executing /u01/app/11203/grid/bin/crsctl add type app.appvip_net1.type -basetype ora.cluster_vip_net1.type -file /u01/app/11203/grid/crs/template/appvip.type 2013-08-07 13:07:46: Executing cmd: /u01/app/11203/grid/bin/crsctl add type app.appvip_net1.type -basetype ora.cluster_vip_net1.type -file /u01/app/11203/grid/crs/template/appvip.type 2013-08-07 13:07:47: Create the Resource 2013-08-07 13:07:47: Executing /u01/app/11203/grid/bin/crsctl add resource MyTestVIP -type app.appvip_net1.type -attr "USR_ORA_VIP=192.168.1.91,START_DEPENDENCIES=hard(ora.net1.network) pullup(ora.net1.network),STOP_DEPENDENCIES=hard(ora.net1.network),ACL='owner:root:rwx,pgrp:root:r-x,other::r--,user:root:r-x',HOSTING_MEMBERS=grac1.example.com,APPSVIP_FAILBACK=" 2013-08-07 13:07:47: Executing cmd: /u01/app/11203/grid/bin/crsctl add resource MyTestVIP -type app.appvip_net1.type -attr "USR_ORA_VIP=192.168.1.91,START_DEPENDENCIES=hard(ora.net1.network) pullup(ora.net1.network),STOP_DEPENDENCIES=hard(ora.net1.network),ACL='owner:root:rwx,pgrp:root:r-x,other::r--,user:root:r-x',HOSTING_MEMBERS=grac1.example.com,APPSVIP_FAILBACK=" # $GRID_HOME/bin/crsctl stat res MyTestVIP NAME=MyTestVIP TYPE=app.appvip_net1.type TARGET=OFFLINE STATE=OFFLINE .. Start our VIP resource: # $GRID_HOME/bin/crsctl start res MyTestVIP CRS-2672: Attempting to start 'MyTestVIP' on 'grac1' CRS-2676: Start of 'MyTestVIP' on 'grac1' succeeded # $GRID_HOME/bin/crsctl stat res MyTestVIP -t -------------------------------------------------------------------------------- NAME TARGET STATE SERVER STATE_DETAILS -------------------------------------------------------------------------------- Cluster Resources -------------------------------------------------------------------------------- MyTestVIP 1 ONLINE ONLINE grac1 Verify that our VIP is working with ping : # ping 192.168.1.91 PING 192.168.1.91 (192.168.1.91) 56(84) bytes of data. 64 bytes from 192.168.1.91: icmp_seq=1 ttl=64 time=0.032 ms 64 bytes from 192.168.1.91: icmp_seq=2 ttl=64 time=0.031 ms 64 bytes from 192.168.1.91: icmp_seq=3 ttl=64 time=0.029 ms Change Apache Listen address to our VIP and restart Apache # grep Listen /etc/httpd/conf/httpd.conf Listen 192.168.1.91:80 # apachectl restart Test your apache by using the following URL: http://192.168.1.91/ Test VIP Relocation to grac2 Stop apache on grac1 [root@grac1]# apachectl stop --> Should now get Unable to connect for testing URL: http://192.168.1.91/ Configure apache on grac2 and start it # grep Listen /etc/httpd/conf/httpd.conf Listen 192.168.1.91:80 # apachectl start (99)Cannot assign requested address: make_sock: could not bind to address 192.168.1.91:80 no listening sockets available, shutting down Unable to open logs --> Need relocate VIP first to grac2 # $GRID_HOME/bin/crs_relocate MyTestVIP -c grac2 Attempting to stop `MyTestVIP` on member `grac1` Stop of `MyTestVIP` on member `grac1` succeeded. Attempting to start `MyTestVIP` on member `grac2` Start of `MyTestVIP` on member `grac2` succeeded. # $GRID_HOME/bin/crsctl stat res MyTestVIP -t -------------------------------------------------------------------------------- NAME TARGET STATE SERVER STATE_DETAILS -------------------------------------------------------------------------------- Cluster Resources -------------------------------------------------------------------------------- MyTestVIP 1 ONLINE ONLINE grac2 Now apache start should on grac2 # apachectl start Verify this by testing following URL http://192.168.1.91/ should display the Apache init page Note as we use a VIP this URL should work from any system in your network Create action script for our cluster resource on both Nodes: # cat /usr/local/bin/apache.scr #!/bin/bash HTTPDCONFLOCATION=/etc/httpd/conf/httpd.conf WEBPAGECHECK=http://192.168.1.91:80/icons/apache_pb.gif case $1 in 'start') /usr/sbin/apachectl -k start -f $HTTPDCONFLOCATION RET=$? ;; 'stop') /usr/sbin/apachectl -k stop RET=$? ;; 'clean') /usr/sbin/apachectl -k stop RET=$? ;; 'check') /usr/bin/wget -q --delete-after $WEBPAGECHECK RET=$? ;; *) RET=0 ;; esac # 0: success; 1 : error if [ $RET -eq 0 ]; then exit 0 else exit 1 fi Test the check part of above action script - Note only if apache is down on both nodes the check routine should return failure code : 1 # chmod 755 /usr/local/bin/apache.scr root@grac2 ~]# /usr/local/bin/apache.scr check [root@grac2 ~]# echo $? 0 [root@grac2 ~]# /usr/local/bin/apache.scr stop [root@grac2 ~]# echo $? 0 [root@grac2 ~]# /usr/local/bin/apache.scr check [root@grac2 ~]# echo $? 1 [root@grac2 ~]# /usr/local/bin/apache.scr start [root@grac2 ~]# echo $? 0 [root@grac2 ~]# /usr/local/bin/apache.scr check [root@grac2 ~]# echo $? 0 Repeat testing on grac1 - but relocate VIP first # $GRID_HOME/bin/crs_relocate MyTestVIP -c grac1 Attempting to stop `MyTestVIP` on member `grac2` Stop of `MyTestVIP` on member `grac2` succeeded. Attempting to start `MyTestVIP` on member `grac1` ... Create a Server pool named myApache_sp $ crsctl add serverpool myApache_sp -attr "PARENT_POOLS=Generic,SERVER_NAMES=grac1 grac2" $ crsctl status server -f NAME=grac1 STATE=ONLINE ACTIVE_POOLS=Generic ora.GRACE2 myApache_sp STATE_DETAILS= NAME=grac2 STATE=ONLINE ACTIVE_POOLS=Generic ora.GRACE2 myApache_sp STATE_DETAILS= Create Cluster resource and verify this resource - don't forget following parameters: START_DEPENDENCIES=hard(MyTestVIP) pullup(MyTestVIP) STOP_DEPENDENCIES=hard(intermediate:MyTestVIP) CARDINALITY=1 # $GRID_HOME/bin/crsctl add resource myApache -type cluster_resource -attr "ACTION_SCRIPT=/usr/local/bin/apache.scr,PLACEMENT='restricted',SERVER_POOLS=myApache_sp,CHECK_INTERVAL='30',RESTART_ATTEMPTS='2', START_DEPENDENCIES=hard(MyTestVIP) pullup(MyTestVIP), STOP_DEPENDENCIES=hard(intermediate:MyTestVIP),CARDINALITY=1 " # $GRID_HOME/bin/crsctl status resource myApache -f NAME=myApache TYPE=cluster_resource STATE=ONLINE TARGET=ONLINE ACL=owner:root:rwx,pgrp:root:r-x,other::r-- ACTION_FAILURE_TEMPLATE= ACTION_SCRIPT=/usr/local/bin/apache.scr ACTIVE_PLACEMENT=0 AGENT_FILENAME=%CRS_HOME%/bin/scriptagent AUTO_START=restore CARDINALITY=1 CARDINALITY_ID=0 CHECK_INTERVAL=30 CREATION_SEED=65 DEFAULT_TEMPLATE= DEGREE=1 DESCRIPTION= ENABLED=1 FAILOVER_DELAY=0 FAILURE_INTERVAL=0 FAILURE_THRESHOLD=0 HOSTING_MEMBERS= ID=myApache LOAD=1 LOGGING_LEVEL=1 NOT_RESTARTING_TEMPLATE= OFFLINE_CHECK_INTERVAL=0 PLACEMENT=restricted PROFILE_CHANGE_TEMPLATE= RESTART_ATTEMPTS=2 SCRIPT_TIMEOUT=60 SERVER_POOLS=myApache_sp START_DEPENDENCIES=hard(MyTestVIP) pullup(MyTestVIP) START_TIMEOUT=0 STATE_CHANGE_TEMPLATE= STOP_DEPENDENCIES=hard(intermediate:MyTestVIP) STOP_TIMEOUT=0 UPTIME_THRESHOLD=1h # $GRID_HOME/bin/crsctl start resource myApache CRS-2672: Attempting to start 'myApache' on 'grac1' CRS-2676: Start of 'myApache' on 'grac1' succeeded # $GRID_HOME/bin/crsctl status resource myApache -t -------------------------------------------------------------------------------- NAME TARGET STATE SERVER STATE_DETAILS -------------------------------------------------------------------------------- Cluster Resources -------------------------------------------------------------------------------- myApache 1 ONLINE ONLINE grac1 Relocate cluster resource myApache: # $GRID_HOME/bin/crsctl status resource myApache -t -------------------------------------------------------------------------------- NAME TARGET STATE SERVER STATE_DETAILS -------------------------------------------------------------------------------- Cluster Resources -------------------------------------------------------------------------------- myApache 1 ONLINE ONLINE grac1 # $GRID_HOME/bin/crsctl relocate resource myApache -f CRS-2673: Attempting to stop 'myApache' on 'grac1' CRS-2677: Stop of 'myApache' on 'grac1' succeeded CRS-2673: Attempting to stop 'MyTestVIP' on 'grac1' CRS-2677: Stop of 'MyTestVIP' on 'grac1' succeeded CRS-2672: Attempting to start 'MyTestVIP' on 'grac2' CRS-2676: Start of 'MyTestVIP' on 'grac2' succeeded CRS-2672: Attempting to start 'myApache' on 'grac2' CRS-2676: Start of 'myApache' on 'grac2' succeeded # $GRID_HOME/bin/crsctl status resource myApache -t -------------------------------------------------------------------------------- NAME TARGET STATE SERVER STATE_DETAILS -------------------------------------------------------------------------------- Cluster Resources -------------------------------------------------------------------------------- myApache 1 ONLINE ONLINE grac2 Reboot server grac2 to test resource failover and check resource status until available on grac1 After reboot monitor myApache cluster resource until it becomes ONLINE on note grac1. # $GRID_HOME/bin/crsctl status resource myApache -t -------------------------------------------------------------------------------- NAME TARGET STATE SERVER STATE_DETAILS -------------------------------------------------------------------------------- Cluster Resources -------------------------------------------------------------------------------- myApache 1 ONLINE ONLINE grac1 Retest your apache application $ /usr/local/bin/apache.scr check [grid@grac1 ~]$ echo $? 0 or use your browser with URL: http://192.168.1.91/icons/apache_pb.gif Check cluster alert.log on grac1 for any cluster related operations: [crsd(3799)]CRS-2773:Server 'grac2' has been removed from pool 'Generic'. 2013-08-07 18:02:00.124 [crsd(3799)]CRS-2773:Server 'grac2' has been removed from pool 'myApache_sp'. 2013-08-07 18:02:00.124 [crsd(3799)]CRS-2773:Server 'grac2' has been removed from pool 'ora.GRACE2'. 2013-08-07 18:03:37.653 [cssd(3170)]CRS-1601:CSSD Reconfiguration complete. Active nodes are grac1 grac2 . 2013-08-07 18:04:11.034 [crsd(3799)]CRS-2772:Server 'grac2' has been assigned to pool 'Generic'. 2013-08-07 18:04:11.034 [crsd(3799)]CRS-2772:Server 'grac2' has been assigned to pool 'ora.GRACE2'. 2013-08-07 18:04:11.034 [crsd(3799)]CRS-2772:Server 'grac2' has been assigned to pool 'myApache_sp'. 2013-08-07 18:04:11.473 References: 11gR2 VIP Does not Fail Over After Public Network Issue if Application VIP is ONLINE and Added With "appvipcfg create" (Doc ID 1457380.1) How to create application VIP using appvipcfg for non-default network (Doc ID 1464080.1) http://gjilevski.com/2011/11/13/build-ha-for-third-party-application-with-oracle-gi-11-2-0-3/
Thanks.
It helped me a lot.