• Русский
  • Как получить доступ к экземплярам MySQL-MGR

    Существует несколько способов подключения к экземпляру MySQL-MGR при обращении к нему из бизнес-приложения. В этом разделе описывается, как выбрать адрес подключения для доступа к экземпляру MySQL-MGR, а также приведены примеры для демонстрации.

    Применимые сценарии

    Метод доступаПрименимые сценарии
    Доступ внутри кластераВ режиме с одним мастером или несколькими мастерами приложения внутри кластера обращаются к экземпляру MGR через порт, открытый SVC.
    Доступ извне кластераВ режиме с одним мастером или несколькими мастерами приложения вне кластера обращаются к экземпляру MGR через порт NodePort.

    Распространённые клиентские программы

    В примерах показано использование клиентов JDBC и GORM. Для других клиентов обращайтесь к документации соответствующего фреймворка.

    При использовании кода измените соответствующие переменные на ваши реальные значения. Описание переменных приведено ниже:

    ПеременнаяОписание
    hostIP-адрес или имя SVC хоста для соответствующего метода доступа
    portНомер порта для соответствующего метода доступа
    userИмя пользователя MySQL-MGR
    passwordФактический пароль пользователя MySQL-MGR
    databaseИмя базы данных, к которой осуществляется доступ

    JDBC

    1. Внутренний доступ в кластере

      import java.sql.*;
      public class Main {
          static final String DB_URL = "jdbc:mysql://mgr-0:3306,mgr-1:3306,mgr-2:3306/mysql";
          static final String USER = "root";
          static final String PASS = "123456";
          public static void main(String[] args) {
              try {
                  Connection conn = DriverManager.getConnection(DB_URL,USER,PASS);
                  Statement statement = conn.createStatement();
              }catch(SQLException se){
                  se.printStackTrace();
              }
          }
      }
    2. Внешний доступ к кластеру — через NodePort

      import java.sql.*;
      public class Main {
          static final String DB_URL = "jdbc:mysql://192.168.1.100:32630,192.168.1.101:32630,192.168.1.102:32630/mysql";
          static final String USER = "root";
          static final String PASS = "123456";
          public static void main(String[] args) {
              try {
                  Connection conn = DriverManager.getConnection(DB_URL,USER,PASS);
                  Statement statement = conn.createStatement();
              }catch(SQLException e){
                  e.printStackTrace();
              }
          }
      }

    GORM

    1. Внутренний доступ в кластере

      import (
          "gorm.io/driver/mysql"
          "gorm.io/gorm"
          "gorm.io/plugin/dbresolver"
      )
      
      func main() {
          writeDSN:="root:123456@tcp(mgr-read-write:32631)/mysql"
          readDSN := "root:123456@tcp(mgr-read-only:32630)/mysql"
          db, err := gorm.Open(mysql.Open(writeDSN), &gorm.Config{})
          if err != nil {
              panic(err)
          }
          err = db.Use(dbresolver.Register(dbresolver.Config{
              Replicas:          []gorm.Dialector{mysql.Open(readDSN)},
              Policy:            dbresolver.RandomPolicy{},
              TraceResolverMode: true,
          }))
          if err != nil {
              panic(err)
          }
      }
    2. Внешний доступ к кластеру — через NodePort

      package main
      
      import (
          "gorm.io/driver/mysql"
          "gorm.io/gorm"
          "gorm.io/plugin/dbresolver"
      )
      
      func main() {
          writeDSNs := []string{
              "root:123456@tcp(192.168.18.130:32631)/mysql",
              "root:123456@tcp(192.168.18.131:32631)/mysql",
              "root:123456@tcp(192.168.18.132:32631)/mysql",
          }
          readDSNs := []string{
              "root:123456@tcp(192.168.18.131:32630)/mysql",
              "root:123456@tcp(192.168.18.132:32630)/mysql",
              "root:123456@tcp(192.168.18.133:32630)/mysql",
          }
          db, err := gorm.Open(mysql.Open(writeDSNs[0]), &gorm.Config{})
          if err != nil {
              panic(err)
          }
          sources := make([]gorm.Dialector, 0)
          replicas := make([]gorm.Dialector, 0)
          for _, dsn := range writeDSNs {
              sources = append(sources, mysql.Open(dsn))
          }
          for _, dsn := range readDSNs {
              replicas = append(replicas, mysql.Open(dsn))
          }
          err = db.Use(dbresolver.Register(dbresolver.Config{
              Sources:           sources,
              Replicas:          replicas,
              Policy:            dbresolver.RandomPolicy{},
              TraceResolverMode: true,
          }))
          if err != nil {
              panic(err)
          }
      }