Так что это очень концептуальный вопрос (как бы мне не хотелось создавать миллиардное пользовательское приложение, я не думаю, что это произойдет).
Я прочитал статью в Pinterestо том, как они масштабировали свой парк MySQL несколько раз (https://medium.com/@Pinterest_Engineering/sharding-pinterest-how-we-scaled-our-mysql-fleet-3f341e96ca6f), и я до сих пор не понимаю, как они «открывают новые осколки», не затрагивая существующих пользователей.
В статье говорится, чтокаждый стол на каждом осколке, включая стол User
.Поэтому я предполагаю, что когда пользователь регистрируется и ему назначается случайный шард, это должно быть сделано с помощью функции, которая всегда будет возвращать один и тот же результат независимо от количества шардов.
например, если я подпишувместе с test@example.com они могли бы использовать это электронное письмо для определения идентификатора шарда, и это должно было бы учитывать количество «открытых» шардов в настоящее время.Мое первоначальное предположение состояло в том, что они будут использовать что-то вроде модового шарда, который они упоминали позже в статье, например,
md5($email) % number_of_shards
Но когда они откроют количество шардов, это изменит результат функции.
Тогда я подумал, что, возможно, у них есть отдельная БД для хранения чисто пользовательской информации для целей аутентификации, и это также будет содержать столбец с назначенным shard_id
, но, как я уже сказал, статья подразумевает, что даже таблица пользователей находится в каждом шарде.
Есть ли у кого-нибудь еще идеи или идеи о том, как что-то подобное может работать?