Необходимо решить поведение JGroups, не связанное с группировкой для группы из двух хостов - PullRequest
0 голосов
/ 16 октября 2019

Я использую 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 работать надежно.

Спасибо!

...