Я хочу масштабировать свою базу данных MySQL на несколько серверов с использованием горизонтального шардинга. Давайте представим, что у меня есть 5 серверов баз данных (не реплик), и я хочу распределить данные из таблицы пользователей между 5 серверами баз данных:
Shard 1 (192.168.1.1)
Shard 2 (192.168.1.2)
Shard 3 (192.168.1.3)
Shard 4 (192.168.1.4)
Shard 5 (192.168.1.5)
Теперь я хочу подключиться к одному из них в зависимости от user_id (server_id = user_id% 5). Я буду делать это при каждом запросе API от пользователей в моем приложении Go.
Я использую go-sql-driver и стандартный пакет database / sql.
import "database/sql"
import _ "github.com/go-sql-driver/mysql"
shard1, _ := sql.Open("mysql", "user:password@tcp(192.168.1.1:3306)/dbname")
shard2, _ := sql.Open("mysql", "user:password@tcp(192.168.1.2:3306)/dbname")
shard3, _ := sql.Open("mysql", "user:password@tcp(192.168.1.3:3306)/dbname")
...
В пакете database / sql есть базовый пул подключений, но он не имеет большого контроля над ним. Есть также несколько методов: SetMaxIdleConns, SetMaxOpenConns, SetConnMaxLifetime, но похоже, что они работают только с одним сервером базы данных одновременно.
Вопрос в том, как правильно обрабатывать и объединять соединения с базой данных в моем приложении Golang? Как работать с несколькими серверами баз данных в Голанге?
Должен ли я создать одноэлементный объект с картой соединений со значениями * DB, сохранить все соединения и использовать их во всем приложении? Например:
connections := make(map[string]interface{})
connections["shard1"] = shard1
connections["shard2"] = shard2
...
Как закрыть соединения или не закрывать их после выполнения SQL-запроса?