Как масштабировать базу данных при равномерном чтении

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

Ответ

Для равномерного чтения в Golang эффективно использовать репликацию и шардирование:

  1. Репликация (Master-Slave):
// Подключение к мастеру для записи
masterDB, _ := sql.Open("mysql", "user:pass@tcp(master:3306)/db")

// Подключение к репликам для чтения
replicaDB, _ := sql.Open("mysql", "user:pass@tcp(replica1:3306)/db")
  1. Шардирование (горизонтальное):
// Выбор шарда по ключу (например, user_id)
func getShard(userID int64) *sql.DB {
    shardNum := userID % 3
    return shards[shardNum]
}

Дополнительные методы:

  • Кэширование (Redis/Memcached)
  • Чтение из реплик с балансировкой нагрузки
  • Materialized Views для частых запросов

Важно: при шардировании избегайте JOIN между шардами, проектируйте схему так, чтобы связанные данные находились в одном шарде.