Solr配置:副本放置插件详解与配置指南
当创建新集合或向现有集合添加副本时,Solr需要首先确定将副本放置在哪个节点上,以便根据某些标准以良好平衡的方式分配集群资源。
副本放置插件是确定这些放置位置的可配置组件。它还可以对集合或副本删除等操作执行额外的约束 - 例如,如果插件希望某些集合始终位于相同节点上,或者在某个其他集合存在时始终存在。
在早期版本的Solr中,此功能通过每个集合的规则或自动扩展框架提供。
插件配置
副本放置插件配置可以在solr.xml
文件中配置,或使用/cluster/plugin
API。在solr.xml
中配置的任何插件将被使用,只要没有将副本放置插件定义为集群插件。
一次只能有一个集群范围的插件配置,并且它使用预定义的插件名称:.placement-plugin
。
Solr发行版中包含几个放置插件。可以添加其他放置插件 - 它们必须实现PlacementPluginFactory
接口。如果插件实现ConfigurablePlugin
接口,配置条目还可能包含config
元素。
Solr内置的放置插件
以下放置插件在Solr 9.0中开箱即用。如果在集群属性中未定义放置插件,Solr将默认使用系统属性solr.placementplugin.default
或环境变量SOLR_PLACEMENTPLUGIN_DEFAULT
中配置的插件。支持的值为simple
、random
、affinity
和minimizecores
。如果未设置此类属性或环境变量,则使用SimplePlacementPlugin。
要使用插件,必须使用/cluster/plugin
API添加其配置。例如,要使用AffinityPlacementFactory
插件,应执行以下命令:
1 | curl -X POST -H 'Content-type: application/json' -d '{ |
⚠️ 重要提醒:放置插件配置必须使用预定义名称.placement-plugin
。只能定义一个(或零个)放置配置。
内置插件详解
1. SimplePlacementFactory
默认情况下,Solr 9.0使用副本放置的传统方法SimplePlacementFactory
。当放置插件配置缺失或无效时使用此方法。
简单放置以轮询方式将新副本分配给活动节点:
- 首先准备一个已排序的节点列表,这些节点具有最少的现有副本数,特别是集合的副本
- 然后对于请求中的每个分片,按此顺序将副本添加到连续节点,如果副本数大于节点数则回绕到第一个节点
此放置策略不确保一个分片的副本不会超过1个放置在同一节点上。轮询分配仅粗略地近似跨节点的副本均匀分布。
2. RandomPlacementFactory
此插件创建随机放置,同时防止同一分片的两个副本被放置在同一节点上。如果节点太少无法满足这些约束,将抛出异常并拒绝请求。
由于其简单算法,此插件应仅在简单部署中使用。此插件不需要任何配置。
3. MinimizeCoresPlacementFactory
此插件创建的放置可以最小化所有活动节点上每个节点的核心数,同时不会将同一分片的两个副本放置在同一节点上。如果节点太少无法满足这些约束,将抛出异常并拒绝请求。
由于其简单算法,此插件应仅在简单部署中使用。此插件不需要任何配置。
4. AffinityPlacementFactory
这是最高级和功能最丰富的插件,实现了大致复制Solr 8.x自动扩展配置的副本放置算法。
主要功能
- 多可用区分布:尽可能均匀地跨多个可用区分布每个分片的副本
- 类型化节点支持:根据副本类型将副本分配给特定类型的节点
- 分片隔离:避免在同一节点上放置一个分片的多个副本
- 资源优化:满足上述约束后,最小化每个节点的核心数或最小化磁盘使用量
配置参数
minimalFreeDiskGB
- 可选,默认:5GB
- 如果节点的可用磁盘空间严格少于此值,则从分配决策中排除该节点
prioritizedFreeDiskGB
- 可选,默认:100GB
- 副本分配将优先分配给具有至少此数量GB可用磁盘空间的节点
withCollection
- 可选,默认:无
- 定义主集合(键)必须与辅助集合(值)位于相同节点上的附加约束
withCollectionShards
- 可选,默认:无
- 与
withCollection
相同,但强制执行分片级约束 - 例如,主集合的shardN只能放置在辅助集合的shardN所在的节点上
collectionNodeType
- 可选,默认:无
- 定义集合(键)必须仅位于标记有一个或多个匹配”节点类型”标签的节点上
配置示例
基本配置
1 | curl -X POST -H 'Content-type: application/json' -d '{ |
配置基础参数
1 | curl -X POST -H 'Content-type: application/json' -d '{ |
集合共置配置
1 | curl -X POST -H 'Content-type: application/json' -d '{ |
节点类型约束配置
1 | curl -X POST -H 'Content-type: application/json' -d '{ |
withCollection约束详解
withCollection
约束强制两个配对集合的副本放置在相同节点上。
工作原理
配置定义:在插件配置的
config/withCollection
元素中定义集合对,JSON映射中键是主集合名称,值是辅助集合名称副本放置:与之前版本的Solr不同,此插件不会自动放置辅助集合的副本 - 假定这些副本已经就位
节点过滤:处理主集合的放置请求时,首先过滤候选节点集,删除不包含辅助集合副本的节点
删除保护:插件通过拒绝辅助集合(或其副本)的删除操作来保持这种共置,如果它们仍在主副本所在的节点上使用
节点类型约束
通过collectionNodeType
配置,可以将特定集合限制到特定类型的节点上:
- 节点标记:使用
node_type
系统属性标记节点,值为任意逗号分隔的标签列表 - 集合约束:在插件配置中指定特定集合必须仅放置在匹配至少一个指定标签的节点上
例如:
1 | # 启动时标记节点 |
最佳实践
1. 选择合适的插件
- 简单环境:使用SimplePlacementFactory或RandomPlacementFactory
- 复杂生产环境:使用AffinityPlacementFactory
2. 资源规划
- 合理设置磁盘空间阈值
- 考虑可用区分布
- 规划节点类型和角色
3. 监控和调优
- 监控副本分布情况
- 观察集群负载均衡效果
- 根据实际情况调整配置参数
4. 约束管理
- 谨慎使用共置约束
- 确保辅助集合副本充足
- 定期检查约束有效性
总结
副本放置插件为SolrCloud提供了强大而灵活的副本分布控制能力。通过选择合适的插件和配置,可以实现高效的资源利用、良好的可用性和最佳的性能表现。AffinityPlacementFactory插件特别适合复杂的生产环境,提供了丰富的约束和优化选项。