Solr/SolrCloud SearchHandler详解

博客详细介绍了Solr的SearchHandler在SolrCloud环境下的工作流程,包括主节点与从节点的交互、分布式执行引擎ShardHandler、请求分步处理等关键步骤,揭示了SolrCloud搜索的分步异步机制。

由于SearchHandler过程比较复杂,基本每次用到都需要重新看一眼才能记忆,而且还比较容易记错。因此索引把写博文一来方便自己,二来方便别人。

当然,对Solr来讲SearchHandler并不复杂,而且十分简洁和清晰。不过,在SolrCloud下由于需要节点的协助,所以变得有些复杂。同时SolrCloud下的设计非常巧妙,非常值得细读和参考。
先看一眼Solr下SearchHandler流程。
这里写图片描述

主干流程就是这样,比较清晰简单。当然后细节依然比较复杂,主要原因Solr在组织代码的时候并没有单机与分布式的逻辑分开来。也就是单机与分布式的代码是堆一起的,这只是其一;其次是因为处理搜索的处理器QueryComponent逻辑也非常复杂。对了解SearchHandler而言,我觉得上面的流程就可以。对于查询语法的解析,搜索逻辑以及搜索过程都出现QueryComponent中,另找机会介绍这一块,本文不详述这块内容。

SearchHandler#inform(SolrCore core) {
    Object declaredComponents = initArgs.get(INIT_COMPONENTS);
    List<String> first = (List<String>) initArgs.get(INIT_FIRST_COMPONEMTS);
    List<String> last = (List<String>) initArgs.get(INIT_LAST_COMPONENTS);

    // TODO 不堆代码了,主要目的是根据 Handler 的配置,构建 **components** 链。
    // 顺序是 first -
root@f1ef6bb4588a:/opt/solr# ps aux | grep java root 6700 0.0 0.0 12820 2048 pts/1 S+ 03:26 0:00 grep java root@f1ef6bb4588a:/opt/solr# ps aux | grep java root 6700 0.0 0.0 12820 2048 pts/1 S+ 03:26 0:00 grep java root@f1ef6bb4588a:/opt/solr# root@f1ef6bb4588a:/opt/solr# grep -R "SOLR_HOST" /opt/solr/ /opt/solr/CHANGES.txt: }' http://$SOLR_HOST:$SOLR_PORT/api/cluster /opt/solr/CHANGES.txt: }' http://$SOLR_HOST:$SOLR_PORT/api/cluster /opt/solr/CHANGES.txt:* SOLR-7545: Honour SOLR_HOST parameter with bin/solr{,.cmd} /opt/solr/bin/solr:if [ "$SOLR_HOST" != "" ]; then /opt/solr/bin/solr: SOLR_TOOL_HOST="$SOLR_HOST" /opt/solr/bin/solr: echo " Can be run on remote (non-Solr) hosts, as long as a valid SOLR_HOST is provided in solr.in.sh" /opt/solr/bin/solr: echo "Can be run from remote (non-Solr) hosts, as long as a valid SOLR_HOST is provided in solr.in.sh" /opt/solr/bin/solr: SOLR_HOST="$2" /opt/solr/bin/solr: PASS_TO_RUN_EXAMPLE+=" -h $SOLR_HOST" /opt/solr/bin/solr:if [ "$SOLR_HOST" != "" ]; then /opt/solr/bin/solr: SOLR_HOST_ARG=("-Dhost=$SOLR_HOST") /opt/solr/bin/solr: SOLR_HOST_ARG=() /opt/solr/bin/solr: if [ "$SOLR_HOST" != "" ]; then /opt/solr/bin/solr: REMOTE_JMX_OPTS+=("-Djava.rmi.server.hostname=$SOLR_HOST") /opt/solr/bin/solr: echo -e " SOLR_HOST = $SOLR_HOST" /opt/solr/bin/solr: "${SOLR_HOST_ARG[@]}" "-Duser.timezone=$SOLR_TIMEZONE" "-XX:-OmitStackTraceInFastThrow" \ /opt/solr/bin/solr.cmd:IF NOT "%SOLR_HOST%"=="" ( /opt/solr/bin/solr.cmd: set "SOLR_TOOL_HOST=%SOLR_HOST%" /opt/solr/bin/solr.cmd:echo Can be run on remote (non-Solr^) hosts, as long as a valid SOLR_HOST is provided in solr.in.cmd /opt/solr/bin/solr.cmd:echo Can be run from remote (non-Solr^) hosts, as long as a valid SOLR_HOST is provided in solr.in.cmd. /opt/solr/bin/solr.cmd:set SOLR_HOST=%~2 /opt/solr/bin/solr.cmd:IF NOT "%SOLR_HOST%"=="" ( /opt/solr/bin/solr.cmd: set SOLR_HOST_ARG=-Dhost=%SOLR_HOST% /opt/solr/bin/solr.cmd: set SOLR_HOST_ARG= /opt/solr/bin/solr.cmd: IF NOT "%SOLR_HOST%"=="" set REMOTE_JMX_OPTS=%REMOTE_JMX_OPTS% -Djava.rmi.server.hostname=%SOLR_HOST% /opt/solr/bin/solr.cmd: @echo SOLR_HOST = %SOLR_HOST% /opt/solr/bin/solr.cmd:IF NOT "%SOLR_HOST_ARG%"=="" set "START_OPTS=%START_OPTS% %SOLR_HOST_ARG%" /opt/solr/bin/solr.in.cmd:REM set SOLR_HOST=192.168.1.1 /opt/solr/bin/solr.in.sh:#SOLR_HOST="192.168.1.1" root@f1ef6bb4588a:/opt/solr# grep -R "8983" /opt/solr/server/etc/*.xml /opt/solr/server/etc/jetty-http.xml: <Set name="port"><Property name="jetty.port" default="8983" /></Set> /opt/solr/server/etc/jetty-https.xml: <Set name="port"><Property name="solr.jetty.https.port" default="8983" /></Set> /opt/solr/server/etc/jetty-https8.xml: <Set name="port"><Property name="solr.jetty.https.port" default="8983" /></Set> root@f1ef6bb4588a:/opt/solr# tail -n 100 /opt/solr/server/logs/solr-8983-console.log OpenJDK 64-Bit Server VM warning: Failed to reserve shared memory (errno = 12). OpenJDK 64-Bit Server VM warning: Failed to reserve shared memory (errno = 12). OpenJDK 64-Bit Server VM warning: Failed to reserve shared memory (errno = 12). OpenJDK 64-Bit Server VM warning: Failed to reserve shared memory (errno = 12). library initialization failed - unable to allocate file descriptor table - out of memoryroot@f1ef6bb4588a:/opt/solr#
03-22
<think>嗯,用户提供了一些在Solr容器中执行的命令和它们的输出,看起来他们可能在排查Solr服务的问题。首先,我需要理解用户执行了哪些命令以及这些输出意味着什么。 用户首先运行了`ps aux | grep java`,但结果中只显示了grep进程本身,没有其他Java进程。这可能意味着Solr的Java服务没有运行,或者因为某些原因崩溃了。接下来,用户检查了环境变量`SOLR_HOST`的配置,使用`grep -R "SOLR_HOST" /opt/solr/`,结果显示该变量在多个脚本中被引用,但可能在配置文件中被注释掉了,比如在`solr.in.sh`里是#SOLR_HOST="192.168.1.1",所以默认可能没有设置。 然后用户查看了端口8983的配置,发现Jetty的HTTP和HTTPS端口都设置为8983,这可能没问题,但需要确认是否有冲突。最后,用户查看了日志文件`solr-8983-console.log`,显示了很多内存相关的错误,比如共享内存分配失败和文件描述符不足,这明显是内存问题导致的启动失败。 现在需要把这些信息串联起来,分析根本原因。首先,Java进程没有运行,结合日志中的内存错误,很可能是由于容器内存不足,导致JVM无法启动。用户可能需要调整容器的内存限制,或者优化Solr的JVM参数,比如减少堆大小。另外,检查`SOLR_HOST`是否正确设置,虽然可能不是直接原因,但如果有网络配置问题也可能影响服务绑定。不过根据错误信息,主要问题还是内存不足,所以应该优先解决内存配置。</think>根据你提供的终端操作记录,我来逐步分析并解释当前系统的状态: **一、Java进程状态检查** 1. 执行命令:$$ps\ aux\ |\ grep\ java$$ 2. 输出结果:仅显示`grep\ java`进程 3. 结论:此时没有正在运行的Solr Java进程,可能原因包括: - Solr服务未启动 - 服务启动后异常退出 - 容器资源不足导致进程崩溃 **二、SOLR_HOST配置检查** 1. 执行命令:$$grep\ -R\ "SOLR_HOST"\ /opt/solr/$$ 2. 关键发现: ```bash /opt/solr/bin/solr.in.sh:#SOLR_HOST="192.168.1.1" /opt/solr/bin/solr.cmd:REM set SOLR_HOST=192.168.1.1 ``` 3. 结论:SOLR_HOST变量在配置文件中被注释(默认未启用),如需设置需取消注释并指定有效IP **三、端口配置检查** 1. 执行命令:$$grep\ -R\ "8983"\ /opt/solr/server/etc/*.xml$$ 2. 关键配置: ```xml <Set name="port"><Property name="jetty.port" default="8983"/></Set> <Set name="port"><Property name="solr.jetty.https.port" default="8983"/></Set> ``` 3. 结论:Solr默认配置使用8983端口(HTTP和HTTPS共用) **四、日志分析(关键错误)** 1. 查看日志:$$tail\ -n\ 100\ /opt/solr/server/logs/solr-8983-console.log$$ 2. 致命错误: ``` OpenJDK 64-Bit Server VM warning: Failed to reserve shared memory (errno = 12) library initialization failed - unable to allocate file descriptor table - out of memory ``` 3. 错误分析: - `errno=12`对应`ENOMEM`(内存不足) - 直接原因:容器内存资源不足导致JVM无法分配所需内存 **解决方案建议**: 1. 提升容器内存限制 - Docker运行时添加参数:`docker run -m 2g ...` 2. 调整JVM内存参数 ```bash # 修改 /opt/solr/bin/solr.in.sh SOLR_JAVA_MEM="-Xms512m -Xmx512m" ``` 3. 验证服务状态 ```bash # 启动Solr /opt/solr/bin/solr start -p 8983 # 检查进程 ps aux | grep java ``` **补充建议**: - 如需远程访问,取消`SOLR_HOST`的注释并设置为`0.0.0.0` - 检查容器ulimit设置(特别是`nofile`限制) - 建议将日志文件挂载到持久化存储卷 以上信息表明当前问题的核心是容器内存资源不足导致JVM初始化失败,建议优先调整内存配置后重新启动服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值