如何从客户端知道 Gemfire/Geode 簇大小
How to know Gemfire/Geode cluster size from the client
我想知道来自客户端的 Gemfire/Geode 集群大小(ds 中的成员数)。了解这一点的最简单方法是什么。我们可以使用函数服务来获得它,但我正在寻找更简单的解决方案。
我还没有尝试过,但我相信您可以在连接后从客户端缓存中执行 "cache.getDistributedSystem().getAllOtherMembers()"。
这是 "DistributedSystem" class 的 javadoc:http://gemfire.docs.pivotal.io/latest/javadocs/japi/index.html。
干杯。
我认为 FunctionService 是 可能是您最好的选择。 cache.getDistributedSystem() 不会告诉您任何对客户端有用的信息。
是的,客户端在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);
另一种方法涉及使用 JMX。如果您的服务器集群中有一个或多个 JMX 管理器 运行,那么您可以让任何 JVM(包括一个独立的 GemFire 客户端)作为 JMX 客户端连接并查询其 mbean。
您感兴趣的 mbean 是 DistributedSystemMXBean。它公开了:
/**
* Returns the number of members in the distributed system.
*/
public int getMemberCount();
它还公开了用于列出整个集群的成员、组、定位器、磁盘存储等的各种其他方法。 javadoc 显示了所有这些属性和操作:http://gemfire.docs.pivotal.io/latest/javadocs/japi/com/gemstone/gemfire/management/DistributedSystemMXBean.html
尤里森,
正如 Rahul 所说,客户端是一个 "loner distributed system",它连接到另一个分布式系统(具有多个服务器、定位器、对等成员),在客户端 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);
我想知道来自客户端的 Gemfire/Geode 集群大小(ds 中的成员数)。了解这一点的最简单方法是什么。我们可以使用函数服务来获得它,但我正在寻找更简单的解决方案。
我还没有尝试过,但我相信您可以在连接后从客户端缓存中执行 "cache.getDistributedSystem().getAllOtherMembers()"。 这是 "DistributedSystem" class 的 javadoc:http://gemfire.docs.pivotal.io/latest/javadocs/japi/index.html。 干杯。
我认为 FunctionService 是 可能是您最好的选择。 cache.getDistributedSystem() 不会告诉您任何对客户端有用的信息。
是的,客户端在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);
另一种方法涉及使用 JMX。如果您的服务器集群中有一个或多个 JMX 管理器 运行,那么您可以让任何 JVM(包括一个独立的 GemFire 客户端)作为 JMX 客户端连接并查询其 mbean。
您感兴趣的 mbean 是 DistributedSystemMXBean。它公开了:
/**
* Returns the number of members in the distributed system.
*/
public int getMemberCount();
它还公开了用于列出整个集群的成员、组、定位器、磁盘存储等的各种其他方法。 javadoc 显示了所有这些属性和操作:http://gemfire.docs.pivotal.io/latest/javadocs/japi/com/gemstone/gemfire/management/DistributedSystemMXBean.html
尤里森, 正如 Rahul 所说,客户端是一个 "loner distributed system",它连接到另一个分布式系统(具有多个服务器、定位器、对等成员),在客户端 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);