地址一二三中文乱码-美国免费成年视频网站-真人搞b直播视频

浅谈订单重构之 MySQL 分库分表实战篇
栏目分类
热点资讯

浅谈订单重构之 MySQL 分库分表实战篇

发布日期:2021-10-06 23:19    点击次数:151

一、背景

发布上篇文章浅谈订单重构之路之后,有很多小伙伴想知道,分库分表具体是如何实现的。那么这篇文章具体介绍下,分库分表实战。

二、目标

本文将完成如下目标:

* 分表数量: 256    分库数量: 4

* 以用户ID(user_id) 为数据库分片Key

* 最后测试订单创建,更新,删除, 单订单号查询,根据user_id查询列表操作。

架构图:

表结构如下:

CREATE TABLE `order_XXX` (   `order_id` bigint(20) unsigned NOT NULL,   `user_id` int(11) DEFAULT '0' COMMENT '订单id',   `status` int(11) DEFAULT '0' COMMENT '订单状态',   `booking_date` datetime DEFAULT NULL,   `create_time` datetime DEFAULT NULL,   `update_time` datetime DEFAULT NULL,   PRIMARY KEY (`order_id`),   KEY `idx_user_id` (`user_id`),   KEY `idx_bdate` (`booking_date`),   KEY `idx_ctime` (`create_time`),   KEY `idx_utime` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

注:  000<= XXX <= 255, 本文重点在于分库分表实践, 只保留具有代表性字段,其它场景可以在此基础上做改进。

全局唯一ID设计

要求:1.全局唯一 2:粗略有序 3:可反解出库编号

1bit + 39bit时间差 + 8bit机器号 + 8bit用户编号(库号) + 8bit自增序列

订单号组成项 保留字段 毫秒级时间差 机器数 用户编号(表编号) 自增序列 所占字节(单位bit) 1 39 8 8 8

单机最大QPS: 256000 使用寿命: 17年

订单号生成规则说明详见 浅谈分布式唯一Id生成器之最佳实践

三、环境准备

1. 基本信息

2. 数据库环境准备

温馨提示:使用docker-compose快速搭建了4主4从数据库集群,实现本地快速一键部署,生产环境一般由DBA同学搭建。

具体实现请移步查看: https://gitee.com/bytearch_admin/docker-app/tree/main/mysql-cluster

3. 建库 & 导入分表

* 在mysql master实例分别建库

172.30.1.21(   o rder_db_ 1) ,  172.30.1.22( order_db_2) ,

172.30.1.23( ord er_db_3) ,   172.30.1.24( order_db_4 )

*  依次导入建表SQL 命令为

mysql -uroot -pbytearch -h172.30.1.21 order_db_1<fast-cloud-mysql-sharding/doc/sql/order_db_1.sql; mysql -uroot -pbytearch -h172.30.1.22 order_db_2<fast-cloud-mysql-sharding/doc/sql/order_db_2.sql; mysql -uroot -pbytearch -h172.30.1.23 order_db_3<fast-cloud-mysql-sharding/doc/sql/order_db_3.sql; mysql -uroot -pbytearch -h172.30.1.24 order_db_4<fast-cloud-mysql-sharding/doc/sql/order_db_4.sql;   
四、配置&实践

1. pom文件 

<!-- mango 分库分表中间件 -->        <dependency>           <groupId>org.jfaster</groupId>           <artifactId>mango-spring-boot-starter</artifactId>           <version>2.0.1</version>       </dependency>            <!-- 分布式ID生成器 -->       <dependency>           <groupId>com.bytearch</groupId>           <artifactId>fast-cloud-id-generator</artifactId>           <version>${version}</version>       </dependency>        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->       <dependency>           <groupId>mysql</groupId>           <artifactId>mysql-connector-java</artifactId>           <version>6.0.6</version>       </dependency

2. 常量配置

package com.bytearch.fast.cloud.mysql.sharding.common;  /**  * 分库分表策略常用常量  */ public class ShardingStrategyConstant {     /**      * database 逻辑名称 ,真实库名为 order_db_XXX      */     public static final String LOGIC_ORDER_DATABASE_NAME = "order_db";     /**      * 分表数 256,一旦确定不可更改      */     public static final int SHARDING_TABLE_NUM = 256;      /**      * 分库数, 不建议更改, 可以更改,但是需要DBA迁移数据      */     public static final int SHARDING_DATABASE_NODE_NUM = 4; } 

3. yml 配置

4主4从数据库配置, 这里仅测试默认使用root用户密码,生产环境不建议使用root用户。

mango:   scan-package: com.bytearch.fast.cloud.mysql.sharding.dao   datasources:     - name: order_db_1       master:         driver-class-name: com.mysql.cj.jdbc.Driver         jdbc-url: jdbc:mysql://172.30.1.21:3306/order_db_1?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedState&connectTimeout=1000&socketTimeout=5000&useSSL=false         user-name: root         password: bytearch         maximum-pool-size: 10         connection-timeout: 3000       slaves:         - driver-class-name: com.mysql.cj.jdbc.Driver           jdbc-url: jdbc:mysql://172.30.1.31:3306/order_db_1?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedState&connectTimeout=1000&socketTimeout=5000&useSSL=false           user-name: root           password: bytearch           maximum-pool-size: 10           connection-timeout: 3000     - name: order_db_2       master:         driver-class-name: com.mysql.cj.jdbc.Driver         jdbc-url: jdbc:mysql://172.30.1.22:3306/order_db_2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedState&connectTimeout=1000&socketTimeout=5000&useSSL=false         user-name: root         password: bytearch         maximum-pool-size: 10         connection-timeout: 3000       slaves:         - driver-class-name: com.mysql.cj.jdbc.Driver           jdbc-url: jdbc:mysql://172.30.1.32:3306/order_db_2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedState&connectTimeout=1000&socketTimeout=5000&useSSL=false           user-name: root           password: bytearch           maximum-pool-size: 10           connection-timeout: 3000     - name: order_db_3       master:         driver-class-name: com.mysql.cj.jdbc.Driver         jdbc-url: jdbc:mysql://172.30.1.23:3306/order_db_3?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedState&connectTimeout=1000&socketTimeout=5000&useSSL=false         user-name: root         password: bytearch         maximum-pool-size: 10         connection-timeout: 3000       slaves:         - driver-class-name: com.mysql.cj.jdbc.Driver           jdbc-url: jdbc:mysql://172.30.1.33:3306/order_db_3?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedState&connectTimeout=1000&socketTimeout=5000&useSSL=false           user-name: root           password: bytearch           maximum-pool-size: 10           connection-timeout: 3000     - name: order_db_4       master:         driver-class-name: com.mysql.cj.jdbc.Driver         jdbc-url: jdbc:mysql://172.30.1.24:3306/order_db_4?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedState&connectTimeout=1000&socketTimeout=5000&useSSL=false         user-name: root         password: bytearch         maximum-pool-size: 10         connection-timeout: 3000       slaves:         - driver-class-name: com.mysql.cj.jdbc.Driver           jdbc-url: jdbc:mysql://172.30.1.34:3306/order_db_4?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedState&connectTimeout=1000&socketTimeout=5000&useSSL=false           user-name: root           password: bytearch           maximum-pool-size: 10           connection-timeout: 300 

4. 分库分表策略

1). 根据order_id为shardKey分库分表策略

package com.bytearch.fast.cloud.mysql.sharding.strategy;  import com.bytearch.fast.cloud.mysql.sharding.common.ShardingStrategyConstant; import com.bytearch.id.generator.IdEntity; import com.bytearch.id.generator.SeqIdUtil; import org.jfaster.mango.sharding.ShardingStrategy;  /**  * 订单号分库分表策略  */ public class OrderIdShardingStrategy implements ShardingStrategy<Long, Long> {     @Override     public String getDataSourceFactoryName(Long orderId) {         if (orderId == null 


首页 | 首页 | 地址一二三中文乱码 | 美国免费成年视频网站 | 真人搞b直播视频 |

Powered by 地址一二三中文乱码-美国免费成年视频网站-真人搞b直播视频 @2013-2021 RSS地图 HTML地图

Copyright 365站群 © 2013-2021 365建站器 版权所有