Apache ShardingSphere 5.1.0 执行引擎性能优化

端正强,SphereEx 高级中间件开发工程师,Apache ShardingSphere Committer。

2018 年开始接触 Apache ShardingSphere 中间件,曾主导公司内部海量数据的分库分表,有着丰富的实践经验;热爱开源,乐于分享,目前专注于 Apache ShardingSphere 内核模块开发。

前言

在 Apache ShardingSphere 5.1.0 前几篇技术解读文章中,我们了解了解析引擎提供的 SQL 格式化功能,以及最新优化的高可用功能。除了不断为用户提供实用的新特性外,Apache ShardingSphere 社区一直在努力提升性能。

以单库 10 分片的 t_order 表为例,max-connections-size-per-query使用默认配置 1,如果用户执行 SELECT * FROM t_order 语句则会导致全路由。由于每个查询只允许在同一个数据库上创建一个数据库连接,因此底层真实执行的 SQL 结果会被提前加载至内存进行处理,该场景限制了数据库连接资源的消耗,但是会占用更多的内存资源。如果用户将 max-connections-size-per-query调整为 10,则可以在执行真实 SQL 时,同时创建 10 个数据库连接,由于数据库连接能够持有结果集,因此该场景不会额外占用内存资源,但是很显然会消耗更多的数据库连接资源。

为了更好地解决数据库连接资源和内存资源占用的问题,在刚刚发布的 5.1.0 版本中,我们对 SQL 执行引擎的性能进行了优化,通过 SQL 改写引擎进行优化性改写,将同一个数据源上的多条真实 SQL,使用 UNION ALL 语句进行合并,从而有效降低了执行引擎对数据库连接资源的消耗,同时减少了内存归并的发生,大幅度提升了 OLTP 场景下 SQL 查询性能。下面我们将结合具体的 SQL 实例,为大家详细解读执行引擎性能优化的细节。

执行引擎原理

在解读执行引擎性能优化之前,让我们先来回顾下 Apache ShardingSphere 微内核及内核流程中执行引擎的原理。如下图所示,Apache ShardingSphere 微内核包含了 SQL 解析、SQL 路由、SQL 改写、SQL 执行和结果归并等核心流程。

SQL 解析引擎负责对用户输入的 SQL 语句进行解析,并生成包含上下文信息的 SQLStatement。SQL 路由引擎则根据解析上下文提取出分片条件,再结合用户配置的分片规则,计算出真实 SQL 需要执行的数据源并生成路由结果。SQL 改写引擎根据 SQL 路由引擎返回的结果,对原始 SQL 进行改写,具体包括了正确性改写和优化性改写。SQL 执行引擎则负责将 SQL 路由和改写引擎返回的真实 SQL 安全且高效地发送到底层数据源执行,执行的结果集最终会由归并引擎进行处理,生成统一的结果集返回给用户。

从整个微内核的执行流程可以看出,SQL 执行引擎直接与底层数据库交互,并负责持有执行的结果集,可以说执行引擎的性能和资源消耗,直接关系到整个 Apache ShardingSphere 的性能和资源消耗,因此 Apache ShardingSphere 内部采用了一套自动化的 SQL 执行引擎,负责在执行性能和资源消耗间进行权衡。

从执行性能的角度来看,为每个分片的执行语句分配一个独立的数据库连接,可以充分利用多线程来提升执行性能,也可以将 I/O 所产生的消耗并行处理。此外,为每个分片分配一个独立的数据库连接,还能够避免过早的将查询结果集加载至内存,独立的数据库连接,能够持有查询结果集游标位置的引用,在需要获取相应数据时移动游标即可。

从资源控制的角度来看,应当对业务访问数据库的连接数量进行限制,避免某一业务占用过多的数据库连接资源,影响其他业务的正常访问。特别是在一个数据库实例中存在较多分表的情况下,一条不包含分片键的逻辑 SQL 将产生落在同库不同表的大量真实 SQL,如果每条真实 SQL 都占用一个独立的连接,那么一次查询无疑将会占用过多的资源。

为了解决执行性能和资源控制的冲突问题,Apache ShardingSphere 提出了连接模式的概念,下面是 Apache ShardingSphere 源码对于连接模式的定义。

/**
 * Connection Mode.
 */
public enum ConnectionMode {

    MEMORY_STRICTLY, CONNECTION_STRICTLY
}

从 ConnectionMode 枚举类中成员的命名可以看出,SQL 执行引擎将数据库连接划分为 MEMORY_STRICTLY 和 CONNECTION_STRICTLY。

  • MEMORY_STRICTLY 代表内存限制模式,当采用内存限制模式时,对于同一个数据源,如果逻辑表对应了 10 个真实表,那么 SQL 执行引擎会创建 10 个连接并行地执行,由于每个分片的结果集都有对应的连接进行持有,因此无需将结果集提前加载到内存中,从而有效地降低了内存占用;

  • CONNECTION_STRICTLY 代表连接限制模式,当采用连接限制模式时,SQL 执行引擎只会在同一个数据源上创建一个连接,严格控制对数据库连接资源的消耗,在真实 SQL 执行之后立即将结果集加载至内存,因此会占用部分内存空间。

那么,Apache ShardingSphere SQL 执行引擎是如何帮助用户选择连接模式的呢?SQL 执行引擎选择连接模式的逻辑可以参考下图:

用户通过配置 maxConnectionSizePerQuery 参数,可以指定每条语句在同一个数据源上最大允许的连接数。通过上面的计算公式,当每个数据库连接需执行的 SQL 数量小于等于 1 时,说明当前可以满足每条真实执行的 SQL 都分配一个独立的数据库连接,此时会选择内存限制模式,同一个数据源允许创建多个数据库连接进行并行执行。反之则会选择连接限制模式,同一个数据源只允许创建一个数据库连接进行执行,然后将结果集加载进内存结果集,再提供给归并引擎使用。

执行引擎优化

在熟悉了 Apache ShardingSphere SQL 执行引擎的内部原理之后,我们发现使用内存限制模式时,会消耗更多的数据库连接,但是能够通过并发执行获得更好的性能,使用连接限制模式能够有效控制连接资源的使用,但是会占用过多的内存,执行的性能也会受到影响。

那么,有没有可能使用尽可能少的数据库连接,同时占用较少内存的执行方式呢?根据前文对 SQL 执行引擎的分析,执行模式的选择主要是根据同一个数据源上路由结果的数量,因此最直接的优化思路,就是对同一个数据源上的路由结果进行合并。SQL 语句天然支持通过 UNION ALL 对多条查询语句进行合并,因此我们采用 UNION ALL 方案,对同一个数据源中的多条真实 SQL 进行优化性改写,从而将多条真实 SQL 改写为一条 SQL,这样能够大大减少数据库连接的获取,同时也可以将内存结果集转换为流式结果集,减少内存的占用。

考虑到不同数据库方言对于 UNION ALL 语句的使用存在限制,我们调研了 MySQL、PostgreSQL、Oracle 以及 SQL Server 的官方文档,梳理之后得到了如下信息。

MySQL UNION ALL 使用规范:

  • UNION 之后的列名使用第一个 SELECT 语句中的列名;

  • UNION 中包含 ORDER BY 和 LIMIT 时,需要使用括号将各个查询语句括起来,UNION 无法保证最终的结果集有序,如果需要对 UNION 结果集进行排序,需要在 UNION 语句最后添加 ORDER BY LIMIT 子句;

# 无法保证 UNION 结果集有序
(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10) UNION (SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);
# 保证 UNION 结果集有序
(SELECT a FROM t1 WHERE a=10 AND B=1) UNION (SELECT a FROM t2 WHERE a=11 AND B=2) ORDER BY a LIMIT 10;
  • UNION 不支持 SELECT HIGH_PRIORITY 语句和 SELECT INTO file 语句

PostgreSQL UNION ALL 使用规范:

  • UNION 之后的列名使用第一个 SELECT 语句中的列名;

  • UNION 中包含 ORDER BY 和 LIMIT 时,需要使用括号将各个查询语句括起来,最后一个 UNION 子句可以不使用括号,不使用括号,则 ORDER BY LIMIT 子句应用于整个 UNION 结果。

  • UNION 语句不支持 FOR NO KEY UPDATE、FOR UPDATE、FOR SHARE 和 FOR KEY SHARE;

Oracle UNION ALL 使用规范:

  • UNION 语句不支持 BLOB, CLOB, BFILE, VARRAY, LONG 类型或者 nested table;

  • UNION 语句不支持 forupdateclause;

  • UNION 语句不支持 select 子句中包含 orderbyclause,只能在 UNION 语句最后添加 orderbyclause;

SELECT product_id FROM order_items UNION SELECT product_id FROM inventories ORDER BY product_id;
  • UNION 语句不支持 SELECT 语句中包含 TABLE collection expressions;

SQL Server UNION ALL 使用规范:

  • UNION 语句中使用 ORDER BY 子句时,必须放在最后一个 select 子句之上,对 UNION 结果进行排序;

综合以上梳理的信息来看,不同的数据库方言都能够支持简单的 SELECT * FROM table WHERE 语句,对于 ORDER BY LIMIT 也能通过语法调整进行支持,只是使用上存在一些语法差异,而对于更加复杂的分组查询、子查询及关联查询,官方文档上并未进行详细描述。考虑到 SQL 优化性改写需要保证 SQL 兼容性,Apache ShardingSphere 5.1.0 只选择了简单的 SELECT * FROM table WHERE 语句进行改写,旨在快速提升 OLTP 场景下的查询性能。

下面展示了 RouteSQLRewriteEngine 改写引擎的最新逻辑,Apache ShardingSphere 5.1.0 中添加了对于 SELECT * FROM table WHERE语句的优化性改写逻辑,首先通过 isNeedAggregateRewrite 进行判断,只有当同一个数据源中的路由结果大于 1,并且真实执行的 SQL 满足 SELECT * FROM table WHERE 结构时,才会进行 UNION ALL 改写。

/**
 * Rewrite SQL and parameters.
 *
 * @param sqlRewriteContext SQL rewrite context
 * @param routeContext route context
 * @return SQL rewrite result
 */
public RouteSQLRewriteResult rewrite(final SQLRewriteContext sqlRewriteContext, final RouteContext routeContext) {
    Map<RouteUnit, SQLRewriteUnit> result = new LinkedHashMap<>(routeContext.getRouteUnits().size(), 1);
    for (Entry<String, Collection<RouteUnit>> entry : aggregateRouteUnitGroups(routeContext.getRouteUnits()).entrySet()) {
        Collection<RouteUnit> routeUnits = entry.getValue();
        if (isNeedAggregateRewrite(sqlRewriteContext.getSqlStatementContext(), routeUnits)) {
            result.put(routeUnits.iterator().next(), createSQLRewriteUnit(sqlRewriteContext, routeContext, routeUnits));
        } else {
            result.putAll(createSQLRewriteUnits(sqlRewriteContext, routeContext, routeUnits));
        }
    }
    return new RouteSQLRewriteResult(result);
}

由于使用了 UNION ALL 改写,归并引擎中对于 queryResults 的判断逻辑也需要同步进行调整,原先多个 queryResults 可能被 UNION ALL 合并为一个 queryResults,这种场景下仍然需要执行归并逻辑。

@Override
public MergedResult merge(final List<QueryResult> queryResults, final SQLStatementContext<?> sqlStatementContext, final ShardingSphereSchema schema) throws SQLException {
    if (1 == queryResults.size() && !isNeedAggregateRewrite(sqlStatementContext)) {
        return new IteratorStreamMergedResult(queryResults);
    }
    Map<String, Integer> columnLabelIndexMap = getColumnLabelIndexMap(queryResults.get(0));
    SelectStatementContext selectStatementContext = (SelectStatementContext) sqlStatementContext;
    selectStatementContext.setIndexes(columnLabelIndexMap);
    MergedResult mergedResult = build(queryResults, selectStatementContext, columnLabelIndexMap, schema);
    return decorate(queryResults, selectStatementContext, mergedResult);
}

为了方便大家理解优化前后的逻辑,我们使用如下分片配置,通过 SELECT * FROM t_order 来具体说明下优化的效果,示例中 max-connections-size-per-query 参数使用默认值 1。

rules:
- !SHARDING
  tables:
    t_order:
      actualDataNodes: ds_${0..1}.t_order_${0..1}
      tableStrategy:
        standard:
          shardingColumn: order_id
          shardingAlgorithmName: t_order_inline
      databaseStrategy:
        standard:
          shardingColumn: user_id
          shardingAlgorithmName: database_inline

  shardingAlgorithms:
    database_inline:
      type: INLINE
      props:
        algorithm-expression: ds_${user_id % 2}
    t_order_inline:
      type: INLINE
      props:
        algorithm-expression: t_order_${order_id % 2}

在 5.0.0 版本中,我们执行 SELECT * FROM t_order 语句后,可以得到如下路由结果,结果中包含 ds_0 和 ds_1 两个数据源,并且各自包含了两个路由结果,由于 max-connections-size-per-query 设置为 1,此时无法满足每个真实执行 SQL 都有一个数据库连接,因此会选择连接限制模式。

 

同时由于使用了连接限制模式,在并行执行后会将结果集加载至内存中,使用 JDBCMemoryQueryResult 进行存储,当用户结果集较大时,会占用较多的内存。内存结果集的使用也会导致归并时只能使用内存归并,而无法使用流式归并。

private QueryResult createQueryResult(final ResultSet resultSet, final ConnectionMode connectionMode) throws SQLException {
    return ConnectionMode.MEMORY_STRICTLY == connectionMode ? new JDBCStreamQueryResult(resultSet) : new JDBCMemoryQueryResult(resultSet);
}

在 5.1.0 版本中,我们使用了 UNION ALL 对执行的 SQL 进行优化,同一个数据源中多个路由结果会被合并为一条 SQL 执行。由于能够满足一个数据库连接持有一个结果集,因此会选择内存限制模式。在内存限制模式下,会使用流式结果集 JDBCStreamQueryResult 对象持有结果集,在需要使用数据时,可以按照流式查询的方式查询数据。

性能优化测试

从前面小节的示例中,我们可以看出使用 UNION ALL 进行优化性改写,可以有效减少对数据库连接的消耗,也能够将内存结果集转换为流式结果集,从而避免过多地占用内存。为了更加具体说明优化对于性能的提升,我们针对优化前后的逻辑进行了压测,压测所采用的软件版本如下,使用 5.0.1-SNAPSHOT 版本的 ShardingSphere-Proxy 以及 5.7.26 版本的 MySQL。

压测环境对应的机器配置如下:

我们参考 sysbench 表结构,创建了 sbtest1~sbtest10 等 10 张分片表,每个分片表又分为 5 库,每个库分为 10 张表,具体的 config-sharding.yaml 配置文件如下。

schemaName: sbtest_sharding
dataSources:
  ds_0:
    url: jdbc:mysql://127.0.0.1:3306/sbtest?useSSL=false&useServerPrepStmts=true&cachePrepStmts=true&prepStmtCacheSize=8192&prepStmtCacheSqlLimit=1024
    username: root
    password: 123456
    connectionTimeoutMilliseconds: 10000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
    minPoolSize: 1
  ds_1:
    url: jdbc:mysql://127.0.0.1:3306/sbtest?useSSL=false&useServerPrepStmts=true&cachePrepStmts=true&prepStmtCacheSize=8192&prepStmtCacheSqlLimit=1024
    username: root
    password: 123456
    connectionTimeoutMilliseconds: 10000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
    minPoolSize: 1
  ds_2:
    url: jdbc:mysql://127.0.0.1:3306/sbtest?useSSL=false&useServerPrepStmts=true&cachePrepStmts=true&prepStmtCacheSize=8192&prepStmtCacheSqlLimit=1024
    username: root
    password: 123456
    connectionTimeoutMilliseconds: 10000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
    minPoolSize: 1
  ds_3:
    url: jdbc:mysql://127.0.0.1:3306/sbtest?useSSL=false&useServerPrepStmts=true&cachePrepStmts=true&prepStmtCacheSize=8192&prepStmtCacheSqlLimit=1024
    username: root
    password: 123456
    connectionTimeoutMilliseconds: 10000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
    minPoolSize: 1
  ds_4:
    url: jdbc:mysql://127.0.0.1:3306/sbtest?useSSL=false&useServerPrepStmts=true&cachePrepStmts=true&prepStmtCacheSize=8192&prepStmtCacheSqlLimit=1024
    username: root
    password: 123456
    connectionTimeoutMilliseconds: 10000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
    minPoolSize: 1

rules:
- !SHARDING
  tables:
    sbtest1:
      actualDataNodes: ds_${0..4}.sbtest1_${0..9}
      tableStrategy:
        standard:
          shardingColumn: id
          shardingAlgorithmName: table_inline_1
      keyGenerateStrategy:
        column: id
        keyGeneratorName: snowflake
    sbtest2:
      actualDataNodes: ds_${0..4}.sbtest2_${0..9}
      tableStrategy:
        standard:
          shardingColumn: id
          shardingAlgorithmName: table_inline_2
      keyGenerateStrategy:
        column: id
        keyGeneratorName: snowflake
    sbtest3:
      actualDataNodes: ds_${0..4}.sbtest3_${0..9}
      tableStrategy:
        standard:
          shardingColumn: id
          shardingAlgorithmName: table_inline_3
      keyGenerateStrategy:
        column: id
        keyGeneratorName: snowflake
    sbtest4:
      actualDataNodes: ds_${0..4}.sbtest4_${0..9}
      tableStrategy:
        standard:
          shardingColumn: id
          shardingAlgorithmName: table_inline_4
      keyGenerateStrategy:
        column: id
        keyGeneratorName: snowflake
    sbtest5:
      actualDataNodes: ds_${0..4}.sbtest5_${0..9}
      tableStrategy:
        standard:
          shardingColumn: id
          shardingAlgorithmName: table_inline_5
      keyGenerateStrategy:
        column: id
        keyGeneratorName: snowflake
    sbtest6:
      actualDataNodes: ds_${0..4}.sbtest6_${0..9}
      tableStrategy:
        standard:
          shardingColumn: id
          shardingAlgorithmName: table_inline_6
      keyGenerateStrategy:
        column: id
        keyGeneratorName: snowflake
    sbtest7:
      actualDataNodes: ds_${0..4}.sbtest7_${0..9}
      tableStrategy:
        standard:
          shardingColumn: id
          shardingAlgorithmName: table_inline_7
      keyGenerateStrategy:
        column: id
        keyGeneratorName: snowflake
    sbtest8:
      actualDataNodes: ds_${0..4}.sbtest8_${0..9}
      tableStrategy:
        standard:
          shardingColumn: id
          shardingAlgorithmName: table_inline_8
      keyGenerateStrategy:
        column: id
        keyGeneratorName: snowflake
    sbtest9:
      actualDataNodes: ds_${0..4}.sbtest9_${0..9}
      tableStrategy:
        standard:
          shardingColumn: id
          shardingAlgorithmName: table_inline_9
      keyGenerateStrategy:
        column: id
        keyGeneratorName: snowflake
    sbtest10:
      actualDataNodes: ds_${0..4}.sbtest10_${0..9}
      tableStrategy:
        standard:
          shardingColumn: id
          shardingAlgorithmName: table_inline_10
      keyGenerateStrategy:
        column: id
        keyGeneratorName: snowflake

  defaultDatabaseStrategy:
    standard:
      shardingColumn: id
      shardingAlgorithmName: database_inline

  shardingAlgorithms:
    database_inline:
      type: INLINE
      props:
        algorithm-expression: ds_${id % 5}
        allow-range-query-with-inline-sharding: true
    table_inline_1:
      type: INLINE
      props:
        algorithm-expression: sbtest1_${id % 10}
        allow-range-query-with-inline-sharding: true
    table_inline_2:
      type: INLINE
      props:
        algorithm-expression: sbtest2_${id % 10}
        allow-range-query-with-inline-sharding: true
    table_inline_3:
      type: INLINE
      props:
        algorithm-expression: sbtest3_${id % 10}
        allow-range-query-with-inline-sharding: true
    table_inline_4:
      type: INLINE
      props:
        algorithm-expression: sbtest4_${id % 10}
        allow-range-query-with-inline-sharding: true
    table_inline_5:
      type: INLINE
      props:
        algorithm-expression: sbtest5_${id % 10}
        allow-range-query-with-inline-sharding: true
    table_inline_6:
      type: INLINE
      props:
        algorithm-expression: sbtest6_${id % 10}
        allow-range-query-with-inline-sharding: true
    table_inline_7:
      type: INLINE
      props:
        algorithm-expression: sbtest7_${id % 10}
        allow-range-query-with-inline-sharding: true
    table_inline_8:
      type: INLINE
      props:
        algorithm-expression: sbtest8_${id % 10}
        allow-range-query-with-inline-sharding: true
    table_inline_9:
      type: INLINE
      props:
        algorithm-expression: sbtest9_${id % 10}
        allow-range-query-with-inline-sharding: true
    table_inline_10:
      type: INLINE
      props:
        algorithm-expression: sbtest10_${id % 10}
        allow-range-query-with-inline-sharding: true
  keyGenerators:
    snowflake:
      type: SNOWFLAKE
      props:
        worker-id: 123

我们使用如下 JMH 测试程序对不同 CASE 进行测试:

@State(Scope.Thread)
public class QueryOptimizationTest {

    private PreparedStatement unionAllForCaseOneStatement;

    private PreparedStatement unionAllForCaseTwoStatement;

    @Setup(Level.Trial)
    public void setup() throws Exception {
        Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3307/sharding_db?useSSL=false", "root", "123456");
        // CASE 1
        unionAllForCaseOneStatement = connection.prepareStatement("SELECT COUNT(k) AS countK FROM sbtest1 WHERE id < ?;");
        // CASE 2
        unionAllForCaseTwoStatement = connection.prepareStatement("SELECT SUM(k) AS sumK FROM sbtest1 WHERE id < ?;");
    }

    @Benchmark
    public void testUnionAllForCaseOne() throws SQLException {
        unionAllForCaseOneStatement.setInt(1, 200);
        unionAllForCaseOneStatement.executeQuery();
    }

    @Benchmark
    public void testUnionAllForCaseTwo() throws SQLException {
        unionAllForCaseTwoStatement.setInt(1, 200);
        unionAllForCaseTwoStatement.executeQuery();
    }
}

性能测试会对每个 CASE 分别测试 3 组,然后取平均值,再切换到优化前的版本 aab226b72ba574061748d8f94c461ea469f9168f进行编译打包,同样测试 3 组取平均值,最终性能测试结果如下。

CASE 1 与 CASE 2 都是基于 100 万数据量下的 sysbench 表结构进行测试,由于测试表分片数较多,整体性能提升了 4 倍左右,理论上随着分片数的增加,性能提升的效果会更加明显。

结语

Apache ShardingSphere 5.1.0 进行了大量的性能优化,针对协议层和内核层进行了全面的优化提升,本文限于篇幅只对 SQL 执行引擎进行了解读,后续的系列文章还会带来更加专业和全面的性能优化指南,希望感兴趣的同学继续关注。同时,也欢迎社区的同学积极参与进来,共同提升 Apache ShardingSphere 的性能,为社区提供更好的使用体验。

参考文档

1、ShardingSphere 执行引擎:https://shardingsphere.apache.org/document/current/cn/reference/sharding/execute/

2、ShardingSphere 社区关于执行引擎连接模式的讨论:https://github.com/apache/shardingsphere/issues/13942

3、MySQL UNION 官方文档:https://dev.mysql.com/doc/refman/8.0/en/union.html

4、PostgreSQL UNION 官方文档:https://www.postgresql.org/docs/14/sql-select.html

5、Oracle UNION 官方文档:https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/The-UNION-ALL-INTERSECT-MINUS-Operators.html

6、SQL Server UNION 官方文档:https://docs.microsoft.com/en-us/sql/t-sql/language-elements/set-operators-union-transact-sql?view=sql-server-ver15

相关推荐

官宣|Apache ShardingSphere 5.0.0 正式发布

11 月 10 日,是 Apache ShardingSphere 进入 Apache 基金会的三周年纪念日。在这特殊的一天,我们很高兴的宣布 Apache ShardingSphere 迎来了 5.0.0 GA 版本的正式发布。经过近两年的优化和打磨,ShardingSphere 5.0.0 GA 版正式开启了以可插拔架构为核心的全新阶段,实现了由过去数据分片单一应用场景到现在复杂应用环境下综合数据治理的身份转变与能力提升。5.0.0 具体版本发布信息如下:1 新特性 支持注释解析 .

SphereEX的博客 733

SphereEx 获数百万美元天使融资,接力 ShardingSphere 开启 Database Plus 新篇章

5月14日,数据前沿技术领域初创公司 SphereEx 获得来自红杉中国种子基金、初心资本的数百万美元天使轮融资。SphereEx是一家致力于构建新型分布式数据基础设施的公司,秉承开源、共享、生态、平台理念,致力于数据领域前沿技术创新。其研发的分布式中间件ShardingSphere,具备“平台化、可插拔、云原生”等核心技术特点,是大规模数据应用、数据增值应用的理想解决方案。SphereEx的核心创始团队来自Apache顶级项目 ShardingSphere、头部互联网公司、及知名基础设施软件提供商。.

SphereEX的博客 644

DBPlusEngine 1.7.2 发布:数据安全闭环与联邦查询突破

ShardingSphere 原厂企业版,支撑企业核心系统安全治理与联邦查询升级。

SphereEX的博客 390

SphereEx-DBPlusEngine 1.5.0 功能解读:CDC

数据库日志(以 MySQL 为例) binlog 是 MySQL 记录变更数据的"二进制日志",它可以看做是一个消息队列,队列中按顺序保存了 MySQL 中详细的增量变更信息,通过消费队列中的变更条目,下游系统或工具实现了与 MySQL 的实时数据同步。前一段时间,面向新一代数据架构的数据库增强引擎 SphereEx-DBPlusEngine 正式发布 1.5.0 版本,新增 CDC 和数据库防火墙两大重磅功能,本篇文章笔者就给大家详细介绍 CDC 功能的实现逻辑和技术细节。使用网络通道的情况下需要。

SphereEX的博客 472

SphereEx-DBPlusEngine 1.5.0 版本发布

近日,面向新一代数据架构的数据库增强引擎 SphereEx-DBPlusEngine 正式发布 1.5.0 版本,新增 CDC 和数据库防火墙两大重磅功能,并在数据安全方面做了重要的增强。增加了对实时数据变更的捕获和管理能力,并增强了对数据访问的监控和拦截能力,帮助企业降低业务风险,提升效率。

SphereEX的博客 365

【版本更新】Apache ShardingSphere 5.4.0 版本正式发布!

SphereEX的博客 580

畅聊新版本!尽在本周六 ShardingSphere 线上圆桌会!

👏 欢迎大家「预约」直播,提前锁定精彩内容,与三位资深社区贡献者一起共究 ShardingSphere 5.4.0 与 ShardingSphere-On-Cloud 0.3.0 的技术魅力!😉 就在本周六(7 月 1 日), ShardingSphere 线上圆桌(第二期)栏目内容即将播出啦!👋 嗨~ ShardingSphere 社区的小伙伴们下午好!🤩 转载议程海报还能赢取「互动福利」!惊喜多多,详情见下方海报哦~👇 👇。

SphereEX的博客 203

围“桌”详谈|本周六直播,一起聊聊「发版」那些事儿!

🎉围“桌”详谈|本周六,来一起聊聊「发版」那些事儿!⏰7 月 1 日下午两点,我们邀请了 ShardingSphere PMC 端正强、ShardingSphere Committer 江龙滔、ShardingSphere Committer 苗立尧三位资深的社区贡献者做客「社区线上直播间」,将为大家详细解答新版本带来的重点功能更新及对应的性能突破!🌟 活动还设有「技术实战」、「有奖问答」等趣味环节,期待与大家一起解锁!

SphereEX的博客 244

倒计时 1 天 | SphereEx 在 2023 亚马逊云科技中国峰会等你来打卡!

📢倒计时 1 天 | SphereEx 即将亮相 2023 亚马逊云科技中国峰会!✨SphereEx 联合创始人 & CTO 潘娟 将在大会期间将向业界介绍如何充分发挥弹性伸缩、自动备份、容错处理等云计算的优势,提高分布式数据库的可靠性和性能。同时,也将分享在分布式数据库应用中安全性的重要性和实践方法,从多个方面保护数据的安全性。👏扫描下方二维码预约参观,通过二维码进行预约的小伙伴在上海展会现场可凭借手机号领取精美礼品一份!还可以在现场参与抽奖,更多好礼等你拿!

SphereEX的博客 300

倒计时2天,解锁亚马逊云科技中国峰会 Dev Lounge 玩法

在此次圆桌讨论中,ShardingSphere PMC & SphereEx 联合创始人兼 CTO 潘娟受邀与多位行业专家共同分享他们在利用开源进行数据分析和挖掘方面的研究成果、经验和启示。开发者们将有机会与专家面对面交流,同时了解最新的数据分析和挖掘技术洞察,掌握趋势和机遇。数据对于企业和个人来说都至关重要,而大数据和人工智能的不断发展,为各种应用场景带来了更多的机会。那么,如何利用开源分析和挖掘数据价值,成为了许多开发者关注的话题。海报二维码扫码报名,6月27-28日,我们上海等你,不见不散!

SphereEX的博客 280

逛开发者集市啦,ShardingSphere 在亚马逊云科技中国峰会等你!

2023亚马逊云科技中国峰会将于6月27日-28日在上海世博中心盛大开幕。本次峰会以“共见·价值成就”为主题,与合作伙伴展望云计算趋势及合作发展战略,分享行业解决方案,共同探讨协同销售策略和全新的 APN 计划,助力合作伙伴成就更多价值。同时,峰会将聚焦构建新技术加速的产品创新、新架构提升的业务弹性、云计算引领的创新模式,围绕价值加速实现,企业敏捷稳健,行业全新机遇等热门话题,携手众多业内技术领导者,践行者一同,把握时代机遇。本次峰会特设开发者会客厅区域,为开发者提供一站式等丰富体验。

SphereEX的博客 399

ShardingSphere 荣获一等奖!2022 年中国开源创新大赛成绩单公布

2022年中国开源创新大赛”在国家中央网信办信息化发展局的指导下,由中国互联网发展基金会、中国网络空间研究院、中国互联网投资基金联合主办,大赛以“开源创新,共建生态”为主题,围绕国家在开源人才培养和开源生态建设方面的重大战略需求,聚焦“卡脖子”相关技术领域,旨在助力开源生态的高质量发展,激发开源创新活力,推动我国科技创新及产业转型升级。5 月 31 日,“2022 年中国开源创新大赛”正式颁奖。

SphereEX的博客 309

创新能力加速产业发展,SphereEx 荣获“中关村银行杯”『大数据与云计算』领域 TOP1

SphereEx 凭借自身在数据库领域产品与理念的双重创新优势,荣获2022 中关村国际前沿科技创新大赛“中关村银行杯”『大数据与云计算』领域的第一名。

SphereEX的博客 348

Pisanix v0.2.0 发布|新增动态读写分离支持

Pisanix 于今天发布了 v0.2.0 版本,在此前版本基础上,本次更新新增了动态读写分离支持,下面将进行详细介绍。

SphereEX的博客 375

Database Plus 的云上之旅:SphereEx 正式开源 ShardingSphere on Cloud 解决方案

作为 Database Plus 设计哲学的最佳实践,Apache 顶级开源项目 ShardingSphere 通过各行业多年的生产环境检验,受到了众多社区爱好者的关注和追捧。而随着 Kubernetes 成为容器编排的事实标准,其引领的云原生风暴迅速席卷了技术世界。Apache ShardingSphere 作为一个拥有开放生态的数据库增强引擎,其设计理念和 Kubernetes 有着诸多相似之处,而在这股云原生浪潮之下,社区对 ShardingSphere 上云的呼声也越来越高,于是 **SphereE

SphereEX的博客 303

DistSQL 深度解析:打造动态化的分布式数据库

本文将以数据分片为例,深度解析 Sharding 相关 DistSQL 的应用场景和使用技巧。同时,通过实践案例将一系列 DistSQL 语句进行串联,为读者展现一套完整实用的 DistSQL 分片管理方案。

SphereEX的博客 409

Pisa-Proxy SQL 解析之 Lex & Yacc

在上篇文章《Pisa-Proxy 之 SQL 解析实践》中介绍了 Pisa-Proxy 的核心模块之一 SQL 解析器的相关内容。在 MySQL 和 PostgreSQL 中 SQL 解析是通过 Yacc 实现的,同样 Pisa- Proxy 的 SQL 解析器是由类似 Yacc 这样的工具实现的,所以本篇文章会围绕 SQL 解析器为大家介绍一些编译原理和 Lex & Yacc 的使用,同时也会为读者展示如何通过 Lex & Yacc 实现一个简单的 SQL 解析器。从而帮助大家更好地理解 Pisa-Pro

SphereEX的博客 993

终于可以一行代码也不用改了!ShardingSphere 原生驱动问世

ShardingSphere-JDBC 驱动的出现,使 ShardingSphere 的易用性获得了前所未有的加强

SphereEX的博客 827

开源者的自我修养|为 ShardingSphere 贡献了千万行代码的程序员,后来当了 CEO

浅谈开源人的17年成长路线,热爱才能坚持

SphereEX的博客 376

开源二三事|ShardingSphere 与 Database Mesh 之间不得不说的那些事

前段时间,以 Apache ShardingSphere 核心团队组建的创业公司 SphereEx,正式对外推出了 Database Mesh 2.0 概念以及与之相配套的开源产品 Pisanix,这引发了社区间对于 ShardingSphere 和 Database Mesh 的不少争论与思考。许多用户都很清楚,SphereEx 是由 Apache ShardingSphere 核心团队创立的。那么有部分用户就提出了疑问,既然已经有了 Apache ShardingSphere 这样一个如此成功的开源项目

SphereEX的博客 366

Pisa-Proxy 之 SQL 解析实践

本文将以 Pisa-Proxy 实践为例,为大家展现 Pisa-Proxy 中的 SQL 解析实现,遇到的问题及优化

SphereEX的博客 543

基于 ShardingSphere 的得物数据库中间件平台“彩虹桥”演进之路

得物与 ShardingSphere 的完美结合实践

SphereEX的博客 571

Apache ShardingSphere 5.1.2 发布|全新驱动 API + 云原生部署,打造高性能数据网关

此次更新带来 ShardingSphere 原生驱动、Helm Chart、SQL 翻译等全新功能,打造极具生产力的数据网关

SphereEX的博客 600

在 Pisa-Proxy 中,如何利用 Rust 实现 MySQL 代理

在 Database Mesh 中,Pisanix 是一套以数据库为中心的治理框架,为用户提供了诸多治理能力

SphereEX的博客 779

ShardingSphere 异构迁移最佳实践:将3.5亿量级的顾客系统 RTO 减少60倍

Apache ShardingSphere 助力当当 3.5 亿用户量级顾客系统重构,由 PHP+SQL Server 技术栈无缝转型为 Java+ShardingSphere+MySQL,性能、可用性及维护性均得到显著提升,是 ShardingSphere 异构迁移最佳实践。

SphereEX的博客 329

SphereEx 正式开源面向 Database Mesh 的解决方案 Pisanix

今天,SphereEx 正式对外推出了面向 Database Mesh 的开源解决方案-- Pisanix v0.1.0 版本。Pisanix 从设计之初就吸收了 Database Mesh 的核心思想:通过可编程实现高性能扩展,应对云上数据库治理挑战。这标志着 Database Mesh 不再停留于纸上,而成为了一个真正可以实现和落地的框架。.........

SphereEX的博客 523

做数据时代的加油站,ShardingSphere 为易车数据库架构演进提供新动力

做数据时代的加油站,ShardingSphere 为易车数据库架构演进提供新动力

SphereEX的博客 255

数据库治理的云原生之道 —— Database Mesh 2.0

本文将带领各位读者回顾 Database Mesh 诞生的背景,重新审视 Database Mesh 1.0 的价值,并为大家介绍 Database Mesh 2.0 的新概念、新思路和新特性,共同探讨 Database Mesh 的未来之路。

SphereEX的博客 508

ShardingSphere 在东南亚|与科技保险公司 Fuse 的技术融合

ShardingSphere 在东南亚|与科技保险公司 Fuse 的技术融合

SphereEX的博客 246

SphereEx 正式成为 CNCF 会员,持续完善云原生环境下的数据库基础设施

近日,SphereEx 正式成为全球知名开源组织 CNCF(云原生计算基金会,Cloud Native Computing Foundation)银牌会员。

SphereEX的博客 285
上一篇: SphereEx 携手重庆大学,引领数据库领域下产学融合新风向
下一篇: Apache ShardingSphere Agent 可观察性实用指南
SphereEx
SphereEx 企业官方账号 企业官方账号
博客等级 码龄6年 69粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值