Apache Ignite 缓存为空,table 有值
Apache Ignite cache empty, table has values
我有一个基本的 Ignite 持久性设置。目前,它是服务器模式下的单个节点 运行,我从中连接两个客户端。当我通过这些客户端之一(下面的 "Client 1")通过 SQL 插入数据时,我可以使用 SQL 再次 SELECT 并取回结果。从下面的 "Client 2" 开始,当我尝试获取本应创建以表示此 table 的缓存时,它为空。
服务器使用以下 Dockerfile 运行 apacheignite 映像:
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
s 和 INSERT
s。当我稍后 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.
最终,我希望能够抓住这个缓存并使用 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 中看到的内容与我在缓存中看到的内容之间存在这种脱节?
他们启动您的方式 "Client 2" 它将作为没有缓存的单个服务器节点启动。
您还应该使用 47500 作为发现端口,而不是 10800。10800 用于瘦客户端。
另请注意,您的 IpFinder、Vm 与 Multicast 不匹配。
我有一个基本的 Ignite 持久性设置。目前,它是服务器模式下的单个节点 运行,我从中连接两个客户端。当我通过这些客户端之一(下面的 "Client 1")通过 SQL 插入数据时,我可以使用 SQL 再次 SELECT 并取回结果。从下面的 "Client 2" 开始,当我尝试获取本应创建以表示此 table 的缓存时,它为空。
服务器使用以下 Dockerfile 运行 apacheignite 映像:
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
s 和 INSERT
s。当我稍后 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.
最终,我希望能够抓住这个缓存并使用 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 中看到的内容与我在缓存中看到的内容之间存在这种脱节?
他们启动您的方式 "Client 2" 它将作为没有缓存的单个服务器节点启动。
您还应该使用 47500 作为发现端口,而不是 10800。10800 用于瘦客户端。
另请注意,您的 IpFinder、Vm 与 Multicast 不匹配。