Что будет, если попытаться прочитать из Slave информацию, которая успела записаться только в Master

«Что будет, если попытаться прочитать из Slave информацию, которая успела записаться только в Master» — вопрос из категории Базы данных, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

При использовании Master-Slave репликации в БД, если данные записаны в Master, но ещё не реплицированы в Slave, чтение из Slave вернёт устаревшие данные. Это называется "чтение с задержкой" (read-after-write inconsistency).

Пример с MySQL и Golang:

// Запись в Master
_, err := masterDB.Exec("INSERT INTO users (name) VALUES (?)", "Alice")
if err != nil {
    log.Fatal(err)
}

// Чтение из Slave (может не видеть новую запись)
var name string
err = slaveDB.QueryRow("SELECT name FROM users WHERE id = LAST_INSERT_ID()").Scan(&name)
if err != nil {
    log.Println("User not found in Slave yet:", err)
}

Как избежать:

  1. Читать критичные данные только из Master.
  2. Использовать синхронную репликацию (но это снижает производительность).
  3. Проверять задержку репликации и ждать, если она критична.