низкая запись кассандры в секунду, 1500-2000 операций записи в секунду в кластере из 6 узлов - PullRequest
0 голосов
/ 15 ноября 2018

Спецификации кластера Cassandra:

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

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

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

конфигурация кластера в драйвере 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 Ответ

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

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

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

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

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

...