MySQL · MySQL 8.4
В конце 2011 года Dropbox разбил базу MySQL на 1600 шардов, хотя серверов было всего 8 — по 200 шардов на каждом. Пользователей прибавлялось около 100 миллионов в год, и позже та же база жила уже на 400 мастер-серверах по 4 шарда. Сверху в 2012 году построили Edgestore — хранилище, которое прячет MySQL от клиентского кода.
Шард — отдельная база MySQL, номер шарда считается из ключа один раз и навсегда: shard = hash(user_id) % 1600. Отдельная таблица маршрутизации хранит, на каком сервере живёт каждый шард.
В работе: Планирование шардирования с запасом на рост: SaaS, хранилища файлов, платёжные системы.
Источник: кейс Dropbox: доклад о MySQL на HighLoad++, расшифровка 2018. Условие пересказано своими словами.
Что даёт схема «много логических шардов на немногих серверах»?
- Рост — это перенос целых шардов на новые серверы: строки не пересчитываются и не перераспределяются
- Много мелких шардов на одном сервере быстрее обрабатывают запросы
- Можно делать JOIN между шардами одного сервера
- То же самое даёт shard = hash(user_id) % 8 с добавлением серверов по мере роста