13 651
правка
Изменения
Нет описания правки
Итак. Сначала почта у них хранилась, видимо, в Maildir-ах, ну или в своём аналоге, то есть ящик - это была папочка на диске, в которой отдельными файлами хранились все письма, плюс индексы. В среднем примерно 3 ТБ вложений на 1 ТБ писем. Горизонтально это масштабировалось норм, а вертикально не норм - предел - 4 ТБ HDD, больше юзать не получалось, т.к. iops-ы HDD с объёмом не растут (100-200 iops). ФС - очевидный оверхед: директории, иноды...
Так и масштабировались на 4 ТБ дисках, в итоге домасштабировались до 3000 серверов и стало дорого и неудобно. Захотелось снизить это число раз в 10. Для начала дизагрегировали из писем вложения, по этому поводу был отдельный доклад: [https://www.youtube.com/watch?v=O247Hq3ego4 Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)] с хайлоада 2016.
Соотношения объёмов данных и нагрузки: мета — 2 ПБ и 3 млн rps, тексты писем — 15 ПБ и 80 тысяч rps, вложения — <s>50</s> 35 ПБ и 8 тысяч rps. В итоге в этом докладе речь идёт только о хранилище текстов, хранимых просто в виде блобов.
Хранилище назвали '''Zepto'''.
Вышло в общем-то очередное [https://www.usenix.org/event/osdi10/tech/full_papers/Beaver.pdf Haystack]/[https://github.com/chrislusf/seaweedfs SeaweedFS]/MDS-подобное хранилище. Примечание: MDS — объектный стородж Яндекса, про который шла речь в докладе Вадима выше и, например, в [https://habr.com/ru/company/yandex/blog/311806/ статьях на хабре], немного дурацкое название, так как в Ceph, Virtuozzo, LizardFS и других MDS называется Metadata Server, а у нас это весь сторадж.
Общие черты:
* Append-only volume-ы. То есть, объекты хранятся в дописываемых всегда в конец больших файлах вперемешку с заголовками.
** Маленькое отличие: в zepto объекты нарезаются на странички по 4 КБ и от каждой странички считается контрольная сумма crc32.
** Чуть более интересное отличие - это реализация удалений в zepto - это запись могилки (флага удаления) в конец.
* Есть "шарды", являющие собой группы из N (2, 3 или ещё скольки-то) таких томов на разных машинах, связанных репликацией вместе. То есть, запись идёт в пары или тройки томов.
** В zepto, как я понял, и сам том, и группа связанных репликацией томов называются "бакет" (bucket). Каждый бакет на каждой машине обслуживается отдельным процессом "bucketservice", слушающем на отдельном порту. В терминологии Ceph - аналог OSD.
** Размер одного бакета - 2 ТБ. Таким образом, на одной машине живёт примерно до 60*18/2 = 540 bucketservice-ов (60 дисков по 18 ТБ в одной полке).
- Клиент хранит ID шарда (бакета) у себя и для чтения объекта обращается к конкретному бакету.
- Есть "прокси", предоставляющие API доступа к хранилищу. У них они называются zeptoproxy и ставятся прямо на клиентские машины.
- Есть отдельный слой управления кластером и он же отвечает за балансировку записи. У mail.ru он называется statusservice.
<pre>