Как установить модуль redisearch в экземпляр Redis GCP memorystore

Мне нужно установить модуль RediSearch поверх экземпляра redis хранилища памяти GCP.

Я выполнил следующие шаги:

docker run -p 6379:6379 redislabs/redisearch:latest

Я отправил этот образ докера в кластер Kubernetes и предоставил внешний IP-адрес. Я использовал этот внешний IP-адрес и порт 6379 в качестве конфигурации для своего приложения, но я не может подключиться к RediSearch.

код:

import java.io.IOException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.apache.beam.sdk.Pipeline;
import org.apache.beam.sdk.PipelineResult;
import org.apache.beam.sdk.options.Default;
import org.apache.beam.sdk.options.Description;
import org.apache.beam.sdk.options.PipelineOptions;
import org.apache.beam.sdk.options.PipelineOptionsFactory;
import org.apache.beam.sdk.transforms.Create;
import org.apache.beam.sdk.transforms.DoFn;
import org.apache.beam.sdk.transforms.ParDo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import io.redisearch.client.Client;
import io.redisearch.*;


public class RediSearch {



    static Client client = new Client("testdoc1", "clusteripaddress", 8097);
    private static final Logger LOG = LoggerFactory.getLogger(RediSearch.class);

    public interface Options extends PipelineOptions {

        @Description("gcp project id.")
        @Default.String("XXXX")
        String getProjectId();
        void setProjectId(String projectId);
    }

    public static PipelineResult run(Options options) throws IOException {

        Pipeline pipeline = Pipeline.create(options);

        pipeline.apply(Create.of("test"))
        .apply(ParDo.of(new DoFn<String, String>() {
            private static final long serialVersionUID = 1L;
            @ProcessElement
            public void processElement(ProcessContext c) throws Exception {     
                String pubsubmsg = c.element();                 

                Schema sc = new Schema()
                .addTextField("title", 5.0)
                .addTextField("body", 1.0)
                .addNumericField("price");

            client.createIndex(sc, Client.IndexOptions.Default());

            Map<String, Object> fields = new HashMap<String, Object>();
            fields.put("title", "hello world");
            fields.put("body", "lorem ipsum");
            fields.put("price", 800);
            fields.put("price", 1337);
            fields.put("price", 2000);

            client.addDocument("searchdoc3", fields);

            SearchResult[] res = client.searchBatch(new Query("hello world").limit(0, 5).setWithScores());      

            for (Document d : res[0].docs) {
                LOG.info("redisearchlog{}",d.getId().startsWith("search"));
                LOG.info("redisearchlog1{}",d.getProperties());
                LOG.info("redisearchlog2{}",d.toString());
            }


            }
        }));    


        return pipeline.run();
    }

    public static void main(String[] args) throws IOException {

        Options options = PipelineOptionsFactory.fromArgs(args).as(Options.class);
        run(options);

    }
}

Ошибка :

redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
at redis.clients.jedis.util.Pool.getResource(Pool.java:59)
at redis.clients.jedis.JedisPool.getResource(JedisPool.java:234)
at redis.clients.jedis.JedisPool.getResource(JedisPool.java:15)
at io.redisearch.client.Client._conn(Client.java:137)
at io.redisearch.client.Client.getAllConfig(Client.java:275)
at com.testing.redisearch.RediSearch$1.processElement(RediSearch.java:59)
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: Failed connecting to host xxxxxxxxxxx:6379
at redis.clients.jedis.Connection.connect(Connection.java:204)
at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:100)
at redis.clients.jedis.BinaryJedis.connect(BinaryJedis.java:1894)
at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:117)
at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:889)
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:424)
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:349)
at redis.clients.jedis.util.Pool.getResource(Pool.java:50)
at redis.clients.jedis.JedisPool.getResource(JedisPool.java:234)
at redis.clients.jedis.JedisPool.getResource(JedisPool.java:15)
at io.redisearch.client.Client._conn(Client.java:137)
at io.redisearch.client.Client.getAllConfig(Client.java:275)
at com.testing.redisearch.RediSearch$1.processElement(RediSearch.java:59)
at com.testing.redisearch.RediSearch$1$DoFnInvoker.invokeProcessElement(Unknown Source)
at org.apache.beam.runners.dataflow.worker.repackaged.org.apache.beam.runners.core.SimpleDoFnRunner.invokeProcessElement(SimpleDoFnRunner.java:218)
at org.apache.beam.runners.dataflow.worker.repackaged.org.apache.beam.runners.core.SimpleDoFnRunner.processElement(SimpleDoFnRunner.java:183)
at org.apache.beam.runners.dataflow.worker.SimpleParDoFn.processElement(SimpleParDoFn.java:335)
at org.apache.beam.runners.dataflow.worker.util.common.worker.ParDoOperation.process(ParDoOperation.java:44)
at org.apache.beam.runners.dataflow.worker.util.common.worker.OutputReceiver.process(OutputReceiver.java:49)
at org.apache.beam.runners.dataflow.worker.util.common.worker.ReadOperation.runReadLoop(ReadOperation.java:201)
at org.apache.beam.runners.dataflow.worker.util.common.worker.ReadOperation.start(ReadOperation.java:159)
at org.apache.beam.runners.dataflow.worker.util.common.worker.MapTaskExecutor.execute(MapTaskExecutor.java:77)
at org.apache.beam.runners.dataflow.worker.BatchDataflowWorker.executeWork(BatchDataflowWorker.java:411)
at org.apache.beam.runners.dataflow.worker.BatchDataflowWorker.doWork(BatchDataflowWorker.java:380)
at org.apache.beam.runners.dataflow.worker.BatchDataflowWorker.getAndPerformWork(BatchDataflowWorker.java:305)
at org.apache.beam.runners.dataflow.worker.DataflowBatchWorkerHarness$WorkerThread.doWork(DataflowBatchWorkerHarness.java:140)
at org.apache.beam.runners.dataflow.worker.DataflowBatchWorkerHarness$WorkerThread.call(DataflowBatchWorkerHarness.java:120)
at org.apache.beam.runners.dataflow.worker.DataflowBatchWorkerHarness$WorkerThread.call(DataflowBatchWorkerHarness.java:107)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.net.SocketTimeoutException: connect timed out
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at redis.clients.jedis.Connection.connect(Connection.java:181)
... 31 more

Любое решение приветствуется.


person Logeshwaran R    schedule 10.06.2020    source источник
comment
Не могли бы вы поделиться с нами дополнительной информацией? Например, как вы пытаетесь подключиться из Kubernetes к Redis?   -  person chainicko    schedule 11.06.2020
comment
@chainicko 1. сначала я отправил образ докера redisearch в реестр контейнеров (docker run -p 6379: 6379 redislabs / redisearch: latest) 2. и я выполнил команду docker и выставил узлы кластера (внешний хост) 3. в коде настроить внешний хост и порт и попытался запустить, но не смог подключиться   -  person Logeshwaran R    schedule 11.06.2020
comment
@chainicko, пожалуйста, проверьте мой код выше в блоке кода   -  person Logeshwaran R    schedule 11.06.2020
comment
Ознакомьтесь с официальной документацией и проверьте, правильно ли вы устанавливаете соединение с экземпляром Redis из кластера Google Kubernetes Engine. А пока не могли бы вы поделиться ошибкой, которая возникает в Stackdriver Logging при попытке подключения?   -  person Nibrass H    schedule 12.06.2020
comment
Спасибо за ответ chainicko, ошибка обновлена ​​выше (блок ошибок)   -  person Logeshwaran R    schedule 15.06.2020


Ответы (2)


Ошибка JedisConnectionException: Could not get a resource from the pool может иметь несколько причин. Согласно ответам в этом вопросе проблема в том, что не удалось установить соединение с RediSearch, потому что Redis не работает, время ожидания соединения истекло или его невозможно выделить.

Тем не менее, я заметил, что даже если вы развертываете Redis на порту 6379, в вашем коде вы пытаетесь получить к нему доступ через порт 8097. Измените свое объявление клиента на следующее и повторите попытку подключения.

static Client client = new Client("testdoc1", "<cluster_ip_address>", 6379);
person Ajordat    schedule 18.06.2020

Если вы хотите иметь модуль RediSearch в своем экземпляре хранилища памяти, похоже, что он еще не поддерживается. Вы можете увидеть в документации Google Cloud здесь, что во время при написании этого даже для версии 5.0 модули redis не поддерживаются.

person aLec    schedule 24.09.2020