概述
副本是分片的物理副本。副本通过提供数据的额外副本来增强故障转移能力,通过为搜索提供额外容量来增强可扩展性。副本管理是SolrCloud运维中的核心功能,正确的副本管理策略对集群的高可用性和性能至关重要。
本指南中的所有示例假设你正在运行”techproducts” Solr示例:
1 | bin/solr start -c -e techproducts |
ADDREPLICA:添加副本
向集合中的分片添加一个或多个副本。可以指定节点名称以在特定节点中创建副本,否则可以指定一组节点,系统将从中选择最合适的节点来创建副本。
API调用方式
V1 API:
1 | http://localhost:8983/solr/admin/collections?action=ADDREPLICA&collection=techproducts&shard=shard1&node=localhost:8983_solr |
V2 API:
1 | curl -X POST http://localhost:8983/api/collections/techproducts/shards/shard1/replicas \ |
ADDREPLICA 参数详解
基础参数
collection
- 类型:必需
- 说明:应该创建副本的集合名称
shard
- 类型:可选
- 说明:要添加副本的分片名称
- 注意:如果未指定
shard
,则必须指定_route_
参数
route (v1) / route (v2)
- 类型:可选
- 说明:如果不知道确切的分片名称,用户可以传递
_route_
值,系统将识别分片名称 - 注意:如果同时指定了
shard
参数,此参数将被忽略
节点选择参数
node
- 类型:可选
- 说明:应该创建副本的节点名称
createNodeSet (v1) / nodeSet (v2)
- 类型:可选
- 说明:新创建副本的候选节点
- 格式:
- V1:逗号分隔的节点名称列表,如
localhost:8983_solr,localhost:8984_solr
- V2:真正的数组格式,如
["localhost:8983_solr", "localhost:8984_solr"]
- V1:逗号分隔的节点名称列表,如
注意:如果既未指定
node
也未指定createNodeSet
/nodeSet
,则从集群中所有活跃节点中选择最佳节点。
存储配置参数
instanceDir
- 类型:可选
- 说明:将要创建的核心的实例目录
dataDir
- 类型:可选
- 说明:应该创建核心的目录
副本类型参数
type
- 类型:可选
- 默认值:
nrt
- 说明:要创建的副本类型,可选值:
nrt
:NRT类型维护事务日志并本地更新索引tlog
:TLOG类型维护事务日志但仅通过复制更新索引pull
:PULL类型不维护事务日志,仅通过复制更新索引,不能成为领导者
nrtReplicas
- 类型:可选
- 默认值:如果
type
为nrt
则为1
,否则为0
- 说明:应该创建的NRT副本数量
tlogReplicas
- 类型:可选
- 默认值:如果
type
为tlog
则为1
,否则为0
- 说明:应该创建的TLOG副本数量
pullReplicas
- 类型:可选
- 默认值:如果
type
为pull
则为1
,否则为0
- 说明:应该创建的PULL副本数量
高级参数
property.name=value
- 类型:可选
- 说明:用作创建核心中附加属性的名称/值对
- 警告:这是专家级选项,修改核心属性可能导致集合不可用
waitForFinalState
- 类型:可选
- 默认值:
false
- 说明:如果为
true
,请求仅在所有受影响的副本变为活跃时完成
async
- 类型:可选
- 说明:异步处理此操作的请求ID
ADDREPLICA 使用示例
创建多种类型的副本:
1 | http://localhost:8983/solr/admin/collections?action=addreplica&collection=gettingstarted&shard=shard1&tlogReplicas=1&pullReplicas=1 |
响应示例:
1 | { |
MOVEREPLICA:移动副本到新节点
此命令通过在目标节点执行ADDREPLICA然后在源节点执行DELETEREPLICA来将副本从一个节点移动到另一个节点。如果此命令被中断或在ADDREPLICA操作产生活跃状态副本之前超时,DELETEREPLICA不会发生。
API调用方式
V1 API:
1 | http://localhost:8983/solr/admin/collections?action=MOVEREPLICA&collection=test&targetNode=localhost:8983_solr&replica=core_node6 |
V2 API:
1 | curl -X POST http://localhost:8983/api/collections/techproducts \ |
MOVEREPLICA 参数
collection
- 类型:必需
- 说明:集合名称
targetNode
- 类型:必需
- 说明:目标节点名称
sourceNode
- 类型:可选
- 说明:包含要移动副本的节点名称
- 注意:除非指定了
replica
,否则此参数为必需。如果指定了replica
则此参数被忽略
shard
- 类型:可选
- 说明:应该移动副本的分片名称
- 注意:除非指定了
replica
,否则此参数为必需。如果指定了replica
则此参数被忽略
replica
- 类型:可选
- 说明:要移动的副本名称
- 注意:除非指定了
shard
和sourceNode
,否则此参数为必需,但此参数优先于这两个参数
timeout
- 类型:可选
- 默认值:600秒
- 说明:等待副本在新位置活跃之后删除旧位置副本的秒数
inPlaceMove
- 类型:可选
- 默认值:
true
- 说明:对于使用共享文件系统的副本,允许重用共享数据的”就地”移动
async
- 类型:可选
- 说明:异步处理此操作的请求ID
MOVEREPLICA 重要提示
- 超时处理:超时不会取消ADDREPLICA操作,将导致额外的副本
- 共享文件系统:在共享文件系统情况下将重用
dataDir
- 副本选择:如果同一节点上同一分片存在多个副本,选择是随机的
DELETEREPLICA:删除副本
允许删除一个或多个副本。可通过多种方式指定要删除的副本:
- 单个副本删除:提供集合、分片和副本名称
- 分片内多副本删除:提供集合和分片名称,以及要删除的副本数量
- 集合内多副本删除:提供集合名称和要删除的副本数量
API调用方式
V1 API(删除指定副本):
1 | http://localhost:8983/solr/admin/collections?action=DELETEREPLICA&collection=techproducts&shard=shard1&replica=core_node2 |
V2 API(删除指定副本):
1 | curl -X DELETE http://localhost:8983/api/collections/techproducts/shards/shard1/replicas/core_node2 |
V2 API(删除分片内指定数量副本):
1 | curl -X DELETE "http://localhost:8983/api/collections/techproducts/shards/shard1/replicas?count=3" |
V2 API(删除集合内指定数量副本):
1 | curl -X PUT -H "Content-type: application/json" \ |
DELETEREPLICA 参数
基础参数
collection
- 类型:必需
- 说明:集合名称
shard
- 类型:必需
- 说明:包含要删除副本的分片名称
replica
- 类型:可选
- 说明:要删除的副本名称
- 注意:如果使用
count
则不需要此参数,否则必须提供
count
- 类型:可选
- 说明:要删除的副本数量
- 限制:
- 如果请求的数量超过副本数量,不会删除任何副本
- 如果只有一个副本,不会被删除
- 注意:如果使用
replica
则不需要此参数,否则必须提供
删除控制参数
deleteInstanceDir
- 类型:可选
- 默认值:
true
- 说明:默认情况下Solr会删除被删除副本的整个实例目录。设置为
false
防止删除实例目录
deleteDataDir
- 类型:可选
- 默认值:
true
- 说明:默认情况下Solr会删除被删除副本的数据目录。设置为
false
防止删除数据目录
deleteIndex
- 类型:可选
- 默认值:
true
- 说明:默认情况下Solr会删除被删除副本的索引。设置为
false
防止删除索引目录
onlyIfDown
- 类型:可选
- 默认值:
false
- 说明:设置为
true
时,如果副本处于活跃状态则不会执行任何操作
followAliases
- 类型:可选
- 默认值:false
- 说明:允许将集合参数视为要解析的实际集合名称的别名
async
- 类型:可选
- 说明:异步处理此操作的请求ID
DELETEREPLICA 删除行为
- 活跃核心:如果对应的核心正在运行,核心将被卸载,条目从集群状态中删除,实例目录和数据目录(默认)被删除
- 非活跃核心:如果核心底层副本已关闭,条目从集群状态中删除,如果核心稍后启动,它会自动注销
- 智能选择:删除多个副本时,Solr选择活跃、最新且当前不是领导者的副本
副本属性管理
ADDREPLICAPROP:添加副本属性
为特定副本分配任意属性并赋予指定值。如果属性已存在,将用新值覆盖。
API调用方式
V1 API:
1 | http://localhost:8983/solr/admin/collections?action=ADDREPLICAPROP&collection=techproducts&shard=shard1&replica=core_node2&property=preferredLeader&property.value=true |
V2 API:
1 | curl -X PUT http://localhost:8983/api/collections/techproducts/shards/shard1/replicas/core_node2/properties/preferredLeader \ |
ADDREPLICAPROP 参数
collection
- 类型:必需
- 说明:副本所属的集合名称
shard
- 类型:必需
- 说明:副本所属的分片名称
replica
- 类型:必需
- 说明:副本名称,例如
core_node1
property
- 类型:必需
- 说明:要添加的属性名称
- 注意:系统会在前面添加
property.
前缀以区别于系统维护的属性
property.value
- 类型:必需
- 说明:分配给属性的值
shardUnique
- 类型:可选
- 默认值:
false
- 说明:如果为
true
,在一个副本中设置此属性将从该分片中的所有其他副本中删除该属性 - 特殊情况:
preferredLeader
属性强制要求shardUnique
为true
ADDREPLICAPROP 使用示例
基础属性设置:
1 | # 设置testprop属性为value1 |
分片唯一属性设置:
1 | # 第一个命令设置属性 |
DELETEREPLICAPROP:删除副本属性
从特定副本中删除任意属性。
API调用方式
V1 API:
1 | http://localhost:8983/solr/admin/collections?action=DELETEREPLICAPROP&collection=techproducts&shard=shard1&replica=core_node2&property=preferredLeader |
V2 API:
1 | curl -X DELETE http://localhost:8983/api/collections/techproducts/shards/shard1/replicas/core_node2/properties/preferredLeader |
DELETEREPLICAPROP 参数
collection
- 类型:必需
- 说明:副本所属的集合名称
shard
- 类型:必需
- 说明:副本所属的分片名称
replica
- 类型:必需
- 说明:副本名称,例如
core_node1
property
- 类型:必需
- 说明:要删除的属性名称
副本类型详解
NRT(Near Real-Time)副本
- 特点:维护事务日志,本地更新索引
- 用途:需要实时更新和查询的场景
- 性能:写入性能最好,存储开销最大
- 领导能力:可以成为分片领导者
TLOG(Transaction Log)副本
- 特点:维护事务日志,但仅通过复制更新索引
- 用途:需要快速故障恢复但写入量不大的场景
- 性能:写入性能中等,存储开销中等
- 领导能力:可以成为分片领导者
PULL副本
- 特点:不维护事务日志,仅通过复制更新索引
- 用途:纯查询节点,读多写少的场景
- 性能:查询性能最好,存储开销最小
- 领导能力:不能成为分片领导者
最佳实践建议
副本规划策略
副本类型选择
- 高写入场景:主要使用NRT副本
- 读多写少场景:NRT + PULL副本组合
- 故障恢复优先:NRT + TLOG副本组合
副本数量规划
- 高可用性:每个分片至少2个副本
- 负载均衡:根据查询负载确定副本数量
- 成本优化:平衡副本数量与存储成本
节点分布策略
- 机架感知:将副本分布在不同机架或可用区
- 负载均衡:避免所有副本集中在少数节点
- 硬件考虑:根据硬件规格合理分配副本
操作最佳实践
副本添加
- 在低负载时期执行
- 使用异步操作避免超时
- 验证副本状态后再进行后续操作
副本移动
- 设置合适的超时时间
- 监控移动过程中的集群状态
- 在共享存储环境中使用inPlaceMove
副本删除
- 确保不会删除唯一副本
- 在删除前备份重要数据
- 使用onlyIfDown避免误删活跃副本
属性管理
- 合理使用preferredLeader实现负载均衡
- 定期审查和清理无用属性
- 使用shardUnique确保属性唯一性
监控和维护
副本健康监控
- 定期检查副本状态
- 监控副本间的同步延迟
- 设置告警机制
性能优化
- 根据查询模式调整副本类型
- 平衡副本在节点间的分布
- 定期评估副本配置的有效性
故障处理
- 制定副本故障恢复流程
- 准备副本重建脚本
- 建立副本数据备份策略
副本管理是SolrCloud运维的核心技能,正确的副本管理策略能够确保集群的高可用性、优良的查询性能和数据安全性。通过合理使用这些副本管理命令,可以构建稳定可靠的搜索集群。