Как смягчить надгробия? Я, наверное, задаю этот вопрос у наших разработчиков, десяток раз в месяц. Самый простой способ: не УДАЛИТЬ, и я серьезно отношусь к этому. В противном случае вы можете смоделировать свои таблицы таким образом, чтобы смягчить надгробных камней в лучшем виде.
Например, допустим, что у меня есть простая таблица для отслеживания состояния заказа. Поскольку заказ может иметь несколько разных статусов (отложенные, собираемые, отправленные, полученные, возвращенные и т. Д.), Ленивый способ состоит в том, чтобы иметь одну строку на заказ и либо DELETE, либо выполнить обновление на месте, чтобы изменить статус (в зависимости от того, является ли статус частью вашего ключа). Лучший способ - преобразовать его в временный ряд и выполнить удаление через TTL. Таблица будет выглядеть примерно так:
CREATE TABLE orderStatus (orderid UUID,
updateTime TIMEUUID,
status TEXT,
PRIMARY KEY (ordered, status))
with CLUSTERING ORDER BY (updateTime DESC);
Допустим, я знаю, что я на самом деле только заботиться о состоянии заказа в течение максимум 30 дней, так что все upserts статус имеют TTL 30 дней ...
INSERT INTO orderStatus (orderid,updateTime,status)
VALUES (UUID(),now(),'pending') USING TTL 2592000;
Эта таблица будет поддерживать запросы для заказа на orderid
, отсортированные по дате загрузки по убыванию. Таким образом, я могу выбрать из этой таблицы идентификатор с LIMIT 1 и всегда получать самый последний статус. Кроме того, эти статусы автоматически удаляются через 30 дней. Теперь данные TTLing все еще создают надгробные плиты. Но эти надгробные плиты отделены от новых заказов (те, которые мне больше всего нравятся), поэтому мне, как правило, не нужно беспокоиться о том, что эти надгробные плики вмешиваются в мои запросы (потому что они все сгруппированы по разделам, которых я не буду часто спрашивать).
Это один из примеров, но я надеюсь, что идея моделирования для смягчения надгробий очевидна. В основном, идея состоит в том, чтобы разбить вашу таблицу таким образом, чтобы надгробия хранились отдельно от данных, которые вы запрашиваете чаще всего.
Есть ли способ, с помощью которого мы можем отслеживать медленные запросы на сервере?
Нет, не существует способа сделать это. Но вы должны иметь возможность запросить все запросы у ваших разработчиков для проблемных кластеров/таблиц. И это должно быть легко, потому что таблица действительно должна поддерживать только один или два запроса. Если ваши разработчики построили таблицу, которая поддерживает 5 или 6 разных запросов, они делают это неправильно.
Когда вы смотрите на запросы, это какие-то красные флаги вы должны задаться вопросом:
- несвязанные запросы (селекцию без WHERE положений).
- Запросы с ПОМОЩЬЮ ФИЛЬТРАЦИИ.
- Использование вторичных индексов.
- Использование IN.
- Использование операторов BATCH (я уже видел инструкцию партии над узлом).
Вы также видите высокие GC-паузы? Какие-либо надгробные надбавки за исключения или предупреждения размера партии в вашей системе.log? Обычно такие вещи происходят из-за плохих запросов, плохих моделей или неправильного использования пакетных операторов. – Aaron
Спасибо Аарону за это предложение. Да, мы получаем перегруженные исключения надгробия (порог по умолчанию> 100000). Мы делаем некоторые удаления. Есть ли способ избежать этого исключения ? Должно ли мы изменить время уплотнения на выравнивание уплотнение (мы хотим, чтобы это быстро прочитано для этой таблицы). Должны ли мы уменьшить gc_grace_seconds, как 3 дня? Есть ли способ, с помощью которого мы можем контролировать, какие запросы работают медленнее на сервере? Мы отслеживали поток запросов на собственный транспорт и видим, что они , забрасывая много циклов процессора. Можем ли мы запросы, связанные с этими запросами ? –