点燃基线拓扑 (blt) 表示群集中的一组服务器节点, 这些服务器节点将数据保留在磁盘上。
n1-2 和 n5 服务器节点是具有本机持久性的点燃群集的成员, 这使得数据能够保存在磁盘上。n3-4 和 n6 服务器节点是点燃群集的成员, 但不是基线拓扑的一部分。
基线拓扑中的节点是常规服务器节点的一部分, 该节点将数据存储在内存和磁盘上, 并且还参与计算任务。点燃群集可以具有不属于基线拓扑的不同节点, 例如:
-
在点燃本机持久性中未用于在磁盘上保留数据的服务器节点。通常, 它们将数据存储在内存中或将数据保存到第三方数据库或 nosql。在上述均衡中, 节点 n3 或 n4 可能是其中之一。
-
不存储共享数据的客户端节点。
为了更好地理解基线拓扑概念, 让我们从一开始就开始, 试着了解它帮助我们解决的问题。
像《点火 “这样的数据库旨在支持海量数据存储和处理。点燃数据库具有高度的可扩展性和容错能力。点燃的这一高可伸缩性功能给数据库管理员带来了一些挑战, 例如: 如何管理群集?如何正确删除节点或如何在加载项删除节点后重新平衡数据?因为具有多个节点的点燃群集会显著增加数据基础结构的复杂性。让我们看一下 apache 点火器的示例。
“在内存中的点燃” 模式群集作为一个概念非常简单。群集中没有主节点或专用节点, 并且每个节点都是相等的。每个节点存储一个分区子集, 可以加入分布式计算或部署在任何服务上。在任何节点发生故障的情况下, 用户请求由其他节点提供服务, 并且失败节点的数据将不再可用。点燃群集管理操作非常相似, 如下所示:
-
若要运行群集, 请启动所有节点。
-
若要展开群集拓扑, 请添加一些节点。
-
若要减少群集拓扑, 请删除一些节点。
这篇文章的一部分是从《阿帕奇点燃》一书中提取的。如果它让你感兴趣, 请查看这本书的其余部分, 了解更多有用的信息。
数据在节点之间自动重新分配。根据缓存的备份副本配置, 数据分区从一个节点移动到另一个节点。
在持久性模式下, 节点即使在重新启动后也保持其状态。在任何读取操作过程中, 都会从磁盘读取数据并恢复节点状态。因此, 与内存中模式不同, 在持久性模式下重新启动节点不需要将数据从一个节点重新分发到另一个节点。节点故障期间的数据将从磁盘还原。这种策略提供了一个机会, 不仅可以防止在节点故障期间移动大量数据, 还可以减少重新启动后整个集群的启动时间”点燃基线拓扑” 提供了此功能。
简而言之, 点燃基线拓扑是为在磁盘上存储持久性数据而配置的节点的集合。基线拓扑跟踪拓扑更改的历史记录, 并防止在恢复过程中群集中的数据差异。让我们刷新对基线拓扑目标的记忆:
-
如果节点正在重新启动, 请避免冗余数据重新平衡。
-
在群集重新启动后, 基线拓扑的所有节点都加入后自动激活群集。
-
防止在分裂大脑的情况下数据不一致。
apache ignite 提供了一个命令行 (cli) 工具, 允许您监视和管理群集基线拓扑。在本文中, 我们将在此工具中回顾使用点燃持久性时基线拓扑管理的几种常见方案。
在 apache 点燃分发目录的/bin文件夹下可以找到. /conl . sh 命令行脚本。此脚本 (工具) 的主要目标是激活/停用和管理表示基线拓扑的一组节点。但是, 此工具是一个多用途工具, 可用于监视缓存状态或检测整个群集中可能发生的任何事务锁。
正在准备沙箱正如我们之前所说, 运行该工具的脚本位于{ignite _ home}/bin文件夹中, 并称为co. sh。有 unix (控制. sh) 和 windows (控制. bat) 的脚本版本。为了演示目的, 我将使用以下配置:
名字 |
描述 |
操作系统 |
macos, 您可以根据自己的选择使用 windows 或 linux 操作系统。 |
点燃版 |
2.6.0 或以上。 |
点燃节点的数量 |
单个主机中的3个节点。 |
Jvm |
1。8 |
tcp 发现 |
组 播 |
步骤 1。我们将在单个主机的持久性模式上运行三个点燃节点。默认情况下, “点燃” 会在 ignitr _ home 文件夹下创建一个工作目录, 用于存储 wal 存档和日志文件。下载 “点燃” 分发, 并将其解存档于操作系统上的3个不同目录中, 以获取 example/usr/ignite/2.6.0-s1、/usr/ignite/2.6.0-s2/usr/ignite/2.6.0-s3。您应该有一个类似的文件夹层次结构, 如图4所示。
请注意, 这是在单个主机中运行具有持久性启用功能的几个节点的最简单方法, 而无需任何额外的配置。但是, 您可以配置 “点燃”, 这种方式允许您使用不同的 wal 存档文件夹运行几个点燃节点。
步骤 2。为了启用持久性存储, 我们在 spring 中使用了 “点燃数据存储” 配置。创建一个名为点火脚本 baselin. xml 的 xml 文件, 并在其中复制以下内容。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
<property name="cacheConfiguration">
<list>
<bean class="org
ignite.configuration.CacheConfiguration “& gt; & lt; 属性名称 =” 名称 “值 =” testcache “/& lt; 属性名称 =” 原子模式 “值 =” 原子模式 “=” atomic “& gt; & lt; 属性名称 =” 备份 “value=”1″/> & lt;/bean& gt; & lt;/列表 & gt; & lt;/属性 & gt; & lt;!–启用 apache 点燃持久存储。–& gt; & gt; & lt; 属性名称 = “数据存储配置” & gt; & lt; bean 类 = “org.apache.ignite.configuration.DataStorageConfiguration” & gt; & lt; 属性名称 = “默认数据区域配置” & gt; & lt; bean 类 = “org.apache.ignite.configuration.DataRegionConfiguration “& gt; & lt; 属性名称 =” 持久性 “值 =” true “/& gt; & lt; & lt; & t; & gt; & lt; & gt; & lt;/属性 & gt;” 属性 “值 =” true ”
& lt;/bean & gt; & lt; 属性 & gt; & lt; 属性名称 = “发现 spi” & gt; & lt; bean 类 = “org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi” & gt; & lt; bean 类 = “orghe.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder “& gt; & gt; & lt; 属性名称 =” 地址 “& gt; & lt; 列表 & & & & lt;value>127.0.0.1:47500..47509</value>
& lt;/list & gt; & lt; 属性 & gt; & lt;/属性 & gt; & lt;/& gt; & lt;/& gt; & gt; & gt; & lt;/bean & gt;
将文件保存在文件系统中的某个位置。
步骤 3。我们将从第一个点燃节点开始, 一次启动每个点燃服务器节点。打开终端, 并将 ignite _ home 目录更改为取消存档 “点燃” 节点1的 “点燃” 分发的文件夹。
export IGNITE_HOME=PATH_TO_THE_IGNITE_NODE_ONE/ignite/2.6.0-s1
现在, 使用以下命令启动第一个点燃节点:
ignite.sh /PATH_TO_THE_SPRING_CONFIG_FILE/ignite/ignite-book-baseline.xml
控制台上的输出应如下所示:
__________ ________________ / _/ ___/ |/ / _/_ __/ __/
_///(77 /// ///_/ /___/\___/_/|_/___/ /_/ /___/
ver. 2.6.0#20180710-sha1:669feacc
2018 Copyright(C) Apache Software Foundation
Ignite documentation: http://ignite.apache.org Quiet mode.
^-- Logging to file '/usr/ignite/2.6.0-s1/work/log/ignite-f0ef6ecc.0.log'
Topology snapshot [ver=1, servers=1, clients=0, CPUs=8, offheap=3.2GB, heap=1.\
^-- Node [id=F0EF6ECC-D692-4862-9414-709039FE00CD, clusterState=INACTIVE] Data Regions Configured:
^-- default [initSize=256.0 MiB, maxSize=3.2 GiB, persistenceEnabled=true]
检查日志显示在控制台上。日志消息确认我们的第一台点燃服务器已启动并运行, 并且已启用持久性模式。现在, 对第二个点燃节点再次执行相同的操作。
export IGNITE_HOME=PATH_TO_THE_IGNITE_NODE_ONE/ignite/2.6.0-s2
ignite.sh /PATH_TO_THE_SPRING_CONFIG_FILE/ignite/ignite-book-baseline.xml
此时, 您可以看到第二个点燃节点在持久性模式下启动并加入到群集。您应该会在终端中看到非常相似的消息, 如下所示。
[16:13:35] >>> Ignite cluster is not active (limited functionality available). Use contro\ l.(sh|bat) script or IgniteCluster interface to activate.
[16:13:35] Topology snapshot [ver=2, servers=2, clients=0, CPUs=8, offheap=6.4GB, heap=2.\ 0GB]
[16:13:35] ^-- Node [id=6DB02F31-115C-41E4-BECC-FDB6980F8143, clusterState=INACTIVE] [16:13:35] Data Regions Configured:
[16:13:35] ^-- default [initSize=256
2 gib, 持久性已启用 = true]
点燃还警告说, 群集尚未激活, 您必须使用 conl. sh 脚本激活群集。让我们激活群集并创建几个用于存储数据的表。
步骤 4。在激活群集之前, 让我们考虑控制. sh 工具的特定功能。控件. sh 脚本当前支持以下命令:
命令 |
描述 |
–激活 |
此命令将群集切换到活动状态。在这种情况下, 如果群集中不存在基线拓扑, 则在激活群集期间将创建新的基线。新的基线拓扑将包括群集拓扑中所有连接的节点。 |
–停用 |
停用群集。在此状态下, 将提供有限的功能。 |
–状态 |
打印当前群集状态。 |
–基线 |
此命令旨在管理基线拓扑。当在没有任何参数的情况下使用此命令时, 它将打印当前群集基线拓扑信息。以下参数可用于此命令: 添加、删除、设置和版本。 |
若要调用特定命令, 请使用以下模式:
UNIX/LINUX/MacOS
$IGNITE_HOME/bin/control.sh <command> <args>
现在, 激活群集。运行以下命令:
$IGNITE_HOME/bin/control.sh
如果该命令成功, 您应该会在控制台中看到以下消息。
Control utility [ver. 2.6.0#20180710-sha1:669feacc] 2018 Copyright(C) Apache Software Foundation
User: shamim
--------------------------------------------------------------------------------
Cluster activated
此时, 您还可以使用–state 命令检查当前群集状态。状态命令应返回群集已激活的消息。
第5步.现在, 创建一个表并填充一些数据。我们使用 sq方林工具连接到群集。运行以下命令以启动 sqlline 工具:
sqlline.sh --color=true --verbose=true -u jdbc:ignite:thin://127.0.0.1/
创建一个名为 emp 的表, 并在表中插入1000行。使用以下 ddl 脚本创建 emp 表, 如下所示:
CREATE TABLE IF NOT EXISTS EMP
(
empno LONG, ename VARCHAR, job VARCHAR, mgr INTEGER, hiredate DATE,
sal LONG,
comm LONG,
deptno LONG,
CONSTRAINT pk_emp PRIMARY KEY (empno)
) WITH "template=partitioned,CACHE_NAME=EMPcache";
接下来, 使用 github 存储库中的 EMP_001.sql 脚本将1000个条目插入表中。
0: jdbc:ignite:thin://127.0.0.1/> !run /PATH_TO_THE_FILE/the-apache-ignite-book/chapters/\ chapter-10/baseline/EMP_001.sql
上述命令将1000个条目插入 emp 表或 empcache。使用 visor cli 工具可以查看整个群集中缓存的大小。在 ignitesor 控制台中运行命令缓存-a。该命令应返回以下输出, 如图5所示。
请看一列名为 size。此列阐明存储在每个节点中的条目数。在我们的示例中, 我们的一个节点包含504条目, 另一个节点包含496个条目到 empcache 缓存中。
第6步让我们启动另一个点燃节点。对于第三个点燃节点, 请再次执行与以前相同的操作。
export IGNITE_HOME=PATH_TO_THE_IGNITE_NODE_ONE/ignite/2.6.0-s3
ignite.sh /PATH_TO_THE_SPRING_CONFIG_FILE/ignite/ignite-book-baseline.xml
控制台上的日志应确认节点在持久性模式下成功启动。此外, 您应该在控制台上收到一条警告, 指出本地节点不包括在基线拓扑中, 并且不会用于持久性数据存储。现在, 我们可以使用–基线命令。让我们在没有任何参数的情况下运行该命令, 如下所示:
$IGNITE_HOME/bin/control.sh --baseline
输出可能如下所示:
shamim:~ shamim$ control.sh --baseline
Control utility [ver. 2.6.0#20180710-sha1:669feacc] 2018 Copyright(C) Apache Software Foundation
User: shamim --------------------------------------------------------------------------------
Cluster state: active
Current topology version: 6
Baseline nodes:
ConsistentID=1640f655-4065-438c-92ca-478b5df91def, STATE=ONLINE ConsistentID=d8b04bc3-d175-443c-b53f-62512ff9152f, STATE=ONLINE
--------------------------------------------------------------------------------
Number of baseline nodes: 2
Other nodes: ConsistentID=3c2ad09d-c835-4f4b-b47a-43912d04d30e
Number of other nodes: 1
上面的基线信息显示了群集状态、拓扑版本和具有一致 id 的节点, 这些 id 是基线拓扑的一部分, 以及那些不属于基线拓扑的节点。在这里, 基线节点的数量为 2, 基线由我们的第一个和第二个点燃节点组成。
有时, 在第一次群集激活期间, 可能会创建基线拓扑。在这种情况下,–基线命令将返回一条消息, 如 “找不到基线节点”。在此情况下, 停止第三个节点, 并等待几秒钟。然后使用数字群集拓扑版本手动设置基线拓扑, 如下所示:
control.sh --baseline version topologyVersion
在上面的命令中,将拓扑版本替换为实际的拓扑版本。您可以在任何点燃节点控制台中找到拓扑版本, 如下所示:
Topology snapshot [ver=6, servers=3, clients=0, CPUs=8, offheap=9.6GB, heap=3.0GB]
从控制台中选择最新的拓扑快照版本。
在此阶段, 第三个点燃节点不是基线拓扑的一部分。此节点将不用于持久性数据存储。这意味着, 如果我们创建任何新表并将数据插入其中, 该节点将不会存储新表的任何数据。让我们验证一下这个概念。
第7步.使用以下 ddl 脚本创建新的表 dept:
CREATE TABLE IF NOT EXISTS DEPT (
deptno LONG,
dname VARCHAR,
loc VARCHAR,
CONSTRAINT pk_dept PRIMARY KEY (deptno)
) WITH "template=partitioned,CACHE_NAME=DEPTcache";
此外, 使用 dept 插入100个部门。Sql。dept。sql 脚本可在github 存储库中使用。
0: jdbc:ignite:thin://127.0.0.1/> !run /PATH_TO_THE_FILE/github/the-apache-ignite-book/ch\ apters/chapter-10/baseline/DEPT.sql
现在, 在遮阳板控制台中运行命令缓存-a, 该控制台应打印如图6所示的类似输出。
但是, 不属于基线拓扑的节点可以参与任何内存中计算。
步骤 8。接下来, 让我们将新的空节点添加到基线拓扑中, 以保存持久性数据。调用命令-基线添加 & lt; 节点的一致性 id & gt; 以将新节点添加到现有基线。
control.sh --baseline add 3c2ad09d-c835-4f4b-b47a-43912d04d30e
在上面的命令中, 将一致的 id 3c2ad09d-c835-4f4b-b47a-43912d04d30 替换为第三个点燃节点的一致 id.完成–基线添加命令后, 将显示一条消息, 确认新的基线拓扑包含3个节点。
Cluster state: active
Current topology version: 10
Baseline nodes:
ConsistentID=1640f655-4065-438c-92ca-478b5df91def, STATE=ONLINE
ConsistentID=3c2ad09d-c835-4f4b-b47a-43912d04d30e, STATE=ONLINE
ConsistentID=d8b04bc3-d175-443c-b53f-62512ff9152f, STATE=ONLINE
-------------------------------------------------------------------------------- Number of baseline nodes: 3
Other nodes not found.
从3个节点形成新的基线拓扑后, 将立即进行数据重新平衡。新的空节点 (在我们的示例中, 它是第三个节点) 将从其他节点接收他的部分数据。如果再次在 “点燃 visor cli” 中运行缓存-a 命令, 则可以确认数据重新平衡。图7显示了在基线拓扑中添加第三个节点后数据重新平衡的结果。
现在, 每个节点存储缓存 empcache 的条目 (约300个条目) 的分区几乎均匀。但是, 如果其中一个基线拓扑节点重新启动, 会发生什么情况?让我们停止一个节点, 并尝试将一些数据插入表 emp。
步骤 9。通过点击关键 crtl + x 来停止第二个节点, 执行命令-基线, 而不使用任何参数来打印基线拓扑的状态。
control.sh --baseline
上面的命令将显示与下一条消息非常相似的当前基线拓扑状态:
--------------------------------------------------------------------------------
Cluster state: active
Current topology version: 11
Baseline nodes:
ConsistentID=1640f655-4065-438c-92ca-478b5df91def, STATE=OFFLINE
ConsistentID=3c2ad09d-c835-4f4b-b47a-43912d04d30e, STATE=ONLINE
ConsistentID=d8b04bc3-d175-443c-b53f-62512ff9152f, STATE=ONLINE
--------------------------------------------------------------------------------
Number of baseline nodes: 3
Other nodes not found
其中一个节点按预期脱机。现在, 尝试通过 sqlline 工具将一些数据插入 emp 表, 如下所示:
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (2009, 'Sall\ ie', 'Sales Associate', 96, null, 3619, 34, 78);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (2010, 'Cori\ ', 'Human Resources Manager', 65, null, 1291, 86, 57);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (2011, 'Myrt\ le', 'VP Quality Control', 88, null, 5103, 21, 48);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (2012, 'Ches\ ', 'Desktop Support Technician', 46, null, 6352, 29, 21);
您应该注意到, 一些插入语句失败, 出现了下一个代码段中显示的错误。
Caused by: class org.apache.ignite.internal.cluster.ClusterTopologyServerNotFoundExceptio\ n: Failed to map keys for cache (all partition nodes left the grid)
apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicSing \ leUpdateFuture.mapSingleUpdate(GridNearAtomicSingleUpdateFuture.java:562)
出现此错误的原因是我们的 emp 表没有备份副本。应存储数据的节点已停止, 并且 “点燃” 无法存储数据。若要避免这种情况, 请考虑使用一个备份的 cache/表。如果一个节点出现故障, 它将不会丢失任何数据。目前, 我们有几个选择:
·尽快重新启动脱机节点, 最大限度地减少停机时间, 以防止数据丢失。
·从基线拓扑中删除脱机节点, 然后重新平衡数据。
步骤 10。让我们从基线拓扑中删除脱机节点。执行以下命令:
control.sh --baseline remove 1640f655-4065-438c-92ca-478b5df91def
完成删除命令后, 基线拓扑发生了更改, 不包括已停止的节点。请注意, 通过从基线拓扑中删除某个节点, 您承认在该节点重新启动后将无法再使用存储在该节点上的数据。此时, 在对群集进行数据操作的过程中不会发生任何错误。您可以将新条目插入或更新缓存中的现有条目。
请注意, 在从基线中删除之前, 应断开要从基线拓扑中删除的节点的连接。否则, 将发生错误 “无法从基线中删除节点”, 指定必须在从基线中删除之前停止的节点。
除了拓扑管理外, 控件. sh 脚本还可用于监视和控制在点燃站点中详细记录的群集状态。因此, 有关详细信息, 请参阅 “点燃” 文档中的控制脚本部分。