Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Cassandra	для	
хранения	метаданных:	
успехи	и	провалы	
Андрей Смирнов, Virtustream
Пару	слов	о	себе…
Principal	SoDware	Engineer	at	Virtustream	
Полностью	удаленная	команда	
Virtustream:	облако	для	enterpri...
Virtustream	Storage	Cloud
Region:	us
Site	A
Site	B
async

replica2on
DNS

Load	Balancer
Customer
S3-compa2ble

API
AcRve-AcRve
Перенаправление	операций	в	“ближайший”	ДЦ	
Доступность	данных	при	отказе	ДЦ	
Чтение	и	запись	при	отказе	ДЦ	или...
Object
Data



001110110011010101

101010101010101100

10101111011011011…
immutable
Metadata



owner:	user1

size:	3456

...
Цифры
Данные:	4	Пбайта	
Кластеры	метаданных:	3	
Объекты:	40	миллиардов		
Объем	метаданных:	160	Тбайт	(с	учетом	репликации)...
Выбор	хранилища	для	метаданных
Поддержка	acRve-acRve	
Масштабируемость	
Баланс	отказоустойчивости	и	надежности	хранения	
Н...
Cassandra
Cassandra
Локальное	KV-хранилище	на	каждом	узле	
Шардирование	данных	по	узлам	(consistent	hashing)	
Координатор	для	перена...
Стадии	познания
время
Хорошее
Время	отклика	в	миллисекундах	
Высокая	масштабируемость	по	записи	
Отказоустойчивость	
Простота
!	Потеря	объектов
Худший	день	в	истории	сервиса	или	почему	уровень	
консистентности	так	важен
Схема	хранения	объектов
bucket key current_version
backup2017 01/03/data.tar.gz 135
backup2017 01/04/data.tar.gz
photos IM...
Схема	хранения	объектов
bucket key current_version
backup2017 01/03/data.tar.gz 135
backup2017 01/04/data.tar.gz
photos IM...
Очистка	ненужных	версий
bucket key current_version
backup2017 01/03/data.tar.gz 135
backup2017 01/04/data.tar.gz
photos IM...
Беда	пришла	незаметно…
Site	A Site	B
асинхронная	репликация
очистка
LOCAL_QUORUM LOCAL_QUORUM LOCAL_QUORUM
3	реплики 3	реп...
bucket key current_version
backup2017 01/03/data.tar.gz
bucket key current_version
backup2017 01/03/data.tar.gz 135
bucket...
bucket key current_version
backup2017 01/03/data.tar.gz
bucket key current_version
backup2017 01/03/data.tar.gz 135
bucket...
💡Решение
Consistency	ALL:	
очень	медленно	
зависимость	от	доступности	всех	узлов	
зато	сразу	read-repair
#	Зомби
Зачем	нужны	tombstone	или	почему	надо	делать

регулярный	repair	кластера
Удаление	в	Cassandra
1 2 3 4 5 6
XX X X X X
Удаление	в	Cassandra
1 2 3 4 5 6
X
Удаление	в	Cassandra
1 2 3 4 5 6
X
X
Удаление	в	Cassandra
1 2 3 4 5 6
XX X X X X
Удаление	в	Cassandra
1 2 3 4 5 6
XX X X X X
Удаление	в	Cassandra
1 2 3 4 5 6
XX X X X X
X
Tombstone
Удаление	==	запись	
Tombstone	имеет	маленький	размер	
Tombstone	удаляется	через	gc_grace_period	секунд
Repair
1 2 3 4 5 6
X X
Repair
1 2 3 4 5 6
X X
Repair
1 2 3 4 5 6
X XX X X X
💡Решение
Repair	по	расписанию,	автоматизация	процесса	
gc_grace_period	>	интервала	repair
$	Large	parRRon
Как	сохранить	отсортированный	список	ключей	заранее		
неизвестной	структуры,	не	убив	при	этом	Cassandra
Список	объектов	в	бакете
bucket key current_version
backup2017 01/03/data.tar.gz 135
backup2017 01/04/data.tar.gz 1456
bac...
Список	объектов	в	бакете
bucket key current_version
backup2017 01/03/data.tar.gz 135
backup2017 01/04/data.tar.gz 1456
bac...
Список	объектов	в	бакете
bucket key current_version
backup2017 01/03/data.tar.gz 135
backup2017 01/04/data.tar.gz 1456
bac...
bucket key metadata
backup2017 01/03/data.tar.gz size:	1455,	…
backup2017 01/04/data.tar.gz size:	1459,	…
backup2017 02/01...
bucket key metadata
backup2017 01/03/data.tar.gz size:	1455,	…
backup2017 01/04/data.tar.gz size:	1459,	…
backup2017 02/01...
bucket key metadata
backup2017 01/03/data.tar.gz size:	1455,	…
backup2017 01/04/data.tar.gz size:	1459,	…
backup2017 02/01...
bucket key metadata
backup2017 01/03/data.tar.gz size:	1455,	…
backup2017 01/04/data.tar.gz size:	1459,	…
backup2017 02/01...
bucket key metadata
backup2017 01/03/data.tar.gz size:	1455,	…
backup2017 01/04/data.tar.gz size:	1459,	…
backup2017 02/01...
Хеширование
bucket	+	key_hash	-	партиция:	
размер	партиции	должен	быть	ограничен	сверху	
возможность	быстро	получить	отсор...
Статическое	хеширование:	hash
bucket key_hash key
backup2017 0 …
backup2017 1 …
backup2017 … …
backup2017 N-1 …
key hash
К...
Статическое	хеширование:	префикс
Как	угадать	распределение	ключей	в	бакете?	
Сколько	символов	в	префиксе?
bucket key_hash ...
Динамическое	распределение
bucket key_hash key
backup2017 4 …
backup2017 7 …
backup2017 … …
backup2017 3123 …
key DT
bucke...
Динамическое	хеширование
Динамическая	таблица	распределения	
Генетический	алгоритм	для	поиска	идеального	распределения	и	
...
💡Решение
Никогда,	никогда	не	допускайте	появления	large	par22on	
Разбивайте	данные	по	primary	key	в	зависимости	от	задачи
%Проблемы	производительности
Почему	узлы	Cassandra	на	самом	деле	не	совсем	независимы	или	
почему	нужна	детальная	статисти...
Сложности	интерпретации
Время	отклика	координатора	(сам	узел	vs.	реплики)	
Конкретная	таблица	или	весь	узел?	
GC	Pause?	Не...
Понимание	контекста
Работает	ли	repair?	
Замена/добавление	узла?	Streaming?	
Проблемы	с	“железом”?	
Проблемы	JVM?
💡Решение
Детальный	мониторинг	как	со	стороны	кластера,	так	и	со	стороны	
приложения	
Тюнинг	JVM	(бесконечный	процесс)	
Изб...
&«Испорченные»	данные
Про	то,	как	Cassandra	испортила	данные,	а	мы	искали	иголку	в	
стоге	сена	(и	нашли)
Проблема
Примерно	раз	в	неделю…	
несколько	десятков	испорченных	строк	(мусор)…	
которые	невозможно	прочитать
Поиски
Поиски
Общий	узел
Поиски
Общий	узел
Плохой	диск
Поиски
Общий	узел
Плохой	диск
Плохая	память
Поиски
Общий	узел
Плохой	диск
Плохая	память
Проблема	репликации
Поиски
Общий	узел
Плохой	диск
Плохая	память
Проблема	репликации
Проблема	приложения
Поиски
Общий	узел
Плохой	диск
Плохая	память
Проблема	репликации
Проблема	приложения
Общий	узел	
Плохой	диск	
Плохая	память...
Иголка	нашлась!
Хм…	а	почему	JVM	crash	dump?	
А	почему	в	stack	trace	часто	есть	G1GC?	
А	что	за	версию	JVM	мы	используем?	...
Восстановление	данных
Backup	не	поможет	
Частичное	восстановление	неповрежденных	колонок	
Восстановление	из	разных	источни...
💡Решение
Обновляйте	JVM	после	длительного	тестирования	
Мониторинг	JVM	сrash	
Имейте	независимую	от	Cassandra	копию	данных
🐞Баги
🐞Баги
Низкое	качество	тестирования	релизов
🐞Баги
Низкое	качество	тестирования	релизов
Постоянные	проблемы	со	сложными	фичами
🐞Баги
Низкое	качество	тестирования	релизов
Постоянные	проблемы	со	сложными	фичами
…	не	используйте	инкрементальный	repair	...
🐞Баги
Низкое	качество	тестирования	релизов
Постоянные	проблемы	со	сложными	фичами
…	не	используйте	инкрементальный	repair	...
🐞Баги
Низкое	качество	тестирования	релизов
Постоянные	проблемы	со	сложными	фичами
…	не	используйте	инкрементальный	repair	...
Предсказуемость
PostgreSQL Redis
предсказуемонепредсказуемо
MySQLCassandra
Cassandra	-	это	хорошо	и	нескучно!	
Только	помните	о	кочках	на	дороге!
Cassandra для хранения метаданных: успехи и провалы / Андрей Смирнов (Virtustream)
Cassandra для хранения метаданных: успехи и провалы / Андрей Смирнов (Virtustream)
Cassandra для хранения метаданных: успехи и провалы / Андрей Смирнов (Virtustream)
Upcoming SlideShare
Loading in …5
×

Cassandra для хранения метаданных: успехи и провалы / Андрей Смирнов (Virtustream)

177 views

Published on

HighLoad++ 2017

Зал «Сингапур», 7 ноября, 16:00

Тезисы:
http://www.highload.ru/2017/abstracts/2917.html

Мы разработали и поддерживаем экзабайтное облачное объектное хранилище (S3-совместимое), и нам необходимо сохранять метаданные объектов. Работа с метаданными сложнее работы с данными, т.к. необходимо поддерживать конкурентные операции по записи/удалению одного и того же объекта, версионирование и т.п. Наше хранилище поддерживает работу в режиме active-active через два дата-центра (eventual consistency), что дополнительно усложняет слой метаданных.
...

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

Cassandra для хранения метаданных: успехи и провалы / Андрей Смирнов (Virtustream)

  1. 1. Cassandra для хранения метаданных: успехи и провалы Андрей Смирнов, Virtustream
  2. 2. Пару слов о себе… Principal SoDware Engineer at Virtustream Полностью удаленная команда Virtustream: облако для enterprise
  3. 3. Virtustream Storage Cloud Region: us Site A Site B async
 replica2on DNS
 Load Balancer Customer S3-compa2ble
 API
  4. 4. AcRve-AcRve Перенаправление операций в “ближайший” ДЦ Доступность данных при отказе ДЦ Чтение и запись при отказе ДЦ или потере связности
  5. 5. Object Data
 
 001110110011010101
 101010101010101100
 10101111011011011… immutable Metadata
 
 owner: user1
 size: 3456
 acl: private
 … mutable,
 business logic
  6. 6. Цифры Данные: 4 Пбайта Кластеры метаданных: 3 Объекты: 40 миллиардов Объем метаданных: 160 Тбайт (с учетом репликации) Скорость изменений (метаданных): 3000 объектов/с
  7. 7. Выбор хранилища для метаданных Поддержка acRve-acRve Масштабируемость Баланс отказоустойчивости и надежности хранения Настраиваемая консистентность операций
  8. 8. Cassandra
  9. 9. Cassandra Локальное KV-хранилище на каждом узле Шардирование данных по узлам (consistent hashing) Координатор для перенаправления запросов к другим узлам
  10. 10. Стадии познания время
  11. 11. Хорошее Время отклика в миллисекундах Высокая масштабируемость по записи Отказоустойчивость Простота
  12. 12. ! Потеря объектов Худший день в истории сервиса или почему уровень консистентности так важен
  13. 13. Схема хранения объектов bucket key current_version backup2017 01/03/data.tar.gz 135 backup2017 01/04/data.tar.gz photos IMG_0175.JPG 149 objects object_versions bucket key version locaRon metadata backup2017 01/03/data.tar.gz 134 421343dc owner: X, … backup2017 01/03/data.tar.gz 135 76fa9949 owner: X, … backup2017 01/04/data.tar.gz 278 4e7ab0d4 owner: X, … photos IMG_0175.JPG 149 1a2058a6 owner: Y, …
  14. 14. Схема хранения объектов bucket key current_version backup2017 01/03/data.tar.gz 135 backup2017 01/04/data.tar.gz photos IMG_0175.JPG 149 objects object_versions bucket key version locaRon metadata backup2017 01/03/data.tar.gz 134 421343dc owner: X, … backup2017 01/03/data.tar.gz 135 76fa9949 owner: X, … backup2017 01/04/data.tar.gz 278 4e7ab0d4 owner: X, … photos IMG_0175.JPG 149 1a2058a6 owner: Y, …
  15. 15. Очистка ненужных версий bucket key current_version backup2017 01/03/data.tar.gz 135 backup2017 01/04/data.tar.gz photos IMG_0175.JPG 149 objects object_versions bucket key version locaRon metadata backup2017 01/03/data.tar.gz 134 421343dc owner: X, … backup2017 01/03/data.tar.gz 135 76fa9949 owner: X, … backup2017 01/04/data.tar.gz 278 4e7ab0d4 owner: X, … photos IMG_0175.JPG 149 1a2058a6 owner: Y, …
  16. 16. Беда пришла незаметно… Site A Site B асинхронная репликация очистка LOCAL_QUORUM LOCAL_QUORUM LOCAL_QUORUM 3 реплики 3 реплики+
  17. 17. bucket key current_version backup2017 01/03/data.tar.gz bucket key current_version backup2017 01/03/data.tar.gz 135 bucket key version locaRon metadata backup2017 01/03/data.tar.gz 135 76fa9949 owner: X bucket key version locaRon metadata backup2017 01/03/data.tar.gz 135 76fa9949 owner: X Site A Site B
  18. 18. bucket key current_version backup2017 01/03/data.tar.gz bucket key current_version backup2017 01/03/data.tar.gz 135 bucket key version locaRon metadata backup2017 01/03/data.tar.gz 135 76fa9949 owner: X bucket key version locaRon metadata backup2017 01/03/data.tar.gz 135 76fa9949 owner: X Site A Site B
  19. 19. 💡Решение Consistency ALL: очень медленно зависимость от доступности всех узлов зато сразу read-repair
  20. 20. # Зомби Зачем нужны tombstone или почему надо делать
 регулярный repair кластера
  21. 21. Удаление в Cassandra 1 2 3 4 5 6 XX X X X X
  22. 22. Удаление в Cassandra 1 2 3 4 5 6 X
  23. 23. Удаление в Cassandra 1 2 3 4 5 6 X X
  24. 24. Удаление в Cassandra 1 2 3 4 5 6 XX X X X X
  25. 25. Удаление в Cassandra 1 2 3 4 5 6 XX X X X X
  26. 26. Удаление в Cassandra 1 2 3 4 5 6 XX X X X X X
  27. 27. Tombstone Удаление == запись Tombstone имеет маленький размер Tombstone удаляется через gc_grace_period секунд
  28. 28. Repair 1 2 3 4 5 6 X X
  29. 29. Repair 1 2 3 4 5 6 X X
  30. 30. Repair 1 2 3 4 5 6 X XX X X X
  31. 31. 💡Решение Repair по расписанию, автоматизация процесса gc_grace_period > интервала repair
  32. 32. $ Large parRRon Как сохранить отсортированный список ключей заранее неизвестной структуры, не убив при этом Cassandra
  33. 33. Список объектов в бакете bucket key current_version backup2017 01/03/data.tar.gz 135 backup2017 01/04/data.tar.gz 1456 backup2017 02/01/data.tar.gz 149 objects SELECT * FROM objects WHERE bucket = ?
  34. 34. Список объектов в бакете bucket key current_version backup2017 01/03/data.tar.gz 135 backup2017 01/04/data.tar.gz 1456 backup2017 02/01/data.tar.gz 149 objects primary key SELECT * FROM objects WHERE bucket = ?
  35. 35. Список объектов в бакете bucket key current_version backup2017 01/03/data.tar.gz 135 backup2017 01/04/data.tar.gz 1456 backup2017 02/01/data.tar.gz 149 objects primary key SELECT * FROM objects WHERE bucket = ?
  36. 36. bucket key metadata backup2017 01/03/data.tar.gz size: 1455, … backup2017 01/04/data.tar.gz size: 1459, … backup2017 02/01/data.tar.gz size: 1470, … bucket_contents composite key primary key
  37. 37. bucket key metadata backup2017 01/03/data.tar.gz size: 1455, … backup2017 01/04/data.tar.gz size: 1459, … backup2017 02/01/data.tar.gz size: 1470, … bucket_contents composite key primary key SELECT * FROM bucket_contents 
 WHERE bucket = ? AND key > ? ORDER BY key
  38. 38. bucket key metadata backup2017 01/03/data.tar.gz size: 1455, … backup2017 01/04/data.tar.gz size: 1459, … backup2017 02/01/data.tar.gz size: 1570, … bucket_contents
  39. 39. bucket key metadata backup2017 01/03/data.tar.gz size: 1455, … backup2017 01/04/data.tar.gz size: 1459, … backup2017 02/01/data.tar.gz size: 1570, … bucket_contents bucket key: 01/03/data.tar.gz key: 01/04/data.tar.gz key: 02/01/data.tar.gz … backup2017 size: 1455, … size: 1459, … size: 1570, … … на самом деле: ширина = размер бакета
  40. 40. bucket key metadata backup2017 01/03/data.tar.gz size: 1455, … backup2017 01/04/data.tar.gz size: 1459, … backup2017 02/01/data.tar.gz size: 1570, … bucket_contents bucket key: 01/03/data.tar.gz key: 01/04/data.tar.gz key: 02/01/data.tar.gz … backup2017 size: 1455, … size: 1459, … size: 1570, … … на самом деле: ширина = размер бакета LARGE PARTITION!
  41. 41. Хеширование bucket + key_hash - партиция: размер партиции должен быть ограничен сверху возможность быстро получить отсортированный список ключей bucket key_hash key metadata backup2017 ? 01/03/data.tar.gz size: 1455, … backup2017 ? 01/04/data.tar.gz size: 1459, … backup2017 ? 02/01/data.tar.gz size: 1470, … bucket_contents primary key
  42. 42. Статическое хеширование: hash bucket key_hash key backup2017 0 … backup2017 1 … backup2017 … … backup2017 N-1 … key hash Как выбрать N? Как его изменить? Выборка отсортированного списка - запрос ко всем key_hash
  43. 43. Статическое хеширование: префикс Как угадать распределение ключей в бакете? Сколько символов в префиксе? bucket key_hash key backup2017 A Aa, Ab, Ac, … backup2017 B Ba, Bb, Bc, … backup2017 … … backup2017 Z Za, Zb, Zc, … key LEFT(x, 1)
  44. 44. Динамическое распределение bucket key_hash key backup2017 4 … backup2017 7 … backup2017 … … backup2017 3123 … key DT bucket keys key_hash backup2017 [‘’, ‘A1’) 33 backup2017 [‘A1’, ‘Ca5’) 48 backup2017 … … backup2017 [‘ZZa1’, ∞) 11 distribu2on_table:
  45. 45. Динамическое хеширование Динамическая таблица распределения Генетический алгоритм для поиска идеального распределения и идеального перераспределения Подсчет размера патриции вне Cassandra Online-перераспределение (без остановки операций и потери консистентности)
  46. 46. 💡Решение Никогда, никогда не допускайте появления large par22on Разбивайте данные по primary key в зависимости от задачи
  47. 47. %Проблемы производительности Почему узлы Cassandra на самом деле не совсем независимы или почему нужна детальная статистика на уровне узла (таблицы)
  48. 48. Сложности интерпретации Время отклика координатора (сам узел vs. реплики) Конкретная таблица или весь узел? GC Pause? Недостачный Thread Pool? Слишком много uncompacted SSTables?
  49. 49. Понимание контекста Работает ли repair? Замена/добавление узла? Streaming? Проблемы с “железом”? Проблемы JVM?
  50. 50. 💡Решение Детальный мониторинг как со стороны кластера, так и со стороны приложения Тюнинг JVM (бесконечный процесс) Избегать large parRRon, batch, condiRonal update, …
  51. 51. &«Испорченные» данные Про то, как Cassandra испортила данные, а мы искали иголку в стоге сена (и нашли)
  52. 52. Проблема Примерно раз в неделю… несколько десятков испорченных строк (мусор)… которые невозможно прочитать
  53. 53. Поиски
  54. 54. Поиски Общий узел
  55. 55. Поиски Общий узел Плохой диск
  56. 56. Поиски Общий узел Плохой диск Плохая память
  57. 57. Поиски Общий узел Плохой диск Плохая память Проблема репликации
  58. 58. Поиски Общий узел Плохой диск Плохая память Проблема репликации Проблема приложения
  59. 59. Поиски Общий узел Плохой диск Плохая память Проблема репликации Проблема приложения Общий узел Плохой диск Плохая память Проблема репликации Проблема приложения
  60. 60. Иголка нашлась! Хм… а почему JVM crash dump? А почему в stack trace часто есть G1GC? А что за версию JVM мы используем? Из 2015 г.? 🤦
  61. 61. Восстановление данных Backup не поможет Частичное восстановление неповрежденных колонок Восстановление из разных источников Логи - это бесценно!
  62. 62. 💡Решение Обновляйте JVM после длительного тестирования Мониторинг JVM сrash Имейте независимую от Cassandra копию данных
  63. 63. 🐞Баги
  64. 64. 🐞Баги Низкое качество тестирования релизов
  65. 65. 🐞Баги Низкое качество тестирования релизов Постоянные проблемы со сложными фичами
  66. 66. 🐞Баги Низкое качество тестирования релизов Постоянные проблемы со сложными фичами … не используйте инкрементальный repair в 2.1 🤦
  67. 67. 🐞Баги Низкое качество тестирования релизов Постоянные проблемы со сложными фичами … не используйте инкрементальный repair в 2.1 🤦 … не используйте инкрементальный repair в 3.x 🤦 🤦 🤦
  68. 68. 🐞Баги Низкое качество тестирования релизов Постоянные проблемы со сложными фичами … не используйте инкрементальный repair в 2.1 🤦 … не используйте инкрементальный repair в 3.x 🤦 🤦 🤦 Надо следить за JIRA
  69. 69. Предсказуемость PostgreSQL Redis предсказуемонепредсказуемо MySQLCassandra
  70. 70. Cassandra - это хорошо и нескучно! Только помните о кочках на дороге!

×