Apache Ignite缓存为空,表具有值

时间:2019-04-17 12:54:45

标签: docker ignite

我有一个基本的Ignite持久性设置。现在,它是在服务器模式下运行的单个节点,我从中连接两个客户端。当我通过SQL从这些客户端之一(以下称为“客户端1”)插入数据时,可以再次使用SQL选择它并返回结果。在下面的“客户端2”中,当我尝试获取应该已创建以代表该表的缓存时,该缓存为空。

服务器使用以下Dockerfile运行apacheignite映像:

服务器/ 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通过Thin JDBC驱动程序连接,并执行一些CREATE TABLEINSERT。以后当我在SELECT中使用DBeaver之类的东西时,可以看到此数据。

此客户端也与Compose中的其他客户端一起在docker中运行。它真正要做的就是循环调用以下内容,其中$file是一个包含CREATE TABLEINSERT等的SQL文件。

/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.

最终,我希望能够抓住此缓存并使用Ignite文档中描述的StreamVisitor对每个缓存执行操作。据称,它看起来像:

... 
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
}));

...但是lambda永远不会运行,因为缓存为空。

为什么在SQL中看到的内容和在缓存中看到的内容之间没有这种联系?

1 个答案:

答案 0 :(得分:0)

通过这种方式,您将启动“客户端2”,它将作为没有缓存的单个服务器节点启动。

您还应该将47500用于发现端口,而不是10800。10800用于瘦客户机。

还请注意,您的IpFinder的Vm与多播不匹配。