通过SLB和客户端连接池优化StarRocks访问性能

本文旨在为您介绍如何通过阿里云负载均衡(SLB)对 StarRocksFrontend(FE)节点进行流量分发,同时结合客户端连接池配置,实现高并发、高可用、高性能的数据库访问。

前提条件

  • FE配置:FE节点数量 ≥ 3。

  • 网络访问权限:客户端地址需位于内网安全组或公网域名白名单中。

操作流程

步骤一:开启SLB访问

EMR Serverless StarRocks默认使用PrivateZone方式访问FE节点,这种方式不支持负载均衡,可能导致多个FE节点之间的连接数不均,从而引发负载不均衡问题。为了解决这一问题,建议开启SLB访问,以实现FE节点的负载均衡。此外,结合客户端连接池的优化配置,可以进一步提升访问效率和稳定性。

  1. 进入EMR Serverless StarRocks实例详情页面。

    1. 登录E-MapReduce控制台

    2. 在左侧导航栏,选择EMR Serverless > StarRocks

    3. 在顶部菜单栏处,根据实际情况选择地域。

    4. 单击目标实例的名称。

  2. 在网关信息区域,单击开通SLB

  3. 单击确定

步骤二:配置客户端连接池

使用连接池的好处如下:

  • 连接复用:减少频繁创建和销毁连接的开销,降低系统资源消耗。

  • 生命周期管理:统一管理连接的生命周期,防止连接泄漏。

  • 并发控制:支持连接队列机制,在高峰期优雅处理大量并发请求。

  • 有效性检测:自动检测无效连接,确保每次查询都能获得有效的连接。

  • 监控与调优:提供详细的监控指标(如FE连接数),便于实时监控连接池状态。

SDK方式(以Java + HikariCP为例)

  • Maven依赖

    在项目的pom.xml文件中添加以下依赖。

    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP</artifactId>
        <version>5.0.1</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.33</version>
    </dependency>
  • HikariCP连接池配置

    import com.zaxxer.hikari.HikariConfig;
    import com.zaxxer.hikari.HikariDataSource;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    
    public class StarRocksConnectionPoolExample {
        public static void main(String[] args) {
            // 配置 HikariCP 连接池
            HikariConfig config = new HikariConfig();
            // 内网域名
            config.setJdbcUrl("jdbc:mysql://fe-c-xxx-internal.starrocks.aliyuncs.com:9030/<yourDatabase>"); 
            config.setUsername("<yourUsername>");
            config.setPassword("<yourPassword>");
    
            // 核心参数配置
            config.setMaximumPoolSize(20);                   // 设置最大连接数为20
            config.setMinimumIdle(5);                        // 设置最小空闲连接数为5
            config.setConnectionTimeout(30000);              // 设置连接超时时间为30秒(30000毫秒)
            config.setIdleTimeout(600000);                   // 设置空闲连接超时时间为10分钟(600000毫秒)
            config.setMaxLifetime(1800000);                  // 设置连接的最大存活时间为30分钟(1800000毫秒)
            config.setConnectionTestQuery("SELECT 1");       // 健康检测 SQL
            config.setValidationTimeout(5000);               // 验证超时
            config.setLeakDetectionThreshold(60000);         // 连接泄漏检测(1分钟)
    
            // 创建数据源
            HikariDataSource dataSource = new HikariDataSource(config);
    
            // 使用连接池执行查询
            try (Connection conn = dataSource.getConnection();
                 PreparedStatement stmt = conn.prepareStatement("SELECT count(*) FROM your_table");
                 ResultSet rs = stmt.executeQuery()) {
    
                if (rs.next()) {
                    System.out.println("Count: " + rs.getLong(1));
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

BI工具配置

常用的BI工具(如Tableau、Superset、Metabase、Quick BI等)支持在高级选项中设置连接池参数。

步骤三:验证负载均衡效果

进入目标StarRocks实例的监控告警实例页签,查看FE Net中的FE连接数监控图。

确认多个FE节点之间的连接数分布是否均衡。如果发现连接数不均,可以调整客户端连接池参数或检查SLB配置。

image

步骤四:调优负载均衡

您可以根据实际业务需求,动态调整以下参数以优化性能。

参数

推荐值

说明

maximumPoolSize

10~50

设置连接池中允许的最大连接数,控制并发连接的上限。

根据应用的并发量调整,建议初始值为20。过高的值可能导致资源浪费。

minimumIdle

5~10

设置连接池中保持的最小空闲连接数,避免冷启动时频繁创建新连接。

connectionTimeout

30s

设置从连接池获取连接的最大等待时间,超过此时间将抛出异常。

idleTimeout

600s(10 分钟)

设置空闲连接在连接池中的存活时间,超过此时间后将被回收。

maxLifetime

1800s(30 分钟)

设置单个连接的最大存活时间,超过此时间后连接将被强制关闭并重新创建。

connectionTestQuery

SELECT 1

设置用于检测连接有效性的SQL查询语句,确保连接池中的连接始终可用。

StarRocks支持该语句,用于验证连接是否正常。

通过阿里云负载均衡(SLB)和客户端连接池的结合使用,可以有效解决StarRocksFE节点的负载均衡问题,同时提升系统的稳定性和性能。建议您根据实际业务需求,合理配置连接池参数,并定期监控系统状态以确保最佳性能表现。