Шардинг MySQL на Голанге - PullRequest
       36

Шардинг MySQL на Голанге

0 голосов
/ 13 января 2019

Я хочу масштабировать свою базу данных 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-запроса?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...