发布时间:2025-11-05 01:28:11 来源:云智核 作者:IT科技
作者:小傅哥
博客:https://bugstack.cn
面试问:“你为什么要自研,面试市面不是啥自有吗,怎么回答?研路由组” 可以从以下3个点解答;
维护性;市面的路由组件比如 shardingsphere 但过于庞大,还需要随着版本做一些升级,不用市面上已经有很多版本了。面试而我们需要更少的啥自维护成本。扩展性;结合自身的研路由组业务需求,我们的不用路由组件可以分库分表、自定义路由协议,面试扫描指定库表数据等各类方式。啥自研发扩展性好,研路由组简单易用。不用安全性;自研的面试组件更好的控制了安全问题。当然,啥自我们的研路由组组件主要是为了更好的适应目前系统的诉求,所以使用自研的方式处理。甚至各个大厂也都自研一整套分布式服务,来让自己的系统更加稳定可控。接着问,你们为什么分库分表?
我们分库分表用的非常熟。高防服务器但不能为了等到系统到了200万数据,才拆。那么工作量会非常大 我们的做法是,因为有成熟方案,所以前期就分库分表了。但,为了解释服务器空间。所以把分库分表的库,用服务器虚拟出来机器安装。这样即不过多的占用服务器资源,也方便后续数据量真的上来了,好拆分。
同时,Xxx系统,是瞬时峰值较高的系统,历史数据不一定多。所以我们希望,用户可以快速的检索到个人数据,做最优响应。因为大家都知道,Xxx这东西,push发完,基本就1~3分钟结束,10分钟人都没了。所以我们这也是云服务器做了分库分表的理由。
不过用和不用是一方面,会和不会是另外一方面。不能因为不会所以不用,不用是因为不同场景的所需。像 Apache ShardingSphere 在很多大的场景还是非常好用的,所以我们需要学习积累。积累不同的思想和设计,以及积累技术的运用。
碎片知识:https://bugstack.cn/md/road-map/road-map.html实战项目:https://bugstack.cn/md/zsxq/introduce.html本文的宗旨在于通过简单干净实践的方式教会读者,快速 Easy 的使用上 sharding-jdbc 这个笨重的大家伙!—— 这篇文章并不复杂,但市面上的案例,还真的很少有能拿过来就能运行起来的!
之所以说"笨重",是云南idc服务商因为 Apache ShardingSphere 不只是简单意义上的路由组件,而是一款分布式 SQL 事务和查询引擎,可通过数据分片、弹性伸缩、加密等能力对任意数据库进行增强。同时它又在迭代过程中,衍生出了很多的版本,以及对应了不同的使用方式。并在 ShardingSphere 5.3 以后又做了不小的架构调整。所以很多伙伴在使用的时候,经常是找了一上午的资料,到下午下班还没对接上。
本文涉及的工程:
xfg-dev-tech-shardingjdbc:https://gitcode.net/KnowledgePlanet/road-map/xfg-dev-tech-shardingjdbc官网:https://shardingsphere.apache.org/index_zh.html分库分表的本质是数据的散列,分摊数据库资源压力。如把原本在一台机器上的数据库存放1000万数据,分摊到n台机上,拆分这1000万的数据和后续的增量。让每个数据库资源来分摊原本需要一台数据库所提供的服务。
图片
图片
sharding/sharding-jdbc-dev.yaml
复制# https://shardingsphere.apache.org/index_zh.html mode: # 运行模式类型。可选配置:内存模式 Memory、单机模式 Standalone、集群模式 Cluster - 目前为单机模式 type: Standalone dataSources: ds_0: dataSourceClassName: com.zaxxer.hikari.HikariDataSource driverClassName: com.mysql.cj.jdbc.Driver jdbcUrl: jdbc:mysql://127.0.0.1:13306/xfg_dev_tech_db_00?useUnicode=true&characterEncoding=utf8&autoRecnotallow=true&zeroDateTimeBehavior=convertToNull&serverTimeznotallow=UTC&useSSL=true username: root password: 123456 connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 15 minPoolSize: 5 ds_1: dataSourceClassName: com.zaxxer.hikari.HikariDataSource driverClassName: com.mysql.cj.jdbc.Driver jdbcUrl: jdbc:mysql://127.0.0.1:13306/xfg_dev_tech_db_01?useUnicode=true&characterEncoding=utf8&autoRecnotallow=true&zeroDateTimeBehavior=convertToNull&serverTimeznotallow=UTC&useSSL=true username: root password: 123456 connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 15 minPoolSize: 5 rules: - !SHARDING # 库的路由 defaultDatabaseStrategy: standard: shardingColumn: user_id shardingAlgorithmName: database_inline # 表的路由 tables: user_order: actualDataNodes: ds_$->{0..1}.user_order_$->{0..3} tableStrategy: standard: shardingColumn: user_id shardingAlgorithmName: user_order_inline # 路由算法 shardingAlgorithms: # 库-路由算法 2是两个库,库的数量。库的数量用哈希模2来计算。 database_inline: type: INLINE props: algorithm-expression: ds_$->{Math.abs(user_id.hashCode()) % 2} # 表-路由算法 4是一个库里,表的数量。4 - 1 为了获得 011 这样的二进制值。不推荐 user_order_$->{Math.abs(user_id.hashCode()) % 2} 作为表的路由 user_order_inline: type: INLINE props: algorithm-expression: user_order_$->{(user_id.hashCode() ^ (user_id.hashCode()) >>> 16) & (4 - 1)} props: # 是否在日志中打印 SQL。 # 打印 SQL 可以帮助开发者快速定位系统问题。日志内容包含:逻辑 SQL,真实 SQL 和 SQL 解析结果。 # 如果开启配置,日志将使用 Topic ShardingSphere-SQL,日志级别是 INFO。false sql-show: true # 是否在日志中打印简单风格的 SQL。false sql-simple: true # 用于设置任务处理线程池的大小。每个 ShardingSphereDataSource 使用一个独立的线程池,同一个 JVM 的不同数据源不共享线程池。 executor-size: 20 # 查询请求在每个数据库实例中所能使用的最大连接数。1 max-connections-size-per-query: 1 # 在程序启动和更新时,是否检查分片元数据的结构一致性。 check-table-metadata-enabled: false # 在程序启动和更新时,是否检查重复表。false check-duplicate-table-enabled: false1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74. mode:运行模式,默认就单机模式。dataSources:数据库连接信息。rules:路由算法。defaultDatabaseStrategy 库的路由、tables 表的路由。之后在 shardingAlgorithms 中配置具体的路由算法。这里的名称都是关联的,不要配置错。props:一些属性信息,包括是否打印日志等。与这个对比,如果你使用的路由功能并不那么大,其实自研会更加简单。当然你也可以想办法,简化 sharding-jdbc 的配置。
application-dev.yml
复制spring: datasource: driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver url: jdbc:shardingsphere:classpath:sharding/sharding-jdbc-dev.yaml1.2.3.4. 和之前的一些 sharding 版本不同,这里是需要使用具体的 ShardingSphereDriver 和 url 地址,才能加载上我们配置的路由信息。
图片
随便看看