Как заставить удаленное чтение только в Cassandra3? - PullRequest
0 голосов
/ 02 ноября 2018

Мы пытаемся изменить код Cassandra для выполнения ТОЛЬКО удаленных чтений (никогда не считывать локально) в целях тестирования производительности с помощью методов уменьшения задержки спекулятивных повторных попыток и дублирования запросов.

Пока что мы изменили SRC / Java / орг / Apache / Cassandra / сервис / AbstractReadExecutor.java сделать что-то вроде этого:

public abstract class AbstractReadExecutor {
  protected int getNonLocalEndpointIndex (Iterable<InetAddress> endpoints) {
    int endpoint_index = 0;

    // iterate thru endpoints and pick non-local one
    boolean found = false;
    for (InetAddress e : endpoints) {
     if (! StorageProxy.canDoLocalRequest(e) ) {
        found = true;
        break;
     }
     endpoint_index++;
    }

    if (!found) {
        endpoint_index = 0;
    }
    return endpoint_index;
   }
}


public static class NeverSpeculatingReadExecutor extends AbstractReadExecutor {
   public void executeAsync() {
         int endpoint_index = getNonLocalEndpointIndex(targetReplicas);
         makeDataRequests(targetReplicas.subList(endpoint_index, endpoint_index+1));

         if (targetReplicas.size() > 1)
             makeDigestRequests(targetReplicas.subList(1, targetReplicas.size()));
         }
    }
}

Однако это не работает, поскольку targetReplicas почти всегда представляет собой только 1 конечную точку (локальную) для использования небольших рабочих нагрузок, 5 узлов кассандры и коэффициент репликации 3.

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

Мне удалось выполнить только удаленное чтение, добавив функцию «getRemoteReplicas ()», которая отфильтровывает локальные узлы до / после создания объекта ReadExecutor. Затем consistencyLevel.filterForQuery () обычно просто возвращает 1 узел (нелокальный).

public static AbstractReadExecutor getReadExecutor(...) {
    ...
    List<InetAddress> remoteReplicas = getRemoteReplicas( allReplicas );
    List<InetAddress> targetReplicas = consistencyLevel.filterForQuery(keyspace, remoteReplicas, repairDecision);
    ...
}

private static List<InetAddress> getRemoteReplicas(List<InetAddress> replicas) {
    logger.debug("ALL REPLICAS: " + replicas.toString());
    List<InetAddress> remote_replicas = new ArrayList<>();

    // iterate thru replicas and pick non-local one
    boolean found = false;
    for (InetAddress r : replicas) {
        if (! StorageProxy.canDoLocalRequest(r) ) {
            remote_replicas.add(r);
            found = true;
        }
    }
    if (!found) {
      return replicas;
    }
    logger.debug("REMOTE REPLICAS: " + remote_replicas.toString());
    return remote_replicas;
}

в src / java / org / apache / cassandra / service / AbstractReadExecutor.java

0 голосов
/ 02 ноября 2018

Если это только для тестирования, можно установить 1 узел в неправильном DC и использовать ЛОКАЛЬНЫЕ запросы для вещей, которые не принадлежат этому узлу (политика балансировки нагрузки белого списка на драйвере, чтобы запросы шли только к нему). Просто нужно сделать так, чтобы тестировались только те вещи, для которых узлу не принадлежит копия.

Или вы заинтересованы в таких вещах, как проверка прокси-мутаций при восстановлении чтения?

...