Forum Discussion

jasona_40790's avatar
jasona_40790
Icon for Nimbostratus rankNimbostratus
Aug 23, 2012

iRule that redirects to Sorry Pool when pool is down

When all of the webservers in a pool are down, I want my users to be directed to the "SorryPage" server pool that will display a maintenance/down page. I've been reading through the forums and I think the best way to do this is via iRules due to the persistent profile issue that can occur when using priorities. I've basically copied other iRules from past posts.

So, I would like to include 1 of these 2 iRules to my webserver VIP. I would like to know which is a better iRule. Does one of these rules run faster or perhaps more efficiently that the other? Thanks for your help.

RULE 1:

when CLIENT_ACCEPTED {
     Check if the VS default pool has no active members
    if {[active_members [LB::server pool]] == 0}{
        pool sorry_pool
    }
}




RULE 2:


when CLIENT_ACCEPTED {
     Save the name of the VS default pool
    set default_pool [LB::server pool]
}
when HTTP_REQUEST {
     Check if the VS default pool has any active members
    if {[active_members $default_pool]}{
        pool $default_pool
    } else {
        pool sorry_pool
    }
}

5 Replies

  • for maintenance page, i think we should use HTTP_REQUEST event and HTTP::uri command in addition to pool command since we may have to change url when sending to maintenance pool. and i do not think we need to save default pool name in CLIENT_ACCEPTED event.

    e.g.

    [root@ve10:Active] config  b virtual bar list
    virtual bar {
       snat automap
       pool foo
       destination 172.28.19.79:80
       ip protocol 6
       rules myrule
       profiles {
          http {}
          tcp {}
       }
    }
    [root@ve10:Active] config  b pool foo list
    pool foo {
       monitor all fake
       members 200.200.200.101:80 {}
    }
    [root@ve10:Active] config  b rule myrule list
    rule myrule {
       when HTTP_REQUEST {
       if {[active_members [LB::server pool]] < 1} {
          HTTP::uri /
          pool sorrypool
       }
    }
    }
    [root@ve10:Active] config  b pool sorrypool list
    pool sorrypool {
       members 200.200.200.102:80 {}
    }
    
     default pool is down
    
    [root@ve10:Active] config  b pool foo|grep -i pool
    POOL foo  LB METHOD round robin   MIN/CUR ACTIVE MEMBERS 0/0
    +-> POOL MEMBER foo/200.200.200.101:80   inactive,down
    
     client accesses virtual server and is sent to sorrypool instead
    
    [root@ve10:Active] config  ssldump -Aed -nni 0.0 port 80 and not host 200.200.200.10
    New TCP connection 1: 172.28.19.251(44474) <-> 172.28.19.79(80)
    1345898352.5804 (0.0009)  C>S
    ---------------------------------------------------------------
    HEAD /something HTTP/1.1
    User-Agent: curl/7.15.5 (i686-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
    Host: 172.28.19.79
    Accept: */*
    
    ---------------------------------------------------------------
    
    New TCP connection 2: 200.200.200.80(44474) <-> 200.200.200.102(80)
    1345898352.5875 (0.0070)  C>S
    ---------------------------------------------------------------
    HEAD / HTTP/1.1
    User-Agent: curl/7.15.5 (i686-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
    Host: 172.28.19.79
    Accept: */*
    
    ---------------------------------------------------------------
    

    just my 2 cents.
  • So, my iRule is as follows:

     

     

    when HTTP_REQUEST {

     

    if {[active_members [LB::server pool]] < 1} {

     

    HTTP::uri /

     

    pool sorrypool

     

    }

     

    }

     

     

     

    This works fine and when all pool members are down or unavailable, requests are sent to the 'sorrypool'. however, once the pool member(s) are available again, all requests are NOT being sent to the main pool again. I'm pretty sure this is due to persistence being set on the main Virtual IP, but we need it on that Virtual IP. This is obviously not acceptable for my site. How do I force requests back to the original pool once the pool members are available again; basically having requests follow the iRule.

     

     

    Thanks.
  • Hi Jason,

    Can you try this version which assigns a pool in all cases and logs the results?

    
    when CLIENT_ACCEPTED {
    set sorry_debug 1
    set default_pool [LB::server pool]
    }
    when HTTP_REQUEST {
    if {[active_members $default_pool] < 1} {
    if {$sorry_debug}{log local0. "[IP::client_addr]:[TCP::client_port]: Using sorry pool for [HTTP::uri]"}
    HTTP::uri /
    pool sorrypool
    } else {
    if {$sorry_debug}{log local0. "[IP::client_addr]:[TCP::client_port]: Using pool $default_pool for [HTTP::uri]"}
    pool $default_pool
    }
    }
    when SERVER_CONNECTED {
    if {$sorry_debug}{log local0. "[IP::client_addr]:[TCP::client_port]: Connected to [LB::server] - [IP::server_addr]:[TCP::server_port]"}
    }
    

    Aaron
  • I have tried these i'm using 11.3 and have no luck on making them work in my setup
  • I have tried these i'm using 11.3 and have no luck on making them work in my setupwhat is not working indeed?