如何在Ubuntu 16.04上配置OrientDB群集

OrientDB是支持图形和文档数据库的多模型NoSQL数据库。它是一个Java应用程序,可以在任何操作系统上运行。它也完全支持ACID投诉,支持多主集群和复制,允许轻松的水平缩放。在本教程中,您将使用社区版OrientDB设置一个具有两个主节点和一个副本节点的三节点集群。

介绍

OrientDB是支持图形和文档数据库的多模型NoSQL数据库。 它是一个Java应用程序,可以在任何操作系统上运行。 它也完全符合ACID -支持多主集群和复制,允许轻松的水平缩放。

但是,OrientDB中的“cluster”一词可以指两个不同的概念:

  1. 您可以拥有一组OrientDB 节点 ,它们是运行OrientDB的服务器。 这意味着使用至少一个物理(或云)服务器,因为多个OrientDB实例可以在一个服务器上运行。
  2. 您还可以在OrientDB 数据库中拥有一个集群,该数据库是类似类型或值类型的记录组。 这样的群集也可以跨多个服务器存在,也可以局限于一个服务器。

本文的重点是第一类集群,即一组节点。 在集群模式下,OrientDB运行在多主机或无主机分布式体系结构中,这意味着集群中的每个节点都能平等运行,并且能够读/写对方的记录。 但是,节点还能够将集群作为副本进行加载 ,其中以只读模式运行。

在本教程中,您将使用社区版OrientDB设置一个具有两个主节点和一个副本节点的三节点集群。

先决条件

要遵循本教程,您将需要:

  • 三个Ubuntu 16.04服务器具有足够的RAM来支持集群。 这将根据您的需要和您如何自定义OrientDB而有所不同,但每个4GB是一个很好的默认值。

  • 使用Ubuntu 16.04教程的初始服务器安装程序, 在每个服务器上设置一个sudo非root用户帐户和防火墙。

  • Java必须安装在所有服务器上,您可以通过遵循此Java安装指南的JDK 8步骤来执行此操作 OpenJDK JRE也可以工作,所以如果你不想接受Oracle许可证,你可以使用同一个教程安装默认的JRE。

  • 通过遵循完整写入的单服务器OrientDB安装指南的第1步,在每个服务器上安装OrientDB 您可以选择遵循第2步来限制所需的RAM量; OrientDB分发的启动脚本期望至少有4 GB的RAM可用,如果发现更少,则无法启动,除非您更改此内容。

  • 通过遵循单服务器OrientDB安装指南的第5步和6,在重新加载单元(即不启动服务)之后停止,OrientDB将在每个服务器上设置为Systemd服务。 您需要做的唯一更改是在单元文件中为ExecStart提供的文件。 原始教程使用server.sh ,但是在这里,使用d server.sh进行分布式模式。

第1步 - 生成根密码和OrientDB实例名称

首先,我们将运行分布式服务器脚本dserver.sh来生成一个OrientDB实例需要在集群内运行的凭据。 具体来说,这将让我们设置OrientDB实例的根密码和名称。 您需要在所有三个服务器上执行此步骤。

要开始,请导航到安装目录。

cd /opt/orientdb

然后启动分布式服务器。

sudo bin/dserver.sh

首次启动分布式服务器时,系统将提示您指定root用户帐户的密码。 这是一个内部OrientDB帐户,将用于访问服务器,例如OrientDB Studio,用于管理OrientDB的基于Web的界面,以及从控制台连接到OrientDB。 如果您在此处未指定密码,则会自动生成密码。 但是,最好自己指定一个,所以在出现以下提示时,请执行以下操作:

+---------------------------------------------------------------+
|                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: *****

然后,系统将提示您为OrientDB的实例设置名称,该名称与运行的云服务器的名称相同。

+---------------------------------------------------------------+
|         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]: node-name

脚本运行完毕后,您会看到如下所示的行:

2017-06-01 02:24:00:717 INFO  OrientDB Server is active v2.2.20 (build 76ab59e72943d0ba196188ed100c882be4315139). [OServer]

此时,您可以使用CTRL+C终止进程。 现在安装了OrientDB,我们需要修改几个配置文件,让它作为集群运行。

第2步 - 将OrientDB配置为分布式模式下的功能

要将OrientDB安装为群集中的节点,需要修改其config目录中的三个文件。 他们是:

  1. hazelcast.xml :此文件中定义的参数使节点自动发现成为可能。
  2. default-distributed-db-config.json :此文件仅用于分布式环境,用于定义每个数据库的节点行为。
  3. orientdb-server-config.xml :这是主要的OrientDB配置文件,无论是在分布式还是独立模式下都需要修改。

我们将在此步骤中修改每个文件,从hazelcast.xml开始。

修改hazelcast.xml文件

您必须在hazelcast.xml中hazelcast.xml的最重要的设置是每个节点将用于加入群集的机制。 我们将在本节中考虑的两种机制是IP多播TCP / IP集群 使用前者,您可以指定每个节点将用于自动发现其所属网络的组播地址和端口。 使用后者,必须指定每个集群成员的IP地址。 由于DigitalOcean不支持IP多播,因此TCP / IP集群是我们在此使用的方法。

要开始,打开文件进行编辑:

sudo nano /opt/orientdb/config/hazelcast.xml

文件不是很长。 这是一个截断的版本,仅显示您将更改的文件部分:

/opt/orientdb/config/hazelcast.xml
. . .
    <group>
        <name>orientdb</name>
        <password>orientdb</password>
    </group>
    <properties>    
        . . .
    </properties>
    <network>
        <port auto-increment="true">2434</port>
        <join>
            <multicast enabled="true">
                <multicast-group>235.1.1.1</multicast-group>
                <multicast-port>2434</multicast-port>
            </multicast>
        </join>
    </network>

您将对此文件执行的操作是禁用IP多播,添加启用TCP / IP集群的条目,并指定集群成员。 我们来看看每个标签:

  • group> name :此元素定义集群的名称。 你可以选择任何你喜欢的东西
  • group> password :定义用于加密每个成员发送的广播消息加入群集的密码。 在这里选择一个强大的密码。
  • network> port :标识用于自动发现节点的端口。 auto-increment属性指示机制从定义的端口开始,如果该端口正在使用,则继续尝试其他端口。 通过将其设置为false,定义的端口将用于通信,如果端口已在使用中,则节点发现将失败。 对于本文,该属性将被禁用。
  • join>组播元素用于定义IP组​​播参数。 您将不会使用IP多播,因此我们将忽略它们。 这意味着我们将enabled属性设置为false。

  • join> tcp-ip :用于定义与TCP / IP集群相关的参数。 enabled属性用于启用它。

  • join> tcp-ip> member :定义集群的每个成员。 还有其他方法来指定每个成员,但是我们将坚持指定每个成员的IP地址(每行一个)。

完成修改文件后,最终版本将如下所示:

/opt/orientdb/config/hazelcast.xml
. . .
    <group>
        <name>clusterName</name>
        <password>clusterPassword</password>
    </group>
    <properties>    
        . . .
    </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>your_master_server_ip_1</member>
                <member>your_master_server_ip_2</member>
                <member>your_replica_server_ip</member>
            </tcp-ip>
        </join>
    </network>

保存并关闭文件,当您进行编辑时。 接下来是我们列表中的第二个文件。

修改default-distributed-db-config.json文件

hazelcast.xml ,我们将对/opt/orientdb/config/default-distributed-db-config.json进行一些/opt/orientdb/config/default-distributed-db-config.json 您在此文件中指定每个服务器必须在集群中播放的角色(主节点或副本)。

打开它进行编辑。

sudo nano /opt/orientdb/config/default-distributed-db-config.json

文件的相关部分显示在下面的代码块中:

/opt/orientdb/config/default-distributed-db-config.json
{
  "autoDeploy": true,
  "readQuorum": 1,
  "writeQuorum": "majority",
  "executionMode": "undefined",
  "readYourWrites": true,
  "newNodeStrategy": "static",
  "servers": {
    "*": "master"
  },
  . . . 
}

以下是每行的含义:

  • autoDeploy :指定是否将数据库部署到集群中尚未拥有的新节点。
  • readQuorum :在读取操作上回复客户端之前需要一致的集群节点的响应次数。 将其设置为“1”将禁用读取一致性。
  • writeQuorum :在写入操作时,在向客户端发送回复之前需要响应多少个节点。 默认值为多数 ,它使用(N / 2)+ 1计算 ,其中N是集群中可用主节点的数量。 在计算大多数时,不考虑复制节点。 如果在仅具有两个主节点的群集中保留默认值,则如果其中一个节点关闭,则法定人数将永远不会形成。
  • executionMode :定义客户端的执行模式 - 同步或异步。 默认值允许客户端决定。
  • readYourWrites :指定节点的响应是否计数达到写入定额。
  • newNodeStrategy :当新节点加入集群时会发生什么。 使用默认值,节点将自动注册在服务器列表下。

我们将添加以下参数:

  • hotAlignment :指定如果节点关闭然后重新联机,会发生什么。 如果启用,则当节点脱机时,同步消息将保留在分布式队列中。 当它回到在线时,通过轮询队列中的所有同步消息来启动同步阶段。
  • servers :用于指定集群中节点的角色(主节点或副本节点)。 默认情况下,使用星号*表示服务器中的所有节点都是主节点。 因为我们打算构建一个包含两个主器件和一个副本的集群,所以我们将通过指定每个节点的名称和集群中的角色来修改此参数进行匹配。 名称是您在第1步中配置的。

完成修改文件后,应该如下所示:

/opt/orientdb/config/default-distributed-db-config.json
{
  "replication": true,
  "hotAlignment" : true,
  "autoDeploy": true,
  "readQuorum": 1,
  "writeQuorum": "majority",
  "executionMode": "undefined",
  "readYourWrites": true,
  "newNodeStrategy": "static",
  "servers": {
    "orientdb_server_name_1": "master",
    "orientdb_server_name_2": "master",
    "orientdb_server_name_3": "replica"
  },

  ...

}

完成后保存并关闭文件。 我们现在将配置我们列表中的最后一个文件。

修改orientdb-server-config.xml文件

/opt/orientdb/config/orientdb-server-config.xml是用于在OrientDB中使用Hazelcast内存数据网格来启用或禁用群集的参数。 您可以在此文件中修改您在第1步中给予OrientDB实例(或具有脚本自动生成)的名称。

打开它进行编辑。

sudo nano /opt/orientdb/config/orientdb-server-config.xml

文件的相关部分如下所示,朝向文件的顶部。 请注意, NodeName参数的值是您在第1步中指定的值:

/opt/orientdb/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" na$
        <parameter value="${ORIENTDB_HOME}/config/hazelcast.xml" name="configuration.haz$
        <parameter value="orientdb_server_name_1" name="nodeName"/>
    </parameters>
</handler>
. . .

要启用群集,请将enabled参数更改为true 编辑完毕后,最终版本如下所示:

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

完成编辑文件后,保存并关闭它。

在我们开始和测试集群之前,剩下的唯一的事情是允许OrientDB的流量通过防火墙。

第3步 - 允许通过防火墙的OrientDB流量

如果您现在尝试启动群集,OrientDB的流量将被您的防火墙阻止。 我们添加规则以允许流量通过以下端口:

  • 2424 ,用于二进制通信
  • 2434 ,用于交换集群通信

打开端口24242480

sudo ufw allow 2424
sudo ufw allow 2434

注意 :端口2480用于访问应用程序Web界面的OrientDB Studio。 这使用HTTP,因此它不安全,不应该暴露给公共Internet。 但是,如果要在测试设置中允许此端口上的流量,可以通过以下方式进行:

sudo ufw allow 2480

接下来,重启UFW。

sudo systemctl restart ufw

OrientDB已经从先决条件设置为Systemd服务,因此现在其余的配置已经完成,我们可以启动集群。

第4步 - 启动和测试OrientDB群集

在每个服务器上,确保服务已启用,以便在启动时启动。

sudo systemctl enable orientdb

现在可以启动所有三个服务器。 启动的第一个服务器(即第一个加入集群)成为协调服务器 ,这是分布式操作启动的地方。 如果您希望特定服务器具有此角色,请先启动该角色。

sudo systemctl start orientdb

检查进程状态以验证它们是否正确启动。

sudo systemctl status orientdb

你会看到如下输出:

● orientdb.service - OrientDB Server
   Loaded: loaded (/etc/systemd/system/orientdb.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2017-06-01 02:45:53 UTC; 7s ago

如果服务器没有启动,请在输出中查找线索。 潜在的错误来源包括没有足够的RAM,没有安装Java JRE,或验证失败的修改的JSON文件。 如果对第2步中的任何文件进行更改,请记住重新启动OrientDB。

一旦进程正确运行,我们来测试一下该集群是否正常运行。 在三个节点中的任何一个节点上,过滤与集群相关的syslog条目:

sudo tail -f /var/log/syslog | grep -i dserver

使用该命令,您将看到类似于下面的输出,表示集群的所有成员都处于联机状态。 星号表示哪个主机是协调器服务器。

-------------------+------+------------------------------------+-----+---------+-------------------+
|Name              |Status|Databases                           |Conns|StartedOn|Binary                    |
-------------------+------+------------------------------------+-----+---------+-------------------+
|orientdb-replica-1|ONLINE|GratefulDeadConcerts=ONLINE (MASTER)|4    |01:26:00 |111.111.111.111
|orientdb-master-2 |ONLINE|GratefulDeadConcerts=ONLINE (MASTER)|4    |01:25:13 |222.222.222.222
|orientdb-master-1*|ONLINE|GratefulDeadConcerts=ONLINE (MASTER)|6    |01:24:46 |333.333.333.333

这是一个好兆头,因为如果服务器及其数据库处于联机状态,则群集功能正常的机会很高。 当您从下面的控制台连接到其中一个数据库时,您还将看到类似的输出,但有更多信息。 您可以点击CTRL+C来停止此输出。

要验证集群中新数据的数据复制,您需要在一个服务器上生成一些数据,然后查看是否将其复制到其他服务器上。 在其中一台主服务器上 ,使用以下命令启动控制台:

cd /opt/orientdb/bin
sudo ./console.sh

最后一个命令应该在启动控制台时给出以下输出,将提示更改为orientdb>

OrientDB console v.2.2.17 (build UNKNOWN@r98dbf8a2b8d43e4af09f1b12fa7ae9dfdbd23f26; 2017-02-02 07:01:26+0000) www.orientdb.com
Type 'help' to display all the supported commands.
Installing extensions for GREMLIN language v.2.6.0

orientdb> 

现在连接到OrientDB服务器实例。 此命令仅使用root用户帐户连接到服务器上运行的OrientDB实例,而不是任何数据库。 密码是您在第3步中创建的密码:

connect remote:localhost root root-password

接下来,我们创建一个名为CallMeMaybe的数据库:

create database remote:localhost/CallMeMaybe root root-password plocal

如果数据库成功创建,您将连接到该数据库,并且您的提示符应更改为匹配。

注意 :如果您收到“Permission denied”或类似的错误,请检查/opt/orientdb/databases目录下的权限。 从控制台创建数据库的帐户应该具有该文件夹的读写权限。 您可以在此Linux权限教程中了解更多信息。

现在, CallMeMaybe仍然是一个空数据库。 只需要有一些测试数据,让我们添加一个类:

create class Artist

然后在其中插入一条记录:

insert into Artist (id, name, age) values (01,'sammy', 35)

检查新数据库现在是否保存刚刚插入的记录:

select id, age, name from Artist

如果一切顺利,输出应该类似于:

+----+----+----+------+
|#   |id  |age |name  |
+----+----+----+------+
|0   |1   |35  |sammy |
+----+----+----+------+

1 item(s) found. Query executed in 0.216 sec(s).

您现在可以退出控制台。

exit

此验证过程的最后一步是登录到集群中的另一个节点,并尝试查询新数据库以查看数据是否已成功传播。

ssh sammy@another_orientdb_server_ip

像以前一样启动控制台。

cd /opt/orientdb/bin
sudo ./console.sh

admin身份连接到数据库,这是任何新的OrientDB数据库的默认用户和密码。

connect remote:localhost/CallMeMaybe admin admin

执行与以前相同的查询。

select id, age, name from Artist 

输出应该与之前的服务器相同 - 因为它应该是因为您在一组服务器上执行查询。 您现在可以退出控制台。

exit

这确认您的三节点集群正常运行。

结论

您已经设置了一个由三个服务于不同角色的节点(主节点或副本)组成的OrientDB群集。 使用这样的设置,更改节点数很容易。 什么会更容易,更有趣,更少的任务将使用配置管理工具,如Ansible自动化这样的集群的部署。

现在,您可能想要做的是查阅此OrientDB安全指南 ,了解如何保护群集中的每个节点。 有关OrientDB管理的官方文档可在项目文档站点获取,有关Hazelcast的更多信息,请访问Hazelcast文档