连接全球数据库网络

全球数据库网络(Global Database Network,简称GDN)是由分布于多个地域的多个PolarDB集群构成的网络。在本文介绍如何查看GDN的集群地址并连接GDN。

读写分离与请求路由

GDN中的集群(主集群和从集群)读写请求路由,是由每个集群的数据库代理配置所决定。您的应用程序无需修改代码,只需连接到相应集群的地址,读写请求便会按以下逻辑自行路由:

  • 写请求(如INSERTUPDATEDELETE等)、其他广播语法(如SET语句)和事务中的所有请求,会被自动转发到主集群的主节点处理。

  • 读请求默认会路由到本地从集群的只读节点,实现就近访问。如果开启了会话一致性,部分读请求也可能被路由到主集群的主节点以保证数据一致性。

此外,GDN还提供了一个统一的连接地址,这不仅能够实现就近访问,还能在主集群切换后保持域名不变。

单击展开查看详细转发逻辑

目标节点

转发的请求

只发往主集群的主节点

  • 所有DML操作(INSERTUPDATEDELETESELECT FOR UPDATE等)。

  • 所有DDL操作(建表或库、删表或库、变更表结构、权限等)。

  • 所有事务中的请求。

  • 用户自定义函数。

  • 存储过程。

  • EXECUTE语句。

  • Multi Statements

  • 使用到临时表的请求。

  • SELECT last_insert_id()

  • 所有对用户变量的查询和更改。

  • SHOW PROCESSLIST

  • KILL(SQL语句中的KILL,非命令KILL)。

发往只读节点或主节点

说明

仅当数据库代理配置中主库是否接受读时会发往主节点。

  • 非事务中的读请求。

  • COM_STMT_EXECUTE命令。

总是发往所有节点

  • 所有系统变量的更改。

  • USE命令。

  • COM_STMT_PREPARE命令。

  • COM_CHANGE_USERCOM_QUITCOM_SET_OPTION等命令。

说明

从集群中的主节点主要用于异步复制主集群数据,不处理任何读写请求。因此,表中的主节点指的是主集群中的主节点,而只读节点则指的是从集群中的只读节点。

说明
  • 读写模式可读可写(自动读写分离)模式的集群地址或自定义地址支持GDN的读写分离服务。

  • 主地址读写模式只读模式的自定义地址不支持GDN的读写分离服务。

  • 为降低主从集群间的复制延迟对业务可能带来的影响,建议您在从集群上设置自定义集群地址时,将主库是否接受读设置为,并设置一致性级别最终一致性(弱)

  • 若您的业务场景无法接受从集群出现延迟,建议直接连接主集群的集群地址进行访问。

查看集群地址

  1. 登录PolarDB控制台,单击左侧导航栏中的全球数据库网络(GDN)

  2. 全球数据库网络(GDN)页面,找到目标GDN,单击全球数据库网络ID进入GDN详情页。

  3. 集群列表区域内,找到目标从集群,单击集群地址栏的查看,即可在弹出的对话框中查看集群地址详情。image

    说明
    • 仅支持查看默认集群的连接地址信息,包括私网公网地址。

    • 如需获取更多连接地址的详细信息,请单击查看或管理更多地址,系统将跳转至目标集群的详情页面,您可以在数据库连接区域中查看更多连接地址。

连接全球数据库集群

各个地域的应用可直接连接就近的集群地址,从而连接到GDN,GDN会自动进行读写分离。连接数据库集群的方法有很多种,您可以根据实际业务需求来选择适合的连接方式。以下列举了部分连接数据库集群的示例:

使用DMS连接集群

DMS是阿里云提供的图形化的数据管理工具,它是一种集数据管理、结构管理、用户授权、安全审计、数据趋势、数据追踪、BI图表、性能与优化和服务器管理于一体的数据管理服务。您无需借助其他工具,即可直接在DMS上管理您的PolarDB集群。

  1. 前往PolarDB控制台,在集群列表中单击目标集群ID进入集群详情页。在页面右上角单击登录数据库image

  2. 在弹出的对话框中,输入PolarDB MySQL集群中创建的数据库账号数据库密码,单击登录image

  3. 登录后,您可以在左侧导航栏的已登录实例中查看到所登录的PolarDB MySQL集群,并进行相应的管理操作。image

使用客户端连接集群

您可以使用任何通用的客户端连接PolarDB集群。此处以MySQL Workbench 8.0.29版本为例,其它客户端的操作类似。

  1. 安装MySQL Workbench。官方下载地址请参见MySQL Workbench下载页面

  2. 打开MySQL Workbench,选择Database > Connect to Database

  3. 输入连接信息,单击OK

    连接界面

    参数

    说明

    示例

    Hostname

    数据库连接地址

    pc-2***.rwlb.rds.aliyuncs.com

    Port

    数据库连接地址的端口号,与数据库连接地址相对应。

    说明

    默认端口为3306。

    3306

    Username

    数据库账号

    polardb_mysql_user

    Password

    数据库账号密码。

    Pass***233

使用命令行连接集群

如果您的服务器安装了MySQL客户端,可以通过命令行连接PolarDB MySQL数据库集群。

语法

mysql -h<连接地址> -P<端口> -u<数据库用户名> -p<数据库用户密码>

示例

mysql -h pc-2***.rwlb.rds.aliyuncs.com -P3306 -upolardb_mysql_user -pPass***233

参数

说明

示例

-h

数据库连接地址

pc-2***.rwlb.rds.aliyuncs.com

-P

数据库连接地址的端口号,与数据库连接地址相对应。

说明
  • 默认端口为3306。

  • 如果端口号为默认端口,该参数可以不填写。

3306

-u

数据库账号

polardb_mysql_user

-p

数据库账号密码。

说明

该参数为必填参数。

  • 如果不填写该参数,在Enter password后会重新要求输入密码。

  • 如果填写该参数,-p与数据库密码之间不能有空格。

Pass***233

使用应用程序连接集群

连接PolarDB MySQL集群的方式与连接其他MySQL数据库的方式一样,仅需将数据库连接地址、端口、账号及密码等进行替换即可。以下为您列举部分开发语言如何通过应用程序访问PolarDB数据库:

Java

此处以Maven项目为例,使用MySQL JDBC驱动连接PolarDB MySQL集群。

  1. 首先,您需要在pom.xml文件中添加MySQL JDBC驱动的依赖,代码示例:

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.27</version>
    </dependency>
  2. 连接集群。请将参数<HOST>、端口号、<USER><PASSWORD><DATABASE><YOUR_TABLE_NAME><YOUR_TABLE_COLUMN_NAME>进行替换。

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.Statement;
    
    public class DatabaseConnection {
       public DatabaseConnection() {
       }
    
       public static void main(String[] args) {
          // PolarDB集群连接地址、端口、需要连接的数据库名
          String url = "jdbc:mysql://<HOST>:3306/<DATABASE>?useSSL=false&serverTimezone=UTC";
          // 数据库账号
          String user = "<USER>";
          // 数据库账号的密码
          String password = "<PASSWORD>";
    
          try {
             Class.forName("com.mysql.cj.jdbc.Driver");
             Connection conn = DriverManager.getConnection(url, user, password);
             Statement stmt = conn.createStatement();
             // 需要检索的数据表名
             ResultSet rs = stmt.executeQuery("SELECT * FROM `<YOUR_TABLE_NAME>`");
    
             while(rs.next()) {
                // 需要检索的数据表的列名
                System.out.println(rs.getString("<YOUR_TABLE_COLUMN_NAME>"));
             }
    
             rs.close();
             stmt.close();
             conn.close();
          } catch (Exception var7) {
             var7.printStackTrace();
          }
    
       }
    }

Python

此处以Python3为例,使用PyMySQL库连接PolarDB MySQL集群。

  1. 首先,您需要安装PyMySQL库。如果您还没有安装,可以通过以下命令进行安装:

    pip3 install PyMySQL
  2. 连接集群。请将参数<HOST>、端口号、<USER><PASSWORD><DATABASE><YOUR_TABLE_NAME>进行替换。

    import pymysql
    
    # 数据库连接参数
    host = '<HOST>'  # PolarDB集群连接地址
    port = 3306  # 默认端口3306
    user = '<USER>'  # 数据库账号
    password = '<PASSWORD>'  # 数据库账号的密码
    database = '<DATABASE>'  # 需要连接的数据库名
    
    try:
        # 创建数据库连接
        connection = pymysql.connect(
            host=host,
            port=port,
            user=user,
            passwd=password,
            db=database
        )
    
        # 获取操作游标
        with connection.cursor() as cursor:
            # 执行 SQL 查询
            sql = "SELECT * FROM `<YOUR_TABLE_NAME>`"  # 需要检索的数据表名
            cursor.execute(sql)
    
            # 获取查询结果
            results = cursor.fetchall()
            for row in results:
                print(row)
    
    finally:
        # 关闭数据库连接
        if 'connection' in locals() and connection.open:
            connection.close()
    

Go

此处以go1.23.0为例,使用database/sql包和go-sql-driver/mysql驱动来连接PolarDB MySQL集群。

  1. 首先,您需要安装go-sql-driver/mysql驱动。您可以通过以下命令进行安装:

    go get -u github.com/go-sql-driver/mysql
  2. 连接集群。请将参数<HOST>、端口号、<USER><PASSWORD><DATABASE><YOUR_TABLE_NAME>进行替换。

    package main
    
    import (
        "database/sql"
        "fmt"
        "log"
        _ "github.com/go-sql-driver/mysql"
    )
    
    func main() {
        // 数据库连接参数
        dbHost := "<HOST>"       // PolarDB集群连接地址
        dbPort := "3306"         // 默认端口3306
        dbUser := "<USER>"       // 数据库账号
        dbPass := "<PASSWORD>"   // 数据库账号的密码
        dbName := "<DATABASE>"   // 需要连接的数据库名
    
        // 构建 DSN (Data Source Name)
        dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", dbUser, dbPass, dbHost, dbPort, dbName)
    
        // 打开数据库连接
        db, err := sql.Open("mysql", dsn)
        if err != nil {
            log.Fatalf("Failed to connect to database: %v", err)
        }
        defer db.Close()
    
        // 测试连接
        err = db.Ping()
        if err != nil {
            log.Fatalf("Failed to ping database: %v", err)
        }
    
        // 创建一个操作游标
        var result string
        err = db.QueryRow("SELECT VERSION()").Scan(&result)
        if err != nil {
            log.Fatalf("Failed to execute query: %v", err)
        }
    
        // 输出数据库版本
        fmt.Printf("Connected to database, version: %s\n", result)
    
        // 执行 SQL 查询
        rows, err := db.Query("SELECT * FROM `<YOUR_TABLE_NAME>`") // 需要检索的数据表名
        if err != nil {
            log.Fatalf("Failed to execute query: %v", err)
        }
        defer rows.Close()
    }

相关文档

  • 全球数据库网络(GDN):了解全球数据库网络(GDN)及其产品架构和应用场景。

  • 创建全局域名:如何创建一个统一的连接地址,不仅能够实现就近访问,还能在主集群切换后保持域名不变。

相关API

API

描述

DescribeDBClusterEndpoints

查询PolarDB集群的连接地址信息。

ModifyDBClusterEndpoint

修改PolarDB集群地址属性,包括读写模式、新节点是否自动加入本地址、一致性级别、事务拆分、主库是否接受读、连接池等。