Virtual machines
Many clients opt for Virtual Machine (VM) infrastructure to host their Genesis applications. This section builds on host preparation, initial application install and config management sections above, and details further setup options for VM infrastructure.
Clustering
The Genesis Application Platform is highly resilient and easy to cluster for a High Availability (HA) setup.
The Genesis platform uses Akka to help manage the communication between clusters: specifically for identifying members of the cluster, joins and leaves etc.
This area takes you through how to configure the platform with our clustering options.
Database on a separate node
In this section, we shall focus on the Genesis Application Platform within an HA set-up using the built-in Genesis Clustering. To achieve full HA, the application's database must be installed on a separate node. There is, of course, an effect on performance in such a set-up.
In the set-up below, there is a stand-by secondary application and a cluster of four FoundationDB databases.
Prerequisites
An HA Load Balancer is required to direct web traffic to the primary node and fail over to the secondary node when the primary node is unresponsive.
The cluster servers need to be able to connect to each other on the configured cluster port (6000 is the default) and by host name.
Here is an example set-up in AWS:
Configure the system definitions
Add all the nodes in the cluster to the hosts section for the specific environment. You must do this on all nodes by editing genesis-system-definition.kts.
systems {
system(name = "DEV") {
hosts {
host(name = "NodeA")
host(name = "NodeB")
}
item(name = "DbNamespace", value = "genesis")
item(name = "ClusterPort", value = "6000")
item(name = "location", value = "LO")
item(name = "LogFramework", value = "LOG4J2")
item(name = "LogFrameworkConfig", value = "log4j2-default.xml")
// defaults to true, false only for Windows
item(name = "LSOF_AVAILABLE", value = "false")
}
}
To activate any configuration change to the platform and/or application, you have to run the command genesisInstall on every changed node.
When you start a node, it will be in STANDBY mode. You can run the mon command to confirm this:
Running the MonCluster command shows all nodes - there are two in this instance:
Set the primary node
Some Genesis processes (and, potentially, application processes) can only run on a single node. So it is important to set one of your nodes as the primary node. Go to that node and run the SetPrimary command to set it to Primary state.
If SetPrimary was executed on NodeA, you should then see something like this when you run MonCluster:
For reference, let's look at a process that has been configured to run on the primary node only. The key definition at the end of the block is the one that sets primaryOnly to true:
<process name="GENESIS_AUTH_CONSOLIDATOR">
<groupId>AUTH</groupId>
<start>true</start>
<options>-Xmx128m -DXSD_VALIDATE=false</options>
<module>genesis-consolidator2</module>
<package>global.genesis.consolidator2</package>
<config>auth-consolidator.xml</config>
<description>Consolidator for all AUTH related consolidations</description>
<primaryOnly>true</primaryOnly>
</process>
Disaster recovery: example
In a clustered Genesis set-up, all session data is shared amongst all nodes. Following the example set-up in the Prerequisites section, if the primary node fails and goes offline, The Load Balancer should divert traffic to the secondary node, which contains all the session data for the end users. Their work will continue without disruption. Below you can see the switch to the secondary node using MonCluster.
If you decide that the primary node will not come back online within an acceptable time frame, you can then set the secondary node to primary.
To do this, run SetPrimary on NodeB. This means that any of those processes where primaryOnly is defined as true will now start running on NodeB.
You can then see the change on MonCluster. But note here that the processes are back up on NodeA.
So, when you are satisfied that NodeA is performing reliably, you can run SetPrimary on NodeA again to make it the primary node. NodeB is automatically reset to Secondary.
In summary, the Load Balancer has handled the automatic switching to the secondary node in response to failure. You have then changed the two nodes manually using SetPrimary.
Capacity planning
You can see CPU and memory usage across an application using the mon command. This gives you a guide to future scaling, either horizontally (extra nodes) or vertically (essentially, you can double the CPU to 8 core and the RAM to 32GB). You can install a larger disc to suit requirements.
You can customise our metrics to output information such as the number of transactions per Event Handler, for example. You can then choose how to store and report on the data points.
Additionally, the Genesis Application Platform is compatible with all major monitoring and planning tools for the Linux environment, such as Nagios, ITRS Geneos or Prometheus.
Vertical and horizontal scaling
If you are adding nodes for horizontal scaling, simply add the details of the extra nodes to the hosts
section in genesis-system-definition.kts.
hosts {
host(name = "NodeA")
host(name = "NodeB")
host(name = "NodeC")
…
}
Every Genesis process is an independent Java process running on a dedicated JVM. Each process can be configured with JVM-specific memory management configurations (-Xmx -Xms etc.) in the module-processes.xml file.
Example:
<process name="GENESIS_WEBMON">
<start>true</start>
<groupId>GENESIS</groupId>
<options>-Xmx512m -DXSD_VALIDATE=false</options>
<module>webmon</module>
<package>global.genesis.webmon</package>
<config>genesis-webmon-config.xml</config>
<description>Admin and operations web interface</description>
</process>
Environment variables
The Genesis platform supports extraction of system-level variables to populate solution-specific settings. The system-level variables can be derived from an enterprise configuration management system, and the platform supports encrypted settings.
item(name = "DbUsername", value = System.getenv("DBUSERNAME"), encrypted = true)
item(name = "DbPassword", value = System.getenv("DBPASSWORD"), encrypted = true)
item(name = "GenesisKey", value = System.getenv("GENESIS_KEY"))
External runtime dependencies
The platform operates without any external dependencies and is well suited to network environments with no public ingress or egress traffic.
Encryption of data in transit and REST
Genesis recommends using a local reverse proxy with SSL termination to provide end-to-end encryption from the web application to the application back end. The platform does not provide specific functionality to encrypt data at REST, as this is best achieved by the database solution deployed for the overall installation and/or the disk partition encryption of the Virtual Machine (VM).
Independent processes
Every Genesis process is an independent Java process running on a dedicated JVM. This ensures segregation of data classification. account privileges and service tiering.