我想知道来自客户端的Gemfire / Geode群集大小(ds中的成员数)。了解这一点最简单的方法是什么。我们可以使用功能服务来实现这一点,但我正在寻找更简单的解决方案。
答案 0 :(得分:1)
我认为FunctionService 可能是你最好的选择。 cache.getDistributedSystem()不会告诉你在客户端上有用的东西。
答案 1 :(得分:1)
另一种方法涉及使用JMX。如果您的服务器集群中运行了一个或多个JMX Manager,那么您可以将任何JVM(包括一个独立的GemFire客户端)连接为JMX客户端并查询其mbeans。
您感兴趣的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
答案 2 :(得分:0)
我还没有尝试过,但我相信你可以在连接后从客户端缓存中执行“cache.getDistributedSystem()。getAllOtherMembers()”。 这是“DistributedSystem”类的javadoc:http://gemfire.docs.pivotal.io/latest/javadocs/japi/index.html。 欢呼声。
答案 3 :(得分: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);
答案 4 :(得分: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);