如何正确地将额外的 SOLR 5 (vm) 节点添加到 SOLR Cloud
How to correctly add additional SOLR 5 (vm) nodes to SOLR Cloud
我有一个 SOLR / Zookeeper / Kafka 设置。每个都在不同的虚拟机上。
我已经成功 运行 这一切都使用两个 SOLR 4.9 虚拟机 (Ubuntu)
现在我希望构建两个 SOLR 5.4 虚拟机并使其再次运行。
本质上,"Upgrade by Replacement"
我有 "hacked" 我的问题的解决方案,但这让我很紧张。
首先,Zookeeper 运行宁。我关闭我的 SOLR 4.9 虚拟机并从 Zookeeper 中删除配置(不一定按那个顺序......;-))
现在,我根据 SOLR Wiki 上的 "Production Install" 说明启动了我的 'solr5' VM(和云模式下的 SOLR),并在其中安装了 SOLR 5.4。我还在 'solr6' 上安装了 5.4,但还没有 运行ning。
我在 'solr5' 机器上发出这个命令:
/opt/solr/bin/solr create -c fooCollection -d /home/john/conf -shards 1 -replicationFactor 1
我得到以下输出:
Connecting to ZooKeeper at 192.168.56.5,192.168.56.6,192.168.56.7/solr ...
Re-using existing configuration directory statdx
Creating new collection 'fooCollection' using command:
http://localhost:8983/solr/admin/collections?action=CREATE&name=fooCollection&numShards=1&replicationFactor=1&maxShardsPerNode=1&collection.configName=fooCollection
{
"responseHeader":{
"status":0,
"QTime":3822},
"success":{"":{
"responseHeader":{
"status":0,
"QTime":3640},
"core":"fooCollection_shard1_replica1"}}}
一切正常。我打开我的微服务,它将我所有的 SOLR 文档从 Kafka 泵入 'solr5'.
现在,我想将 'solr6' 添加到 collection。除了我的 hack(我将在后面描述)之外,我找不到其他方法来做到这一点。
我之前用来创建 collection 的命令出错,发现我的 collection 已经存在。
似乎没有 zkcli.sh 或 solr 命令可以执行我想要的操作。 api 命令中的 None 似乎也可以执行此操作。
有没有简单的方法告诉(SOLR?Zookeeper?)我想添加另一台机器到我的SOLR节点,请像第一个(solr5)一样配置它并开始复制数据?
也许我应该在发出创建命令时 运行 拥有两台机器?
如果有一些 "approved" 方法可以做到这一点,我将不胜感激,因为每次需要时,我都需要想出一个 "solution" 在 Prod 中执行相同类型的方法升级 SOLR。
现在开始我的技巧。请记住,我现在花了两天时间试图找到关于此的明确文档。请不要发火,我完全明白这不是做事的方式。至少,我希望这不是做事的方式......
- 从创建 collection 的位置复制 fooCollection 目录
命令把它放在 'solr5' (这是
/opt/solr/server/solr/fooCollection_shard1_replica1) 一样
在我的 'solr6' VM 上的位置。
- 对 collection 目录名进行合理的更改(变为
fooCollection_shard1_replica2)
- 在 core.properties 文件中进行看起来合乎逻辑的更改:
作为参考,这是由创建命令创建的 core.properties 文件。
#Written by CorePropertiesLocator
#Wed Jan 20 18:59:08 UTC 2016
numShards=1
name=fooCollection_shard1_replica1
shard=shard1
collection=fooCollection
coreNodeName=core_node1
这是我完成黑客攻击后 'solr6' 上文件的样子。
#Written by CorePropertiesLocator
#Wed Jan 20 18:59:08 UTC 2016
numShards=1
name=fooCollection_shard1_replica2
shard=shard1
collection=fooCollection
coreNodeName=core_node2
当我这样做并重新启动时 'solr6' 一切都变成了金色。 "Cloud" 网页在管理网页中看起来正确 - 当我将文档添加到 'solr5' 时,如果我直接从管理网页点击它,它们在 'solr6' 中可用。
如果有人能告诉我如何在没有像这样的 hack 的情况下实现这一点,我将不胜感激......或者如果这是这样做的正确方法......
=============================
回答@Mani 和建议的程序
谢谢 Mani - 我确实按照您的步骤非常仔细地尝试了这个。
最后,我从 collection 状态查询中得到了这个输出:
john@solr6:/opt/solr$ ./bin/solr healthcheck -z 192.168.56.5,192.168.56.6,192.168.56.7/solr5_4 -c fooCollection
{
"collection":"fooCollection",
"status":"healthy",
"numDocs":0,
"numShards":1,
"shards":[{
"shard":"shard1",
"status":"healthy",
"replicas":[{
"name":"core_node1",
"url":"http://192.168.56.15:8983/solr/fooCollection_shard1_replica1/",
"numDocs":0,
"status":"active",
"uptime":"0 days, 0 hours, 6 minutes, 24 seconds",
"memory":"31 MB (%6.3) of 490.7 MB",
"leader":true}]}]}
这是我一直在实验中发现的那种结果。核心将在其中一个 SOLR 虚拟机(我发出命令行以在其上创建 collection 的那个虚拟机)上创建,但我没有在另一个虚拟机上创建任何东西——这取决于您在下面的步骤,相信你也想过应该会发生吧?
此外,我会为任何阅读 5.4 的人指出,命令是 "healthcheck" 而不是 healthstatus。命令行马上给你看,没什么大不了的。
===============
更新 1 :: 手动添加第二个核心
如果我转到另一个 VM 并手动添加以下内容:
sudo mkdir /opt/solr/server/solr/fooCollection_shard1_replica2
sudo mkdir /opt/solr/server/solr/fooCollection_shard1_replica2/data
nano /opt/solr/server/solr/fooCollection_shard1_replica2/core.properties
(in here I add only collection=fooCollection and then save/close)
然后我在同一个虚拟机上重新启动我的 SOLR 服务器:
sudo /opt/solr/bin/solr restart -c -z zoo1,zoo2,zoo3/solr
我会发现第二个节点神奇地出现在我的管理控制台中。它将是一个 "follower"(即不是领导者)并且两者都将在云 UI.
中分支 "shard1"
我不知道这是不是 "the way" 但这是我目前找到的唯一方法。我将重现到那个点并尝试使用 Admin UI 看看我得到了什么。时机成熟时,这对我的 IT 人员来说会容易一些 - 如果可行的话。
===============
更新 2 :: 创建命令的轻微修改
@Mani -- 我相信我已经按照你的步骤取得了成功 - 就像很多事情一样,一旦你理解了它就很简单。
我重置了所有内容(删除了目录,清除了 zookeeper (rmr /solr),然后从头开始重新做了所有事情。
我稍微更改了 "create" 命令,因此:
./bin/solr create -c fooCollection -d /home/john/conf -shards 1 -replicationFactor 2
注意 "replicationFactor 2" 而不是 1。
突然间我确实在两个虚拟机上都有内核。
几个注意事项:
我发现仅通过使用 Zookeeper IP 地址以云模式启动 SOLR 5.4 服务器,我无法从状态调用中获得令人满意的结果。 Zookeeper 中的 "node" 尚未创建。
此时创建命令也失败了。
我发现解决这个问题的方法是使用 zkcli.sh 加载这样的配置:
sudo /opt/solr/server/scripts/cloud-scripts/zkcli.sh -cmd upconfig -confdir /home/john/conf/ -confname fooCollection -z 192.168.56.5/solr
当我在 运行 执行此命令后立即检查 Zookeeper 时,有一个 /solr/configs/fooCollection "path".
现在创建命令起作用了,我假设如果我想覆盖配置,我当时可以这样做,尽管我还没有尝试过。
我不确定在什么时候,但似乎我需要重新启动 SOLR 服务器(可能在创建命令之后)以便找到状态等的所有内容......我可能记错了,因为我'我已经经历过很多次了。如果在创建命令后有疑问,请尝试重新启动服务器。 (这可以是正确解析的 IP 地址或名称)
sudo /opt/solr/bin/solr restart -c -z zoo1,zoo2,zoo3/solr
sudo /opt/solr/bin/solr restart -c -z 192.168.56.5,192.168.56.6,192.168.56.7/solr
在对@Mani 推荐的程序进行这些细微修改后,我在不同的 VM 上分别获得了一个 Leader 和一个 "follower" - 在 /opt/solr/server/solr 目录(本例中为 fooCollection)中,我能够将数据发送到一个并通过管理控制台点击 IP 地址搜索另一个。
=============
变化
任何阅读本文的人可能想尝试的一件事就是在 Zookeeper 中制作另一个 "node"(例如 solr5_4)。
我试过了,效果很好。在任何你看到与 Zookeeper 整体相关联的 /solr chroot 的地方,你都可以用 /solr5_4 替换它。这将允许旧的 SOLR VM 在构建新的 SOLR 5.4 "environment" 时继续在 Prod 中运行,并且可以将相同的 Zookeeper VM 用于两者——因为不同的 chroot 应该保证没有交互或重叠。
同样,Zookeeper 中的 "node" 在您上传配置之前不会被创建,但是您需要像这样启动您的 SOLR 过程,否则您稍后会处于错误的上下文中。注意 "solr5_4" 作为 chroot。
sudo /opt/solr/bin/solr restart -c -z zoo1,zoo2,zoo3/solr5_4
完成测试后,solr5_4 "environment" 对 Prod 和 SOLR 4.x VM 和 Zookeeper "node" 的 solr 来说很重要。将负载均衡器指向新的 SOLR VM 并在用户根本没有注意到的情况下进行切换应该是一件相当简单的事情。
此策略适用于 SOLR 6、6.5、7 等。
此命令还可以添加 collections/cores。但是,solr 服务器必须先 运行ning。
http://192.168.56.16:8983/solr/admin/collections?action=CREATE&name=fooCollection&numShards=1&replicationFactor=2&collection.configName=fooCollection
==================
作为替换升级使用
如果不是很明显,这种技术(特别是如果在 Zookeeper 中使用 "new" chroot 之类的 /solr5_4 或类似的东西)让您可以奢侈地离开旧版本的 SOLR 运行宁多久都行。如果需要,允许 re-indexing 所有数据花费几天时间。
我没试过,但我猜索引的备份也可以放入新机器中。
我只是想让读者明白,这是一种旨在让升级真正轻松简单的方法。 (不需要就地升级,只需构建新的 VM 并安装最新版本的 SOLR。)
这将允许 switch-over 在不影响生产的情况下发生,直到您准备好放下锤子和 re-direct 您的负载均衡器在新的 SOLR ip 地址(您已经测试过当然...)
这里的一个假设是您有资源来启动一组 SOLR VM 或物理服务器,以匹配您在生产中已有的任何东西。显然,如果您 resource-limited 只使用您拥有的盒子或 VM,upgrade-in-place 可能是您唯一的选择。
这就是我要做的。我假设您有停机时间的奢侈并且有能力完全重新索引文档。由于您实际上是从 4.9 升级到 5.4。
- 停止 4.9 solr 节点并卸载 solr。
- 使用 zkcli.sh 和 clear 命令从 zk 节点删除配置。
- 在 solr5 和 solr6 vm 上安装 solr
- 启动两个 solr 节点并确保它们都可以与 zk 通信。 =>
在 solr5 vm ./bin/solr start -c -z zk1:port1,zk2:port1,zk3:port1
在 solr6 vm ./bin/solr start -c -z zk1:port1,zk2:port1,zk3:port1
- 使用 ./bin/solr status => 验证 Solrcloud 的状态 => 这应该 return liveNodes as 2
现在使用来自任何 solr 节点的 CollectionsAPI 创建 fooCollection。这会将配置集上传到 zookeeper 并创建集合 =>
./bin/solr create -c fooCollection -d /home/john/conf -shards 1 -replicationFactor 1
验证 fooCollection 的健康状态 =>
./bin/solr healthstatus -z zk1:port1,zk2:port1,zk3:port1 -c fooCollection
- 现在通过检查 Solr-AdminConsole -> CloudSection -> Tree .. /configs
来验证配置是否存在于 Zookeeper 中
- 同时检查显示节点活动状态的 CloudSection -> Graph。那说明一切都很好。
- 现在开始将文档推送到集合中
下面的 wiki 对完成上述操作很有帮助。
https://cwiki.apache.org/confluence/display/solr/Solr+Start+Script+Reference
我有一个 SOLR / Zookeeper / Kafka 设置。每个都在不同的虚拟机上。
我已经成功 运行 这一切都使用两个 SOLR 4.9 虚拟机 (Ubuntu)
现在我希望构建两个 SOLR 5.4 虚拟机并使其再次运行。
本质上,"Upgrade by Replacement"
我有 "hacked" 我的问题的解决方案,但这让我很紧张。
首先,Zookeeper 运行宁。我关闭我的 SOLR 4.9 虚拟机并从 Zookeeper 中删除配置(不一定按那个顺序......;-))
现在,我根据 SOLR Wiki 上的 "Production Install" 说明启动了我的 'solr5' VM(和云模式下的 SOLR),并在其中安装了 SOLR 5.4。我还在 'solr6' 上安装了 5.4,但还没有 运行ning。
我在 'solr5' 机器上发出这个命令:
/opt/solr/bin/solr create -c fooCollection -d /home/john/conf -shards 1 -replicationFactor 1
我得到以下输出:
Connecting to ZooKeeper at 192.168.56.5,192.168.56.6,192.168.56.7/solr ...
Re-using existing configuration directory statdx
Creating new collection 'fooCollection' using command:
http://localhost:8983/solr/admin/collections?action=CREATE&name=fooCollection&numShards=1&replicationFactor=1&maxShardsPerNode=1&collection.configName=fooCollection
{
"responseHeader":{
"status":0,
"QTime":3822},
"success":{"":{
"responseHeader":{
"status":0,
"QTime":3640},
"core":"fooCollection_shard1_replica1"}}}
一切正常。我打开我的微服务,它将我所有的 SOLR 文档从 Kafka 泵入 'solr5'.
现在,我想将 'solr6' 添加到 collection。除了我的 hack(我将在后面描述)之外,我找不到其他方法来做到这一点。
我之前用来创建 collection 的命令出错,发现我的 collection 已经存在。
似乎没有 zkcli.sh 或 solr 命令可以执行我想要的操作。 api 命令中的 None 似乎也可以执行此操作。
有没有简单的方法告诉(SOLR?Zookeeper?)我想添加另一台机器到我的SOLR节点,请像第一个(solr5)一样配置它并开始复制数据?
也许我应该在发出创建命令时 运行 拥有两台机器?
如果有一些 "approved" 方法可以做到这一点,我将不胜感激,因为每次需要时,我都需要想出一个 "solution" 在 Prod 中执行相同类型的方法升级 SOLR。
现在开始我的技巧。请记住,我现在花了两天时间试图找到关于此的明确文档。请不要发火,我完全明白这不是做事的方式。至少,我希望这不是做事的方式......
- 从创建 collection 的位置复制 fooCollection 目录 命令把它放在 'solr5' (这是 /opt/solr/server/solr/fooCollection_shard1_replica1) 一样 在我的 'solr6' VM 上的位置。
- 对 collection 目录名进行合理的更改(变为 fooCollection_shard1_replica2)
- 在 core.properties 文件中进行看起来合乎逻辑的更改:
作为参考,这是由创建命令创建的 core.properties 文件。
#Written by CorePropertiesLocator
#Wed Jan 20 18:59:08 UTC 2016
numShards=1
name=fooCollection_shard1_replica1
shard=shard1
collection=fooCollection
coreNodeName=core_node1
这是我完成黑客攻击后 'solr6' 上文件的样子。
#Written by CorePropertiesLocator
#Wed Jan 20 18:59:08 UTC 2016
numShards=1
name=fooCollection_shard1_replica2
shard=shard1
collection=fooCollection
coreNodeName=core_node2
当我这样做并重新启动时 'solr6' 一切都变成了金色。 "Cloud" 网页在管理网页中看起来正确 - 当我将文档添加到 'solr5' 时,如果我直接从管理网页点击它,它们在 'solr6' 中可用。
如果有人能告诉我如何在没有像这样的 hack 的情况下实现这一点,我将不胜感激......或者如果这是这样做的正确方法......
=============================
回答@Mani 和建议的程序
谢谢 Mani - 我确实按照您的步骤非常仔细地尝试了这个。
最后,我从 collection 状态查询中得到了这个输出:
john@solr6:/opt/solr$ ./bin/solr healthcheck -z 192.168.56.5,192.168.56.6,192.168.56.7/solr5_4 -c fooCollection
{
"collection":"fooCollection",
"status":"healthy",
"numDocs":0,
"numShards":1,
"shards":[{
"shard":"shard1",
"status":"healthy",
"replicas":[{
"name":"core_node1",
"url":"http://192.168.56.15:8983/solr/fooCollection_shard1_replica1/",
"numDocs":0,
"status":"active",
"uptime":"0 days, 0 hours, 6 minutes, 24 seconds",
"memory":"31 MB (%6.3) of 490.7 MB",
"leader":true}]}]}
这是我一直在实验中发现的那种结果。核心将在其中一个 SOLR 虚拟机(我发出命令行以在其上创建 collection 的那个虚拟机)上创建,但我没有在另一个虚拟机上创建任何东西——这取决于您在下面的步骤,相信你也想过应该会发生吧?
此外,我会为任何阅读 5.4 的人指出,命令是 "healthcheck" 而不是 healthstatus。命令行马上给你看,没什么大不了的。
===============
更新 1 :: 手动添加第二个核心
如果我转到另一个 VM 并手动添加以下内容:
sudo mkdir /opt/solr/server/solr/fooCollection_shard1_replica2
sudo mkdir /opt/solr/server/solr/fooCollection_shard1_replica2/data
nano /opt/solr/server/solr/fooCollection_shard1_replica2/core.properties
(in here I add only collection=fooCollection and then save/close)
然后我在同一个虚拟机上重新启动我的 SOLR 服务器: sudo /opt/solr/bin/solr restart -c -z zoo1,zoo2,zoo3/solr
我会发现第二个节点神奇地出现在我的管理控制台中。它将是一个 "follower"(即不是领导者)并且两者都将在云 UI.
中分支 "shard1"我不知道这是不是 "the way" 但这是我目前找到的唯一方法。我将重现到那个点并尝试使用 Admin UI 看看我得到了什么。时机成熟时,这对我的 IT 人员来说会容易一些 - 如果可行的话。
===============
更新 2 :: 创建命令的轻微修改
@Mani -- 我相信我已经按照你的步骤取得了成功 - 就像很多事情一样,一旦你理解了它就很简单。
我重置了所有内容(删除了目录,清除了 zookeeper (rmr /solr),然后从头开始重新做了所有事情。
我稍微更改了 "create" 命令,因此:
./bin/solr create -c fooCollection -d /home/john/conf -shards 1 -replicationFactor 2
注意 "replicationFactor 2" 而不是 1。
突然间我确实在两个虚拟机上都有内核。
几个注意事项:
我发现仅通过使用 Zookeeper IP 地址以云模式启动 SOLR 5.4 服务器,我无法从状态调用中获得令人满意的结果。 Zookeeper 中的 "node" 尚未创建。
此时创建命令也失败了。
我发现解决这个问题的方法是使用 zkcli.sh 加载这样的配置:
sudo /opt/solr/server/scripts/cloud-scripts/zkcli.sh -cmd upconfig -confdir /home/john/conf/ -confname fooCollection -z 192.168.56.5/solr
当我在 运行 执行此命令后立即检查 Zookeeper 时,有一个 /solr/configs/fooCollection "path".
现在创建命令起作用了,我假设如果我想覆盖配置,我当时可以这样做,尽管我还没有尝试过。
我不确定在什么时候,但似乎我需要重新启动 SOLR 服务器(可能在创建命令之后)以便找到状态等的所有内容......我可能记错了,因为我'我已经经历过很多次了。如果在创建命令后有疑问,请尝试重新启动服务器。 (这可以是正确解析的 IP 地址或名称)
sudo /opt/solr/bin/solr restart -c -z zoo1,zoo2,zoo3/solr
sudo /opt/solr/bin/solr restart -c -z 192.168.56.5,192.168.56.6,192.168.56.7/solr
在对@Mani 推荐的程序进行这些细微修改后,我在不同的 VM 上分别获得了一个 Leader 和一个 "follower" - 在 /opt/solr/server/solr 目录(本例中为 fooCollection)中,我能够将数据发送到一个并通过管理控制台点击 IP 地址搜索另一个。
=============
变化
任何阅读本文的人可能想尝试的一件事就是在 Zookeeper 中制作另一个 "node"(例如 solr5_4)。
我试过了,效果很好。在任何你看到与 Zookeeper 整体相关联的 /solr chroot 的地方,你都可以用 /solr5_4 替换它。这将允许旧的 SOLR VM 在构建新的 SOLR 5.4 "environment" 时继续在 Prod 中运行,并且可以将相同的 Zookeeper VM 用于两者——因为不同的 chroot 应该保证没有交互或重叠。
同样,Zookeeper 中的 "node" 在您上传配置之前不会被创建,但是您需要像这样启动您的 SOLR 过程,否则您稍后会处于错误的上下文中。注意 "solr5_4" 作为 chroot。
sudo /opt/solr/bin/solr restart -c -z zoo1,zoo2,zoo3/solr5_4
完成测试后,solr5_4 "environment" 对 Prod 和 SOLR 4.x VM 和 Zookeeper "node" 的 solr 来说很重要。将负载均衡器指向新的 SOLR VM 并在用户根本没有注意到的情况下进行切换应该是一件相当简单的事情。
此策略适用于 SOLR 6、6.5、7 等。
此命令还可以添加 collections/cores。但是,solr 服务器必须先 运行ning。
http://192.168.56.16:8983/solr/admin/collections?action=CREATE&name=fooCollection&numShards=1&replicationFactor=2&collection.configName=fooCollection
==================
作为替换升级使用
如果不是很明显,这种技术(特别是如果在 Zookeeper 中使用 "new" chroot 之类的 /solr5_4 或类似的东西)让您可以奢侈地离开旧版本的 SOLR 运行宁多久都行。如果需要,允许 re-indexing 所有数据花费几天时间。
我没试过,但我猜索引的备份也可以放入新机器中。
我只是想让读者明白,这是一种旨在让升级真正轻松简单的方法。 (不需要就地升级,只需构建新的 VM 并安装最新版本的 SOLR。)
这将允许 switch-over 在不影响生产的情况下发生,直到您准备好放下锤子和 re-direct 您的负载均衡器在新的 SOLR ip 地址(您已经测试过当然...)
这里的一个假设是您有资源来启动一组 SOLR VM 或物理服务器,以匹配您在生产中已有的任何东西。显然,如果您 resource-limited 只使用您拥有的盒子或 VM,upgrade-in-place 可能是您唯一的选择。
这就是我要做的。我假设您有停机时间的奢侈并且有能力完全重新索引文档。由于您实际上是从 4.9 升级到 5.4。
- 停止 4.9 solr 节点并卸载 solr。
- 使用 zkcli.sh 和 clear 命令从 zk 节点删除配置。
- 在 solr5 和 solr6 vm 上安装 solr
- 启动两个 solr 节点并确保它们都可以与 zk 通信。 => 在 solr5 vm ./bin/solr start -c -z zk1:port1,zk2:port1,zk3:port1 在 solr6 vm ./bin/solr start -c -z zk1:port1,zk2:port1,zk3:port1
- 使用 ./bin/solr status => 验证 Solrcloud 的状态 => 这应该 return liveNodes as 2
现在使用来自任何 solr 节点的 CollectionsAPI 创建 fooCollection。这会将配置集上传到 zookeeper 并创建集合 => ./bin/solr create -c fooCollection -d /home/john/conf -shards 1 -replicationFactor 1
验证 fooCollection 的健康状态 => ./bin/solr healthstatus -z zk1:port1,zk2:port1,zk3:port1 -c fooCollection
- 现在通过检查 Solr-AdminConsole -> CloudSection -> Tree .. /configs 来验证配置是否存在于 Zookeeper 中
- 同时检查显示节点活动状态的 CloudSection -> Graph。那说明一切都很好。
- 现在开始将文档推送到集合中
下面的 wiki 对完成上述操作很有帮助。 https://cwiki.apache.org/confluence/display/solr/Solr+Start+Script+Reference