在SolrCloud中处理碎片


你在参加时学到的一件事是Sematext Solr training是如何缩放Solr。我们讨论了关于领导者碎片及其复制品的各种话题——比如什么时候去寻找更多的领导者,什么时候去寻找更多的复制品,以及什么时候两者都去。我们讨论你能对他们做什么,如何控制他们的创作,以及如何与他们合作。我想把重点放在上面提到的一个方面:在SolrCloud中处理副本创建。请注意,虽然这并不局限于码头工人的部署;如果您正在考虑在Docker容器中运行Solr,您将需要注意这一点。

基础知识

在SolrCloud中创建集合时,我们可以调整创建命令。有些参数是强制的,但有些参数有默认值,可以被覆盖。我们感兴趣的两个主要参数是碎片数量和复制因子。前者告诉Solr如何划分藏品——我们的藏品将被分成多少不同的部分(碎片)。例如,如果我们说我们想要四个碎片,Solr会将集合分成四个部分,每个部分包含大约25%的文档。另一方面,复制因素决定了每个碎片将拥有的物理副本的数量。因此,当复制因子设置为1时,将只创建前导碎片;如果复制因子设置为2,则每个领导者将有一个副本;如果复制因子设置为3,每个领导者将有两个副本;等等。

默认情况下,Solr会将集合的一个碎片放在给定的节点上。如果我们想要比我们在SolrCloud集群中的节点数量更多的碎片,我们需要调整行为,这也可以通过使用集合应用编程接口来实现。当然,Solr将尝试在集群中均匀分布碎片,但是我们也可以通过告诉Solr应该在哪个节点上创建碎片来调整这种行为。

接下来让我们看看这个。为了向您展示所有这些是如何工作的,我将使用码头工人和码头工人作曲。我将推出四个带有SolrCloud的容器和一个带有ZooKeeper的容器。我将使用以下内容docker-constitution . yml文件:

version: "2"
services:
 solr1:
  image: solr:6.2.1
  ports:
   - "8983:8983"
  links:
   - zookeeper
  command: bash -c '/opt/solr/bin/solr start -f -z zookeeper:2181'
 solr2:
  image: solr:6.2.1
  links:
   - zookeeper
   - solr1
  command: bash -c '/opt/solr/bin/solr start -f -z zookeeper:2181'
 solr3:
  image: solr:6.2.1
  links:
   - zookeeper
   - solr1
   - solr2
  command: bash -c '/opt/solr/bin/solr start -f -z zookeeper:2181'
 solr4:
  image: solr:6.2.1
  links:
   - zookeeper
   - solr1
   - solr2
   - solr3
  command: bash -c '/opt/solr/bin/solr start -f -z zookeeper:2181'
 zookeeper:
  image: jplock/zookeeper:3.4.8
  ports:
   - "2181:2181"
   - "2888:2888"
   - "3888:3888"

通过运行以下命令启动所有容器:

$ docker-compose up

命令需要在相同的目录中运行docker-constitution . yml文件已找到。完成后,我们应该会在SolrCloud集群中看到以下节点:

solrcloud-handling-replication-nodes

为了创建一个集合,我们需要上传一个配置。我将使用Solr默认提供的配置之一,并使用以下命令将它们上传到ZooKeeper:

$ docker exec -it --user solr 56a02fb8d997 bin/solr zk -upconfig -n example -z zookeeper:2181 -d server/solr/configsets/data_driven_schema_configs/conf

56a02fb8d997是第一个Solr容器的标识符。顺便说一句,如果你不熟悉索尔和多克,我们鼓励你看看我们2016年朗讯革命演讲的幻灯片,How to Run Solr on Docker and Why。视频也将很快推出。

我们终于可以开始创作收藏品了。让我们尝试创建一个由四个主要碎片组成的集合。这很简单,我们只需运行:

$ curl 'localhost:8983/solr/admin/collections?action=CREATE&name=primariesonly&numShards=4&replicationFactor=1&collection.configName=example'

命令执行后,集合视图应该如下所示:

solrcloud-handling-replication-primariesonly

当然,我们可以创建分成更少前导碎片的集合,但使用副本:

$ curl 'localhost:8983/solr/admin/collections?action=CREATE&name=primariesandreplicas&numShards=2&replicationFactor=2&collection.configName=example'

solrcloud-handling-replication-primariesandreplicas

我们将拥有比节点更多的碎片:

$ curl 'localhost:8983/solr/admin/collections?action=CREATE&name=primariesandreplicasmore&numShards=4&replicationFactor=2&maxShardsPerNode=2&collection.configName=example'

solrcloud-handling-replication-primariesandreplicasmore

这里的关键点是:一旦你创建了一个集合,你可以添加更多的副本,但是前导碎片的数量将保持不变。即使我们使用的是复合路由器,如果我们不分割碎片,这种说法也是正确的。那么,我们怎样才能添加更多的副本呢?让我们来看看。

手动添加副本

第一个想法是通过指定我们感兴趣的集合和碎片以及应该在哪里创建副本来手动添加副本。让我们看看使用以下命令创建的集合:

$ curl 'localhost:8983/solr/admin/collections?action=CREATE&name=manualreplication&numShards=2&replicationFactor=1&collection.configName=example'

solrcloud-handling-replication-manualreplication

要添加副本,我们需要说明新副本应该放在哪个节点上,应该复制哪个碎片。让我们尝试为shard1创建一个副本,并将其放在172.19.0.3。为此,我们运行以下命令:

$ curl 'localhost:8983/solr/admin/collections?action=ADDREPLICA&collection=manualreplication&shard=shard1&node=172.19.0.3:8983_solr'

执行上述命令并等待恢复过程完成后,我们将看到集合的以下视图:

solrcloud-handling-replication-manualreplicationreplica

当然,您可能会问从哪里获取节点名。您可以从/live_nodes动物园管理员中的节点:

solrcloud-handling-replication-live_nodes

请记住,指定节点名称不是强制性的。我们实际上可以让Solr为我们选择节点。但是,当我们添加机器时,我们仍然需要手动添加副本。这能改变吗?自动化?

自动添加副本

当SolrCloud在共享文件系统上工作时,可以自动创建新的副本。我们通过添加自动地址复制=真集合创建命令,如下所示:

$ curl 'localhost:8983/solr/admin/collections?action=CREATE&name=autoadd&numShards=2&replicationFactor=1&autoAddReplicas=true'

在共享文件系统上,Solr将自动创建副本。遗憾的是,当Solr不在共享文件系统上运行时,当向群集添加新节点时,无法自动扩展Solr集合。

控制碎片放置

我们之前提到过,我们可以在创建集合时分配碎片。我们可以用半手工的方式或者用规则来做。半手工方式非常简单。例如,让我们创建一个仅放置在节点172.19.0.3和172.19.0.4上的集合。我们可以通过运行以下命令来做到这一点:

$ curl 'localhost:8983/solr/admin/collections?action=CREATE&name=manualplace&numShards=2&replicationFactor=1&createNodeSet=172.19.0.3:8983_solr,172.19.0.4:8983_solr'

生成的集合如下所示:

solrcloud-handling-replication-manual_create

我们能做的不止这些。我们可以定义Solr用来将碎片放入我们的SolrCloud集群的规则。规则有三个可能的条件,要将副本分配给给定的节点,应该满足这些条件。这些条件是:

  • 碎片,碎片或通配符的名称;告诉Solr规则应该应用于哪些碎片;如果不提供,它将用于所有碎片。
  • 复制品,从零到无穷大的通配符或数字。
  • 标记,节点的一个属性,它应该在规则中匹配。

还有一些规则操作符,包括:

  • 例如,相等标签:xyz,这意味着标记属性必须等于xyz。
  • >(大于),这意味着属性的值必须高于提供的值。
  • <(小于),这意味着属性的值必须低于提供的值。
  • ,表示不相等,这意味着属性的值必须不同于提供的值。

我们将很快看到如何使用这些规则和操作符。

为了充分利用上述规则和运算符,我们需要了解告密者。告密者是来自实现告密者接口的插件的值。索尔提供了一些现成的例子:

  • 核心,节点中的核心数量。
  • 自由磁盘,节点上可用的磁盘空间(以GB为单位)。
  • 主机,节点工作所在的主机的名称。
  • 端口,节点的端口。
  • 节点,节点名称。
  • 角色,节点的角色;在撰写本文期间,这里唯一可能的值是“监督”
  • ip_1,ip_2,ip_3,ip_4,部分IP地址(例如,在172.19.0.2,该ip_1存在2,ip_2存在0,ip_3存在19ip_4存在172)。
  • sysprop。属性名,由提供的属性名-Dkey =值在节点启动期间。

我们在创建集合时配置告密者。

例如,要创建一个集合,并且仅将碎片放在至少有30GB磁盘空间的节点上,并且其IP地址以172开头,以4结尾,我们将使用以下集合创建命令:

$ curl 'localhost:8983/solr/admin/collections?action=CREATE&name=rulescollection&numShards=4&replicationFactor=1&maxShardsPerNode=4&rule=shard:*,replica:*,ip_1:4&rule=shard:*,replica:*,ip_4:172&rule=shard:*,replica:*,freedisk:>30'

创建的集合如下所示:

solrcloud-handling-replication-rulescollection

这些规则被保存在动物园管理员中,并将应用于每个碎片。这意味着在副本放置和碎片分割期间,Solr将使用存储的规则。此外,我们可以通过使用集合修改命令来修改规则。

摘要

如您所见,在碎片创建方面,我们有很多可能性,从简单的控制到基于开箱即用的价值和提供我们自己的能力的复杂规则。对我来说,规则是Solr中缺失的功能,我在SolrCloud还年轻的时候就在寻找它。我希望它能被越来越多的用户所了解。