Note: Documentation for Pivotal GemFire 7.0.x is now available at http://gemfire.docs.pivotal.io/index.html. Please refer to the Pivotal site for the latest and most up-to-date documentation on GemFire 7.0.x. The vFabric GemFire 7.0 documentation site will no longer be updated.

Configuring a Multi-site (WAN) System

Plan and configure your multi-site topology, and configure the regions that will be shared between systems.

Prerequisites

Before you start, you should understand how to configure membership and communication in peer-to-peer systems using locators. See Configuring Peer-to-Peer Discovery and Configuring Peer Communication. WAN replication is not supported when using multicast for discovery.

WAN deployments increase the messaging demands on a GemFire system. To avoid hangs related to WAN messaging, always set conserve-sockets=false for GemFire members that participate in a WAN deployment. See Controlling Socket Use and Making Sure You Have Enough Sockets.

Note: If you will be upgrading an existing WAN deployment to use the new WAN API, also refer to the WAN deployment upgrade guidelines in the vFabric GemFire Release Notes.

Main Steps

Use the following steps to configure a multi-site system:
  1. Plan the topology of your multi-site system. See Multi-site (WAN) Topologies for a description of different multi-site topologies.
  2. Configure membership and communication for each distributed system in your multi-site system. You must use locators for peer discovery in a WAN configuration. See Configuring Peer-to-Peer Discovery. Start each distributed system using a unique distributed-system-id and identify remote clusters using remote-locators.
  3. Configure the gateway senders that you will use to distribute region events to remote systems.See Configure Gateway Senders.
  4. Create the data regions that you want to participate in the multi-site system, specifying the gateway sender(s) that each region should use for WAN distribution. Configure the same regions in the target clusters to apply the distributed events. See Create Data Regions for Multi-site Communication.
  5. Configure gateway receivers in each GemFire cluster that will receive region events from another cluster. See Configure Gateway Receivers.
  6. Start distributed system member processes in the correct order (locators first, followed by data nodes) to ensure efficient discovery of WAN resources. See Starting Up Your System.
  7. (Optional.) Deploy custom conflict resolvers to handle resolve potential conflicts that are detected when applying events from over a WAN. See Resolving Conflicting Events.
  8. (Optional.) Deploy WAN filters to determine which events are distributed over the WAN, or to modify events as they are distributed over the WAN. See Filtering Events for Multi-Site (WAN) Distribution.
  9. (Optional.) Configure persistence, conflation, and/or dispatcher threads for gateway sender queues using the instructions in Configuring Event Queues.

Configure Gateway Senders

Each gateway sender configuration
  • A unique ID for the gateway sender configuration.
  • The distributed system ID of the remote site to which the sender propagates region events.
  • A property that specifies whether the gateway sender is a serial gateway sender or a parallel gateway sender.
  • Optional properties that configure the gateway sender queue. These queue properties determine features such the amount of memory used by the queue, whether the queue is persisted to disk, and how one or more gateway sender processes dispatch events from the queue.
See WAN Configuration for more information about individual configuration properties.
  1. For each GemFire system, choose the members that will host a gateway sender configuration and distribute region events to remote sites:
    • You must deploy a parallel gateway sender configuration on each GemFire member that hosts a region that uses the sender.
    • You may choose to deploy a serial gateway sender configuration on one or more GemFire members in order to provide high availability. However, only one instance of a given serial gateway sender configuration distributes region events at any given time.
  2. Configure each gateway sender on a GemFire member using either the cache.xml file or Java API:
    • cache.xml configuration
      These example cache.xml entries configure two parallel gateway senders to distribute region events to two remote GemFire clusters (clusters "2" and "3"):
      <cache>
        <gateway-sender id="sender2" parallel="true" 
         remote-distributed-system-id="2"/> 
        <gateway-sender id="sender3" parallel="false" 
         remote-distributed-system-id="3"/> 
         ... 
      </cache>
    • Java configuration

      This example code shows how to configure a parallel gateway sender using the GemFire API:

      // Create or obtain the GemFire cache
      Cache cache = new CacheFactory().create();
      
      // Configure and create the gateway sender
      GatewaySenderFactory gateway = cache.createGatewaySenderFactory();
      gateway.setParallel(true);
      GatewaySender sender = gateway.create("sender2", "2");
      sender.start();
      
  3. Depending on your applications, you may need to configure additional features in each gateway sender. Things you need to consider are:
    • The maximum amount of memory each gateway sender queue can use. When the queue exceeds the configured amount of memory, the contents of the queue overflow to disk. For example:
      <gateway-sender id="sender2" parallel="true"
       remote-distributed-system-id="2" 
       maximum-queue-memory="150"/> 
    • Whether to enable disk persistence, and whether to use a named disk store for persistence or for overflowing queue events. See Persisting an Event Queue. For example:
      <gateway-sender id="sender2" parallel="true"
       remote-distributed-system-id="2" 
       is-persistent="true" disk-store-name="cluster2Store"
       maximum-queue-memory="150"/> 
    • (For serial gateway senders only.) Whether to use multiple dispatcher threads on each gateway queue to process the queue's events. The dispatcher-threads attribute of the gateway sender determines whether multiple threads process the queue. If you use multiple dispatcher threads, also configure the ordering policy to use for dispatching the events. For example:
      <gateway-sender id="sender2" parallel="false"
       remote-distributed-system-id="2" 
       dispatcher-threads="2" order-policy="partition"/>

      You cannot configure multiple dispatcher threads or an ordering policy for a parallel gateway sender queue.

      Note: When you configure multiple dispatcher threads, each thread operates on its own copy of the gateway sender queue. Queue configuration attributes such as maximum-queue-memory are repeated for each dispatcher thread that you configure.

      See Configuring Dispatcher Threads and Order Policy for Event Distribution.

    • Determine whether you should conflate events in the queue. See Conflating Events in a Queue.
Note: The gateway sender configuration for a specific sender id must be identical on each GemFire member that hosts the gateway sender.

Create Data Regions for Multi-site Communication

After you define gateway senders, configure regions to use the gateway sender to distribute region events :
  • cache.xml Configuration
    Use the gateway-sender-ids region attribute to add gateway senders to a region. To assign multiple gateway senders, use a comma-separated list. For example:
    <region-attributes gateway-sender-ids="sender2,sender3">
    </region-attributes>
  • Java API Configuration
    This example shows adding two gateway senders (configured in the earlier example) to a partitioned region:
    RegionFactory rf = 
      cache.createRegionFactory(RegionShortcut.PARTITION);
    rf.addCacheListener(new LoggingCacheListener());
    rf.addGatewaySenderId("sender2");
    rf.addGatewaySenderId("sender3");
    custRegion = rf.create("customer");
    Note: When using the Java API, you must configure a parallel gateway sender before you add its id to a region. This ensures that the sender distributes region events that were persisted before new cache operations take place. If the gateway sender id does not exist when you add it to a region, you receive an IllegalStateException.
Note: Replicated regions cannot use a parallel gateway sender. Use a serial gateway sender instead.
Note: In addition to configuring regions with gateway senders to distribute events, you must configure the same regions in the target clusters to apply the distributed events. The region name in the receiving cluster must exactly match the region name in the sending cluster.

Configure Gateway Receivers

Always configure a gateway receiver in each GemFire cluster that will receive and apply region events from another cluster.

A gateway receiver configuration can be applied to multiple GemFire servers for load balancing and high availability. However, each GemFire member that hosts a gateway receiver must also define all of the regions for which the receiver may receive an event. If a gateway receiver receives an event for a region that the local member does not define, GemFire throws an exception. See Create Data Regions for Multi-site Communication.

A gateway receiver configuration specifies a range of possible port numbers on which to listen. The GemFire server picks an unused port number from the specified range to use for the receiver process. You can use this functionality to easily deploy the same gateway receiver configuration to multiple members:
  • cache.xml Configuration

    The following configuration defines a gateway receiver that listens on an unused port in the range from 1530 to 1550:

    <cache>
      <gateway-receiver start-port="1530" end-port="1551"/> 
       ... 
    </cache>
  • Java Configuration
    // Create or obtain the GemFire cache
    Cache cache = new CacheFactory().create();
    
    // Configure and create the gateway receiver
    GatewayReceiverFactory gateway = cache.createGatewayReceiverFactory();
    gateway.setStartPort(1530);
    gateway.setEndPort(1551);
    GatewayReceiver receiver = gateway.create();
    receiver.start();
    
    Note: When using the Java API, you must create any region that might receive events from a remote site before you start the gateway receiver. Otherwise, batches of events could arrive from remote sites before the regions for those events have been created. If this occurs, the local site will throw exceptions because the receiving region does not exist yet. If you define regions in cache.xml, the correct startup order is handled automatically.