Низкая запись кассандры в секунду, 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.
И конечно это может быть многое другое. Трудно догадаться без дополнительных данных.