提问者:小点点

如何从客户端了解Gemfire/Geode集群大小


我想从客户那里知道Gemfire/Geode集群的大小(ds中的成员数量)。知道这一点的最简单方法是什么。我们可以使用Function Service获得它,但我正在寻找更简单的解决方案。


共3个答案

匿名用户

我认为FunctionService可能是您最好的选择。cache. get分布式系统()不会告诉您客户端上的任何有用信息。

匿名用户

另一种方法涉及使用JMX。如果您的服务器集群中运行了一个或多个JMX管理器,那么您可以让任何JVM(包括较孤独的GemFire客户端)作为JMX客户端连接并查询其mbean。

您感兴趣的mbean是分布式系统MXBean。它公开了:

/**
 * Returns the number of members in the distributed system.
 */
public int getMemberCount();

它还公开了用于列出整个集群的成员、组、定位器、磁盘存储等的各种其他方法。javadocs显示了所有这些属性和操作:http://gemfire.docs.pivotal.io/latest/javadocs/japi/com/gemstone/gemfire/management/DistributedSystemMXBean.html

匿名用户

Urizen,正如Rahul所说,客户端是一个单独的分布式系统,它连接到另一个分布式系统(有多个服务器,定位器,对等成员),在客户端DS上执行cache. getGenertedSystem.getAllOhter会员,只会给你客户端的成员信息,而不是服务器端分布式系统的成员信息。

Rahul的代码片段将只提供有关服务器成员的信息,而不是DS中可用的对等成员。

IMO我们需要稍微修改Rahul的代码,以考虑对等成员和定位器。

public class CountMemberFunction extends FunctionAdapter {
  private static final long serialVersionUID = 1L;

  @Override
  public void execute(FunctionContext fc) {
    Cache c = CacheFactory.getAnyInstance();
    //Get other members of the system
    Set<DistributedMember> dsMembers=       
     c.getDistributedSystem().getAllOtherMembers();
   // add this member
    dsMembers.add(c.getDistributedSystem().getDistributedMember)
    fc.getResultSender().lastResult(dsMembers);  
 }

 @Override
 public String getId() {
   return getClass().getName();
 }
}

并使用onServer而不是onServers

Execution execution = FunctionService.onServer(gemCache);
ResultCollector rc = execution.execute(new CountMemberFunction());
List nodes = (List)rc.getResult();
println("Server nodes are " + nodes);