Apache Ignite кеш пустой, таблица имеет значения - PullRequest
1 голос
/ 17 апреля 2019

У меня работает базовая настройка персистентности Ignite.Пока это один узел, работающий в режиме сервера, с которого я подключаю двух клиентов.Когда я вставляю данные через SQL от одного из этих клиентов («Клиент 1» ниже), я могу ВЫБРАТЬ их снова с помощью SQL и получить результаты обратно.Из приведенного ниже «Клиента 2», когда я пытаюсь получить кеш, который должен быть создан для представления этой таблицы, он равен null.

Сервер запускает образ apacheignite, используя следующий файл Docker:

server / Dockerfile:

FROM apacheignite/ignite

# for jdbc connection
EXPOSE 10800

EXPOSE 47100-47109
EXPOSE 47500-47509

# for rest api
EXPOSE 8080

WORKDIR /app

COPY ./config /app/config

RUN mv /opt/ignite/apache-ignite/libs/optional/ignite-aws /opt/ignite/apache-ignite/libs/

RUN mv /opt/ignite/apache-ignite/libs/optional/ignite-rest-http /opt/ignite/apache-ignite/libs/

CMD /opt/ignite/apache-ignite/bin/ignite.sh /app/config/ignite-config.xml -v

Соответствующие части ignite-config.xml, упомянутые здесь, выглядят следующим образом:

/ app / config / ignite-config.xml

<bean class="org.apache.ignite.configuration.IgniteConfiguration">
        <property name="dataStorageConfiguration">
            <bean class="org.apache.ignite.configuration.DataStorageConfiguration">
                <property name="defaultDataRegionConfiguration">
                    <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
                        <property name="persistenceEnabled" value="true"/>
                    </bean>
                </property>
            </bean>
        </property>
        <property name="discoverySpi">
            <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
                <property name="ipFinder">
                    <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">
                        <property name="addresses">
                            <list>
                                <value>127.0.0.1:47500..47509</value>
                            </list>
                        </property>
                    </bean>
                </property>
            </bean>
        </property>
    </bean>

Я также удостоверился, что активировал кластер в контейнере сервера, используя, поскольку Persistence по умолчанию устанавливает кластер в неактивное состояние.

/opt/ignite/apache-ignite/bin/control.sh --activate

Клиент 1

Клиент 1 подключается черезТонкий драйвер JDBC и делает некоторые CREATE TABLE с и INSERT с.Когда я позже SELECT в чем-то вроде DBeaver, я вижу эти данные.

Этот клиент также работает в Docker, наряду с другим в Compose.Все, что он делает, - это вызывает в цикле следующее, где $file - это файл SQL, содержащий CREATE TABLE, INSERT s и т. Д.

/opt/ignite/apache-ignite/bin/sqlline.sh -u jdbc:ignite:thin://server:10800 -f $file;

Один из таких файлов SQL выглядит так:

DROP TABLE IF EXISTS attributes;
DROP INDEX IF EXISTS idx_attributes_token;

CREATE TABLE attributes (
    token VARCHAR,
    attributeId LONG,
    name VARCHAR,
    PRIMARY KEY(token, attributeId)
) WITH "affinityKey=token";

CREATE INDEX idx_attributes_token ON attributes (token);

INSERT INTO attributes (token, attributeId, name) VALUES ('abc123', 123, 'some name');

Клиент 2

Клиент 2 подключается к Ignite более или менее следующим образом:

IgniteConfiguration igniteConfiguration = new IgniteConfiguration();
TcpDiscoverySpi discoverySpi = new TcpDiscoverySpi();
TcpDiscoveryMulticastIpFinder ipFinder = new TcpDiscoveryMulticastIpFinder();

ipFinder.setAddresses(igniteConfig.getAddresses()); // will be "localhost:10800" -- I map 10800:10800 when the "Server" container runs

discoverySpi.setIpFinder(ipFinder);
igniteConfiguration.setDiscoverySpi(discoverySpi);

Ignite ignite = Ignition.start(igniteConfiguration);

IgniteCache<Object, String> attributesCache = ignite.cache("SQL_PUBLIC_ATTRIBUTES"); // null

//  if i use ignite.getOrCreateCache("SQL_PUBLIC_ATTRIBUTES") instead then of course it's a cache of size 0.

В конечном счете, я хочу иметь возможность захватить этот кеш и использоватьStreamVisitor, описанный в документации Ignite для выполнения операций над каждым.Якобы это выглядело бы так:

... 
IgniteDataStreamer<Object, AttributeWithGroup> attributeStreamer = ignite.dataStreamer(attributesCache.getName());

attributeStreamer.receiver(StreamVisitor.from((cache, entity) -> {
    Object key = entity.getKey();
    Attribute attribute = entity.getValue();
    // do some stuff
}));

... но лямбда никогда не запускается, потому что кеш нулевой.

Почему существует такое различие между тем, что я вижу вSQL и что я вижу в кеше?

1 Ответ

0 голосов
/ 17 апреля 2019

Как вы запускаете свой «Клиент 2», он запускается как отдельный серверный узел без кешей.

Вы также должны использовать 47500 для порта обнаружения, а не 10800. 10800 для тонких клиентов.

Также обратите внимание, что у вас не совпадают IpFinder, Vm и Multicast.

...