Создание пространства ключей Cassandra происходит в бесконечном цикле с драйвером Cassandra 2.2.0-rc3
Я установил кластер кассандры с 3 узлами на одной машине (Ubantu), и я делаю следующее -
- Все три узла работают, и приложение может создавать пространство ключей.
- Завершите работу одного из трех работающих узлов, и приложение все еще сможет создать пространство ключей.
Выключите еще один узел из двух запущенных узлов и немедленно запустите его, и теперь приложение не может создать пространство ключей, оно продолжает сообщать (как бесконечный цикл) о -
2017-09-25 14:42:40 ИНФОРМАЦИЯ RequestHandler:561 - Запрос СОЗДАТЬ KEYSPACE, ЕСЛИ НЕ СУЩЕСТВУЕТ MYKEYSPACE С replication = {'class':'NetworkTopologyStrategy', 'datacenter1':'2'}; не подготовлен на /127.0.0.1:9042, подготовка перед повторной попыткой выполнения. Увидеть это сообщение несколько раз - это хорошо, но его частое обращение может быть источником проблем с производительностью.
Журнал моего приложения залит этими сообщениями, и это привело к ошибке java heap out.
Примечание. Коэффициент репликации равен 2, а версия cassandra с использованием 2.2.6 с драйвером cassandra - 2.2.0-rc3. Когда я возвращаюсь обратно к драйверу Кассандры 2.1.3, все работает нормально, так что просто интересно, есть ли какие-то проблемы на уровне драйвера
Более того, чтобы добавить это, я отлаживал код даже на уровне драйвера cassandra и обнаружил, что это из-за нижеприведенного метода класса com.datastax.driver.core.Connection -
private void flush(FlushItem item) {
EventLoop loop = item.channel.eventLoop();
Flusher flusher = flusherLookup.get(loop);
if (flusher == null) {
Flusher alt = flusherLookup.putIfAbsent(loop, flusher = new Flusher(loop));
if (alt != null)
flusher = alt;
}
flusher.queued.add(item);
flusher.start();
}
Таким образом, после перевода узла в оперативный режим (2 узла теперь работают из 3), RequestHandler продолжает сообщать о не подготовленном запросе, следовательно, готовится до повторной попытки, когда этот вызов сделан -
public ResponseHandler write(ResponseCallback callback, boolean startTimeout)
{
....
....
....
flush(new FlushItem(channel, request, writeHandler(request, handler)));
....
....
}
1 ответ
После обновления версии драйвера cassandra до версии 3.3.0 проблема не возникла. Я полагаю, что есть некоторые ошибки в 2.2.0-RC3, который является версией-кандидатом.