Apache Зона воспламенения (стойка) - информация о взлете - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь настроить Apache Ignite для распределения разделов с учетом зоны. У меня есть Ignite 2.8.0 с 4-мя узлами, работающими в качестве модулей StatefulSet в GKE 1.14, разделенных на две зоны. Я следовал руководству и примеру :

  • Распространение имен зон в pod в AVAILABILITY_ZONE env var.
  • Затем, используя веб-консоль, я убедился, что этот env var был загружен правильно для каждого узла.
  • Я устанавливаю шаблон кэша в конфигурации узла XML, как показано ниже, и создаю кэш из него, используя GET /ignite?cmd=getorcreate&cacheName=zone-aware-cache&templateName=zone-aware-cache (я не вижу настройки affinityBackupFilter в пользовательском интерфейсе, но другие параметры из шаблона были применены, поэтому я предполагаю, что это сработало)

Чтобы упростить проверку распределения разделов, у меня номер раздела установлен равным 2. После создания кэша я наблюдал следующее распределение разделов:

enter image description here

Затем я отобразил идентификаторы узлов на значения в AVAILABILITY_ZONE env var, как сообщается узлами, со следующими результатами:

AA146954 us-central1-a
3943ECC8 us-central1-c
F7B7AB67 us-central1-a
A94EE82C us-central1-c

Как можно легко увидеть , раздел 0 pri / bak находится на узлах 3943ECC8 и A94EE82 C, которые оба находятся в одной зоне . Чего мне не хватает, чтобы заставить его работать?

Еще одна странная вещь, это указание номера раздела, который будет низким (например, 2 или 4), используются только 3 из 4 узлов). При использовании 1024 разделов используются все узлы, но проблема по-прежнему существует - у 346 из 1024 разделов их основной / резервный узел находились в одной и той же зоне.

Вот мой конфиг узла XML:

<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="
  http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean class="org.apache.ignite.configuration.IgniteConfiguration">

    <!-- Enabling Apache Ignite Persistent Store. -->
    <property name="dataStorageConfiguration">
      <bean class="org.apache.ignite.configuration.DataStorageConfiguration">
        <property name="defaultDataRegionConfiguration">
          <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
            <property name="persistenceEnabled" value="true"/>
          </bean>
        </property>
      </bean>
    </property>

    <!-- Explicitly configure TCP discovery SPI to provide list of initial nodes. -->
    <property name="discoverySpi">
      <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
        <property name="ipFinder">
          <!-- Enables Kubernetes IP finder and setting custom namespace and service names.  -->
          <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.kubernetes.TcpDiscoveryKubernetesIpFinder">
            <property name="namespace" value="ignite"/>
          </bean>
        </property>
      </bean>
    </property>

    <property name="cacheConfiguration">
      <list>
        <bean id="zone-aware-cache-template" abstract="true" class="org.apache.ignite.configuration.CacheConfiguration">
          <!-- when you create a template via XML configuration, you must add an asterisk to the name of the template -->
          <property name="name" value="zone-aware-cache*"/>
          <property name="cacheMode" value="PARTITIONED"/>
          <property name="atomicityMode" value="ATOMIC"/>
          <property name="backups" value="1"/>
          <property name="readFromBackup" value="true"/>
          <property name="partitionLossPolicy" value="READ_WRITE_SAFE"/>
          <property name="copyOnRead" value="true"/>
          <property name="eagerTtl" value="true"/>
          <property name="statisticsEnabled" value="true"/>
          <property name="affinity">
            <bean class="org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction">
              <property name="partitions" value="2"/>  <!-- for debugging only! -->
              <property name="excludeNeighbors" value="true"/>
              <property name="affinityBackupFilter">
                <bean class="org.apache.ignite.cache.affinity.rendezvous.ClusterNodeAttributeAffinityBackupFilter">
                  <constructor-arg>
                    <array value-type="java.lang.String">
                      <!-- Backups must go to different AZs -->
                      <value>AVAILABILITY_ZONE</value>
                    </array>
                  </constructor-arg>
                </bean>
              </property>
            </bean>
          </property>
        </bean>
      </list>
    </property>

  </bean>
</beans>

Обновление: В конечном итоге excludeNeighbors false / true делает или нарушает понимание зоны. Я не уверен, почему он не работал с excludeNeighbors=false ранее для меня. Я сделал несколько сценариев для автоматизации моего тестирования. И теперь определенно, что это настройка excludeNeighbors. Это все здесь: https://github.com/doitintl/ignite-gke. Несмотря на это я также открыл ошибку с IGNITE Jira: https://issues.apache.org/jira/browse/IGNITE-12896. Большое спасибо @alamar за его предложения.

1 Ответ

2 голосов
/ 09 апреля 2020

Я рекомендую установить excludeNeighbors на false. Это true в вашем случае, оно не нужно, и я получаю правильное сопоставление разделов, когда задаю false (конечно, я также запускаю все четыре узла локально).

Свойство среды было достаточно, не нужно было добавлять его вручную в пользовательские атрибуты.

...