How to configure replication in orientdb ?

mohamad wael
7 min readMar 28, 2021

Start by downloading orientdb on the servers , where replication is to be configured . It can be gotten fromorientdb, or for example by using wget, as in :

$ wget https://s3.us-east-2.amazonaws.com/orientdb3/releases/3.1.10/orientdb-3.1.10.tar.gz

Next extract orientdb, by using tar, as in tar -xzf orientdb-version.tar.gz, and go into the bindirectory of the extracted folder , which is more or less related to orientdbexecution , by using the cdcommand , as in cd orientdb-3.1.10/bin, and execute./dserver.sh.

The dserver.shscript , starts orientdb in distributed mode . The reason that this script is first ran , is for orientdb to generate a password , and a name for each node , where the script is to be ran . Choose meaningful name , as in location1 , location2 ...

...
+---------------------------------------------------------------+
| WARNING: FIRST RUN CONFIGURATION |
+---------------------------------------------------------------+
| This is the first time the server is running. Please type a |
| password of your choice for the 'root' user or leave it blank |
| to auto-generate it. |
| |
| To avoid this message set the environment variable or JVM |
| setting ORIENTDB_ROOT_PASSWORD to the root password to use. |
+---------------------------------------------------------------+

Root password [BLANK=auto generate it]: ***********
Please confirm the root password: ***********
...

+---------------------------------------------------------------+
| WARNING: FIRST DISTRIBUTED RUN CONFIGURATION |
+---------------------------------------------------------------+
| This is the first time that the server is running as |
| distributed. Please type the name you want to assign to the |
| current server node. |
| |
| To avoid this message set the environment variable or JVM |
| setting ORIENTDB_NODE_NAME to the server node name to use. |
+---------------------------------------------------------------+

Node name [BLANK=auto generate it]: development

# You can after that hit ctrl-c to stop
# orientdb , or you can also execute the
# script ./shutdown.sh in orientdb
# bin directory , to shut down
# orientdb .

Orientdb recommends 4 GBof ram , for the distributed mode , but if memory is an issue, it can be configured by editing the script orientdb-version/bin/dserver.sh, for example by using nanoand ctrl-w, to search for the memory settings , which should be as follows :

# Excerpt from bin/dserver.sh


# ORIENTDB memory options, default to 4GB of heap.

if [ -z "$ORIENTDB_OPTS_MEMORY" ] ; then
ORIENTDB_OPTS_MEMORY="-Xms4G -Xmx4G"


# Xms is the start memory , and Xmx is the
# max memory .
# Replace 4G for example by 512M , which means
# 512 megabytes .
# If using nano , hit ctrl-x , followed by the
# y character , followed by an enter to exit
# editing , and save the done work .

Now it is time to configure nodes’ clustering . To do that theOHazelcastPlugin must be configured inconfig/orientdb-server-config.xml, to specify if it is enabled , and where the default configuration file for distributed database , for exampledefault-distributed-db-config.jsonis , and where the file used to configure cluster membership and protocol , for example ,hazelcast.xmlis . The default configuration in orientdb-server-config.xmlis sufficient .

<!-- orientdb-version/config/orientdb-server-config.xml -->

<handler class="com.orientechnologies.orient.server.hazelcast.OHazelcastPlugin">
<parameters>
<parameter value="${distributed}" name="enabled"/>
<parameter value="${ORIENTDB_HOME}/config/default-distributed-db-config.json" name="configuration.db.default"/>
<parameter value="${ORIENTDB_HOME}/config/hazelcast.xml" name="configuration.hazelcast"/>
<parameter value="development" name="nodeName"/>
</parameters>
</handler>

To configure the replication protocol, edit orientdb-server-config.xml, for each server .

<!-- The config/orientdb-server-config.xml file .-->
<?xml version="1.0" encoding="UTF-8"?>
<hazelcast
xsi:schemaLocation="http://www.hazelcast.com/schema/config ...>

<group>
<name>orientdb</name>
<password>orientdb</password>
</group>

<properties>
<property name="hazelcast.phone.home.enabled">false</property>
...
</properties>

<network>
<port auto-increment="false">2434</port>
<join>

<multicast enabled="false">
<multicast-group>235.1.1.1</multicast-group>
<multicast-port>2434</multicast-port>
</multicast>

<tcp-ip enabled="true">
<member>ipaddress</member>
<member>ipaddress:port</member>
<member>host</member>
<member>host:port</member>
...
</tcp-ip>

</join>
</network>

<executor-service>
<pool-size>16</pool-size>
</executor-service>

</hazelcast>

The group name and password , are the cluster’s name and password . Make sure to change them , and to choose a secure password .

The network is the network protocol to be used. auto-incrementis disabled , if enabled and the port specified is already bound , then the next port is tried .

The network protocol can be set to multicast , like if on the local network , or on the same PC , in such a case , nothing is to be configured , just make sure that multicast is enabled , as in , enabled="true". Only one network setting can be enabled , as in tcp-ipor multicast.

If like on different or remote networks , or for any other reasons , the network protocol can be set to tcp-ip. For tcp-ip, you can specify the IP address or host name , with optionally a port number , as in 192.168.0.4:2424. For each server , that is to be part of the group , just add its details using the member tag .

Having configured the network protocol , it is time to configure database replication, which can be done indefault-distributed-db-config.json. This file is copied , and updated as distributed-config.json, to each database folder in orientdb-version/databases.

// The config/default-distributed-db-config.json file .
{
"autoDeploy": true,
"executionMode": "undefined",
"readQuorum": 1,
"writeQuorum": "majority",
"readYourWrites": true,
"newNodeStrategy": "static",
"servers": {
"production": "master"
"development": "replica",
},
"clusters": {
"internal": {
},
"*": {
"servers": [""]
}
}
}
/*
autoDeploy : Means automatically deploy the database to nodes ,which
do not have it .
executionMode : Default is undefined , to let the client decide .
If set to Asynchronous , then an operation is first
executed on the the local node , before being
replicated .
readQuorum : Number of responses that must be coherent , before
replying to a read operation .
writeQuorum : Number of responses that must be coherent , before
replying to a write operation .
If set to all , means all responses must be coherent ,
if set to majority , this means that n/2 + 1
responses must be coherent , and if set to 1 , it
is as if it is disabled .
readYourWrites : The write quorum is only satisfied , if the local
node has responded .
newNodeStrategy : Can be set to static or dynamic , if static a new
node is registered as static , if dynamic a new
node is managed as dynamic . When a node is
unreachable , and the node strategy is dynamic
it does not count into the quorum .
servers : What is the role of each server , for example the
server which was given the name of production is
a master , and the one given the name of development
is replica .
"servers":{"*"":master} , can be used to state that
all servers are masters .
More than one master can be configured , a replica
server is just a replica , it does not count
into voting in writeQuorum .
clusters : The term cluster in orientdb , also means a way
of grouping records of a certain type , or by
a specific value .
A class is orientdb way of modeling , so it is the
model , it stores its data into records .
Each class can have multiple clusters , as in to
group records which it has and which are similar .
A cluster can be a physical one , as storage on disk , or
temporal as an in memory cluster .
So this setting is used to configure clusters .
As seen , in the provided excerpt the internal cluster
is not replicated . All other clusters are
replicated .
servers has as a value an array , which is the list of
servers where cluster records are saved . The special
value <NEW_NODE> means auto add new nodes . An
example of using specific node values is :
["location1" , "location2"] .
Cluster configuration inherits database configuration ,
readQuorum , writeQuorum , readYourWrites , and can
override them .
Additionally owner can be used to specify the owner
of the cluster , as in "owner": "location1" ,
this is called static assignment , even if the
node is down , a static owner is not changed . If
not done statically , an owner is
chosen at runtime dynamically .*/

In the previous example, two nodes were specified , one as being a master , and the second one as being a replica , other configuration options , are explained in the preceding code , as in having all nodes to be masters , which is the default .

That is it for configuring replication using orientdb , the servers can be started using./dserver.sh . Start the replica , after the master .

To check if everything is working correctly , a database can be created as in create database remote:localhost/nameOfDb root thePassword, on the master server , using the console , which can be launched from the binfolder , and using the console in the replica server , and after issuing the commandconnect remote:localhost/ root thePassword, the command List databasescan be run to verify that the created database has been replicated .

If multiple instances of orientdb are run on the same PC , different ports must be configured for each running instance , for example in orientdb-server-config.xml , by using nano config/orientdb-server-config.xml , and searching using ctrl-w for port , and choosing the preferred ports .

<!-- Excerpt from orientdb-server-config.xml file .-->
<?xml version="1.0" encoding="UTF-8"?>
<listener protocol="binary" socket="default" port-range="2424-2430" ip-address="0.0.0.0"/>
<listener protocol="http" socket="default" port-range="2480-2490" ip-address="0.0.0.0">

<!-- Excerpt from config/hazelcast.xml file .-->
<port auto-increment="false">2434</port>
<!-- instead of changing the port , auto-increment
can be set to true for hazelcast.xml .-->

Originally published at https://difyel.com on March 28, 2021.

--

--