0

我想知道客户端的 Gemfire/Geode 集群大小(ds 中的成员数)。知道这一点的最简单方法是什么。我们可以使用功能服务来获得这个,但我正在寻找更简单的解决方案。

4

5 回答 5

1

我认为 FunctionService可能你最好的选择。cache.getDistributedSystem() 不会告诉您任何对客户端有用的信息。

于 2015-06-15T21:24:00.410 回答
1

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

您感兴趣的 mbean 是 DistributedSystemMXBean。它暴露了:

/**
 * 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

于 2015-06-16T22:43:16.643 回答
0

我还没有尝试过,但我相信您可以在连接后从客户端缓存中执行“cache.getDistributedSystem().getAllOtherMembers()”。这是“分布式系统”类的 javadoc:http: //gemfire.docs.pivotal.io/latest/javadocs/japi/index.html。干杯。

于 2015-06-15T11:01:44.367 回答
0

是的,客户端在 lonar 分布式系统中运行,因此cache.getDistributedSystem()客户端提供了 lonar 分布式系统的实例,该实例没有关于服务器集群的信息。

这样做的一种方法是使用 geode 区域本身,即每个服务器将 member-id 放入某个区域中的条目,然后从客户端检索相同的信息。

另一种方法是使用功能服务。下面是相同的代码片段。

定义函数适配器:

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

  @Override
  public void execute(FunctionContext fc) {
    Cache c = CacheFactory.getAnyInstance();
    String member = c.getDistributedSystem().getDistributedMember().getId();
    fc.getResultSender().lastResult(member);  
  }

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

在服务器中注册它:

FunctionService.registerFunction(new CountMemberFunction());

从客户端执行 onServers 函数:

Execution execution = FunctionService.onServers(gemCache);
  ResultCollector rc = execution.execute(new CountMemberFunction());
  List nodes = (List)rc.getResult();
  println("Server nodes are " + nodes);
于 2015-06-16T06:00:13.727 回答
0

Urizen,正如 Rahul 所说,客户端是一个“孤独的分布式系统”,它连接到另一个分布式系统(具有多个服务器、定位器、对等成员),在客户端 DS 上执行“cache.getDistributedSystem.getAllOhterMembers”,将为您提供成员信息仅客户端而不是服务器端分布式系统。

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);
于 2015-06-18T06:52:58.463 回答