Set Up the User Interface Role for HA

The UI role includes the Nginx and Apache Tomcat components. There are also a number of Moogsoft Enterprise webapps (servlets) installed and running within Tomcat, responsible for the following processes:

  • graze: Graze API

  • moogpoller: Dynamic updates to UI

  • moogsvr: Services HTTP requests

  • situation_similarity: Calculates the situation similarity and pushes to UI

  • toolrunner: Services Server Tools

HA architecture

In our distributed HA installation, the UI components are installed on the UI 1 and UI 2 servers.

7_-_UI_for_HA.png

Refer to the Distributed HA system Firewall for more information on connectivity within a fully distributed HA architecture.

Install UI primary

  1. Install Moogsoft Enterprise components on the UI primary server.

    On UI 1 install the following Moogsoft Enterprise components:

    VERSION=8.0.0.1; yum -y install moogsoft-common-${VERSION} \
        moogsoft-integrations-ui-${VERSION} \
        moogsoft-integrations-${VERSION} \
        moogsoft-ui-${VERSION} \
        moogsoft-utils-${VERSION}
    

    Edit the ~/.bashrc file to contain the following lines:

    export MOOGSOFT_HOME=/usr/share/moogsoft
    export APPSERVER_HOME=/usr/share/apache-tomcat
    export JAVA_HOME=/usr/java/latest
    export PATH=$PATH:$MOOGSOFT_HOME/bin:$MOOGSOFT_HOME/bin/utils 

    Source the .bashrc file

    source ~/.bashrc
  2. Run the initialization script moog_init_ui.sh on UI 1 to initialize the UI stack. Substitute the name of your RabbitMQ zone and the Core 1 server hostname:

    moog_init_ui.sh -twfz <zone> -c <Core 1 server hostname>:15672 -m <Core 1 server hostname>:5672 -s <Core 1 server hostname>:9200 -d <Core 1 server hostname>:3309 -n
    
  3. Uncomment and edit the servlets settings on UI 1 in the file $MOOGSOFT_HOME/config/servlets.conf. Note the importance of the initial comma.

    ,ha :
    {
        cluster: "primary",
        instance: "servlets",
        group: "servlets_primary",
        start_as_passive: false
    }
  4. On UI 1, edit $MOOGSOFT_HOME/config/system.conf and set the following properties. Substitute the name of your RabbitMQ zone, the server hostnames, and the cluster names.

    "mooms" :
       {
    ...
    "zone" : "<zone>",
    
    "brokers" : [
        {"host" : "<Core 1 server hostname>", "port" : 5672},
        {"host" : "<Core 2 server hostname>", "port" : 5672},
        {"host" : "<Redundancy server hostname>", "port" : 5672}
    ],
    ...
    "cache_on_failure" : true,
    ...
    "search" :
        {
    ...
    "nodes" : [
        {"host" : "<Core 1 server hostname>", "port" : 9200},
        {"host" : "<Core 2 server hostname>", "port" : 9200},
        {"host" : "<Redundancy server hostname>", "port" : 9200}
    ]
    ...
    "failover" :
        {
        "persist_state" : true,
        "hazelcast" :
            {
            "hosts" : ["<Core 1 server hostname>","<Core 2 server hostname>"],
            "cluster_per_group" : true
            }
        "automatic_failover" : true,
        }
    ...
    "ha": 
        { "cluster": "PRIMARY" }
  5. On UI 1, restart the Apache Tomcat service:

    systemctl restart apache-tomcat
  6. Install, configure and start HA Proxy on UI 1 to connect to the Percona XtraDB Cluster.

Install UI secondary

  1. Install Moogsoft Enterprise components on the UI secondary server.

    On UI 2 install the following Moogsoft Enterprise components:

    VERSION=8.0.0.1; yum -y install moogsoft-common-${VERSION} \
        moogsoft-integrations-ui-${VERSION} \
        moogsoft-ui-${VERSION} \
        moogsoft-utils-${VERSION}
    

    Edit the ~/.bashrc file to contain the following lines:

    export MOOGSOFT_HOME=/usr/share/moogsoft
    export APPSERVER_HOME=/usr/share/apache-tomcat
    export JAVA_HOME=/usr/java/latest
    export PATH=$PATH:$MOOGSOFT_HOME/bin:$MOOGSOFT_HOME/bin/utils 

    Source the .bashrc file

    source ~/.bashrc
  2. Initialize the UI stack. Run the initialization script moog_init_ui.sh on UI 2 to initialize the UI stack. Substitute the name of your RabbitMQ zone and the Core 2 server hostname:

    moog_init_ui.sh -twfz <zone> -c <Core 2 server hostname>:15672 -m <Core 2 server hostname>:5672 -s <Core 2 server hostname>:9200 -d <Core 2 server hostname>:3309 -n
    
  3. Uncomment and edit the servlets settings on UI 2 in the file $MOOGSOFT_HOME/config/servlets.conf. Note the importance of the initial comma.

    Caution

    The secondary server group must be different to the primary server group.

    ,ha :
    {
        cluster: "secondary",
        instance: "servlets",
        group: "servlets_secondary",
        start_as_passive: false
    }
  4. On UI 2, edit $MOOGSOFT_HOME/config/system.conf and set the following properties. Substitute the name of your RabbitMQ zone, the server hostnames, and the cluster names.

    "mooms" :
       {
    ...
    "zone" : "<zone>",
    
    "brokers" : [
        {"host" : "<Core 1 server hostname>", "port" : 5672},
        {"host" : "<Core 2 server hostname>", "port" : 5672},
        {"host" : "<Redundancy server hostname>", "port" : 5672}
    ],
    ...
    "cache_on_failure" : true,
    ...
    "search" :
        {
    ...
    "nodes" : [
        {"host" : "<Core 1 server hostname>", "port" : 9200},
        {"host" : "<Core 2 server hostname>", "port" : 9200},
        {"host" : "<Redundancy server hostname>", "port" : 9200}
    ]
    ...
    "failover" :
        {
        "persist_state" : true,
        "hazelcast" :
            {
            "hosts" : ["<Core 1 server hostname>","<Core 2 server hostname>"],
            "cluster_per_group" : true
            }
        "automatic_failover" : true,
        }
    ...
    "ha": 
        { "cluster": "SECONDARY" }
  5. On UI 2, restart the Apache Tomcat service:

    systemctl restart apache-tomcat
  6. Install, configure and start HA Proxy on UI 2 to connect to the Percona XtraDB Cluster .

Configure the UI load balancer

A user session needs to be served from the same UI stack, ie. they need to stay connected to the same UI server for the duration of their session, or until that UI server becomes unavailable (in which case the load balancer will redirect the user to the secondary). This is because requests are routed via moogsvr and data is received from moogpoller (web sockets).

Configure the UI load balancer with the following attributes:

  • Since both UI stacks are active you can choose to implement the round robin or least connection balancing method.

  • Route web traffic only to the Nginx behind which there is an active UI. The decision for this is based on a moogsvr servlet check via the ‘hastatus’ Tomcat endpoint. It will return a 204 if the UI stack is UP. It does not however report on the health of other roles, ie. Core (Moogfarmd, RabbitMQ and Elasticsearch clusters), Database (Percona Cluster), LAMs.

  • Sticky sessions are preferred. Traffic needs to be routed to the same backend server based on the same MOOGSESS cookie.

You can send the following example cURL command from the command line to check moogsvr servlet status:

curl -k https://server1/moogsvr/hastatus -v