概述
在SolrCloud中,分片是集合的逻辑分区,用于存储集合的部分索引。分片数量决定了单个集合可包含的文档总数,同时也影响搜索性能。分片管理是SolrCloud运维中的关键技能,涉及集群扩容、负载均衡和性能优化等重要方面。
本指南中的所有示例假设你正在运行”techproducts” Solr示例:
1 | bin/solr start -c -e techproducts |
SPLITSHARD:分片分割
分片分割将现有分片拆分成两个部分,这两个部分作为两个新分片写入磁盘。原始分片将继续保持相同数据,但开始将请求重新路由到新分片。新分片将具有与原始分片相同数量的副本。
API调用方式
V1 API:
1 | http://localhost:8983/solr/admin/collections?action=SPLITSHARD&collection=techproducts&shard=shard1 |
V2 API:
1 | curl -X POST http://localhost:8983/api/collections/techproducts/shards \ |
SPLITSHARD 核心机制
- 无缝分割:命令允许无缝分割,不需要停机时间
- 持续服务:正在分割的分片将继续接受查询和索引请求
- 自动路由:操作完成后自动开始将请求路由到新分片
- 自动提交:分割分片后自动发出软提交,使文档在子分片上可见
分割原理
分割通过将原始分片的哈希范围分成两个相等分区,并根据新的子范围划分原始分片中的文档来执行。新创建的分片将具有与父分片相同数量和类型的副本。
SPLITSHARD 参数详解
基础参数
collection
- 类型:必需
- 说明:包含要分割分片的集合名称
shard
- 类型:可选
- 说明:要分割的分片名称
- 注意:当未指定
split.key
时此参数为必需
高级分割控制
ranges
- 类型:可选
- 说明:十六进制哈希范围的逗号分隔列表,如
ranges=0-1f4,1f5-3e8,3e9-5dc
- 功能:可将原始分片的哈希范围分成指定的任意哈希范围区间
- 示例:如果原始哈希范围是
0-1500
,添加参数ranges=0-1f4,1f5-3e8,3e9-5dc
将把原始分片分成三个分片,哈希范围分别为0-500
、501-1000
和1001-1500
split.key
- 类型:可选
- 说明:用于分割索引的路由键
- 功能:使用路由键分割分片,使指定路由键的所有文档最终在单个专用子分片中
- 注意:此时不需要提供
shard
参数,因为路由键足以确定正确的分片 - 示例:假设
split.key=A!
哈希到范围12-15
并属于范围为0-20
的分片’shard1’,按此路由键分割将产生三个子分片,范围为0-11
、12-15
和16-20
numSubShards
- 类型:可选
- 默认值:
2
- 说明:将父分片分割成的子分片数量
- 允许值:2-8
- 限制:只能在未指定
ranges
或split.key
时使用
分割方法配置
splitMethod
- 类型:可选
- 默认值:
rewrite
- 说明:当前支持两种分片分割方法:
rewrite方法:
- 机制:在选择要保留在每个分区中的文档后,从头开始创建子索引
- 特点:CPU和I/O密集的长时间过程,但产生不包含不属于每个分区的文档数据的最优大小子索引
- 适用场景:追求最优存储效率和性能的生产环境
link方法:
- 机制:使用文件系统级硬链接创建原始索引文件的副本,然后只修改包含每个分区中删除文档列表的文件
- 特点:比
rewrite
方法快很多倍,资源消耗更少,但生成的子索引仍然与原始索引一样大 - 限制:影响复制过程速度,在副本节点上消耗更多磁盘空间
- 适用场景:快速分割或资源受限环境
splitFuzz
- 类型:可选
- 默认值:
0.0
- 说明:必须小于
0.5
的浮点值,允许按总分片范围的此百分比改变子分片范围 - 效果:奇数分片更大,偶数分片更小
特殊分割选项
splitByPrefix
- 类型:可选
- 默认值:
false
- 说明:如果为
true
,将通过考虑分片中compositeId值的分布来选择分割点 - 机制:compositeId形式为
<prefix>!<suffix>
,具有相同前缀的所有文档在哈希空间中共同定位 - 优化字段:如果存在名为
id_prefix
的可选字段并为每个文档索引了文档前缀(包括!),则将使用该字段生成计数
模式配置示例:
1 | <!-- 可选,用于splitByPrefix优化 --> |
当前限制:
- 前缀大小使用具有前缀的文档数量计算
- 仅支持两级compositeId
- 分片只能分成两个
其他参数
property.name=value
- 类型:可选
- 说明:设置核心属性名称为值
waitForFinalState
- 类型:可选
- 默认值:
false
- 说明:如果为
true
,仅在所有受影响副本变为活跃时请求才完成
timing
- 类型:可选
- 默认值:
false
- 说明:如果为
true
,将计时每个处理阶段并在响应中包含timing
部分
async
- 类型:可选
- 说明:异步处理此操作的请求ID
- 重要:分片分割可能是长时间运行的过程,建议使用异步调用避免超时
SPLITSHARD 注意事项
- 磁盘空间要求:使用
splitMethod=rewrite
(默认)时,必须确保运行父分片领导者的节点有足够的可用磁盘空间(超过索引大小的两倍) - 副本放置:生成的子分片的第一个副本将始终放在分片领导者节点上
- 集合类型限制:只能用于使用
numShards
参数创建的SolrCloud集合,即依赖Solr基于哈希路由机制的集合 - 磁盘空间检查:可通过
-Dsolr.shardSplit.checkDiskSpace.enabled=false
系统属性禁用本地文件系统的可用磁盘空间检查
CREATESHARD:创建分片
只能为使用’implicit’路由器的集合(即创建集合时使用router.name=implicit
)使用此API创建分片。可以为现有’implicit’集合创建具有指定名称的新分片。
对于使用’compositeId’路由器创建的集合,应使用SPLITSHARD命令。
API调用方式
V1 API:
1 | http://localhost:8983/solr/admin/collections?action=CREATESHARD&shard=newShardName&collection=techproducts |
V2 API:
1 | curl -X POST http://localhost:8983/api/collections/techproducts/shards \ |
CREATESHARD 参数
collection
- 类型:必需
- 说明:包含要创建分片的集合名称
shard
- 类型:必需
- 说明:要创建的分片名称
createNodeSet
- 类型:可选
- 说明:定义新集合分布的节点
- 格式:逗号分隔的节点名称列表,如
localhost:8983_solr,localhost:8984_solr
- 默认行为:如果未提供,CREATESHARD操作将在所有活跃Solr节点上创建分片副本
nrtReplicas / tlogReplicas / pullReplicas
- 类型:可选
- 说明:应为新分片创建的各类型副本数量
- 默认值:如果省略,将使用集合的默认值
property.name=value
- 类型:可选
- 说明:设置核心属性名称为值
waitForFinalState
- 类型:可选
- 默认值:
false
- 说明:如果为
true
,仅在所有受影响副本变为活跃时请求才完成
async
- 类型:可选
- 说明:异步处理此操作的请求ID
DELETESHARD:删除分片
删除分片将卸载分片的所有副本,将它们从集合的state.json
中删除,并(默认情况下)删除每个副本的instanceDir和dataDir。它只会删除非活跃分片或自定义分片中没有给定范围的分片。
API调用方式
V1 API:
1 | http://localhost:8983/solr/admin/collections?action=DELETESHARD&shard=shard1&collection=techproducts |
V2 API:
1 | curl -X DELETE http://localhost:8983/api/collections/techproducts/shards/shard1 |
DELETESHARD 参数
collection
- 类型:必需
- 说明:包含要删除分片的集合名称
shard
- 类型:必需
- 说明:要删除的分片名称
deleteInstanceDir
- 类型:可选
- 默认值:
true
- 说明:默认情况下Solr会删除被删除每个副本的整个实例目录。设置为
false
防止删除实例目录
deleteDataDir
- 类型:可选
- 默认值:
true
- 说明:默认情况下Solr会删除被删除每个副本的数据目录。设置为
false
防止删除数据目录
deleteIndex
- 类型:可选
- 默认值:
true
- 说明:默认情况下Solr会删除被删除每个副本的索引。设置为
false
防止删除索引目录
followAliases
- 类型:可选
- 默认值:false
- 说明:允许将集合参数视为要解析的实际集合名称的别名
async
- 类型:可选
- 说明:异步处理此操作的请求ID
FORCELEADER:强制分片领导者选举
在分片丢失领导者的不太可能情况下,可以调用此命令强制选举新领导者。
API调用方式
V1 API:
1 | http://localhost:8983/solr/admin/collections?action=FORCELEADER&collection=techproducts&shard=shard1 |
V2 API:
1 | curl -X POST http://localhost:8983/api/collections/techproducts/shards/shard1/force-leader |
FORCELEADER 参数
collection
- 类型:必需
- 说明:集合名称
shard
- 类型:必需
- 说明:应该进行领导者选举的分片名称
FORCELEADER 重要警告
这是专家级命令,只有在常规领导者选举不起作用时才应调用。在新领导者没有某些更新(可能是最近的更新)的情况下,这可能导致数据丢失,这些更新在旧领导者下线之前已被确认。
使用场景
- 分片无领导者:分片中所有副本都存在但没有领导者
- 领导者选举失败:正常的领导者选举机制无法工作
- 紧急恢复:需要紧急恢复服务时的最后手段
INSTALLSHARDDATA:安装/导入数据到分片
在正常情况下,数据通过索引文档添加到Solr集合(及其组成的分片)。但某些用例需要离线构建每个分片的索引。INSTALLSHARDDATA API允许将这些预构建的索引安装到集合内的各个分片中。
使用场景
- 查询流量隔离:将查询流量与索引负载隔离
- 复杂ETL流水线:使用中的ETL流水线特别复杂
- 批量数据导入:大批量数据的离线处理和导入
API调用方式
V1 API:
1 | http://localhost:8983/solr/admin/collections?action=INSTALLSHARDDATA&collection=techproducts&shard=shard1&repository=localfs&location=/mounts/myNFSDrive/tech/shard1/data/index |
V2 API:
1 | curl -X POST http://localhost:8983/api/collections/techproducts/shards/shard1/install \ |
INSTALLSHARDDATA 参数
collection
- 类型:必需
- 说明:集合名称
shard
- 类型:必需
- 说明:要安装数据的分片名称
location
- 类型:必需
- 说明:在指定备份存储库中查找要安装的索引文件的位置
repository
- 类型:可选
- 说明:要在其中查找索引文件的备份存储库名称
- 默认值:如果未提供存储库参数,将使用Solr的默认备份存储库(如果在solr.xml中定义了)作为后备
async
- 类型:可选
- 说明:异步处理此操作的请求ID
INSTALLSHARDDATA 前置条件
- 只读模式:拥有该分片的集合必须首先使用MODIFYCOLLECTION API置于”只读”模式
- 兼容性检查:用户负责确保安装到分片的索引与托管该分片的集合的模式和配置兼容
- 文件完整性:指定的
location
必须包含构成核心data/index
目录的所有文件
安装过程
- 数据覆盖:安装将索引文件复制到分片内的所有副本,覆盖该分片持有的任何预先存在的数据
- 并行安装:一旦处于只读模式,分片安装可以串行或并行完成
- 存储库支持:数据可以从Solr可插拔备份存储库抽象支持的任何
repository
和location
导入
分片管理最佳实践
分片规划策略
分片数量确定
- 数据量评估:根据预期数据量确定分片数量
- 查询模式分析:考虑查询模式和并发需求
- 硬件资源:基于可用硬件资源计算合适的分片数
分片大小控制
- 单分片限制:单个分片建议不超过100GB
- 文档数量:每个分片建议不超过200万文档
- 性能监控:持续监控分片性能指标
分片分割策略
分割时机选择
- 低负载期:在查询和索引负载较低时执行
- 容量预警:在分片接近容量限制前主动分割
- 性能下降:当查询性能明显下降时考虑分割
分割方法选择
- 生产环境:推荐使用
rewrite
方法获得最优性能 - 测试环境:可使用
link
方法快速验证 - 资源受限:在磁盘空间或CPU资源受限时考虑
link
方法
- 生产环境:推荐使用
分割参数优化
- 异步执行:始终使用异步方式执行分割操作
- 磁盘空间:确保有足够的磁盘空间完成分割
- 监控进度:设置适当的监控跟踪分割进度
分片管理运维
健康监控
- 分片状态:定期检查分片健康状态
- 领导者分布:监控领导者分片的分布情况
- 副本同步:监控副本间的数据同步状态
容量管理
- 存储使用率:监控各分片的存储使用情况
- 索引增长率:跟踪索引增长趋势
- 预警机制:建立容量预警和自动扩容机制
故障处理
- 领导者选举:准备强制领导者选举的应急方案
- 数据恢复:制定分片数据丢失的恢复策略
- 备份策略:建立定期分片级备份机制
性能优化建议
负载均衡
- 分片分布:确保分片在节点间均匀分布
- 查询路由:优化查询路由减少跨分片查询
- 索引分布:合理使用路由键实现数据局部性
资源配置
- JVM设置:根据分片大小调整JVM参数
- 磁盘I/O:为分片分割等操作预留足够I/O带宽
- 网络带宽:确保节点间有足够网络带宽
运维自动化
- 监控告警:建立完善的分片监控告警体系
- 自动扩容:实现基于指标的自动分片扩容
- 运维脚本:准备常用分片操作的自动化脚本
分片管理是SolrCloud运维的核心技能,合理的分片管理策略能够确保集群的可扩展性、高性能和数据安全性。通过掌握这些分片管理命令和最佳实践,可以构建高效稳定的大规模搜索集群。