/
askuchukov
/
testDBCluster
Обзор
Документация
Войти
/
askuchukov
/
testDBCluster
Код
Запросы
0
Задачи
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
database/database.go
61 строка
2 KB
01573998
init project
01 сен 2024, 20:39
01 сен 2024, 20:39
72f3ba4
Код
Авторство
О чём код?
package database import ( "context" "fmt" "sync" "github.com/jackc/pgx/v4/pgxpool" ) var ( mu sync.Mutex masterPool *pgxpool.Pool replicaPool *pgxpool.Pool ) func Connect(masterConnStr, replicaConnStr string) (*pgxpool.Pool, *pgxpool.Pool, error) { var err error masterPool, err = pgxpool.Connect(context.Background(), masterConnStr) if err != nil { return nil, nil, fmt.Errorf("failed to connect to master: %w", err) } replicaPool, err = pgxpool.Connect(context.Background(), replicaConnStr) if err != nil { return nil, nil, fmt.Errorf("failed to connect to replica: %w", err) } return masterPool, replicaPool, nil } // checkIfMaster определяет, является ли данное подключение подключением к мастер-ноде. func checkIfMaster(pool *pgxpool.Pool) (bool, error) { var isMaster bool err := pool.QueryRow(context.Background(), "SELECT NOT pg_is_in_recovery()").Scan(&isMaster) if err != nil { return false, err } return isMaster, nil } // performWriteOperation выполняет операцию записи, проверяя, является ли текущая мастер-нода всё ещё мастером. func PerformWriteOperation(writeFunc func(pool *pgxpool.Pool) error, masterPool *pgxpool.Pool, replicaPool *pgxpool.Pool) error { mu.Lock() defer mu.Unlock() isMaster, err := checkIfMaster(masterPool) if err != nil { return err } if !isMaster { // Переключаемся на новую мастер-ноду (которая сейчас является репликой) fmt.Println("Старый мастер стал репликой. Переключаемся на новую мастер-ноду.") masterPool, replicaPool = replicaPool, masterPool _ = replicaPool } return writeFunc(masterPool) }