如何在Ubuntu16.04上配置OrientDB集群
介绍
OrientDB 是一个多模型 NoSQL 数据库,支持图形和文档数据库。 它是一个 Java 应用程序,可以在任何操作系统上运行。 它还完全符合 ACID 标准,支持多主集群和复制,可以轻松进行水平扩展。
但是,OrientDB 中的“集群”一词可以指两个不同的概念:
- 您可以拥有一个 OrientDB 节点 集群,它们是运行 OrientDB 的服务器。 这意味着使用至少一台物理(或云)服务器,因为一台服务器上可以运行多个 OrientDB 实例。
- 您还可以在 OrientDB 数据库 中拥有一个集群,它是一组相似类型或值的记录。 这样的集群也可以存在于多台服务器上或仅限于一台服务器。
本文的重点是第一种集群,即 节点集群。 在集群模式下,OrientDB 运行在多主或无主分布式架构中,这意味着集群中的每个节点都在平等的基础上运行,并且能够读取/写入彼此的记录。 但是,节点也可以作为 副本 加入集群,它在只读模式下运行。
在本教程中,您将使用 OrientDB 的社区版设置一个包含两个主节点和一个副本节点的三节点集群。
先决条件
要遵循本教程,您将需要:
- 三台具有足够 RAM 的 Ubuntu 16.04 服务器来支持集群。 这将根据您的需求和您自定义 OrientDB 的方式而有所不同,但每个 4GB 是一个很好的默认值。
- 使用 this Initial Server Setup with Ubuntu 16.04 教程 在每台服务器 上设置 sudo 非 root 用户帐户和防火墙 。
- Java 必须安装在所有服务器上,您可以按照 本 Java 安装指南 的 JDK 8 步骤进行操作。 OpenJDK JRE 也可以使用,因此如果您不想接受 Oracle 许可,可以使用相同的教程安装默认 JRE。
- OrientDB 在每台服务器 上安装 ,完全按照单服务器 OrientDB 安装指南 的 步骤 1 进行操作。 您也可以选择按照步骤 2 来限制必要的 RAM 数量; OrientDB 分布式启动脚本预计至少有 4 GB 的可用 RAM,如果发现更少,将无法启动,除非您更改此设置。
- 按照单服务器OrientDB安装指南的步骤5和6,在每台服务器上将OrientDB设置为Systemd服务,重新加载单元后停止(即 不启动服务)。 您需要做的唯一更改是您在单元文件中为
ExecStart
提供的文件。 原始教程使用server.sh
,但这里使用dserver.sh
用于分布式模式。
第 1 步 - 生成 Root 密码和 OrientDB 实例名称
首先,我们将运行分布式服务器脚本 dserver.sh
来生成 OrientDB 实例在集群中运行所需的凭据。 具体来说,这将让我们为 OrientDB 的实例设置 root 密码和名称。 您需要在 所有三台服务器 上执行此步骤。
首先,导航到安装目录。
cd /opt/orientdb
然后启动分布式服务器。
sudo bin/dserver.sh
首次启动分布式服务器时,系统会提示您为 root 用户帐户指定密码。 这是一个内部 OrientDB 帐户,将用于访问服务器,例如 OrientDB Studio、用于管理 OrientDB 的基于 Web 的界面,以及从控制台连接到 OrientDB。 如果您未在此处指定密码,则会自动生成密码。 但是,最好自己指定一个,因此在出现以下提示时这样做:
Output+---------------------------------------------------------------+ | 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 的实例设置一个名称,该名称可以与运行它的云服务器的名称相同。
Output+---------------------------------------------------------------+ | 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
脚本完成运行后,您将看到如下所示的一行:
Output2017-06-01 02:24:00:717 INFO OrientDB Server is active v2.2.20 (build 76ab59e72943d0ba196188ed100c882be4315139). [OServer]
此时,您可以使用 CTRL+C
终止进程。 现在已经安装了 OrientDB,我们需要修改几个配置文件,让它作为集群运行。
第 2 步 — 将 OrientDB 配置为在分布式模式下运行
要将 OrientDB 安装为集群中的节点,需要修改其 config
目录中的三个文件。 他们是:
hazelcast.xml
:此文件中定义的参数使自动发现节点成为可能。default-distributed-db-config.json
:此文件仅供分布式环境使用,用于定义每个数据库节点的行为。orientdb-server-config.xml
:这是OrientDB的主要配置文件,无论是分布式还是独立模式都需要修改。
我们将在此步骤中修改每个文件,从 hazelcast.xml
开始。
修改 hazelcast.xml
文件
您必须在 hazelcast.xml
中配置的最重要设置是每个节点用于加入集群的机制。 我们将在本节中考虑的两种机制是 IP Multicast 和 TCP/IP-cluster。 使用前者,您指定每个节点将用于自动发现其所属网络的多播地址和端口。 对于后者,必须指定每个集群成员的 IP 地址。 因为 DigitalOcean 不支持 IP 多播,所以我们将在这里使用 TCP/IP-cluster 方法。
首先,打开文件进行编辑:
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 > multicast 元素用于定义 IP 多播参数。 您不会使用 IP 多播,因此我们将忽略它们。 这意味着我们将
enabled
属性设置为 false。 - join > tcp-ip:用于定义 TCP/IP-cluster 相关参数。
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
进行一些修改。 您可以在此文件中指定每个服务器在集群中必须扮演的角色(主服务器或副本服务器)。
打开它进行编辑。
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:在写操作时,需要多少个节点响应才能向客户端发送回复。 默认为 majority,使用 (N/2) + 1 计算,其中 N 是集群中可用的主节点数。 计算多数时不考虑副本节点。 如果在只有两个主节点的集群中保留默认设置,则如果其中一个节点出现故障,将永远不会形成仲裁。
- executionMode:定义客户端的执行模式——同步或异步。 默认让客户决定。
- readYourWrites:指定节点的响应是否计入写入仲裁。
- newNodeStrategy:当一个新节点加入集群时会发生什么。 使用默认值,节点会自动注册到服务器列表下。
我们将添加以下参数:
- hotAlignment:指定如果一个节点宕机然后又重新上线会发生什么。 如果启用,当节点离线时,同步消息将保存在分布式队列中。 当它重新联机时,它通过轮询队列中的所有同步消息来开始同步阶段。
- servers:用于指定集群中节点的角色(master或replica)。 默认情况下,星号
*
用于表示服务器中的所有节点都是主节点。 因为我们打算构建一个包含两个主节点和一个副本的集群,所以我们将通过指定每个节点的名称及其在集群中的角色来修改此参数以匹配。 该名称是您在步骤 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
,用于交换集群通信
打开端口 2424
和 2480
。
sudo ufw allow 2424 sudo ufw allow 2434
注:端口2480
用于访问OrientDB Studio,应用程序的Web界面。 这使用 HTTP,因此它不安全,不应该暴露在公共互联网上。 但是,如果您想在测试设置中允许此端口上的流量,您可以这样做:
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
您将看到如下所示的输出:
Output● 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
使用该命令,您将看到类似于下面的输出,表明集群的所有成员都在线。 星号指示哪个主服务器是协调服务器。
Output-------------------+------+------------------------------------+-----+---------+-------------------+ |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>
。
OutputOrientDB 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
如果数据库已成功创建,您将连接到它,并且您的提示应更改为匹配。
注意:如果出现“权限被拒绝”或类似错误,请检查/opt/orientdb/databases
目录的权限。 从控制台创建数据库的帐户应该对该文件夹具有读写权限。 你可以在这个Linux权限教程中了解更多。
现在,CallMeMaybe
仍然只是一个空数据库。 为了获得一些测试数据,让我们为其添加一个类:
create class Artist
然后在其中插入一条记录:
insert into Artist (id, name, age) values (01,'sammy', 35)
检查新数据库现在是否包含您刚刚插入的记录:
select id, age, name from Artist
如果一切顺利,输出应该类似于:
Output+----+----+----+------+ |# |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 文档 。