首页 > 解决方案 > SolrCloud Kubernetes 部署和连接

问题描述

我有一个基于 Marketplace Solr Kubernetes 部署的基于 Kubernetes 的 SolrCloud 部署。可以在https://github.com/GoogleCloudPlatform/click-to-deploy/tree/master/k8s/solr中找到实现的详细信息。

对于我的用例,我正在尝试使用 GitHub 操作来更新/创建 SolrCloud 集合:

  1. 如果集合不存在,则创建它
  2. 如果集合存在,则根据架构更改对其进行更新

我正在运行以下服务:

# 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 部署中正确执行此操作,我非常感谢一些帮助。谢谢!

标签: javakubernetessolrlucenesolrj

解决方案


您还需要端口转发 8983。solr 客户端不会 100% 通过 Zookeeper。


推荐阅读