Невозможно настроить контейнер Vespa на нескольких экземплярах

#vespa

#vespa

Вопрос:

У меня есть два экземпляра, в которых мне нужно развернуть Vespa в контейнере docker. Один контейнер будет действовать как кластер конфигурации, кластер контейнеров и кластер содержимого, в то время как другой будет действовать как кластер контейнеров и кластер содержимого.

host.xml файл для приложения выглядит следующим образом:

 <hosts>
  <host name="vespa-master">
    <alias>admin0</alias>
  </host>

  <host name="vespa-searcher">
    <alias>searcher1</alias>
  </host>

</hosts>
  

services.xml для приложения выглядит так:

 <services version="1.0">
    <admin version="2.0">
        <adminserver hostalias="admin0"/>
        <configservers>
            <configserver hostalias="admin0"/>
        </configservers>
    </admin>

    <container id="container" version="1.0">
        <document-api />
        <search/>
        <nodes>
            <node hostalias="admin0"/>
            <node hostalias="searcher1"/>
        </nodes>
    </container>

    <content id="content" version="1.0">
        <documents>
            <!--version 1 docs starts-->
            <document type="document_name" mode="index" />
            <!--version 1 docs ends-->
        </documents>

        <redundancy>2</redundancy>
             <engine>
                 <proton>
                     <searchable-copies>1</searchable-copies>
                 </proton>
             </engine>

        <group name="top-group">
            <distribution partitions="*"/>
            <group name="group0" distribution-key="0">
                <node hostalias="admin0" distribution-key="0"/>
                <node hostalias="searcher1" distribution-key="1"/>
            </group>
        </group>
    </content>
</services>
  

Я использую docker swarm для создания оверлейного сетевого соединения между двумя экземплярами. Команда, для которой выглядит примерно так:

 docker network create --driver=overlay --subnet=<IP>/24 vespa_conn --attachable
  

Команда для создания контейнера в первом экземпляре, который я использовал,:

 docker run --detach --hostname vespa-master --network=vespa_conn <other arguments> --env VESPA_CONFIGSERVERS=vespa-master vespaengine/vespa
  

и команда для создания контейнера во втором экземпляре:

 docker run --detach --hostname vespa-searcher --network=vespa_conn <other arguments> --env VESPA_CONFIGSERVERS=vespa-master vespaengine/vespa
  

Ссылка на эти команды приведена на этой странице.

И после создания и развертывания моего приложения состояние узла во втором контейнере не отображается.

 vespa-get-cluster-state 

Cluster content:
content/distributor/0: up
content/distributor/1: down
content/storage/0: up
content/storage/1: down
  

Проблема, которую я обнаружил, была:

 content/distributor/0: Failed to fetch json: Connection error: socket write error
admin/cluster-controllers/0: Failed to fetch json: Connection error: socket write error
admin/slobrok.0: Failed to fetch json: Connection error: socket write error
admin/metrics/vespa-master: Failed to fetch json: Connection error: socket write error
hosts/vespa-master/sentinel: Failed to fetch json: Connection error: socket write error
hosts/vespa-master/logd: Failed to fetch json: Connection error: socket write error
[generation not up-to-date ignored]
container/container.1: Failed to fetch json: Connection error: socket write error
hosts/vespa-searcher/logd: Failed to fetch json: Connection error: socket write error
[generation not up-to-date ignored]
  

После нескольких попыток. Я устранил проблему, добавив:
'override VESPA_CONFIGSERVERS vespa-master' in /opt/vespa/conf/vespa/default-env.txt файл во втором контейнере, а затем перезапуск служб.

Есть ли лучший способ сделать это, чтобы мне не приходилось вручную обновлять default-env.txt файл?

Кроме того, когда я добавлял «configserver» или «services» в конец строки команды запуска docker, как указано на странице, я получал эту ошибку:

 [2020-10-15 11:36:13.782540] 1935/8285 (vespa-model-inspect.config.frt.frtconnection) warning: Connection to tcp/localhost:19090 failed or timed out
[2020-10-15 11:36:13.782631] 1935/8285 (vespa-model-inspect.config.frt.frtconnection) warning: FRT Connection tcp/localhost:19090 suspended until 2020-10-15 11:36:23 GMT
[2020-10-15 11:36:13.782647] 1935/8285 (vespa-model-inspect.config.frt.frtconfigagent) info: Error response or no response from config server (key: name=model,namespace=cloud.config,configId=admin/model) (errcode=104, validresponse:0), trying again in 6000 milliseconds
  

В чем причина этой ошибки, я делаю что-то не так?

Ответ №1:

Чтобы это работало, вам следует избегать подчеркивания в имени сети, использовать полное имя для сервера конфигурации и называть контейнеры, чтобы заставить DNS работать.

Создайте сеть на хосте роя менеджера:

 docker network create --driver=overlay --attachable vespa-net
  

Запустите контейнер Vespa, в котором работают как сервер конфигурации, так и службы (без аргумента для точки входа):

 docker run --detach --name vespa-master --hostname vespa-master.vespa-net --network=vespa-net --env VESPA_CONFIGSERVERS=vespa-master.vespa-net vespaengine/vespa
  

Запустите контейнер Vespa, в котором работают только службы (аргумент services для entrypoint):

 docker run --detach --name vespa-searcher --hostname vespa-searcher.vespa-net --network=vespa-net --env VESPA_CONFIGSERVERS=vespa-master.vespa-net vespaengine/vespa services
  

Затем используйте полные имена в hosts.xml:

 <hosts>
  <host name="vespa-master.vespa-net">
    <alias>admin0</alias>
  </host>

  <host name="vespa-searcher.vespa-net">
    <alias>searcher1</alias>
  </host>

</hosts>
  

Путем развертывания неизмененного services.xml Я получаю следующее состояние:

 [root@vespa-master /]# vespa-get-cluster-state

Cluster content:
content/distributor/0: up
content/distributor/1: up
content/storage/0: up
content/storage/1: up
  

Комментарии:

1. Спасибо aressem. Это решение сработало как шарм. Кроме того, если возможно, можете ли вы поделиться какой-либо документацией, касающейся полного имени серверов конфигурации.

2. Это просто полное имя хоста серверов конфигурации, используемых в переменной среды VESPA_CONFIGSERVERS ( docs.vespa.ai/documentation/setting-vespa-variables.html ). В этом случае полное имя хоста равно vespa-master.vespa-net .