Я этого не делал, но вот идея.В вашей базе данных записи может быть сервер memcache, к которому вы подключаетесь перед каждым запросом на чтение.Когда вы делаете запись, добавляете какой-нибудь ключ в свою кэш-память, а когда вы реплицируете 1 , удаляйте ключ.
Когда вы выполняете чтение кэш-памяти, и вы читаетеодиночная запись, если ключ записи найден, вы должны читать ее только с мастера.Если вы выбираете несколько записей, прочитайте их из ведомого устройства, а затем запросите каждый найденный идентификатор по ключам memcache.Если что-либо найдено в memcache, перечитайте только те записи из базы данных master.
Вы можете обнаружить, что есть некоторые (интенсивно для записи) случаи использования, когда эта стратегия сводит на нет преимущества наличия чтения / записиТрещина.Но я бы поспорил, что в большинстве случаев дополнительная проверка memcache и случайные повторные чтения мастера все равно будут делать это.
1 Если вы используете стандартную репликацию и не можете отследить,конкретная запись полностью реплицирована, просто отметьте время всех ваших ключей и удалите / истекайте их после задержки в худшем случае.Например, если ваши рабы отстают от вашего хозяина на две минуты, игнорируйте (и удалите) все ключи, которые старше двух минут, поскольку они обязательно будут реплицированы.
Все это говорит: не забывайте тамЕсть много случаев, когда лаг приемлем.Например, если у вас есть веб-сайт, на котором пользователи обновляют свои профили, если их изменения не распространяются полностью в течение пяти минут, в большинстве случаев это нормально.Ключ, я думаю, не в том, чтобы что-то чрезмерно спроектировать, чтобы получить мгновенное распространение, если в этом нет необходимости.