Multi-server applications
Applications protected by IBM® Application Gateway (IAG) may use multiple replicated servers for high availability. A resource server definition in IAG can specify multiple replicated servers to protect a single application.
Specifying multiple servers
For example, consider the following configuration where the /accounting resource
server is a legacy application available on two replicated servers:
resource_servers:
- path: /accounting
servers:
- server: acc1.demo.com
port: 9443
# ...
- server: acc2.demo.com
port: 9443
# ...
# ...
When handling requests to the /accounting resource, IAG will distribute requests
between the two replica servers.
If the protected application requires that client requests are always directed to the same replica server during a session to maintain state, see the Stateful Applications topic to learn more.
Understanding how IAG selects servers
IAG uses a least-busy algorithm to determine which of the available servers is currently handling the fewest request connections and forwards the request to that server.
Server Availability
IAG also performs regular health checks of each server to determine if the server is available.
If a server is not available, IAG will stop forwarding requests to that server until it is available
again. This health check is referred to as a ping in the configuration YAML.
In the following example, IAG will:
- While the server is available:
- Send a
HEADrequest (ping/method = HEAD) - To the URL
/health(ping/url = /health) - Every 10 minutes (
ping/policy/frequency = 600) - The request will be considered to have failed if:
- It is not completed
within 10 seconds (
ping/policy/timeout = 10) - It returns a response code of
500-509, but will succeed for any others (
ping/policy/rule = [ -50*, +* ])
- It is not completed
within 10 seconds (
- If the request fails two consecutive times, the server will be
considered unavailable (
ping/policy/threshold = 2)
- Send a
- While the server is unavailable:
- It will retry the ping every 10 seconds
(
ping/policy/recovery/frequency = 10) - If the request succeeds three
consecutive times, the server will be considered available again
(
ping/policy/recovery/threshold = 3)
- It will retry the ping every 10 seconds
(
resource_servers:
- path: "/example"
# ...
health:
ping:
method: HEAD
url: /health
policy:
frequency: 600
threshold: 2
recovery:
frequency: 10
threshold: 3
timeout: 10
rule:
- -50?
- +*
Grouping Servers
IAG can also prioritize servers, this is achieved by grouping the servers based on priority. When grouped by priority, IAG will always send requests to the server(s) with the highest available priority.
In the following example, the /hr application has four servers.
hr-primary-1.demo.com and hr-primary-2.demo.com both have the
priority of 9 and hr-secondary-1.demo.com and
hr-secondary-2.demo.com are priority 8.
resource_servers:
- path: /hr
servers:
- server: hr-primary-1.demo.com
port: 443
priority: 9
# ...
- server: hr-primary-2.demo.com
port: 443
priority: 9
# ...
- server: hr-secondary-1.demo.com
port: 443
priority: 8
# ...
- server: hr-secondary-2.demo.com
port: 443
priority: 8
# ...
# ...
While any server(s) with priority 9 are available, IAG will exclusively distribute requests to them. If all servers with priority 9 are unavailable, IAG will then start distributing requests to the next highest priority level, which in this case are the two servers with priority 8. Whilst in this state, if any servers with priority 9 become available, IAG will then resume distributing requests only to the server(s) with priority 9.