SolrCloud Autoscaling 自动添加副本

SolrCloud Autoscaling 自动添加副本

前言 问题描述

起因是这样的,我在本地调试 Solr 源码(版本 7.7.3),用 IDEA 以 solrcloud 方式启动了 2 个 Solr 服务,如下所示:
在这里插入图片描述

上图的启动参数 VM Options 如下:

-DzkHost=127.0.0.1:2181/solr7 -Djetty.port=8985 -Duser.timezone=UTC 
-Djetty.home=/Workspace/source-code/solr/solr/server 
-Dsolr.solr.home=/Workspace/Solr/Solr7_SolrHome_8985 
-Dsolr.install.dir=/Workspace/source-code/solr/solr 
-Dsolr.log.dir=/Workspace/Solr/Solr7_SolrHome_8985/logs 
-Dsolr.log=/Workspace/Solr/Solr7_SolrHome_8985/logs/solr.log

solrcloud_8986 启动参数和上面的类似,只需更改端口号

之后我在本地创建了一个 MOVIE 的 Collection,创建的时候表单内容如下:
在这里插入图片描述
上面的页面是我们自己的搜索中台创建 Collection 的表单页面,当时我没注意到 autoAddReplicas 参数设置了 true,当创建好 Collection 后,系统会自动分配好 shard 和 副本到对应的 Solr 节点上,如下所示:
在这里插入图片描述
之后我把 Shard1 和 Shard2 对应的副本全部删除,在8985端口的Solr节点上创建这两个 Shard 的 TLOG 类型副本,之后在 8986 节点上创建 Shard1 的 PULL 类型副本,如下所示:
在这里插入图片描述
起初我本来想调试查看 PULL 副本同步 TLOG 副本数据的代码,结果当我断点调试的时候发现 PULL 类型的副本没了,系统自动的在 8985 端口的 Solr 节点创建了一个 NRT 类型的副本。遇到这种情况我就比较纳闷,于是我重复上面的步骤,把 8986 端口的 Solr 节点 down 掉,观察后面的现象。当我关闭 8986 端口后,节点状态的变化如下:
在这里插入图片描述
可以看到此时 8986 端口的 Solr 节点状态已变成 down,之后耐心等待~。大约 2 min 左右,Shard 副本信息变成了如下结果:
在这里插入图片描述
我们可以看到此时原先的 PULL 副本没有了,取而代之的新增了一个 NRT 副本,而且该副本创建在 8985 端口的 Solr 节点上。
后来我仔细审视整个流程并调试源码,发现是我创建 Solr Collection 的时候无意将 autoAddReplica设置了 true,这个参数默认应该是 false,那么这个参数有什么作用,为什么会发生这个现象,这里就要提到 SolrCloud 的 Autoscaling 自动添加副本的功能了。

SolrCloud Autoscaling 自动添加副本

官方文档地址:https://solr.apache.org/guide/7_7/solrcloud-autoscaling-auto-add-replicas.html#the-autoaddreplicas-parameter

Solr 提供了一种方法,当活动副本( active replicas )数量低于创建集合时指定的复制因子(replicationFactor)时,自动为集合添加副本。

这里就要说到之前我创建 Collection 时,填写的 replicationFactor 为 2,这个参数的意思如下:
在这里插入图片描述

Solr 官方文档地址:https://solr.apache.org/guide/7_7/collections-api.html

这个参数默认是 1,而且其默认创建的就是 NRT 类型副本,而我观察到的现象是如果我的一个 Shard 有多副本,当其他机器的副本不可用时,会扩展出一个新的副本来,而没有创建过其他副本的 Shard2 并不会拓展出来新的副本。发生这个现象的原因就是我在创建 Collection 的时候将 addAutoReplicas 参数设置成了 true,其官文文档如下:
在这里插入图片描述
后面我又创建了一个新的 Collection 并将 autoAddReplicas 设置成了 false,重复之前的操作的步骤,等待 2 min 后,IDEA 中的 8985 端口的 Solr 节点打印出了如下日志:
在这里插入图片描述
中台页面可以看到:
在这里插入图片描述
原 PULL 类型的副本没有消失,而且也没有创建出新的副本。

autoAddReplicas 参数

在创建 Collection 的时候将布尔值 autoAddReplicas 参数传递给 Collection API 的 CREATE 命令,就会开启SolrCloud Autoscaling 自动添加副本的功能。接口如下:

创建启用 autoAddReplicas 的集合:
http://localhost:8983/solr/admin/collections?action=CREATE&name=my_collection&numShards=1&replicationFactor=5&autoAddReplicas=true

MODIFYCOLLECTION 命令可用于为任何集合启用或禁用此功能,接口如下:

修改集合以禁用 autoAddReplicas
http://localhost:8983/solr/admin/collections?action=MODIFYCOLLECTION&collection=my_collection&autoAddReplicas=false

在 ZooKeeper 中,如下节点可以看到集合的状态信息:
在这里插入图片描述
比如上图 autoAddReplicas 为 false,当我请求:http://localhost:8985/solr/admin/collections?action=MODIFYCOLLECTION&collection=MOVIE&autoAddReplicas=true 接口的时候,其值就会变为 true:
在这里插入图片描述

.autoAddReplicas 触发器

在上面的场景中,每次 8986 端口 Solr 节点 down 掉后再过 2 min 之后才会触发新增副本的操作,这个时间又是在哪里配置的?
在 Solr 中,当任何集合启用 autoAddReplicas 功能时,将自动创建名为 .autoAddReplicas 的触发器。

一个触发器就足以服务于所有启用此功能的集合。.autoAddReplicas 触发器监控从集群中丢失的节点,并使用默认的触发器动作来创建新的副本,以替换那些由丢失节点托管的副本。如果旧节点重新上线,它会卸载被移动的副本,该节点将根据需要自由托管其他副本。

由于该触发器为所有集合提供 autoAddReplicas 功能,因此可以使用挂起触发器和恢复触发器的自动扩展 API 命令,通过一次 API 调用为所有集合禁用和启用此功能。

为所有集合挂起 autoAddReplicas 功能

{"suspend-trigger": {"name" : ".autoAddReplicas"}
}

为所有集合恢复 autoAddReplicas 功能

{"resume-trigger": {"name" : ".autoAddReplicas"}
}

请求的 url 为:

curl -X POST -H "Content-Type: application/json" -d '{"suspend-trigger": {"name": ".auto_add_replicas"}
}' "http://localhost:8985/solr/admin/autoscaling"# 响应如下:
{"responseHeader":{"status":0,"QTime":236},"changed":[".auto_add_replicas"],"result":"success","WARNING":"This response format is experimental.  It is likely to change in the future."}---curl -X POST -H "Content-Type: application/json" -d '{"resume-trigger": {"name" : ".auto_add_replicas"}
}' "http://localhost:8985/solr/admin/autoscaling"# 响应如下:
{"responseHeader":{"status":0,"QTime":121},"changed":[".auto_add_replicas"],"result":"success","WARNING":"This response format is experimental.  It is likely to change in the future."}

在 ZooKeeper 中的 autoscaling.json 也可以看到更改,如下所示:
在这里插入图片描述
上面截图可以看到 waitFor 被设置成了 120(单位是秒),这也是为什么节点 down 掉 2min 后才会新增副本,关于 autoscaling.json 的解释如下:

在 SolrCloud 中,autoscaling.json 是一个配置文件,用于定义如何自动扩展集群资源以应对不同的事件。内容如下:

{"triggers": {".auto_add_replicas": {"name": ".auto_add_replicas","event": "nodeLost","waitFor": 120,"enabled": "true","actions": [{"name": "auto_add_replicas_plan","class": "solr.AutoAddReplicasPlanAction"},{"name": "execute_plan","class": "solr.ExecutePlanAction"}]},".scheduled_maintenance": {"name": ".scheduled_maintenance","event": "scheduled","startTime": "NOW","every": "+1DAY","enabled": true,"actions": [{"name": "inactive_shard_plan","class": "solr.InactiveShardPlanAction"},{"name": "inactive_markers_plan","class": "solr.InactiveMarkersPlanAction"},{"name": "execute_plan","class": "solr.ExecutePlanAction"}]}},"listeners": {".auto_add_replicas.system": {"beforeAction": [],"afterAction": [],"stage": ["STARTED","ABORTED","SUCCEEDED","FAILED","BEFORE_ACTION","AFTER_ACTION","IGNORED"],"trigger": ".auto_add_replicas","class": "org.apache.solr.cloud.autoscaling.SystemLogListener"},".scheduled_maintenance.system": {"beforeAction": [],"afterAction": [],"stage": ["STARTED","ABORTED","SUCCEEDED","FAILED","BEFORE_ACTION","AFTER_ACTION","IGNORED"],"trigger": ".scheduled_maintenance","class": "org.apache.solr.cloud.autoscaling.SystemLogListener"}},"properties": {}
}

Triggers 部分

.auto_add_replicas 触发器

  • name:触发器的名称,.auto_add_replicas。
  • event:触发这个触发器的事件类型,这里是 nodeLost,意味着当集群中的节点丢失时触发。
  • waitFor:在执行任何操作前等待的时间(秒),这里设置为 120 秒,以便在节点可能只是暂时不可达而非永久丢失的情况下,给予系统一定的恢复时间。
  • enabled:指示触发器是否启用。
  • actions
    • auto_add_replicas_plan:定义了当触发器被触发时要执行的具体行动,使用 solr.AutoAddReplicasPlanAction 类,这个动作负责计划在其他节点上创建丢失节点上副本的替代副本。
    • execute_plan:执行上一步计划的动作,使用 solr.ExecutePlanAction 类。

.scheduled_maintenance 触发器

  • name:触发器的名称,.scheduled_maintenance。
  • event:事件类型为 scheduled,表示这是一个根据计划进行的定期任务。
  • startTime:计划任务开始的时间,这里设置为 NOW,表示立即开始。
  • every:触发频率,这里是 +1DAY,表示每天执行一次。
  • enabled:此触发器是否启用。
  • actions
    • inactive_shard_plan:使用 solr.InactiveShardPlanAction 类,可能涉及对某些 shard 进行维护或使其暂时不活跃。
    • inactive_markers_plan:使用 solr.InactiveMarkersPlanAction 类,处理与维护相关的标记。
    • execute_plan:执行上述计划的动作。

Listeners 部分

.auto_add_replicas.system.scheduled_maintenance.system 监听器

这些监听器用于记录系统日志,并在特定的阶段对触发器活动进行反应。

  • beforeActionafterAction:分别在动作执行前后的监听器响应,这里没有具体的动作定义。
  • stage:定义监听器应响应的各种阶段,如 STARTED, ABORTED, SUCCEEDED, FAILED 等,这有助于跟踪每个操作的生命周期。
  • trigger:关联的触发器名称。
  • class:处理监听事件的类,这里是 org.apache.solr.cloud.autoscaling.SystemLogListener,用于将自动扩展事件记录到系统日志。

properties 部分

通常这个部分可以用来定义一些全局属性或默认值。


参考文档:https://solr.apache.org/guide/7_7/solrcloud-autoscaling-auto-add-replicas.html

部分断点截图:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/39935.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RocketMQ实战:一键在docker中搭建rocketmq和doshboard环境

在本篇博客中,我们将详细介绍如何在 Docker 环境中一键部署 RocketMQ 和其 Dashboard。这个过程基于一个预配置的 Docker Compose 文件,使得部署变得简单高效。 项目介绍 该项目提供了一套 Docker Compose 配置,用于快速部署 RocketMQ 及其…

美国商超入驻细节全面曝光,电竞外设产品的国际化浪潮即将席卷全球

近年来,随着电子竞技(简称电竞)行业的蓬勃发展,电竞外设产品也逐渐成为消费者关注的热点。近期,一系列美国商超入驻细节的全面曝光,预示着电竞外设产品的出海风潮即将到来。 电竞行业迅速崛起,全球市场规模年均增长超1…

ResNet50V2

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 一、ResNetV1和ResNetV2的区别 ResNetV2 和 ResNetV1 都是深度残差网络(ResNet)的变体,它们的主要区别在于残差块的设计和…

美业系统实操:手机App如何查看员工业绩?美业门店管理系统Java源码分享

在当今竞争激烈的美业市场中,有效的管理对于提高效率、增强客户体验和推动业务增长至关重要。美业管理系统通过其各种功能和优势,成为现代美业企业不可或缺的利器。 ▶下面以博弈美业进行实操-手机App端如何查看员工业绩? 1.店主登录手机端…

不是大厂云用不起,而是五洛云更有性价比

明月代维的一个客户的大厂云境外云服务器再有几天就到期了,续费提醒那是提前一周准时到来,但是看到客户发来的续费价格截图,我是真的没忍住。这不就是在杀熟吗?就这配置续费竟然如此昂贵?说实话这个客户的服务器代维是…

Ollama+OpenWeb UI搭建最简单的大模型交互界面

Open WebUI是一个专为大型语言模型(LLMs)设计的Web用户界面。这个界面提供了一个直观、响应迅速且易于使用的平台,使用户能够与本地运行的语言模型进行交互,就像与云服务中的模型交互一样。可以非常方便的调试、调用本地模型。你能…

贴片电阻:01A、01B、01C、01D分别是什么意思?

贴片电阻的识别方法: 1、数字索位标称法 (一般矩形片状电阻采用这种标称法) 数字索位标称法就是在电阻体上用三位数字来标明其阻值。它的第一位和第二位为有效数字,第三位表示在有效数字后面所加“0”的个数.这一位不会出现字母。例如&…

项目实战-MySQL极佳优化方案---前缀索引

一、应用背景 由于公司项目数据量较大,开发小程序和APP过程中,SQL查询超过1.5s以上的等待时间,因此需要对SQL或者数据表结构设计进行优化。就不讲SQL语句优化啦,而是记录一下数据表结构设计优化的前缀索引实现。 二、MySQL索引 …

昇思25天学习打卡营第10天|使用静态图加速

昇思25天学习打卡营第10天|使用静态图加速 前言使用静态图加速背景介绍动态图模式静态图模式 静态图模式的使用场景静态图模式开启方式基于装饰器的开启方式基于context的开启方式 静态图的语法约束JitConfig配置选项静态图高级编程技巧 个人任务打卡(读者请忽略&am…

UE4_材质_水体的反射与折射制作_Ben教程

在这个教程中,将制作水的反射和折射,上个教程,我们主要讲了制作水涟漪(水面波纹)和水滴法线混合,水深计算,我们首先要谈的是反射和产生折射的问题。我们将所有从干扰从场景中分离出去&#xff0…

一个动画形式的分形树

要在Python中使用matplotlib来创建并展示一个动画形式的分形树(例如,基于递归的L系统生成的树),我们需要结合使用matplotlib的动画功能以及递归函数来生成树的形状。下面是一个简单的示例,展示如何使用matplotlib和Fun…

Ubuntu + SSH密钥连接服务器

1. 下载VSCode 下载链接 cd到下载文件夹后,使用命令安装,把xxx复制为文件名 sudo dpkg -i xxx.deb2. 为VSCode换皮肤 3. 下载SSH插件 4. 配置SSH 把密钥key文件放在/home/your_user_name/.ssh/里面,然后在/home/your_user_name/.ssh/confi…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【18】认证服务02—微博社交登录

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【18】认证服务02—微博社交登录 微博社交登录图示原理前置准备实现流程完整代码 参考 微博社交登录 OAuth: OAuth(开放授权)是一个开放标准&#xff0…

Spring Boot2.x教程:(四)Spring Boot2.6及之后版本整合Knife4j的问题

Spring Boot2.6及之后版本整合Knife4j的问题 1、概述2、问题出现原因及解决办法3、拓展3.1、为什么发生这种变化 4、总结 大家好,我是欧阳方超,可以扫描下方二维码关注我的公众号“欧阳方超”,后续内容将在公众号首发。 1、概述 今天在2.7…

互联网盲盒小程序的市场发展前景如何?

近几年来,盲盒成为了大众热衷的消费市场。盲盒是一个具有随机性和惊喜感,它能够激发消费者的好奇心,在拆盲盒的过程中给消费者带来巨大的愉悦感,在各种的吸引力下,消费者也愿意为各类盲盒买单。如今,随着盲…

VSCode里python代码不扩展/级联了的解决办法

如图 解决办法:重新下载新的扩展工具 步骤如下 1、在左边工具栏打开Extensions 2、搜索框输入python,选择别的扩展工具,点击Install - 3在扩展工具所在的目录下,新建一个文件,就可以用了

iis部署前后端分离项目(React前端,Node.js后端)

iis虽然已经有点过时,但不少用户还在用,故总结一下。 1. 安装iis 如果电脑没有自带iis管理器,打开控制面板->程序->启用或关闭Windows功能,勾选iis安装即可 2. 部署前端项目 打开iis,添加网站,物理…

Docker加速器配置指南:提升镜像下载速度的秘诀 加速安装Mysql Redis ES

在安装 Docker 镜像时,由于官方镜像下载速度较慢,我们可以使用阿里云的镜像加速器来提升下载速度。 使用阿里云镜像加速器 首先,找到并配置阿里云的镜像加速器。安装教程如下: 登录阿里云,进入容器镜像服务。直达链…

05 docker 镜像

目录 1. 镜像 2. 联合文件系统 3. docker镜像加载原理 4. 镜像分层 镜像分层的优势 5. 容器层 1. 镜像 镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好行程一个可交付的运行环境&#xf…

AMEYA360代理:海凌科60G客流量统计雷达模块 4T4R出入口绊数计数

数字化时代,不管是大型商城还是各种连锁店,客流统计分析都可以帮助企业更加精准地了解顾客需求和消费行为。 海凌科推出一款专用于客流量统计的60G雷达模块,4T4R,可以实时进行固定范围内的人体运动轨迹检测,根据人体的…