说明: 本篇所有curl操作是在终端中进行的, 当然可以省去curlurl中的引号, 直接在浏览器的地址栏中发起HTTP请求, 效果更明显.

1 创建Collection、Core

1.1 创建collection

直接在浏览器的URL地址栏进行操作, 命令如下:

http://localhost:8080/solr/admin/collections?action=CREATE&name=mycollection&numShards=3&replicationFactor=4

或者: 直接在终端的命令行中操作(注意curl之后的内容需要加单引号或双引号):

curl 'http://localhost:8080/solr/admin/collections?action=CREATE&name=mycollection&numShards=3&replicationFactor=4'

上述方式创建的Collection中, Shard和Replica由Solr自动分配, 不能手动选择具体的数据存放路径、实例存放路径.

1.2 创建core

手动指定实例存放路径和数据存放路径:

curl 'http://localhost:8080/solr/admin/cores?action=CREATE&name=my_collection-shard1-replica1&instanceDir=/usr/solr/my_collection-shard1-replica1&dataDir=/data_solr/my_collection-shard1-replica1&collection=my_collection&shard=shard1'
curl 'http://localhost:8080/solr/admin/cores?action=CREATE&name=my_collection-shard1-replica2&instanceDir=/usr/solr/my_collection-shard1-replica2&dataDir=/data_solr/my_collection-shard1-replica2&collection=my_collection&shard=shard1'

这样可以创建出一个collection, 并自己指定该collection的shard和replica的所有配置项.

1.3 创建操作中的参数

(1) action: 要操作动作的名称;

(2) name: 要创建的集合名称;

(3) numShards: 集合分片的个数;

(4) replicationFactor(副本因子): 每个分片配备的副本数, 包括Leader和Replica;

(5) collection.configName: 创建新集合时所使用的配置文件的名称, 如果不指定, 就会默认使用name作为配置文件的名称.

(6) createNodeSet: 如果不提供该参数, 创建操作会将Replica分布到所有活跃的Solr节点上. 这个参数用于创建分片和副本的节点集合, 格式为: createNodeSet=node1:8081_solr,node2:8082_solr,node3:8083_solr

(7) maxShardsPerNode: 指定每个Node可以创建的Shard数, 默认为1.

a) 创建操作将生成numShards * replicationFactor个副本, 并尽可能均匀地分布在所有活跃的Node上;

b) 为了保证高可用, 同一个Solr节点上不能存在同一Shard的多个副本;

c) 如果maxShardsPerNode * nodeNum < numShards * replicationFactor, CREATE操作将失败, 报错信息如下:

org.apache.solr.common.SolrException:org.apache.solr.common.SolrException: Cannot create collection mycollection.
Value of maxShardsPerNode is 3, and the number of live nodes is 3. This allows a maximum of 9 to be created.
Value of numShards is 3 and value of replicationFactor is 4. This requires 12 shards to be created (higher than the allowed number)

2 删除Collection、Core、Shard

(1) 删除collection:

collections的API不支持UNLOAD操作;

删除操作将直接删除指定的collection, 包括其目录文件.

curl 'http://localhost:8080/solr/admin/collections?action=DELETE&name=collection1&indent=true'

name: 将被删除的集合的名称;

indent=true: 格式化(有缩进)显示响应结果.

(2) 卸载core:

cores的API不支持DELETE操作;

卸载操作将卸载指定的collection_shard_replica, 并不会删除目录文件.

curl 'http://localhost:8080/solr/admin/cores?action=UNLOAD&core=collection1_shard1_replica2&deleteIndex=true&indent=true'

(3) 删除shard:

这个操作一般配合切分分片(SPLITSHARD)来使用: 切分分片后, 删除被切分的分片.

curl 'http://localhost:8080/solr/admin/collections?action=DELETESHARD&shard=shard1&collection=collection1'

删除操作并不会删除对应Shard的目录文件, 但是会删除其存放index文件的目录, 并将记录core信息的文件标记为已卸载: core.properties.unloaded, 内容如下:

3 加载Collection、Core

(1) 重新加载collection:

collections的API不支持LOAD操作;

被卸载了的core并不会被RELOAD进来.

curl 'http://localhost:8080/solr/admin/collections?action=RELOAD&name=collection1&indent=true'

name: 将被重新加载的集合的名称.

(2) 加载core:

cores的API不支持RELOAD操作;

可以LOAD某一个collection, 但被卸载了的core不能被LOAD进来;

可以LOAD某一个指定的core, 但被卸载了的core也不能被LOAD进来.

curl 'http://localhost:8080/solr/admin/cores?action=LOAD&core=collection1_shard1_replica2&indent=true'

4 查看集群状态

(1) 查看集群的Cloud data:

此操作亦可通过浏览器的URL查看, 格式化响应结果, 更加清晰:

curl 'http://localhost:8080/solr/zookeeper?wt=json&detail=true&path=/clusterstate.json'

(2) 查看集群中的所有core:

curl 'http://localhost:8080/solr/admin/collections?action=LIST'

(3) 查看集群的健康状况:

curl 'http://localhost:8080/solr/admin/collections?action=CLUSTERSTATUS'

可以查看到Shard的路由、活跃状态、副本状态等信息.

5 添加副本(ADDREPLICA)

如果服务器配置优良, 为了提高检索性能, 我们可以通过为分片添加副本.

如果要在指定的节点中创建副本, 则可以指定节点名称 —— 可以在http://localhost:8080/solr/#/~cloud?view=tree中的live_nodes下查看活跃的节点, 一般格式都是:

/live_nodes
172.16.10.11:8080_solr
172.16.10.12:8080_solr
172.16.10.13:8080_solr

(1) 使用方式:

http://localhost:8080/solr/admin/collections?action=ADDREPLICA&collection=collection1&shard=shard1&node=nodeName

collection: 集合的名称;

shard: 要添加副本的分片, 如果不指定, 就要指定_route_参数 —— 如果无法确定分片名, 就可以传递该_route_值, 系统会识别这个_route_所属的分片, 然后完成相关操作;

node: 应该创建副本的节点的名称, 必须活跃, 必须是活跃节点, 可不指定, Solr会自动进行负载均衡;

instanceDir: 将被创建的核心的instanceDir, 可不指定;

dataDir: 应在其中创建核心的目录, 可不指定;

type: 要创建的副本的类型, 有以下几种: (可不指定)

nrt: NRT类型维护事务日志并在本地更新其索引, 这是默认的, 也是最常用的;

tlog: TLOG类型维护事务日志, 但只通过复制更新其索引;

pull: PULL类型不维护事务日志, 只通过复制更新其索引. 这种类型没有资格成为Leader.

(2) 使用示例:

http://localhost:8080/solr/admin/collections?action=ADDREPLICA&collection=test&shard=shard1&node=172.16.10.11:8080_solr

操作成功后的响应信息为:

<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">1496</int>
</lst>
<lst name="success">
<lst>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">1407</int>
</lst>
<!-- 添加成功后的副本名称 -->
<str name="core">test_shard1_replica2</str>
</lst>
</lst>
</response>

6 切割分片(SPLITSHARD)

(1) 切割示例:

curl 'http://localhost:8080/solr/admin/collections?action=SPLITSHARD&collection=mycollection&shard=shard2&indent=true'

collection: 集合的名称;

shard: 将被切割的分片ID, 必须存在, 且当前Collection的shard个数必须大于1个(已验证).

(2) 该特性发布于Solr4.3, 测试结果如图:

SPLITSHARD命令不能用于使用了自定义哈希的集群, 因为这样的集群没有一个明确的哈希范围 —— 它只用于具有plain或compositeid路由的集群;

② 该命令将指定的shard的切割成 两个新的具有相同数据的分片, 并根据新分片的路由范围切割父分片 (被切割的shard) 中的文档;

③ 新的分片将被命名为shardx_0shardx_1 —— 表明是从shardx上分裂得到的新Shard;

④ 一旦新分片被成功创建, 它们就会被立即激活, 同时父分片也将被暂停 —— 新的读写请求就不会被发送到父分片中了, 而是直接路由到新的切割生成的新分片中;

该特征能够保证无缝切割和无故障时间: 父分片数据不会被删除, 在切割操作完成之前, 父分片将继续提供读写请求, 直到切割完成.

(3) 使用注意事项:

① 切割分片后, 再使用DELETESHARD命令删除被切割的原始Shard, 就能保证数据不冗余, 当然也可以通过UNLOAD命令卸载被切割的Shard;

② 原Shard目录下的配置文件会变成core.properties.unloaded, 也就是加了个卸载标示; data目录下保存索引数据的index目录被删除 —— 从侧面印证了数据完成了切分和迁移;

SolrCloud不支持对索引到其他Shard上的数据的动态迁移, 可以通过切割分片实现SolrCloud的扩容, 这只会对 切割操作之后、路由的哈希范围仍然属于原分片的数据 进行扩容.

7 操作集合别名(操作成功, 但未查出区别)

Solr允许用户创建独立的指向一个或多个真实集合的虚拟集合, 可以在运行时修改别名.

(1) 创建或修改别名:

curl 'http://localhost:8080/solr/admin/collections?action=CREATEALIAS&name=alias&collections=collection1&indent=true'

用来修改的别名应该只映射一个独立的集合, 读取的别名能映射一个或多个集合.

(2) 移除存在的别名:

curl 'http://localhost:8080/solr/admin/collections?action=DELETEALIAS&name=alias&indent=true'

8 更新集群的配置

集群会发生变化的就是collection的配置, 因此当配置文件发生变化后就应该使用命令更新ZooKeeper中的配置信息. 对此, Solr提供了很好的运维工具:

8.1 将配置文件上传到ZooKeeper中

需要的jar包: $SOLR_HOME/example/lib/ext/* 以及 Solr项目的WEB-INF/lib/*, 这里已经将ext下的jar包拷贝到了WEB-INF/lib目录下, 便捷很多.

cd /data/solr-cloud/tomcat/display/solr/WEB-INF/lib

下述一长串是一条命令, 为了便于查看, 使用了反斜杠(\)来断句, 如果使用中出现问题, 可将反斜杠(\)删除, 并删除所有的换行, 然后回车执行.

# 注意本地路径, 以及../classes/log4j.properties文件的路径
java -classpath .:* \
-Dlog4j.configuration=file:../classes/log4j.properties \
org.apache.solr.cloud.ZkCLI -cmd upconfig \
-zkhost 10.0.20.50:2181,10.0.20.51:2181,10.0.20.52:2181 \
-confdir /data/solr-cloud/tomcat/solrhome/collection1/conf \
-confname myconf2

建议: 将配置文件单独存放, 比如: 我这里将整个example/solr/collection1/conf存放至/data/solr-cloud/tomcat下, 之后执行配置文件的更新:

java -classpath .:* \
-Dlog4j.configuration=file:../classes/log4j.properties \
org.apache.solr.cloud.ZkCLI -cmd upconfig \
-zkhost 10.0.20.50:2181,10.0.20.51:2181,10.0.20.52:2181 \
-confdir /data/solr-cloud/tomcat/conf \
-confname myconf

8.2 将ZooKeeper中的配置文件与Collection相关联

cd /data/solr-cloud/tomcat/display/solr/WEB-INF/lib

java -classpath .:* \
-Dlog4j.configuration=file:../classes/log4j.properties \
org.apache.solr.cloud.ZkCLI -cmd linkconfig \
-collection mycollection -confname myconf \
-zkhost 10.0.20.50:2181,10.0.20.51:2181,10.0.20.52:2181

注意: 配置文件若被删除, 将会导致ZooKeeper中的配置文件被同步删除, 从而在建立collection时将出现问题.

可关闭Tomcat服务与ZooKeeper服务, 删除ZooKeeper目录下的配置文件的版本信息, 然后再次启动ZooKeeper更新配置文件, 最后启动Tomcat服务继续测试.

参考资料

Solr光放文档 - SPLITSHARD: Split a Shard

solr安装-tomcat+solrCloud构建稳健solr集群

版权声明

作者: 马瘦风(https://healchow.com)

出处: 博客园 马瘦风的博客(https://www.cnblogs.com/shoufeng)

感谢阅读, 如果文章有帮助或启发到你, 点个[好文要顶

Solr 13 - 在URL地址栏中操作Solr集群 - 包括CRUD、别名、切割分片、更新配置的更多相关文章

  1. 在URL地址栏中显示ico

             <!-- 在URL地址栏中显示ico -->         <link Rel="SHORTCUT ICON" href="imag ...

  2. 项目中使用Quartz集群分享--转载

    项目中使用Quartz集群分享--转载 在公司分享了Quartz,发布出来,希望大家讨论补充. CRM使用Quartz集群分享  一:CRM对定时任务的依赖与问题  二:什么是quartz,如何使用, ...

  3. (4) Spring中定时任务Quartz集群配置学习

    原 来配置的Quartz是通过spring配置文件生效的,发现在非集群式的服务器上运行良好,但是将工程部署到水平集群服务器上去后改定时功能不能正常运 行,没有任何错误日志,于是从jar包.JDK版本. ...

  4. [转贴]CentOS7.5 Kubernetes V1.13(最新版)二进制部署集群

    CentOS7.5 Kubernetes V1.13(最新版)二进制部署集群 http://blog.51cto.com/10880347/2326146   一.概述 kubernetes 1.13 ...

  5. 操作Hadoop集群

    操作Hadoop集群 所有必要的配置完成后,将文件分发到所有机器上的HADOOP_CONF_DIR目录.这应该是所有机器上相同的目录. 一般来说,建议HDFS和YARN作为单独的用户运行.在大多数安装 ...

  6. python 操作redis集群

    一.连接redis集群 python的redis库是不支持集群操作的,推荐库:redis-py-cluster,一直在维护.还有一个rediscluster库,看GitHub上已经很久没更新了. 安装 ...

  7. Java操作Hadoop集群

    mavenhdfsMapReduce 1. 配置maven环境 2. 创建maven项目 2.1 pom.xml 依赖 2.2 单元测试 3. hdfs文件操作 3.1 文件上传和下载 3.2 RPC ...

  8. Redis 中常见的集群部署方案

    Redis 的高可用集群 前言 几种常用的集群方案 主从集群模式 全量同步 增量同步 哨兵机制 什么是哨兵机制 如何保证选主的准确性 如何选主 选举主节点的规则 哨兵进行主节点切换 切片集群 Redi ...

  9. java操作redis集群配置[可配置密码]和工具类(比较好用)

    转: java操作redis集群配置[可配置密码]和工具类 java操作redis集群配置[可配置密码]和工具类     <dependency>   <groupId>red ...

随机推荐

  1. HTTP状态码的详细解释,供参考

    HTTP状态码详解 常用对照表 状态码 含义 100 客户端应当继续发送请求.这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝.客户端应当继续发送请求的剩余部分,或者如果请求已经 ...

  2. css 模拟radio的样式

    1.input 默认的 type 为 radio的样式,在具体场合中的改造 默认的样式这样: 但是我要这样的: 这样看来是不是比原来的好看多了. 2.优化radio的样式 <span class ...

  3. 从零开始学Web之HTML(二)标签、超链接、特殊符号、列表、音乐、滚动、head等

    大家好,这里是 Daotin 从零开始学 Web 系列教程.此文首发于「 Daotin的梦呓 」,欢迎大家订阅关注.在这里我会从 Web 前端零基础开始,一步步学习 Web 相关的知识点,期间也会分享 ...

  4. [Python接口自动化]从零开始学习python自动化(1):环境搭建

    第一步:安装python编译环境 安装python编译环境之前,必须保证已安装jdk哈,如果为安装,请参考https://jingyan.baidu.com/article/6dad5075d1dc4 ...

  5. Solr相似性算法

    Solr相似性算法 介绍 Solr 4及之前的版本默认采用VSM(向量空间模型)进行相似度的计算(或打分).之后的版本,则采用Okapi BM25(一种二元独立模型的扩展),属于概率模型. 检索模型通 ...

  6. Postman----基础使用篇(没有接口文档的情况下如何着手做接口测试)

    [备注说明]内文中的图片由于页面的限制,图片显示不清晰,为了能更加的看清图片,请点击"图片",点击"右键"选择"在新标签页中打开图片",可查 ...

  7. python 编译源文件

    背景 近期项目到了部署的阶段.由于项目后台和算法都是用Python "撸的",但是又不希望将源代码直接 "release" 到 “客户”哪里.于是开始思考... ...

  8. Spring Boot 入门教程 | 图文讲解

    目录 一.Spring Boot 是什么 二.为什么要使用 Spring Boot 三.快速入门 3.1 创建 Spring Boot 项目 3.2 项目结构 3.3 引入 Web 依赖 3.4 编写 ...

  9. [Inside HotSpot] C1编译器优化:全局值编号(GVN)

    1. 值编号 我们知道C1内部使用的是一种图结构的HIR,它由基本块构成一个图,然后每个基本块里面是SSA形式的指令,关于这点如可以参考[Inside HotSpot] C1编译器工作流程及中间表示. ...

  10. C++删除文件末尾字符

    C++中使用fstream来进行文件读写,如果要覆盖文件末尾的部分字符,应该怎么操作呢? #include <iostream> #include <fstream> std: ...