
The deployment of SAP BusinessObjects BI Platform on Azure is similar to on-premise deployment. But in Azure, you can leverage some of their offerings to build the application which can reduces maintenance work for some application components like DBaaS (Azure SQL Database) for CMS Database, Azure Files or Azure NetApp Files (ANF) for File Repository Server, Azure Load Balancer or Application Gateway for load balancing traffic to web server, .
In below figure, SAP BusinessObjects BI Platform is installed on two Azure Virtual Machines (VM) along with tomcat. To load balance the traffic between two web servers, application gateway is used. The application gateway IP address (10.31.3.20) act as an entry point for the users, handles incoming TLS/SSL (HTTPS - TCP/443) connections, decrypt the TLS/SSL and passing on the un-encrypted request (HTTP - TCP/8080) to the servers (azusbosl1 or azusbosl2) in the backend pool. With in-built TLS/SSL termination feature, we just need to maintain only one TLS/SSL certificate i.e. on Azure Application Gateway which simplifies operations.
When one of the web server goes down, application gateway route all the traffic to other host(s). This way we can attain high availability of tomcat server at host level. But the problem here is that, we lose user session along with the host. So user needs to login again to access application via different tomcat server. To ensure user sessions remain intact during tomcat service disruption, we need to configure session replication in tomcat which replicates user session to other hosts that are member of the cluster group.
Traditionally in on-premise deployment, tomcat cluster is configured using multicast but as this is not supported on Azure (SAP Note 2764907), we need to configure tomcat cluster using Static Membership Interceptor.
McastService
attribute we will be using StaticMember
attribute for cluster membership. In this illustration, we are using two web servers azusbosl1 and azusbosl1 on Linux. Replace
<!--
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
-->
With below on azusbosl1 (10.31.0.8)
<Cluster
channelSendOptions="8"
channelStartOptions="3"
className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
<Manager
className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"
/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender" />
</Sender>
<Receiver
address="10.31.0.8"
autoBind="0"
className="org.apache.catalina.tribes.transport.nio.NioReceiver"
maxThreads="6"
port="4000"
selectorTimeout="5000"
/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpPingInterceptor" staticOnly="true"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector" />
<Interceptor className="org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor">
<Member
className="org.apache.catalina.tribes.membership.StaticMember"
port="4000"
host="10.31.0.9"
uniqueId="{0,0,0,0,0,0,0,0,0,0,0,0,6,7,8,9}"
/>
</Interceptor>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter="" />
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener" />
<Valve className="com.sap.customvalve.CustomReplicationValve"/>
</Cluster>
org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor
class include the information of all the other web server host that you want to be part of tomcat cluster. In this example, it includes information about azusbosl2. uniqueID is a universally unique ID for static member. The value must be 16 bytes in format {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}. For more information on attribute and option, refer Tomcat cluster guide.Replace:
<!--
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
-->
With below on azusbosl2 (10.31.0.9):
<Cluster
channelSendOptions="8"
channelStartOptions="3"
className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
<Manager
className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"
/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender" />
</Sender>
<Receiver
address="10.31.0.9"
autoBind="0"
className="org.apache.catalina.tribes.transport.nio.NioReceiver"
maxThreads="6"
port="4000"
selectorTimeout="5000"
/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpPingInterceptor" staticOnly="true"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector" />
<Interceptor className="org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor">
<Member
className="org.apache.catalina.tribes.membership.StaticMember"
port="4000"
host="10.31.0.8"
uniqueId="{0,0,0,0,0,0,0,0,0,0,0,5,6,7,8,9}"
/>
</Interceptor>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter="" />
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener" />
<Valve className="com.sap.customvalve.CustomReplicationValve"/>
</Cluster>
org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor
class include the information of all the other web server host that you want to be part of tomcat cluster. In this example, it includes information about azusbosl1. uniqueID is a universally unique ID for static member. The value must be 16 bytes in format {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}. For more information on attribute and option, refer Tomcat cluster guide<web-app>
<distributable/>
</web-app>
org.apache.catalina.tribes.transport.ReceiverBase.bind Receiver
Server Socket bound to:[/10.31.0.8:4000]
org.apache.catalina.tribes.transport.ReceiverBase.bind Receiver
Server Socket bound to:[/10.31.0.9:4000]
[Catalina-utility-1] org.apache.catalina.ha.tcp.SimpleTcpClust
er.memberAdded Replication member added:[org.apache.catalina.t
ribes.membership.StaticMember[tcp://10.31.0.8:4000,10.31.0.8,4
000, alive=0, securePort=-1, UDP Port=-1, id={0 0 0 0 0 0 0 0
0 0 0 5 6 7 8 9 }, payload={}, command={}, domain={}]]
INFO [Catalina-utility-1] org.apache.catalina.ha.tcp.SimpleTc
pCluster.memberAdded Replication member added:[org.apache.cat
alina.tribes.membership.StaticMember[tcp://10.31.0.9:4000,10.
31.0.9,4000, alive=0, securePort=-1, UDP Port=-1, id={0 0 0 0
0 0 0 0 0 0 0 0 6 7 8 9 }, payload={}, command={}, domain={}]]
INFO [Catalina-utility-1] org.apache.catalina.tribes.group.in
terceptors.TcpFailureDetector.performBasicCheck Suspect membe
r, confirmed alive.[org.apache.catalina.tribes.membership.Sta
ticMember[tcp://10.31.0.9:4000,10.31.0.9,4000, alive=0, secur
ePort=-1, UDP Port=-1, id={0 0 0 0 0 0 0 0 0 0 0 0 6 7 8 9 },
payload={}, command={}, domain={}]]
502 - Web server received an invalid response while acting as a gateway or proxy server
error message. It is because session fail-over is still happening and it takes few seconds before user can connect to the same user session.You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
12 | |
9 | |
7 | |
6 | |
6 | |
6 | |
4 | |
4 | |
4 | |
4 |