问题描述
我有一个基于 Marketplace Solr Kubernetes 部署的基于 Kubernetes 的 SolrCloud 部署。可以在 https://github.com/GoogleCloudPlatform/click-to-deploy/tree/master/k8s/solr 中找到实现的详细信息。
对于我的用例,我正在尝试使用 GitHub 操作来更新/创建 SolrCloud 集合:
- 如果集合不存在,则创建它
- 如果集合存在,则根据架构更改更新它
我正在运行以下服务:
# kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ilb-service LoadBalancer XXX XXX 8983:30072/TCP 92d
kubernetes ClusterIP XXX <none> 443/TCP 92d
solr-1-solr-exporter ClusterIP XXX <none> 9983/TCP 92d
solr-1-solr-headless ClusterIP XXX <none> 8983/TCP 92d
solr-1-solr-svc ClusterIP XXX <none> 8983/TCP 92d
solr-1-zk-client ClusterIP XXX <none> 2181/TCP 92d
solr-1-zk-headless ClusterIP None <none> 2888/TCP,3888/TCP 92d
对于本地开发,我已经像这样对 solr-1-zk-client 进行了端口转发:
kubectl port-forward \
svc/solr-1-zk-client \
--namespace default 2181
我正在尝试使用以下脚本来测试是否可以添加文档:
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.solr.client.solrj.solrClient;
import org.apache.solr.client.solrj.solrQuery;
import org.apache.solr.client.solrj.solrserverException;
import org.apache.solr.client.solrj.impl.CloudSolrClient;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.solr.client.solrj.impl.LBHttpSolrClient;
import org.apache.solr.client.solrj.request.QueryRequest;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.solrDocument;
import org.apache.solr.common.solrInputDocument;
import picocli.CommandLine;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.Optional;
@CommandLine.Command(name = "SolrManager",description = "Creates a solr collection using a provided config.",mixinStandardHelpOptions = true)
public class SolrManager implements Runnable{
private static final Logger LOG = LogManager.getLogger(SolrManager.class);
@CommandLine.Option(names = { "-z","--zkHost"},paramLabel = "ZKHOST",description = "zkHost to connect to")
String zkHost;
@CommandLine.Option(names = { "-DzkACLProvider" },paramLabel = "zkACLProvider",required = true)
String DzkACLProvider;
@CommandLine.Option(names = { "-DzkCredentialsProvider" },paramLabel = "zkCredentialsProvider",required = true)
String DzkCredentialsProvider;
@CommandLine.Option(names = { "-DzkDigestUsername" },paramLabel = "zkDigestUsername",required = true)
String DzkDigestUsername;
@CommandLine.Option(names = { "-DzkDigestPassword" },paramLabel = "zkDigestPassword",required = true)
String DzkDigestPassword;
@CommandLine.Option(names = { "-DzkDigestReadonlyUsername" },paramLabel = "zkDigestReadonlyUsername",required = true)
String DzkDigestReadonlyUsername;
@CommandLine.Option(names = { "-DzkDigestReadonlyPassword" },paramLabel = "zkDigestReadonlyPassword",required = true)
String DzkDigestReadonlyPassword;
public static void main(String... args) {
CommandLine.run(new SolrManager(),System.err,args);
}
@Override
public void run() {
System.setProperty("zkACLProvider",DzkACLProvider);
System.setProperty("zkCredentialsProvider",DzkCredentialsProvider);
System.setProperty("zkDigestUsername",DzkDigestUsername);
System.setProperty("zkDigestPassword",DzkDigestPassword);
System.setProperty("zkDigestReadonlyUsername",DzkDigestReadonlyUsername);
System.setProperty("zkDigestReadonlyPassword",DzkDigestReadonlyPassword);
System.setProperty("basicauth",Dbasicauth);
LOG.debug("Connecting to Solr cluster: " + zkHost);
CloudSolrClient client = new CloudSolrClient.Builder(Collections.singletonList(zkHost),Optional.empty()).build();
client.setDefaultCollection("test");
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id","1234");
doc.addField("content","A lovely summer holiday");
try {
client.add(doc);
client.commit();
} catch (SolrserverException e) {
e.printstacktrace();
} catch (IOException e) {
e.printstacktrace();
}
try {
client.close();
} catch (IOException e) {
e.printstacktrace();
}
}
}
我希望这会起作用,但出现以下异常:
Exception in thread "main" picocli.CommandLine$ExecutionException: Error while running command (SolrManager@53fdffa1): org.apache.solr.client.solrj.impl.CloudSolrClient$RouteException: IOException occurred when talking to server at: http://solr-1-solr-0.solr-1-solr-headless.default:8983/solr/test_shard1_replica_n1
at picocli.CommandLine.executeUserObject(CommandLine.java:1948)
at picocli.CommandLine.access$1300(CommandLine.java:145)
at picocli.CommandLine$RunLast.executeUserObjectOfLastSubcommandWithSameParent(CommandLine.java:2352)
at picocli.CommandLine$RunLast.handle(CommandLine.java:2346)
at picocli.CommandLine$RunLast.handle(CommandLine.java:2311)
at picocli.CommandLine$AbstractParseResultHandler.handleParseResult(CommandLine.java:2172)
at picocli.CommandLine.parseWithHandlers(CommandLine.java:2550)
at picocli.CommandLine.run(CommandLine.java:3008)
at picocli.CommandLine.run(CommandLine.java:2959)
at SolrManager.main(SolrManager.java:62)
Caused by: org.apache.solr.client.solrj.impl.CloudSolrClient$RouteException: IOException occurred when talking to server at: http://solr-1-solr-0.solr-1-solr-headless.default:8983/solr/test_shard1_replica_n1
at org.apache.solr.client.solrj.impl.CloudSolrClient.getRouteException(CloudSolrClient.java:125)
at org.apache.solr.client.solrj.impl.CloudSolrClient.getRouteException(CloudSolrClient.java:46)
at org.apache.solr.client.solrj.impl.BaseCloudSolrClient.directUpdate(BaseCloudSolrClient.java:581)
at org.apache.solr.client.solrj.impl.BaseCloudSolrClient.sendRequest(BaseCloudSolrClient.java:1076)
at org.apache.solr.client.solrj.impl.BaseCloudSolrClient.requestWithRetryOnStaleState(BaseCloudSolrClient.java:934)
at org.apache.solr.client.solrj.impl.BaseCloudSolrClient.request(BaseCloudSolrClient.java:866)
at org.apache.solr.client.solrj.solrRequest.process(SolrRequest.java:214)
at org.apache.solr.client.solrj.solrClient.add(SolrClient.java:177)
at org.apache.solr.client.solrj.solrClient.add(SolrClient.java:138)
at org.apache.solr.client.solrj.solrClient.add(SolrClient.java:156)
at SolrManager.run(SolrManager.java:83)
at picocli.CommandLine.executeUserObject(CommandLine.java:1939)
... 9 more
Caused by: org.apache.solr.client.solrj.solrserverException: IOException occurred when talking to server at: http://solr-1-solr-0.solr-1-solr-headless.default:8983/solr/test_shard1_replica_n1
at org.apache.solr.client.solrj.impl.HttpSolrClient.executeMethod(HttpSolrClient.java:695)
at org.apache.solr.client.solrj.impl.HttpSolrClient.request(HttpSolrClient.java:266)
at org.apache.solr.client.solrj.impl.HttpSolrClient.request(HttpSolrClient.java:248)
at org.apache.solr.client.solrj.impl.LBSolrClient.doRequest(LBSolrClient.java:369)
at org.apache.solr.client.solrj.impl.LBSolrClient.request(LBSolrClient.java:297)
at org.apache.solr.client.solrj.impl.BaseCloudSolrClient.lambda$directUpdate$0(BaseCloudSolrClient.java:555)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at org.apache.solr.common.util.ExecutorUtil$MDCAwareThreadPoolExecutor.lambda$execute$0(ExecutorUtil.java:218)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.net.UnkNownHostException: solr-1-solr-0.solr-1-solr-headless.default: Name or service not kNown
at java.base/java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
at java.base/java.net.InetAddress$PlatformNameService.lookupAllHostAddr(InetAddress.java:929)
at java.base/java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1515)
at java.base/java.net.InetAddress$NameServiceAddresses.get(InetAddress.java:848)
at java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1505)
at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1364)
at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1298)
at org.apache.http.impl.conn.SystemDefaultDnsResolver.resolve(SystemDefaultDnsResolver.java:45)
at org.apache.http.impl.conn.DefaultHttpClientConnectionoperator.connect(DefaultHttpClientConnectionoperator.java:112)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:376)
at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:393)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56)
at org.apache.solr.client.solrj.impl.HttpSolrClient.executeMethod(HttpSolrClient.java:571)
... 10 more
我预计所有请求都会发送到我通过端口转发的 Zookeeper 服务,但似乎 CloudSolrClient 客户端正在尝试从我的本地开发机器调用 http://solr-1-solr-0.solr-1-solr-headless.default:8983/solr/test_shard1_replica_n1
服务器。
我该如何解决这个问题?我是 kubernetes 的新手。我是否必须将我的 Java 应用程序包装在 Docker 容器中并从同一个集群执行我的代码,以便它可以与那里的其他服务通信?我真的很感激有关如何在 Kubernetes 部署中正确执行此操作的一些帮助。谢谢!
解决方法
您还需要转发 8983。 solr 客户端不会 100% 通过 Zookeeper。