docker - Apache Ignite缓存为空,表具有值

标签 docker ignite

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

服务器使用以下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默认将群集设置为非 Activity 状态。
/opt/ignite/apache-ignite/bin/control.sh --activate

客户1

客户端1通过Thin JDBC驱动程序连接,并执行一些CREATE TABLEINSERT。当我稍后在DBeaver之类的文件中SELECT时,我可以看到此数据。

该客户端也可以在docker中运行,其他客户端也可以在Compose中运行。它的真正作用是在循环中调用以下命令,其中$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中看到的内容和在缓存中看到的内容之间存在这种脱节?

最佳答案

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

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

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

关于docker - Apache Ignite缓存为空,表具有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55728025/

相关文章:

java - 如何将 Apache Ignite 缓存条目写入 Apache Avro 文件?

docker - 如何使用 docker-compose 在容器和主机之间同步代码?

postgresql - 在 docker-entrypoint-initdb.d 中创建 pg_cron 扩展失败

ignite - 如何禁用 Apache ignite 中的自动发现?

java - 点燃持久化集 : Cannot find metadata for object with compact footer

python - pyignite 序列化和反序列化复杂类型

linux - 出现未知错误 : Chrome failed to start: exited abnormally.(未知错误:DevToolsActivePort 文件不存在)

ruby-on-rails - 为什么要将 Gemfile.lock 复制到 Docker 中,然后立即覆盖它?

docker - Docker 上的 Vault TLS - 无法验证 127.0.0.1 的证书,因为它不包含任何 IP SAN

java - apache ignite 是否在启动时创建 cassandra 表还是我们需要运行任何命令?