同一主机上的多个 gemfire 缓存服务器

Multiple gemfire cache-server on same host machine

您好,我想使用 Spring gemfire 8 在同一主机上启动多个 gemfire 缓存服务器。1.Please 在下面找到 gemfire 配置文件。我想使用 Spring Gemfire 配置在同一主机 i.e.HOSTNAME 上启动 GFServer1 和 GFServer2。我想避免 gfsh 命令并从 eclipse 启动所有内容并将客户端连接到同一主机上的这些服务器。 提前致谢

    <util:properties id="gemfireProperties">
        <prop key="name">Locator_Dev</prop>
        <prop key="mcast-port">0</prop>
        <prop key="locators">HOSTNAME[1099]</prop>
        <prop key="log-level">warning</prop>
        <prop key="http-service-port">8181</prop>
        <prop key="jmx-manager">true</prop>
        <prop key="jmx-manager-port">1199</prop>
        <prop key="jmx-manager-start">true</prop>
        <prop key="start-locator">HOSTNAME[1099]</prop>
    </util:properties>

    <gfe:cache properties-ref="gemfireProperties" />


    <gfe:cache-server id="GFServer1" auto-startup="true"
        bind-address="HOSTNAME" port="40411" host-name-for-clients="HOSTNAME"
        load-poll-interval="2000" max-connections="22" max-threads="16"
        max-message-count="1000" max-time-between-pings="30000" >

        <gfe:subscription-config eviction-type="ENTRY"
            capacity="1000" disk-store="diskStore1" />
    </gfe:cache-server>


    <gfe:cache-server id="GFServer2" auto-startup="true"
        bind-address="HOSTNAME" port="40412" host-name-for-clients="HOSTNAME"
        load-poll-interval="2000" max-connections="22" max-threads="16"
        max-message-count="1000" max-time-between-pings="30000" >

        <gfe:subscription-config eviction-type="ENTRY"
            capacity="1000" disk-store="diskStore1" />
    </gfe:cache-server>


   <gfe:disk-store id="diskStore1" queue-size="50"
        auto-compact="true" max-oplog-size="10" time-interval="9999">
        <gfe:disk-dir
            location="D:\NP\WorkSpace\GemfireRegionSolutionNStart\disk-store\store_1"
            max-size="20" />
        <gfe:disk-dir
            location="D:\NP\WorkSpace\GemfireRegionSolutionNStart\disk-store\store_2"
            max-size="20" />
    </gfe:disk-store>


    <gfe:replicated-region id="customer" name="Customer">
    </gfe:replicated-region>

    <gfe:replicated-region id="bookMaster" name="BookMaster">
    </gfe:replicated-region>

</beans> 

您发布的配置将在同一个 JVM 中创建两个缓存服务器,即它将在同一个进程中打开两个端口。

如果这不是您想要的,即您想要两个不同的进程,在 Eclipse 中您将必须提供两个运行时配置来启动两个服务器。

有具体问题吗?正如@Swapnil 指出的那样,这将启动 2 GemFire "Cache Servers"(ServerSockets 侦听缓存客户端),因为您已在同一 JVM 内的同一主机上进行了适当配置。无论它是如何执行的(即 IDE,命令行,从 Gfsh 或从 Spring 启动),这都会起作用。

如果您有更具体的问题,请告诉我们,谢谢!

好的...因此您可以从 IDE(例如 Eclipse)中选择一些选项。

如果将上面的 Spring 配置分成 2 个单独的 Spring (Data GemFire) XML 配置文件,每个包含 1 个 <gfe:cache-server> 元素,调用这些文件,例如 spring-gemfire-server1-context.xml 和 spring-gemfire-server2-context.xml,您可以 运行 Spring-based/configure GemFire "data nodes" 和具有以下内容的缓存服务器...

SimpleSpringApplication

简单的小 Java "main" 程序的参数是上述 Spring XML 配置文件之一的文件系统路径。

更好的是,您可以使用类似...

的 Spring 启动应用程序启动这些 Spring (GemFire) 配置

UsefulSpringBootGemFireApplication

正如您在此处看到的,如果您使用基于 Java 的配置从 Spring 配置 GemFire,则可以使用 @Import 注释(例如,UsefulSpringBasedGemFireConfiguration),或者在您的情况下,XML 使用 @ImportResoruce("/classpath/to/spring-gemfire-server1-context.xml") 注释。

可能(不确定)将系统 属性 值传递到 @ImportResource 注释中,就像这样...

@SpringBootApplication
@ImportResource("${spring-gemfire-context-xml-location}")
class SpringBootGemFireApplication {
  ...
}

然后,在您的 IDE 中,您可以使用相同的 SpringBootGemFireApplication class 创建 2 个单独的 "run profiles",然后设置系统 属性(例如 -Dspring-gemfire-context-xml-location=/path/to/spring-gemfire-server1-context.xml) 适合每个配置。

记住,您可以使用 Spring 的 ResourceLoader path qualifiers(例如 file:、http: 等)从不同的源位置(CLASSPATH、文件)解析您的 Spring GemFire 配置系统等)...请参阅 Spring 框架参考指南 .

超链接部分中的 table ("Table 7.1 Resource strings")

在最坏的情况下,您需要创建 2 个独立但几乎相同的 Spring 启动应用程序 Java main classes 来为每个 GemFire 数据节点启动您的 2 个配置文件(& CacheServer) JVM 进程。但是,希望使用系统 属性 方法可以让您在 2 个单独的 运行 配置文件中回收相同的 class。

因此,现在您有 2 个 GemFire 数据节点 JVM 进程。但是,他的定位器呢?

嗯,你可以像以前一样继续在GemFire数据节点服务器JVM进程中嵌入Locator,但是如果你真的想要一个独立的Locator JVM进程,那么你可以使用下面的,"experimental" class...

LocatorLauncherFactoryBean

这个 class 使用 GemFire 的 LocatorLauncher class 来配置和 bootstrap 来自 Spring 的 GemFire Locator配置。我在 2 年前为客户 POC 创建了这个 class 作为开发人员如何从 Spring config.

配置 GemFire Locator 的示例

Spring XML 配置(由 SpringBootGemFireApplication @ImportResoruce 注释使用,在另一个 "run profile" 和系统 属性 组合中) , 看起来类似于以下...

locator.xml

现在,您已经有效地实现了 3 个独立的 GemFire JVM 进程(2 个服务器和 1 个定位器)。您可以将其从我们的 IDE 扩展到您想要的任意数量的服务器和定位器,Pulse 将在集群中显示所有这些,前提是集群配置正确(服务器指向定位器等)。

希望这对您有所帮助。

干杯! 约翰

所以你可以配置LocatorLauncherFactoryBean,比如像这样...

<uti:properties id="gemfireProperties">
  <prop key="log-level">config</prop>
  <prop key="http-service-port">8181</prop>
  <prop key="jmx-manager">true</prop>
  <prop key="jmx-manager-port">1199</prop>
  <prop key="jmx-manager-start">true</prop>
  <prop key="locators">host1[10334],host2[11235],...,hostN[20668]</prop>
</util:properties>

<bean id="locator" class="org.spring.data.gemfire.config.LocatorLauncherFactoryBean">
  <property name="gemfireProperties" ref="gemfireProperties"/>
  <property name="memberName" value="SpringDataGemFireLocator"/>
  <property name="bindAddress" value="10.124.12.24"/>
  <property name="port" value="12480"/>
</bean>

您可能已经注意到,此定位器可以加入 GemFire 集群中的其他定位器,这些定位器是在“gemfireProperties”bean 中使用“locators”GemFire 系统指定的 属性.

注意:“bindAddress” 属性 到 LocatorLauncherFactoryBean 仅当此定位器 运行 所在的本地主机有多个 NIC 并且您想绑定到特定的 NIC。

此外,我还设置了 JMX 管理器 GemFire 系统属性,使定位器成为并实际启动一个管理器(在端口 1199 上)。这允许您使用 gfsh>connect --locator=localhost[12480]gfsh>connect --jmx-manager=localhost[1199].

从 Gfsh 连接到此定位器

基本上,“gemfireProperties”bean 允许您配置任何 valid GemFire System property.

现在,由于此定位器 运行 来自您的 IDE,您将需要使用指向 [=] 的 $GEMFIRE 环境变量配置 "run profile" 23=] 在发行版中。

例如,我将 $GEMFIRE 环境变量设置为...

/Users/jblum/Downloads/Pivotal/GemStone/Products/GemFire/Pivotal_GemFire_820_b17919_Linux

现在,让您的个人 Spring 配置的 GemFire 服务器连接到集群,这很简单。

同样,您只需要在每个 Spring GemFire 服务器 XML 配置文件中定义一个“gemfireProperties”bean 和 "locators" GemFire 系统 属性定义,例如...

<uti:properties id="gemfireProperties">
  <prop key="log-level">config</prop>
  <prop key="locators">localhost[12480]</prop>
</util:properties>

<gfe:cache properties-ref="gemfireProperties"/>

此配置将使 GemFire 数据节点能够连接到集群,如果一切设置正确,则此集群将从 Pulse 可见。

再一次,希望这对您有所帮助。

干杯, 约翰