Низкая запись кассандры в секунду, 1500-2000 операций записи в секунду в кластере из 6 узлов

Спецификации кластера Кассандры:

Nodes: 6
Storage: 1536 GB
Cores: 48
Ram: 168 GB

Задержка кластера кассандры от моего локального: 330 мс-390 мс

Я использую Java-драйвер cassandra, версия 2.3.2 spark-cassandra-connector_2.11

конфигурация кластера в драйвере Java:

private static Session connect(
      final String node, final Integer port, final String userName, final String password) {

    Builder b = Cluster.builder().addContactPoints(node.split(COMMA_SEPARATOR));
    if (!Strings.isNullOrEmpty(userName) && !Strings.isNullOrEmpty(password)) {
      b.withCredentials(userName, password);
    }

    if (port != null && port != 0) {
      b.withPort(port);
    }

    PoolingOptions poolingOptions = new PoolingOptions();
    poolingOptions
        .setMaxRequestsPerConnection(HostDistance.LOCAL, 32768)
        .setMaxRequestsPerConnection(HostDistance.REMOTE, 10000)
        .setMaxConnectionsPerHost(HostDistance.LOCAL, 3)
        .setMaxConnectionsPerHost(HostDistance.REMOTE, 3)
        .setNewConnectionThreshold(HostDistance.LOCAL, 3)
        .setNewConnectionThreshold(HostDistance.REMOTE, 3)
        .setCoreConnectionsPerHost(HostDistance.LOCAL, 3)
        .setCoreConnectionsPerHost(HostDistance.REMOTE, 3);

    b.withSocketOptions(
        new SocketOptions()
            .setConnectTimeoutMillis(SOCKET_CONNECT_TIMEOUT)
            .setReadTimeoutMillis(SOCKET_READ_TIMEOUT));
    b.withPoolingOptions(poolingOptions);

    cluster = b.build();


    session = cluster.connect();

    return session;
  }

Ниже моя тестовая таблица:

CREATE TABLE my_keyspace.test_table (
  id int PRIMARY KEY
)

Для записи на Кассандру я использую session.executeAsync и хранение фьючерсов в списке и ожидание завершения всех фьючерсов.

Когда я делаю 100000 записей, это занимает 50-65 секунд. Это должно быть так медленно или что-то мне не хватает в конфигурации? Я уже пробовал несколько опций в опциях сокетов и пулов, но это лучшее, что я получил.

1 ответ

Первым делом я проверю, работает ли ваш сервер Cassandra с 100% загрузкой процессора. Если это не так, и, поскольку я предполагаю, что сервер не является узким местом на диске (нет проблем с выполнением 1500 операций записи в секунду даже на вращающийся диск), то узкое место должно быть где-то еще:

Одна возможность, которую вы всегда должны проверять в первую очередь, заключается в том, что клиент не является узким местом, то есть он не использует 100% ЦП.

Затем вы сказали, что "задержка на кластер кассандры из моего локального составляет 330 мс". Это время пинга между вашей тестовой машиной и кластером Cassandra? Если это так, у вас могут быть два вида проблем. Во-первых, возможно, это своего рода WAN с низкой пропускной способностью, который действительно не может поддерживать более 2000 запросов в секунду. Но я сомневаюсь в этом. Другая возможность заключается в том, что вашему клиенту просто не хватает параллелизма... С задержкой в ​​1/3 секунды для достижения 2000 операций записи в секунду необходимо, чтобы клиент выполнял 666 запросов параллельно. Является ли setMaxRequestsPerConnection() установленным вами действительно действующим? Потому что, если это не так, по умолчанию (в соответствии с https://docs.datastax.com/en/developer/java-driver/2.1/manual/pooling/) в 256 раз больше трех установленных вами соединений, что составляет 768, близко к вышеуказанному номеру 666.

И конечно это может быть многое другое. Трудно догадаться без дополнительных данных.

Другие вопросы по тегам