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

网站开发主页营销案例100例小故事

网站开发主页,营销案例100例小故事,怎么做淘宝优惠券的网站,抚州企业网站做优化大家好#xff0c;我是小富#xff5e; ShardingSphere实现分库分表#xff0c;如何管理分布在不同数据库实例中的成千上万张分片表#xff1f; 上边的问题是之前有个小伙伴看了我的分库分表的文章#xff0c;私下咨询我的#xff0c;看到他的提问我第一感觉就是这老铁…大家好我是小富 ShardingSphere实现分库分表如何管理分布在不同数据库实例中的成千上万张分片表 上边的问题是之前有个小伙伴看了我的分库分表的文章私下咨询我的看到他的提问我第一感觉就是这老铁没用过ShardingSphere因为这个问题在ShardingSphere中已经有了很好的解决方案接下来看看怎么实现。 本文案例代码GitHub地址https://github.com/chengxy-nds/Springboot-Notebook/tree/master/shardingsphere101/shardingsphere-autocreate-table 系列往期 往期系列文章我佛系更新无下限拖更 一好好的系统为什么要分库分表 二分库分表的 21 条法则hold 住 三2 种方式快速实现分库分表轻松拿捏 本文是《ShardingSphere5.x分库分表原理与实战》系列的第四篇文章在进行分库分表设计时确认好了数据节点数量和分片策略以后接下来要做的就是管理大量的分片表。实际实施过程中可能存在上百个分片数据库实例每个实例中都可能有成千上万个分片表如果仅依靠人力来完成这些任务显然是不现实的。所以想要快速且自动化管理这些分片表使用工具是十分必要滴。 前言 ShardingSphere框架成员中的Shardingsphere-jdbc和Shardingsphere-proxy都提供了自动化管理分片表的功能auto-tables可以统一维护大量的分片表避免了手动编写脚本和维护分片表的繁琐工作极大程度减少分库分表的开发和维护成本提升效率和可靠性。 这里咱们先使用Shardingsphere-jdbc来实际操作一下Shardingsphere-proxy方式后续会有单独的文章详细讲解就不在这里展开了。 准备工作 假设我们要对t_order表进行分库分表首先我们要做的就是确定好分片方案这里使用两个数据库实例db0、db1每个实例中t_order表分成1000张分片表t_order_1 ~ t_order_1000order_id字段作为分片键分片算法使用取模算法order_id % n分布式主键生成策略采用snowflake。 t_order逻辑表的表结构如下 CREATE TABLE t_order (order_id BIGINT ( 20 ) NOT NULL COMMENT 订单表分布式主健ID,order_number VARCHAR ( 255 ) NOT NULL COMMENT 订单号,customer_id BIGINT ( 20 ) NOT NULL COMMENT 用户ID,order_date date NOT NULL COMMENT 下单时间,total_amount DECIMAL ( 10, 2 ) NOT NULL COMMENT 订单金额,PRIMARY KEY ( order_id ) USING BTREE );有了这些基础信息可以先来进行t_order表的分片配置了不考虑其他因素这里先Run起来 分片规则配置 设定好分片规则接着编写逻辑表t_order的分片规则的配置我分别使用yml配置和Java编码两种方式做了实现。要注意的是两种方式不要并存不然启动会报错。 yml配置方式 使用yml配置相对简单易用比较直观适合对分库分表要求不太复杂的场景完整配置如下 spring:shardingsphere:datasource:# 数据源名称多数据源以逗号分隔 ,放在第一个的数据源为未配置分片规则表的默认数据源names: db0 , db1# 名称与上边 names 保持一致db0:....db1:....# 具体规则配置rules:sharding:# 分片算法定义sharding-algorithms:# 自定义分片算法名称t_order_database_algorithms:# 分片算法类型type: INLINE# 自定义参数props:algorithm-expression: db$-{order_id % 2}t_order_table_algorithms:type: INLINEprops:algorithm-expression: t_order_$-{order_id % 1000}t_order_mod:type: MODprops:# 指定分片数量sharding-count: 1000# 分布式序列算法配置key-generators:t_order_snowflake:type: SNOWFLAKE# 分布式序列算法属性配置props:worker-id: 1tables:# 逻辑表名称t_order:# 数据节点数据库.分片表actual-data-nodes: db$-{0..1}.t_order_$-{1..1000}# 分库策略database-strategy:standard:# 分片列名称sharding-column: order_id# 分片算法名称sharding-algorithm-name: t_order_database_algorithms# 分表策略table-strategy:standard:# 分片列名称sharding-column: order_id# 分片算法名称sharding-algorithm-name: t_order_table_algorithms# 主键生成策略keyGenerateStrategy:column: order_idkeyGeneratorName: t_order_snowflake# 属性配置props:# 展示修改以后的sql语句sql-show: trueJava编码方式 使用Java编码方式更加灵活和可扩展可以根据业务定制分片规则适合对分库分表有特殊需求或需要动态调整的场景。 /*** 公众号程序员小富*/ Configuration public class ShardingConfiguration {/*** 配置分片数据源* 公众号程序员小富*/Beanpublic DataSource getShardingDataSource() throws SQLException {MapString, DataSource dataSourceMap new HashMap();dataSourceMap.put(db0, dataSource0());dataSourceMap.put(db1, dataSource1());// 分片rules规则配置ShardingRuleConfiguration shardingRuleConfig new ShardingRuleConfiguration();// 分片算法shardingRuleConfig.setShardingAlgorithms(getShardingAlgorithms());// 配置 t_order 表分片规则ShardingTableRuleConfiguration orderTableRuleConfig new ShardingTableRuleConfiguration(t_order, db${0..1}.t_order_${1..1000});orderTableRuleConfig.setTableShardingStrategy(new StandardShardingStrategyConfiguration(order_id, t_order_table_algorithms));orderTableRuleConfig.setDatabaseShardingStrategy(new StandardShardingStrategyConfiguration(order_id, t_order_database_algorithms));shardingRuleConfig.getTables().add(orderTableRuleConfig);// 是否在控制台输出解析改造后真实执行的 SQLProperties properties new Properties();properties.setProperty(sql-show, true);// 创建 ShardingSphere 数据源return ShardingSphereDataSourceFactory.createDataSource(dataSourceMap, Collections.singleton(shardingRuleConfig), properties);}/*** 配置数据源1* 公众号程序员小富*/public DataSource dataSource0() {HikariDataSource dataSource new HikariDataSource();dataSource.setDriverClassName(com.mysql.cj.jdbc.Driver);dataSource.setJdbcUrl(jdbc:mysql://127.0.0.1:3306/db0?useUnicodetruecharacterEncodingutf-8useSSLfalseserverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrue);dataSource.setUsername(root);dataSource.setPassword(123456);return dataSource;}/*** 配置数据源2* 公众号程序员小富*/public DataSource dataSource1() {HikariDataSource dataSource new HikariDataSource();dataSource.setDriverClassName(com.mysql.cj.jdbc.Driver);dataSource.setJdbcUrl(jdbc:mysql://127.0.0.1:3306/db1?useUnicodetruecharacterEncodingutf-8useSSLfalseserverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrue);dataSource.setUsername(root);dataSource.setPassword(123456);return dataSource;}/*** 配置分片算法* 公众号程序员小富*/private MapString, AlgorithmConfiguration getShardingAlgorithms() {MapString, AlgorithmConfiguration shardingAlgorithms new LinkedHashMap();// 自定义分库算法Properties databaseAlgorithms new Properties();databaseAlgorithms.setProperty(algorithm-expression, db$-{order_id % 2});shardingAlgorithms.put(t_order_database_algorithms, new AlgorithmConfiguration(INLINE, databaseAlgorithms));// 自定义分表算法Properties tableAlgorithms new Properties();tableAlgorithms.setProperty(algorithm-expression, db$-{order_id % 1000});shardingAlgorithms.put(t_order_table_algorithms, new AlgorithmConfiguration(INLINE, tableAlgorithms));return shardingAlgorithms;} } 上面我们在应用中编写好了分片规则现在就差在数据库实例中创建分片表了手动创建和管理1000张分片表确实是一个又脏又累的活反正我是不会干的 管理分片表 其实ShardingSphere内已经为我们提供了管理分片表的能力。 当一张逻辑表t_order被配置了分片规则那么接下来对逻辑表的各种DDL操作例如创建表、修改表结构等命令和数据会根据分片规则执行和存储到每个分片数据库和分片库中的相应分片表中以此保持整个分片环境的一致性。 不过使用Shardingsphere-jdbc管理分片表的过程中是需要我们手动编写对逻辑表的DDL操作的代码。我们来跑几个单元测试用例来观察实际的执行效果直接使用jdbcTemplate执行创建逻辑表t_order的SQL。 /*** author 公众号程序员小富* 自动创建分片表* date 2023/12/31 17:25*/ SpringBootTest class AutoCreateTablesTests {Resourceprivate JdbcTemplate jdbcTemplate;/*** 执行创建逻辑表的SQL会根据AutoTables的配置自动在对应的数据源内创建分片表* author 公众号程序员小富*/Testpublic void autoCreateOrderTableTest() {jdbcTemplate.execute(CREATE TABLE t_order (\n order_id bigint(20) NOT NULL,\n order_number varchar(255) NOT NULL,\n customer_id bigint(20) NOT NULL,\n order_date date NOT NULL,\n total_amount decimal(10,2) NOT NULL,\n PRIMARY KEY (order_id) USING BTREE\n ););} }根据之前配置的分片规则将会在两个数据库实例 db0 和 db1 中分别生成1000张命名为t_order_1到t_order_1000的分片表看到两个数据库均成功创建了1000张分片表。 在次执行更新t_order表SQL将字段order_number长度从 varchar(255)扩展到 varchar(500)执行SQL看下效果。 /*** author 公众号程序员小富* 自动创建分片表* date 2023/12/31 17:25*/ SpringBootTest class AutoCreateTablesTests {Resourceprivate JdbcTemplate jdbcTemplate;Testpublic void autoModifyOrderTableTest() {jdbcTemplate.execute(ALTER TABLE t_order MODIFY COLUMN order_number varchar(500););} }通过查看两个分片库我们成功地将所有分片表的order_number字段长度更改为了varchar(500)在控制台日志中可以看到它是通过在每个分片库内依次执行了1000次命令实现的。 Shardingsphere-jdbc实现分库分表时可以采用这种默认的方式来管理分片表。但要注意的是由于涉及到不同的数据库实例如果不使用第三方的分布式事务管理工具例如Seata等执行过程是无法保证事务一致性的。 自定义管理分片表 上边为逻辑表配置分片规则应用程序内执行对逻辑表的DDL操作就可以很轻松的管理分片表。 自定义 不过默认的分片管理还是有局限性的我们在设计分片规则时往往会根据不同的业务维度来划分例如按天、月、按季度生成分片表并分布到不同数据源中等。这样就需要一些自定义的规则来实现。 ShardingSphere 5.X版本后推出了一种新的管理分片配置方式AutoTable。设置了AutoTable的逻辑表将交由ShardingSphere自动管理分片用户只需要指定分片数量和使用的数据库实例无需再关心表的具体分布配置格式如下 spring:shardingsphere:# 数据源配置datasource:......# 具体规则配置rules:sharding:# 逻辑表分片规则tables:# 逻辑表名称t_order:.....# 自动分片表规则配置auto-tables:t_order: # 逻辑表名称actual-data-sources: db$-{0..1}sharding-strategy: # 切分策略standard: # 用于单分片键的标准分片场景sharding-column: order_id # 分片列名称sharding-algorithm-name: t_order_mod # 自动分片算法名称ShardingSphere-Jdbc中配置使用auto-tables主要两个参数actual-data-sources指定数据源分布由于是管理分片表所以只需数据源信息即可sharding-strategy指具体采用何种算法来进行分片。 对逻辑表的DDL操作系统会首先检查是否配置了AutoTable如果已配置则优先采用配置的规则若未配置则将使用默认的逻辑表分片规则。 AutoTable支持ShardingSphere内置的全部自动分片算法所谓自动分片算法就是根据actualDataSources设置的数据源信息使用对应内置算法自行解析处理。 MOD取模分片算法HASH_MOD哈希取模分片算法VOLUME_RANGE基于分片容量的范围分片算法BOUNDARY_RANGE基于分片边界的范围分片算法AUTO_INTERVAL自动时间段分片算法 AutoTable使用 举个例子我们使用内置MOD取模算法作为AutoTable的分片算法同样是db0、db1两个实例中各创建1000张分片表。那么当对逻辑表的DDL操作时ShardingSphere会依据分片表编号t_order_0t_order_1999 % 数据库实例数取模来确认DDL命令路由到哪个实例中执行。 spring:shardingsphere:# 数据源配置datasource:.....# 具体规则配置rules:sharding:# 自动分片表规则配置auto-tables:t_order:actual-data-sources: db$-{0..1}sharding-strategy:standard:sharding-column: order_datesharding-algorithm-name: t_order_mod# 分片算法定义sharding-algorithms:t_order_mod:type: MODprops:# 指定分片数量sharding-count: 2000还是执行刚才创建表的单元测试会发现db0、db1两个实例中已经各自创建了1000张分片表但你会发现1000张表已经不再是按照顺序创建的了。 上边使用的是内置自动分片算法它对于我们来说是黑盒提供它方便我们拿来即用。不过如果想要做到更细粒度的管理分片表最好的办法就是自定义分片算法后续章节会介绍所有内置分片算法和自定义分片算法的使用。 总结 在使用ShardingSphere实现分库分表的时候要摒弃先建表、再配规则的传统思维要先确定规则在建表管理表是一件很简单的事我们只要告诉ShardingSphere分片数量和分布规则剩下的就让框架来处理就好了。 本文案例代码GitHub地址https://github.com/chengxy-nds/Springboot-Notebook/tree/master/shardingsphere101/shardingsphere-autocreate-table 我是小富 下期见 参考文献 https://shardingsphere.apache.org/https://www.bookstack.cn/read/shardingsphere-5.3.2-zh/ddd3efa082ed1ffc.mdhttps://shardingsphere.apache.org/blog/cn/material/oct_12_6_autotable_your_butler-like_sharding_configuration_tool/https://community.sphere-ex.com/https://blog.csdn.net/qq_36641443/article/details/127343113
http://www.zqtcl.cn/news/200529/

相关文章:

  • 巴中建设厅网站电话seo是网络优化吗
  • 中国做投资的网站做网站的公司怎么推广
  • 专业的广州微网站建设移动应用开发干什么的
  • 网站运营有什么用常熟智能网站开发
  • 如何组建做网站的团队绍兴网站建设推广
  • 资讯类响应式网站模板深圳网站建设培训机构
  • 电子商务网站功能设计3d动画制作过程
  • 随机网站生成器win7asp+sql server 2008做网站
  • 金本网站建设设计江苏建筑业网
  • 校园网站建设的作用淄博网站建设网站推广优化
  • 域名过期了怎么办怎么找回网站校友录网站开发设计
  • 医疗 企业 网站建设seo网络优化是什么工作
  • e时代速递搜索引擎网站建设aso关键词搜索优化
  • 产品单页营销型网站模板龙华网站建设深圳信科
  • 建网站平台要多少钱投资公司取名字大全
  • 建设网站需要哪些设备重庆本地建站
  • 学做家常菜去那个网站专业制作网站制作
  • 合肥网站建设公网站程序如何上传
  • 潍坊网站建设招聘官方网站建设 在线磐石网络
  • 校友网站建设开一个网站的流程
  • 商业门户网站是什么意思哪家培训机构学校好
  • 青岛企业网站制作seo排名优化培训网站
  • 2018做网站还是app上海搜索seo
  • 网站建设用模板好吗罗湖网站制作费用
  • 网站图片延时加载app推广视频
  • 郑州设计师网站个人搭建网站要多少钱
  • 网站制作成品下载wordpress怎么更改样式
  • 河北省城乡和建设厅网站首页网站维护属于什么部门
  • 西安建网站公司哪家好网站导航条设计欣赏
  • 张家港网站网络优化济南网站建设0531soso