Snowflake - кэширование с сохранением свежести данных
Я много читал о кэшировании «снежинки», но не понимаю, как «снежинка» решает проблему свежести данных, с которой сталкиваются другие «общие архитектуры». Насколько я понимаю, с общим доступом ко всему при изменении данных, по сути, должна быть некоторая блокировка.
Как объясняется в этой статье:
Для эффективности оба узла кэшировали локальные копии записи 1 в памяти. Затем клиент пытается обновить запись 1 так, чтобы «foo» превратилось в «bar». Чтобы сделать это согласованным образом, СУБД должна принять распределенную блокировку на всех узлах, которые могут иметь кэшированную запись 1. Такие распределенные блокировки становятся все медленнее и медленнее по мере увеличения количества машин в кластере и в результате могут препятствовать масштабируемости процесс написания.
Другими словами, если Snowflake кэширует данные на уровне вычислений, но базовые данные изменяются в S3, разве Snowflake не сталкивается с теми же проблемами кеширования, что и в других архитектурах с общим доступом? Я вижу, что в базе данных аналитики обновлений меньше, но почему тогда традиционные архитектуры с общим доступом не работают?
Единственный ответ, который я видел, - это то, что у Snowflake есть оптимизатор запросов, который проверяет, изменились ли базовые данные. Но до сих пор не понимаю, почему это значительное обновление по сравнению со стратегией кэширования в традиционных базах данных с общим доступом.
1 ответ
Я считаю, что ключевая концепция, которую вам здесь не хватает, заключается в том, что Snowflake никогда не обновляет запись ... никогда. Вместо этого он создает новый Micro-Partition, который содержит все данные из старого Micro-Partition с примененными изменениями. Таким образом, уровень сервисов Snowflake немедленно знает, что микро-раздел в кэше хранилища больше не действителен, потому что он больше не активен в соответствии с уровнем сервисов.
Единственный раз, когда вам понадобится блокировка, - это если вы «обновляете» кеш или базовые данные. Здесь такого никогда не бывает. Новые микро-разделы становятся активными, как только оператор обновления завершен. Пока выполняется обновление, у данных нет «грязных» состояний, поэтому любой запрос, выполняемый для этой таблицы, всегда будет либо предыдущим состоянием во время выполнения обновления, либо состоянием после обновления. Замки не нужны.
Это ответ на ваш вопрос?