Как узнать размер кластера Gemfire/Geode с клиента
Я хочу узнать размер кластера Gemfire/Geode (количество членов в ds) от клиентов. Какой самый простой способ узнать это. Мы можем получить это с помощью службы функций, но я ищу более простое решение.
5 ответов
Urizen, как сказал Рахул, клиент - это "одиночная распределенная система", которая подключена к другой распределенной системе (которая имеет несколько серверов, локаторов, одноранговых участников), выполняя "cache.getDistributedSystem.getAllOhterMembers" на клиентских DS, предоставит вам информацию о членах только клиента, а не серверной распределенной системы.
Фрагмент кода Рахула предоставит информацию только о членах сервера, а не о равноправных членах, доступных в DS.
ИМО, нам нужно немного изменить код Рахула, чтобы учесть равноправные члены, локаторы тоже.
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);
Другой подход предполагает использование JMX. Если в вашем кластере серверов запущен один или несколько JMX-менеджеров, то вы можете подключить любую 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
Я думаю, что FunctionService , вероятно, ваш лучший выбор. cache.getDistributedSystem() не расскажет вам ничего полезного о клиенте.
Да, клиент работает в одиночной распределенной системе таким образом cache.getDistributedSystem()
из клиента выдает экземпляр одиночной распределенной системы, в которой нет информации о кластере серверов.
Один из способов сделать это - использовать сам регион geode, т. Е. Каждый сервер помещает идентификатор участника в какой-либо регион, а затем получает ту же информацию от клиента.
Другим способом является использование функции сервиса. Ниже приведен фрагмент кода для того же.
Определить функциональный адаптер:
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);
Я еще не пробовал, но я полагаю, что вы можете выполнить "cache.getDistributedSystem(). GetAllOtherMembers()" из кэша клиента после подключения. Вот javadoc для класса "DistributedSystem": http://gemfire.docs.pivotal.io/latest/javadocs/japi/index.html. Приветствия.