当前位置: 首页 > news >正文

ShardingSphere Proxy 配置

在使用 ShardingSphere Proxy 模式时,结合 主从复制架构 实现 读写分离,并按照 用户ID哈希算法 确定库、时间范围 确定表的场景下,配置文件需要做一些调整以支持分片、读写分离以及主从复制。

以下是如何配置 ShardingSphere Proxy 模式的详细步骤:

1. 数据库配置

假设我们有多个数据库 db_0, db_1, …, db_9,每个数据库都有主从复制架构,即每个数据库都有一个主节点和多个从节点。我们可以按照以下方式配置 ShardingSphere Proxy。

配置文件示例(sharding.yml

schemaName: sharding_db

dataSources:
  # 主库配置(每个数据库有主从架构)
  ds_0_master:
    url: jdbc:mysql://localhost:3306/db_0_master
    username: root
    password: root
    driverClassName: com.mysql.cj.jdbc.Driver
  ds_0_slave:
    url: jdbc:mysql://localhost:3306/db_0_slave
    username: root
    password: root
    driverClassName: com.mysql.cj.jdbc.Driver
  ds_1_master:
    url: jdbc:mysql://localhost:3306/db_1_master
    username: root
    password: root
    driverClassName: com.mysql.cj.jdbc.Driver
  ds_1_slave:
    url: jdbc:mysql://localhost:3306/db_1_slave
    username: root
    password: root
    driverClassName: com.mysql.cj.jdbc.Driver
  # 配置其他数据库的主从架构
  ...

# 配置读写分离
readwriteSplitting:
  ds_0:
    writeDataSourceName: ds_0_master
    readDataSourceNames:
      - ds_0_slave
  ds_1:
    writeDataSourceName: ds_1_master
    readDataSourceNames:
      - ds_1_slave
  # 配置其他数据库的主从架构
  ...

# 配置分片规则
sharding:
  tables:
    user_trades:
      actualDataNodes: ds${0..9}.user_trades_${yyyy_MM}
      tableStrategy:
        inline:
          shardingColumn: user_id
          algorithmExpression: user_trades_${yyyy_MM}
      databaseStrategy:
        inline:
          shardingColumn: user_id
          algorithmExpression: ds${user_id.hashCode() % 10}
      keyGenerator:
        column: trade_id
        type: SNOWFLAKE
  bindingTables:
    - user_trades

配置 Spring Boot 与 ShardingSphere Proxy 连接

在 application.properties 或 application.yml 中配置数据源连接 ShardingSphere Proxy。
application.yml 配置

spring:
  datasource:
    url: jdbc:mysql://localhost:3307/example_ds
    username: root
    password: password
    driver-class-name: com.mysql.cj.jdbc.Driver
    hikari:
      maximum-pool-size: 10

此配置中,localhost:3307 是 ShardingSphere Proxy 的地址,假设 Proxy 配置监听在该端口。

2. 解释配置内容

数据源配置 (dataSources)

每个数据源(ds_0_master, ds_0_slave, ds_1_master, ds_1_slave 等)都配置了一个主库和从库。主库用于写操作,从库用于读操作。通过这种方式,ShardingSphere Proxy 可以实现 读写分离

  • 主库:用于所有的写操作。
  • 从库:用于所有的读操作。

读写分离配置 (readwriteSplitting)

readwriteSplitting 配置将数据库的主从节点进行绑定,指定写操作走主库,读操作走从库。
例如:

ds_0:
  writeDataSourceName: ds_0_master
  readDataSourceNames:
    - ds_0_slave

该配置意味着,所有针对 ds_0 数据源的写操作会被路由到 ds_0_master,而所有读操作则会被路由到 ds_0_slave

分片规则 (sharding)

ShardingSphere 中,分片规则的配置包括 数据库分片表分片

  • 数据库分片策略
    • 基于 用户ID哈希算法 对数据库进行分片。通过 user_id.hashCode() % 10 确定用户数据存储在哪个数据库(ds_0, ds_1, …, ds_9)。
  • 表分片策略
    • 根据 时间范围 来确定表。例如,可以按月来分片,表名会是 user_trades_2023_01, user_trades_2023_02 等。
    • actualDataNodes: ds${0..9}.user_trades_${yyyy_MM} 配置表示每个数据库中都有以 yyyy_MM 格式命名的表。

分片键

  • user_id 是分片键,ShardingSphere 会根据 user_id 的哈希值决定数据落在哪个数据库上。
  • yyyy_MM 是时间范围,用来决定数据落在哪个具体的表上。

主键生成器

  • 这里使用了 Snowflake 算法生成 trade_id,确保每个 trade_id 在分布式环境下是唯一的。

3. 读写分离工作原理

  • 写操作:所有的写操作会根据 user_id 哈希值决定目标数据库,然后路由到对应的 主库ds_0_master, ds_1_master, …)。
  • 读操作:所有的读操作会根据 user_id 哈希值决定目标数据库,然后路由到对应的 从库ds_0_slave, ds_1_slave, …)。

4. 配置调整

  • 分片粒度:你可以根据实际需求调整分片粒度,按 月、季度、年 等时间段进行分表。
  • 数据库扩展:随着数据量的增加,你可以增加更多的数据库(ds_10, ds_11, …),并相应修改分片策略,以支持水平扩展。

5. 测试和监控

  • 在生产环境中,进行充分的 负载测试性能监控,确保读写分离能够有效地缓解读压力,并且系统的整体性能达到预期。
  • 使用 ShardingSphere 提供的监控工具(如 Prometheus、Grafana)来监控数据库负载、请求量等指标,确保系统稳定。

总结

通过 ShardingSphere Proxy 模式和主从复制架构,你可以实现 读写分离分布式分片。配置文件中,关键是将 数据库分片读写分离 配置结合起来,确保写操作进入主库,读操作路由到从库,同时按照 用户ID哈希算法 来决定库,按 时间范围 来决定表。这种设计可以有效提高系统的可扩展性、性能和容错性。

相关文章:

  • Web开发:ORM框架之使用Freesql的导航属性
  • RK3568平台开发系列讲解(UBOOT篇)u-boot启动流程
  • pandas中的数据结构+数据查询
  • 用markdown 写简历
  • 821 字符的最短距离
  • c++进阶之----二叉搜索树
  • 【射频仿真学习笔记】Cadence的Layout EXL与ADS dynamic link联动后仿
  • 【组态PLC】基于西门子s7-200PLC和组态王中央空调的循环控制系统【含PLC组态源码 M019期】
  • Java注解的原理
  • Kotlin 随记 (1)
  • RAG-202502
  • Mellanox的LAG全称是什么?网卡的创建机制如何?(Link Aggregation Group 链路聚合组)
  • WiFi IEEE 802.11协议精读:IEEE 802.11-2007,6,MAC service definition MAC服务定义
  • TinyEngine v2.2版本发布:支持页面嵌套路由,提升多层级路由管理能力开发分支调整
  • HBase常用的Filter过滤器操作
  • Spring Data JPA vs MyBatis:ORM框架如何选择?
  • 【IntelliJ IDEA】关于设置固定的文件格式(包括注释、版权信息等)的方法
  • 轨迹控制--odrive的位置控制---负载设置
  • lmstdio大模型——本地大模型python函数调用设计
  • Python中有哪些基本数据类型?
  • 科学家为AI模型设置“防火墙”,以防止被不法分子滥用
  • 白云山一季度营收净利双降,此前称今年将挖掘盘活自身资源
  • 昂立教育:去年减亏1.39亿元,今年以“利润持续增长”为核心目标
  • 葡萄牙、西班牙突发大范围停电,交通和通信服务受到严重影响
  • 大理杨徐邱再审上诉案宣判:驳回上诉,维持再审一审判决
  • 北京公园使用指南