solr版本8.4,问题比较多,一个个解决+更新
问题一:UI上nodes监控不可用
查看日志:
请求是:https://[fec0::d910:8:5:158:5]:21101/solr/admin/info/system?nodes=fec0::d910:8:5:158:15:21101_solr
报错是:
2020-07-03 11:46:07,693 | ERROR | https-jsse-nio-fec0:0:0:d910:8:5:158:5-21101-exec-1 | org.apache.solr.common.SolrException: Parameter nodes has wrong format at org.apache.solr.handler.admin.AdminHandlersProxy.maybeProxyToNodes(AdminHandlersProxy.java:84) at org.apache.solr.handler.admin.SystemInfoHandler.handleRequestBody(SystemInfoHandler.java:136) at org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:211) at org.apache.solr.handler.admin.InfoHandler.handle(InfoHandler.java:93) at org.apache.solr.handler.admin.InfoHandler.handleRequestBody(InfoHandler.java:83) at org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:211) at org.apache.solr.servlet.HttpSolrCall.handleAdmin(HttpSolrCall.java:922) at org.apache.solr.servlet.HttpSolrCall.handleAdminRequest(HttpSolrCall.java:888) at org.apache.solr.servlet.HttpSolrCall.call(HttpSolrCall.java:616) at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:419) at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:351) at org.apache.solr.servlet.SolrAuthorizationFilter.doFilter(SolrAuthorizationFilter.java:201) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at com.huawei.solr.security.check.SolrParaCheckFilter.doFilter(SolrParaCheckFilter.java:201) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at com.huawei.solr.security.audit.AuditFilter.doFilter(AuditFilter.java:152) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at com.huawei.solr.security.auth.server.AuthenticationFilter.doFilter(AuthenticationFilter.java:619) at com.huawei.solr.security.auth.token.DelegationTokenAuthenticationFilter.doFilter(DelegationTokenAuthenticationFilter.java:270) at com.huawei.solr.security.auth.server.AuthenticationFilter.doFilter(AuthenticationFilter.java:575) at com.huawei.solr.security.auth.DelegationTokenKerberosFilter.doFilter(DelegationTokenKerberosFilter.java:50) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at com.huawei.solr.security.auth.cas.HttpServletRequestWrapperFilterWrapper.doFilter(HttpServletRequestWrapperFilterWrapper.java:37) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at com.huawei.solr.security.auth.cas.Cas20ProxyReceivingTicketValidationFilterWrapper.doFilter(Cas20ProxyReceivingTicketValidationFilterWrapper.java:73) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at com.huawei.solr.security.auth.cas.Cas20AuthenticationFilterWrapper.doFilter(Cas20AuthenticationFilterWrapper.java:63) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at com.huawei.solr.security.auth.cas.LogoutFilter.doFilter(LogoutFilter.java:84) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at com.huawei.solr.security.auth.ServerRealmFilter.doFilter(ServerRealmFilter.java:75) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at com.huawei.solr.security.auth.RerouteRequestFilter.doFilter(RerouteRequestFilter.java:58) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.logging.log4j.web.Log4jServletFilter.doFilter(Log4jServletFilter.java:71) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:798) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:808) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) | org.apache.solr.common.SolrException.log(SolrException.java:148)查看代码:
for (String nodeName : nodes) { if (!nodeName.matches("^[^/:]+:\\d+_[\\w/]+$")) { throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Parameter " + PARAM_NODES + " has wrong format"); }excuse me ??
分析这个正则表达式:^[^/:]+:\\d+_[\\w/]+$
根据https://www.infoq.cn/article/regular-expressions-introduction-part03,这个正则基本上是url通用的正则,但是确实不支持IPv6:port这种格式。
第一部分:^[^/:]+,表示多个[^/:] ,[^xyz]表示匹配不包含x或y或z的任意字符串,比如可以匹配abcdefg,但是不能匹配abcdefgx,因此这部分不匹配包含/或:的任何字符,也就是说我们的IPv6地址:fec0::d910:8:5:158:5中包含了冒号,是无法匹配的。
那么问题来了,所有的IPv6地址都可能包含冒号,因此这个/admin/info/system的API不支持IPv6:port的格式
第二部分::\\d+ ,java中\\表示转义,这部分表示任意个数字,也就是端口号,没有问题
第三部分:_[\\w/]+$,\\w表示任意字符,后面加上/没懂,一说表示结束
修改正则表达式为:^[^/]+:\\d+_[\\w/]+$,替换jar包,重启服务验证OK