Изменения

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

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

1472 байта убрано, 09:07, 7 декабря 2022
Нет описания правки
* Волюмы/бакеты.
** В zepto нет индексов (почти!). Объект идентифицируется прямо смещением внутри тома.
** А как же удаления, спросите вы, если смещение — это ID? А удаления реализуются через индекс удалений («индекс дырок»), добавляемый при сборке мусора. Видимо, вида «старое смещение → новое смещение»на каждую дырку. Ну такое… :) в худшем случае (если сильно изрубить всё удалён каждый второй объект) дырок будет столько же, сколько объектов, но в труху удалениямисреднем — типа, всё равно индекс большой получитсялучше.
** В zepto объекты пишутся страничками по 4 КБ, у каждой странички есть контрольная сумма crc32.
** Размер одного бакета — 2 ГБ. Логично, ибо под смещение выделено 32 бита. Плюс ещё 32 бита — ID бакета. Соответственно, общий лимит места в zepto-кластере — 16 ЭБ; под почту, которой всего 15 ПБ, этого хватает с головой :)
* Репликация — клиентская, запись — кворумная. То есть клиент (прокся) напрямую соединяется с несколькими серверами и пишет свои данные на каждый, и считает запись успешной при записи на 2 из 3 серверов. При неуспехе — повторная попытка в другой бакет.
** Консистентность удалений — если какой-то bucketservice лежит в момент удаления — другие сохраняют к себе запись типа «foreign delete», то есть «данный объект был удалён в другом месте» и после его поднятия досылают ему записи удалений.
** Восстановление — тупое, ручное (zeptoctl fix) и только полным копированием тома на отсутствующие/повреждённые реплики. Причём вообще, вроде, в разрезе разделов, а не отдельных волюмов.
* Слой управления (statusservice)
** Держит индекс бакетов в памяти, обновляет его дельтами. 2 основных метода API: дай бакет для записи, дай адрес по бакету.
* EC
** В супер-простейшем формате — побитовый XOR. То есть реализована только 1 схема, x1.5, то есть EC 2+1.
** Вообще открою страшную тайну: в любом EC первый чанк — как правило, XOR — к такому виду можно привести любую матрицу EC и это делается в том же jerasure для упрощения вычислений. Так что в XOR ничего зазорного нет. Но в докладе было упомянуто, что XOR побитойпобитовый, и вот тут я уже не уверен — если это значит, что коды генерятся не как (первый байт XOR второй байт), а как (первый бит первого байта XOR второй бит первого байта), то это слегка изврат.
** В XOR данные перекладываются только после заполнения. Запускается «полторирование» и перекодирует бакет из x2 или x3 в x1.5.
** Казалось бы, тут должны быть сосиски, то есть EC-кодирование всего волюма-колбасы а-ля seaweedfs, но этого нет. Кодируется каждый объект отдельно. А чего тогда, писали бы сразу в EC…* Жёсткая схема распределения места** Как я понял, это значит, что при добавлении серверы/разделы сразу разбиваются на группы так, чтобы полностью покрыть ими всю ёмкость, и потом бакеты собираются только уже в конкретных заданных сочетания. И, видимо, как-то переоптимизируются при добавлении/удалении дисков. Я в Vitastor со своим lpsolve-ом тоже начинал с подобной идеи...* Есть сжатие (zstd), которое позволяет 15 ПБ, превращённые с 2x репликацией в 30 ПБ, превратить обратно в 15 ПБ :).
<pre>+ bucket-видимо pgИтог: ужали хранилище с 3000 серверов до 1500. ан нет, это еблоб реплицированный. волюм seaweedfs. правда странички по 4 кб. есть crc на 4 кб. фоновые скрабы. нахуя 4кб.. если хедеры мелкие+ версия бакета = оффсет Используют ещё в файлеоблаке (которое mail. оru диск, дельты, привет!+ zeptoproxy клиент прямо рядом с приложением+ 1 диск = 1 bucketservice. разные порты. осд короче. фоновые видимо) - bucketcompactor+ statusservice. индекс бакетов. дельтами получает. держит карту бакетов 80 ПБ данных в памятиx1. api: дай бакет 5 и в сниппетах для записи, дай адрес поиска по бакету. пошардирован по дц. мастер для своих бакетов %3+ размер бакета почте - 2 ГБ. пиздец же, мало. а они довольны, типа меньше чем было+ fallocate. врайты 4 ПБ в конец. мало меты. мало лишних иопс+ кворумная запись. пись. пись+ x2, x3, x1.5+ xor. полторирование. ебать хитрая сосиска. после закрытия. ну видимо конвертация сосиски после. а шо с удалением из ec?- схема добавления дисков Средний размер объекта в кластер. жесткая. это как? а, видимо разделения места. я так умею на lpsolve, лолъпочте 40 КБ при времени доступа 10 мс (90% - пары это logical partitions+ ретраи на пут30 мс), на гет. все ясно. а если данные убрали из памяти, стрим?+ zeptoid=bid+recordid, 64bit. 2^64 байт? = 16 ЕБ. смещение что ли? почта = 15 пет, им похуй. ебааааать, индекс удалений. ну да, забавно сделано+ delete = put средний размер объекта в конец. lock. compact. по облаке > 1 МБ при времени доступа 500 мс (90% удалений как и везде. а EC?+ консистентность делете: ну это томбстоуны, понятно... а, не совсем. есть foreign del, форвард другому бакету- zeptoctl. move in = новая группа. тоже приоритет пустых. потом будет перекос по get-ам. есть масштабирование. средний du. не2 сек), стопв общем, а нагрузка?+ 18Т диски, 12Т вложения, 6Т письма, 20плюс-40 иопс на дискминус как у голого HDD. вложения отдельно, не зепто. 60 дисков на сата-полке. сата?- zstd. 15т -> 30т -> 15тЧто ещё хотят поулучшать: добавить автоматики (её нет в том числе из- серверов 3к за боязни админов -> 1.5к. индексы в 250- облако 80 пбмало ли автоматика сойдёт с ума), х1.5. сниппеты поиска 2.4п.что- гибридная схема тоже хотят.то придумать с лишними iops- удаления накур. лишнее ио.- ручной move inами при удалении, fixпопробовать сделать гибридную схему хранения (x3 &rarr; x2 &rarr; x1. боязнь админов, ага5).+ как смигрировать 50пб в 32+ синк по смещениям?+ Вадим ты чота завернул блеа. 6 дисков 15 пар+ запись под локом. статус сервис лочит. епт. 72д по 6т.+ цеф им нинужен. как удаления из ец хз лол, он не ответил+ большие файлы чанкуются по 64 мб.+ zeptoId какой-то еще последней записи. емое... в которой все. ааа. понятно. она с чанками</pre>
В общем, ждём ебилдов (c).

Навигация