Изменения

Перейти к: навигация, поиск

Highload-2022: Отчёт Виталия Филиппова

95 байтов добавлено, 17:16, 6 декабря 2022
Нет описания правки
* Append-only volume-ы с переупаковкой. То есть, объекты хранятся в дописываемых всегда в конец больших файлах-томах вперемешку с заголовками, при удалении из тома сразу не удаляются, а только помечаются удалёнными — а потом, когда количество удалённого превышает определённый %, приходит отдельный процесс (называемый по вкусу compaction/defrag/gc/repack) и перезаписывает том целиком, на этот раз действительно удаляя удалённые объекты. Волюмы fallocate-ятся, чтобы исключить фрагментацию места в ФС.
* Есть «шарды», являющие собой группы из N (2, 3 или ещё скольки-то) таких томов на разных машинах, связанных репликацией вместе. То есть, запись идёт в пары или тройки томов. В терминологии Ceph шард — по сути, PG (placement group). В терминологии zepto — «бакет» (и сам волюм тоже, видимо, называется «бакет»).
* Клиент хранит ID шарда (бакета) у себя и для чтения объекта обращается к конкретному шарду. Центральный сервер метаданных, знающий, какой объект где лежитлежат все объекты, отсутствует.
* Запись через page cache. fsync-ов после каждой записи и строгой консистентности формально нет. fsync просто раз в секунду выполняется в отдельном потоке, чтобы стимулировать сброс данных на диск. Но так как бешеные уборщицы не ходят по залу и не дёргают в произвольном порядке целые датацентры из розеток — данные не теряются.
* Есть «прокси», предоставляющие API доступа к хранилищу. У них они называются zeptoproxy и ставятся прямо на клиентские машины.
** Бакеты складываются в 2 ТБ разделы дисков и один раздел (~1000 бакетов) обслуживается 1 процессом «bucketservice». В ноде 72 диска по 18 ТБ, но под Zepto на них обычно выделено только 4-6 ТБ, так что на одной машине живёт примерно 216 bucketservice-ов.
** Процесс-переупаковщик бакетов называется bucketcompactor.
* Репликация — клиентская, запись — кворумная. То есть клиент (прокся) напрямую соединяется с несколькими серверами и пишет свои данные на каждый, и считает запись успешной при записи на 2 из 3 серверов.* Распределение объектов — перед каждой записью идём в statusservice и спрашиваем у него, в какой бакет писать. При этом бакет на запись блокируется. При удалении аналогично, тоже блокировка. После записи разблокируем и обновляем версию бакета в statusservice. Версией служит просто последнее смещение в бакете.
* Консистентность удалений — если какой-то bucketservice лежит в момент удаления — другие сохраняют к себе запись типа «foreign delete», то есть «данный объект был удалён в другом месте» и после его поднятия досылают ему записи удалений.
* Восстановление — тупое, только полным копированием тома на отсутствующие/повреждённые реплики.
<pre>
- + bucket-видимо pg. ан нет, это еблоб реплицированный. волюм seaweedfs. правда странички по 4 кб. есть crc на 4 кб. фоновые скрабы. нахуя 4кб.. если хедеры м
елкие
- + версия бакета = оффсет в файле. о, дельты, привет!- + zeptoproxy клиент прямо рядом с приложением- + 1 диск = 1 bucketservice. разные порты. осд короче. фоновые - bucketcompactor
- statusservice. индекс бакетов. дельтами получает. держит карту бакетов в памяти. api: дай бакет для записи, дай адрес по бакету. пошардирован по дц. мастер
для своих бакетов %3
- + размер бакета 2 ГБ. пиздец же, мало. а они довольны, типа меньше чем было- + fallocate. врайты в конец. мало меты. мало лишних иопс- + кворумная запись. пись. пись
- x2, x3, x1.5
- xor. полторирование. ебать хитрая сосиска. после закрытия. ну видимо конвертация сосиски после. а шо с удалением из ec?
- пары это logical partitions
- ретраи на пут, на гет. все ясно. а если данные убрали из памяти, стрим?
- + zeptoid=bid+recordid, 64bit. 2^64 байт? = 16 ЕБ. смещение что ли? почта = 15 пет, им похуй. ебааааать, индекс удалений. ну да, забавно сделано- + delete = put в конец. lock. compact. по % удалений как и везде. а EC?- + консистентность делете: ну это томбстоуны, понятно... а, не совсем. есть foreign del, форвард другому бакету
- zeptoctl. move in = новая группа. тоже приоритет пустых. потом будет перекос по get-ам. есть масштабирование. средний du. не, стоп, а нагрузка?
- + 18Т диски, 12Т вложения, 6Т письма, 20-40 иопс на диск. вложения отдельно, не зепто. 60 дисков на сата-полке. сата?
- zstd. 15т -> 30т -> 15т
- серверов 3к -> 1.5к. индексы в 250
- удаления накур. лишнее ио.
- ручной move in, fix. боязнь админов, ага.
- + как смигрировать 50пб в 32- + синк по смещениям?- + Вадим ты чота завернул блеа. 6 дисков 15 пар- процессы порты. ец удаление. нагрузка. сата полка. синк по смещениям?- + запись под локом. статус сервис лочит. епт. 72д по 6т.- + цеф им нинужен. как удаления из ец хз лол, он не ответил
- большие файлы чанкуются по 64 мб.
- zeptoId какой-то еще последней записи. емое... в которой все. ааа. понятно. она с чанками

Навигация