Я использую JGroups, чтобы создать кластер из двух машин, подключив их к группе с тем же именем, и я получаю беспорядочное поведение при группировании, и я спрашиваю, есть ли изменение конфигурации JGroups или конфигурации сервераизменение, которое мне нужно сделать, чтобы оно заработало.
Когда у меня есть два хоста в группе JGroups, и один член уходит, это замечает другой член в viewAccepted. Но когда более ранний член возвращается, ни один из них не видит друг друга в функции viewAccepted, и они работают в эффективно независимых группах (плохо). Такое не группирующее поведение может быть случайным. Например, сегодня утром я перезапустил один хост после того, как вчера отключил его, и ни один из них не увидел в группе. Однако, как только я остановил их обоих и перезапустил, они нашли друг друга в группе.
Конечное использование JGroups - это кластеризация двух хостов Tomcat, на которых выполняется одно и то же приложение, так что запускается первый хост, указанный в кластере. сообщает, пока второй ожидает смерти первого, затем занимает место первого хоста и запускает отчеты. Когда первый хост возвращается в службу, он становится вторым в списке участников кластера и ожидает смерти другого. Прямо сейчас поведение приложения повторяет поведение тестовой программы ниже.
Использование JGroups jgroups-4.1.6.Final.jar из коробки без специального файла udp.xml и без аргументов для нового JChannel (). У меня есть тестовое приложение, которое работает на двух хостах RHEL 7, чтобы получить их в кластер. Код ниже:
import java.util.List;
import org.jgroups.Address;
import org.jgroups.JChannel;
import org.jgroups.Message;
import org.jgroups.Receiver;
import org.jgroups.View;
public class ClusterTest implements Receiver {
private String clusterName;
private JChannel channel;
public ClusterTest(String[] args) {
if (args.length > 0) {
clusterName = args[0];
} else {
clusterName = "TEST_CLUSTER";
}
}
/**
* Joins the JGroups cluster
*/
private void joinCluster() {
System.out.println("joinCluster(): joining cluster \"" + clusterName + "\"");
try {
channel = new JChannel();
channel.setReceiver(this);
channel.connect(clusterName);
} catch (Exception e) {
System.out.print("joinCluster failed: ");
e.printStackTrace();
}
}
@Override
public void viewAccepted(View view) {
System.out.println("viewAccepted(): view = \"" + view + "\" for name = \"" + channel.getName() + "\" / \"" + channel.clusterName() + "\"");
List<Address> viewMembers = view.getMembers();
int memNum = 0;
for (Address member : viewMembers) {
System.out.println("viewAccepted(): member #" + memNum++ + " = " + member);
}
String myClusterName = channel.getName();
System.out.println("viewAccepted(): my clusterName = \"" + myClusterName + "\"");
if (viewMembers.size() > 0) {
String clusterActive = viewMembers.get(0).toString();
System.out.println("viewAccepted(): " + clusterName + ", cluster active = \"" + clusterActive + "\"\n");
}
}
@Override
public void receive(Message arg0) {
System.out.println("receive called, message = \"" + arg0 + "\"");
}
/**
* @param args
*/
public static void main(String[] args) {
ClusterTest tester = new ClusterTest(args);
tester.joinCluster();
}
}
Я выхожу из тестового приложения, нажимая control-C, так что это неблагодарный выход.
Наш администратор Linux просмотрел журналы и ничего не увидел изобычный. Администратор также сказал, что нет никаких ограничений или конфигураций, которые могли бы препятствовать трафику UDP.
Вещи, которые я пробовал:
- Увеличение размеров буфера отправки и приема для многоадресной рассылки согласно это решение. Теперь я не получаю предупреждающих сообщений при запуске из-за неадекватного размера буфера.
- Обновление версии JGroups до последней.
- Ожидание в течение ночи, чтобы попытаться запустить остановленный хост.
Вещи, которые я не хочу пробовать:
- Использование TCP, поскольку членство в кластере изменчиво (это могут быть любые два хоста), и я бы не стал обновлять файл конфигурации при каждом изменении хоста.
Я открыт для альтернативных решений в случае, если я не могу заставить JGroups работать надежно.
Спасибо!