Friday, 18 January 2013

JMX URL for GemFire 7

In order to connect to the MBean server within a GemFire 7 Distributed System you would need to use a JMX service URL as follows.

Format:

service:jmx:rmi://{hotname}/jndi/rmi://{hostname}:1099/jmxrmi

Example:

service:jmx:rmi://Pas-Apicellas-MacBook-Pro.local/jndi/rmi://Pas-Apicellas-MacBook-Pro.local:1099/jmxrmi

Another way is to use GFSH and start jconsole issuing the command "start jconsole" as shown below. This will automatically connect for you providing you have the ability to display jconsole graphically.

  
gfsh>start jconsole
Running JDK JConsole


Viewing Data Distribution on GemFire Members

The following code can be used to show which member is hosting which primary piece of data in a partitioned region within GemFire. This was done with gemFire 7 but should work with GemFire 6.6 as well.

1. The server side cache.xml is as follows which pre populates some data into the region to save having to write a client to add data.

  
<?xml version="1.0"?>
<!DOCTYPE cache PUBLIC
    "-//GemStone Systems, Inc.//GemFire Declarative Caching 7.0//EN"
    "http://www.gemstone.com/dtd/cache7_0.dtd">

<cache>
    <cache-server port="40001" notify-by-subscription="true"/>
    <region name="exampleRegion">
      <region-attributes refid="PARTITION_REDUNDANT"/>
      <entry><key><string>1</string></key><value><string>MyValue1</string></value></entry>
      <entry><key><string>2</string></key><value><string>MyValue2</string></value></entry>
      <entry><key><string>3</string></key><value><string>MyValue3</string></value></entry>
      <entry><key><string>4</string></key><value><string>MyValue4</string></value></entry>
      <entry><key><string>5</string></key><value><string>MyValue5</string></value></entry>
      <entry><key><string>6</string></key><value><string>MyValue6</string></value></entry>
      <entry><key><string>7</string></key><value><string>MyValue7</string></value></entry>
      <entry><key><string>8</string></key><value><string>MyValue8</string></value></entry>
      <entry><key><string>9</string></key><value><string>MyValue9</string></value></entry>
      <entry><key><string>10</string></key><value><string>MyValue10</string></value></entry>
      <entry><key><string>11</string></key><value><string>MyValue11</string></value></entry>
      <entry><key><string>12</string></key><value><string>MyValue12</string></value></entry>
      <entry><key><string>13</string></key><value><string>MyValue13</string></value></entry>
      <entry><key><string>14</string></key><value><string>MyValue14</string></value></entry>
      <entry><key><string>15</string></key><value><string>MyValue15</string></value></entry>
      <entry><key><string>16</string></key><value><string>MyValue16</string></value></entry>
      <entry><key><string>17</string></key><value><string>MyValue17</string></value></entry>
      <entry><key><string>18</string></key><value><string>MyValue18</string></value></entry>
      <entry><key><string>19</string></key><value><string>MyValue19</string></value></entry>
      <entry><key><string>20</string></key><value><string>MyValue20</string></value></entry>
      <entry><key><string>21</string></key><value><string>MyValue21</string></value></entry>
      <entry><key><string>22</string></key><value><string>MyValue22</string></value></entry>
      <entry><key><string>23</string></key><value><string>MyValue23</string></value></entry>
      <entry><key><string>24</string></key><value><string>MyValue24</string></value></entry>
      <entry><key><string>25</string></key><value><string>MyValue25</string></value></entry>
      <entry><key><string>26</string></key><value><string>MyValue26</string></value></entry>
      <entry><key><string>27</string></key><value><string>MyValue27</string></value></entry>
      <entry><key><string>28</string></key><value><string>MyValue28</string></value></entry>
      <entry><key><string>29</string></key><value><string>MyValue29</string></value></entry>
      <entry><key><string>30</string></key><value><string>MyValue30</string></value></entry>
   </region>
</cache> 

2. When listing members we have one locator and 2 cache servers.
  
gfsh>list members;
  Name   | Id
-------- | -------------------------------------------------------
server2  | Pas-Apicellas-MacBook-Pro(server2:78035)<v2>:4641
server1  | Pas-Apicellas-MacBook-Pro(server1:78002)<v1>:13379
locator1 | Pas-Apicellas-MacBook-Pro(locator1:77992:locator):23631

3. Get a query to ensure we indeed have 30 entries in the region.
  
gfsh>query --query="select count(*) from /exampleRegion";

Result     : true
startCount : 0
endCount   : 20
Rows       : 1

Result
------
30

NEXT_STEP_NAME : END

4. Create an XML cache.xml file which will enable us to connect as a cache server to the Distributed System with storage disabled.
  
<?xml version="1.0"?>
<!DOCTYPE cache PUBLIC
    "-//GemStone Systems, Inc.//GemFire Declarative Caching 7.0//EN"
    "http://www.gemstone.com/dtd/cache7_0.dtd">

<cache>
  <cache-server port="0" />

  <region name="exampleRegion" >
       <region-attributes data-policy="partition" >
           <partition-attributes local-max-memory="0" redundant-copies="1"/>
           <subscription-attributes interest-policy="all"/>            
       </region-attributes>
  </region>
</cache> 

5. Write a java client with code as follows
  
package vmware.au.gemfire.demos.deptemp;

import java.util.Map;
import java.util.Set;

import com.gemstone.gemfire.cache.Cache;
import com.gemstone.gemfire.cache.CacheFactory;
import com.gemstone.gemfire.cache.Region;
import com.gemstone.gemfire.cache.partition.PartitionRegionHelper;
import com.gemstone.gemfire.distributed.DistributedMember;

public class VerifyDataLocations 
{
 private Cache cache = null;
   
 public VerifyDataLocations() 
 {
     CacheFactory cf = new CacheFactory();
     cf.set("cache-xml-file", "xml/datalocations-cache-no-storage.xml");
     cf.set("locators", "localhost[10334]");
     cache = cf.create();
 }

 public void run() throws InterruptedException
 {
  Region<String,String> exampleRegion = cache.getRegion("exampleRegion");
  System.out.println("exampleRegion size = " + exampleRegion.size());

     Set<Map.Entry<String, String>> entries = exampleRegion.entrySet();

     for (Map.Entry entry: entries) 
     {

       DistributedMember member = 
         PartitionRegionHelper.getPrimaryMemberForKey(exampleRegion, (String) entry.getKey());
       System.out.println
         (String.format("\"Primary Member [Host=%s, Id=%s - Key=%s, Value=%s]", 
          member.getHost(), member.getId(), entry.getKey(), (String) entry.getValue())); 
        
     }
     
     System.out.println("Sleeping for 20 seconds..");
     
        cache.close();
     
 }
 
 /**
  * @param args
  * @throws InterruptedException 
  */
 public static void main(String[] args) throws InterruptedException 
 {
  // TODO Auto-generated method stub
  VerifyDataLocations test = new VerifyDataLocations();
  test.run();
 }

}

6. Output as follows.

exampleRegion size = 30
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server2:78035):4641 - Key=20, Value=MyValue20]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server2:78035):4641 - Key=21, Value=MyValue21]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server2:78035):4641 - Key=22, Value=MyValue22]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server2:78035):4641 - Key=23, Value=MyValue23]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server2:78035):4641 - Key=24, Value=MyValue24]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server2:78035):4641 - Key=25, Value=MyValue25]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server2:78035):4641 - Key=26, Value=MyValue26]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server2:78035):4641 - Key=27, Value=MyValue27]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server2:78035):4641 - Key=28, Value=MyValue28]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server2:78035):4641 - Key=29, Value=MyValue29]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server2:78035):4641 - Key=30, Value=MyValue30]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server2:78035):4641 - Key=1, Value=MyValue1]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server2:78035):4641 - Key=2, Value=MyValue2]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server2:78035):4641 - Key=3, Value=MyValue3]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server2:78035):4641 - Key=4, Value=MyValue4]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server1:78002):13379 - Key=5, Value=MyValue5]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server1:78002):13379 - Key=6, Value=MyValue6]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server1:78002):13379 - Key=7, Value=MyValue7]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server1:78002):13379 - Key=8, Value=MyValue8]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server1:78002):13379 - Key=9, Value=MyValue9]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server1:78002):13379 - Key=10, Value=MyValue10]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server1:78002):13379 - Key=11, Value=MyValue11]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server1:78002):13379 - Key=12, Value=MyValue12]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server1:78002):13379 - Key=13, Value=MyValue13]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server1:78002):13379 - Key=14, Value=MyValue14]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server1:78002):13379 - Key=15, Value=MyValue15]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server1:78002):13379 - Key=16, Value=MyValue16]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server1:78002):13379 - Key=17, Value=MyValue17]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server1:78002):13379 - Key=18, Value=MyValue18]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server1:78002):13379 - Key=19, Value=MyValue19]




Tuesday, 15 January 2013

vFabric Gemfire 7 Monitoring Plugin (Hyperic)

Hyperic plug-in for vFabric Gemfire, manages GemFire Distributed System (DS) and the servers and services it comprises. Recenbtly a new version was released which supports GemFire 7. You can obtain it from the VMware Sulution Exchange link below.

https://solutionexchange.vmware.com/store/products/vfabric-gemfire-monitoring-plugin-hyperic

To set GemFire 7 monitoring on Hyperic 50 the steps are as follows

  • Download plugin from link above
  • If plugin name contains version such as vfgf-plugin-1.0.M1.jar, rename to vfgf-plugin.jar.
  • Log in to HQ UI
  • Click on Administration
  • Click on Plugin Manager
  • Click Add/Update Plugins
  • Select vfgf-plugin.jar from your filesystem
  • Click Ok
  • Wait for plugin sync to complete (usually not more than a minute or two)


  • Click on Resources
  • Click on the Tools menu
  • Click on New Platform
  • Enter a name for this platform such as "Gemfire 7.0" this name must be unique in HQ Inventory
  • Optionally enter Description and Location
  • From Platform Type drop down select either "vFabric Gemfire Distributed System 7.x"
  • Choose the HQ agent you wish to monitor gemfire from in the Agent Connection drop down. (Note: If the HQ agent will be monitoring GF remotely be sure firewall allows the selected HQ agent to connect to the gemfire agent/locators)
  • Enter the IP Address of the GemFire system into IP Address
  • Enter a unique name to use in the Fully Qualified Domain Name box. 
  • Once done it should look as follows once servers have been picked up and discovered.

  • Click OK - This will add the platform to inventory. It still needs to be configured 


  • Click on Edit under Configuration Properties under the Inventory tab of the new platform you added
  • Enter in the details for the locator(s) and their ports. If there are multiple locators then separate then by a comma.
Finally when done you can save charts to the main dashboard as required.