Как Обработать Возможные Проблемы согласованности в Разделении Чтения / Записи MySQL
Я искал решения для масштабирования MySQL. За исключением добавления слоя Memcached часто выходит разделение на чтение / запись - все записи идут на мастер, а все чтения - на набор ведомых с балансировкой нагрузки.
Единственная проблема, которая явно возникает при таком подходе, - это "возможная последовательность". Когда я запускаю запись на ведущем устройстве, репликация на считанные ведомые устройства занимает определенное время. Таким образом, если я сделаю запрос на вновь созданную строку, он может не быть там.
Кто-нибудь знает конкретные стратегии для решения этой проблемы? Я читал о концептуальном частичном решении способности "читать, что ты пишешь". Но есть ли у кого-нибудь идеи, как реализовать такое решение - будь то концептуально или конкретно в стеке Spring/Hibernate?
1 ответ
Я этого не делал, но вот идея. В вашей базе данных записи может быть сервер memcache, к которому вы подключаетесь перед каждым запросом на чтение. Когда вы делаете запись, добавляете какой-нибудь ключ в свою memcache, а когда вы копируете1, удаляете ключ.
Когда вы читаете memcache и читаете одну запись, если ключ записи найден, вы должны читать ее только из мастера. Если вы выбираете несколько записей, прочитайте их из ведомого устройства, а затем запросите каждый найденный идентификатор по ключам memcache. Если что-либо найдено в memcache, перечитайте только те записи из основной базы данных.
Вы можете обнаружить, что есть некоторые (тяжелые для записи) случаи использования, когда эта стратегия сводит на нет преимущества разделения чтения / записи. Но я бы поспорил, что в большинстве случаев дополнительная проверка memcache и случайные перечитывания мастера все равно будут полезны.
1 Если вы используете стандартную репликацию и не можете отследить, полностью ли реплицирована конкретная запись, просто отметьте время всеми вашими ключами и удалите / истекайте их после задержки в худшем случае. Например, если ваши подчиненные отстают от вашего мастера на две минуты, игнорируйте (и удаляйте) все ключи старше двух минут, так как они обязательно будут реплицированы.
Это все сказало: не забывайте, что есть много случаев, когда задержка допустима. Например, если у вас есть веб-сайт, на котором пользователи обновляют свои профили, если их изменения распространяются не полностью в течение пяти минут, в большинстве случаев это нормально. Ключевым моментом, имхо, не является чрезмерная разработка чего-либо для мгновенного распространения, если в этом нет необходимости.