精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

ShardingSphere5.2.1生產級分庫分表實現

數據庫 MySQL
我們完成了在DailyMart中集成分庫分表功能的實踐,大家在實施分庫分表過程中一定要結合自己的業務實際選擇合理的分片鍵,分片鍵的好壞決定了你分庫分表架構方案的好壞。

大家好,我是飄渺。

隨著業務的不斷發展,DailyMart每天產生的銷售訂單已經達到了約100萬,并且呈持續增長趨勢。按照這樣的發展速度,每年的數據量將達到約4億左右。目前,DailyMart采用的是MySQL單表進行存儲,但鑒于業務的快速發展,我們迫切需要對其進行分庫分表的改造。今天,我們來探討如何實現分庫分表功能,以及相關的步驟和注意事項。

這是本系列文章的第31篇,歡迎持續關注。

對于分庫分表的相關知識,我的星球分庫分表專欄有詳細的介紹說明,強烈推薦大家加入學習。

分庫分表的核心在于合理選擇分片鍵以及快速定位非分片鍵的數據。

分片鍵的選擇

DailyMart作為一個ToC的業務系統,大部分業務訪問都是基于用戶ID進行的,比如登錄用戶查看自己的購買記錄等。因此,對于訂單模塊我們決定以用戶ID作為分片鍵。

在訂單模塊中,訂單主表 CUSTOMER_ORDER 和訂單明細表 ORDER_ITEM 是最核心的兩張表,由于它們經常會一起使用,我們也需要將訂單明細表的用戶字段 CUSTOMER_ID 作為分片鍵,以確保基于用戶維度的查詢在單個分片上完成。下面是一個示例SQL:

SELECT * FROM CUSTOMER_ORDER ORDER
LEFT JOIN ORDER_ITEM ITEM ON ORDER.order_sn = ITEM.order_sn
WHERE ORDER.customer_id = 2846741676215238657
ORDER BY create_time DESC LIMIT 10

非分片鍵查詢

既然確定使用用戶ID作為分片鍵,大部分查詢都需要帶上CUSTOMER_ID作為查詢條件。但在實際使用中,經常會根據訂單編號ORDER_SN進行精確查詢,比如庫存扣減、支付后的反查等。在默認情況下,根據訂單編號(非分片鍵)進行查詢將需要在所有分片上進行查詢,然后對結果進行聚合,顯然這樣的查詢效率是很低的。

為了解決這個問題,業界一般采用基因法來解決,即將分片鍵的信息保存在想要查詢的列中,這樣通過查詢的列就能直接知道數據所在的分片信息。

基因法的原理是 對一個數取余2的n次方,那么余數就是這個數的二進制的最后n位數。

以訂單表為例,對訂單表我們根據CUSOMER_ID將其拆成16張表,采用CUSOMER_ID % 16的方式來進行數據庫路由,這里的CUSOMER_ID % 16,其本質是CUSOMER_ID的最后4個bit位 log(16,2) = 4 決定這行數據落在哪個分片上,這4個bit就是分片基因。

基于這一理論,基因法有兩種具體的實現:

基因替換法

  1. 在生成訂單編號ORDER_SN時,先使用一種分布式ID生成算法生成前60bit
  2. 計算出分片基因:分庫基因是CUSTOMER_ID的最后4個bit,log(16,2) = 4,即1001
  3. 將分庫基因加入到ORDER_SN的最后4個bit(上圖中粉色部分)
  4. 拼裝成最終的64bit訂單ORDER_SN(上圖中藍色部分)

圖片

這樣保證了同一個用戶創建的所有訂單都落到了同一個分片上,ORDER_SN的最后4個bit都相同,通過CUSTOMER_ID %16 能夠定位到分片,通過ORDER_SN % 16也能定位到分片。

基因替換法可能會導致ORDER_SN重復,以雪花算法為例,假設同一個用戶在一毫秒內創建了 2 個訂單,這樣生產的序列號相差1,替換掉基因后對應的二進制都相同了,導致ORDER_SN也是重復的。但這種情況非常少見,除非是機器人刷單。當然如果要徹底杜絕訂單編號重復問題可以使用下面介紹的基因拼接法。

基因拼接法

基因拼接法更簡單,就是在構建訂單編號時直接將用戶基因拼接在生成的ID后面,即:ORDER_SN = string(ORDER_SN + CUSTOMER_ID)

假設開始生成的訂單號是3531318506608209922,用戶ID為2846741676215238658,那最終生成的編號為35313185066082099222846741676215238658。為了減少長度,我們可以只取用戶ID的最后6位進行拼接,生成的編號為3531318506608209922238658,這樣可以支持2^6=64個分片。

那么此時如果根據 ORDER_SN 進行查詢:

SELECT * FROM CUSTOMER_ORDER
WHERE ORDER_SN = '3531318506608209922238658';

由于字段 ORDER_SN 的設計中直接包含了分片鍵信息,所以我們可以直接通過分片鍵部分直接定位到分片上。

基因拼接法的缺點是,對應的鍵會變大一些,存儲也會相應變大,但是卻可以大大提升后續的查詢效率,這種空間換時間的設計,總體上看是非常值得的。

實際上淘寶的訂單號也是這樣構建的,如下圖所示,訂單的最后6位都是607041,所以大概率推測出:

  1. 淘寶訂單表的分片鍵是用戶 ID;
  2. 淘寶訂單表,訂單表的主鍵包含用戶 ID,也就是分片信息。這樣通過訂單號進行查詢,可以獲得分片信息,從而查詢 1 個分片就能得到最終的結果。

圖片

代碼實現

在DailyMart中選擇使用shardingsphere實現分庫分表功能,不過為了方便演示,我在這里只進行分表操作。

1、首先,將原始訂單表和訂單明細表分別拆成4個表

圖片

2、在訂單模塊基礎設施層中引入shardingsphere,

<dependency>
  <groupId>org.apache.shardingsphere</groupId>
  <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
  <version>5.2.1</version>
</dependency>

3、編寫復合分片算法,實現基于order_sn和customer_id的查詢

public class OrderGenComplexTableAlgorithm implements ComplexKeysShardingAlgorithm<Comparable<?>> {
  ...
    @Override
    public Collection<String> doSharding(Collection<String> availableTargetNames, ComplexKeysShardingValue<Comparable<?>> shardingValue) {

        Map<String, Collection<Comparable<?>>> columnNameAndShardingValuesMap = shardingValue.getColumnNameAndShardingValuesMap();

        Collection<String> result = new LinkedHashSet<>(availableTargetNames.size());

        if(MapUtils.isNotEmpty(columnNameAndShardingValuesMap)){
            // 獲取用戶ID
            Collection<Comparable<?>> userIdCollection = columnNameAndShardingValuesMap.get(USER_ID_COLUMN);
            //用戶分片
            if(CollectionUtils.isNotEmpty(userIdCollection)){
                userIdCollection.stream().findFirst().ifPresent(comparable -> {
                    long tableNameSuffix = (Long) comparable % shardingCount;
                    result.add(shardingValue.getLogicTableName() + "_" + tableNameSuffix);
                });
            }else {
                Collection<Comparable<?>> orderSnCollection = columnNameAndShardingValuesMap.get(ORDER_ID_COLUMN);
                orderSnCollection.stream().findFirst().ifPresent(comparable -> {
                    String orderSn = String.valueOf(comparable);
                    //獲取用戶基因
                    String substring = orderSn.substring(Math.max(0, orderSn.length() - 6));
                    long tableNameSuffix = Long.parseLong(substring) % shardingCount;
                    result.add(shardingValue.getLogicTableName() + "_" + tableNameSuffix);
                });
            }
        }
        return result;
    }
  ...
}

在上述代碼中,當通過用戶ID進行查詢時直接通過分片鍵取模定位分片,如果是基于訂單查詢先獲取用戶基因,再根據用戶基因取模定位分片。

4、在application.yaml中配置分庫分表

spring:
  shardingsphere:
    datasource:
      names: ds0
      ds0:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: org.mariadb.jdbc.Driver
    rules:
      sharding:
        sharding-algorithms:
          order-gen-complex-sharding:
            type: CLASS_BASED
            props:
              strategy: COMPLEX
              algorithmClassName: com.jianzh5.dailymart.module.order.infrastructure.config.OrderGenComplexTableAlgorithm
              sharding-count: 4
        tables:
          customer_order:
            actual-data-nodes: ds0.customer_order_$->{0..3}
            table-strategy:
              complex:
                sharding-algorithm-name: order-gen-complex-sharding
                sharding-columns: order_sn,customer_id
          order_item:
            actual-data-nodes: ds0.order_item_$->{0..3}
            table-strategy:
              complex:
                sharding-algorithm-name: order-gen-complex-sharding
                sharding-columns: order_sn,customer_id

通過上述步驟,在訂單模塊中已經集成了分庫分表功能,接下來編寫兩個接口對其進行測試。

測試

在訂單模塊的接口層我們定義了兩個接口用于模擬實際的業務場景:1、獲取指定用戶的訂單分頁列表;2、根據訂單編號獲取訂單詳情。

接口定義如下:

@Operation(summary = "根據用戶ID分頁查詢訂單")
@GetMapping("/api/pd/order/page")
public PageResponse<OrderRespDTO> pageQuery(@Valid OrderPageQueryDTO orderPageQueryDTO) {
  return orderService.findListByUserId(orderPageQueryDTO);
}


@Operation(summary = "根據訂單號查詢訂單詳情")
@GetMapping("/api/pd/order/{orderSn}")
public OrderRespDTO getOrderBySn(@PathVariable("orderSn") String orderSn) {
  return orderService.getOrderBySn(orderSn);
}

通過運行結果可知,根據用戶訂單獲取分頁列表時直接根據Customer_id取模,只需要一次查詢即可定位。

圖片

當根據訂單號查詢訂單詳情時,根據用戶基因取模,同樣也只需要一次查詢即可定位。

圖片圖片

小結

通過以上步驟,我們完成了在DailyMart中集成分庫分表功能的實踐,大家在實施分庫分表過程中一定要結合自己的業務實際選擇合理的分片鍵,分片鍵的好壞決定了你分庫分表架構方案的好壞。

責任編輯:武曉燕 來源: JAVA日知錄
相關推薦

2024-07-10 08:42:39

2020-07-30 17:59:34

分庫分表SQL數據庫

2019-11-12 09:54:20

分庫分表數據

2021-08-31 20:21:11

VitessMySQL分庫

2023-08-11 08:59:49

分庫分表數據數據庫

2020-11-18 09:39:02

MySQL數據庫SQL

2025-02-10 08:20:09

2024-07-26 00:16:11

2025-04-01 08:45:00

2024-11-15 09:54:58

2021-01-26 05:37:08

分庫分表內存

2020-07-28 09:04:09

NewSQL分庫分表

2022-07-11 08:16:47

NewSQL關系數據庫系統

2020-11-17 08:08:34

分庫分表

2013-07-26 10:08:35

創業創業心得

2019-01-16 14:00:54

數據庫分庫分表

2025-04-03 09:39:14

2021-03-01 10:10:39

數據遷移擴容

2019-07-31 09:27:23

數據庫MySQLSQL

2024-01-03 08:14:33

GreatSQLMyCat庫名字
點贊
收藏

51CTO技術棧公眾號

欧美高清电影在线看| 色狠狠av一区二区三区| 国产欧美日韩一区| 无码人妻一区二区三区线| 北条麻妃国产九九九精品小说| 欧美日韩精品一区二区| youjizz.com在线观看| 午夜视频在线播放| 看片的网站亚洲| 欧美激情视频给我| 亚洲ⅴ国产v天堂a无码二区| 亚洲一二av| 色综合久久中文综合久久牛| 超碰成人在线免费观看| 四虎在线免费看| 精品在线免费观看| 欧美壮男野外gaytube| 天天操夜夜操av| 日韩精品亚洲aⅴ在线影院| 精品视频123区在线观看| 拔插拔插海外华人免费| 天堂中文а√在线| 久久嫩草精品久久久久| 91精品天堂| 国产一级片一区二区| 黄色成人在线网站| xxav国产精品美女主播| 久久国产精品无码一级毛片| 国产剧情一区二区在线观看| 在线视频欧美精品| 国产黄视频在线| 伊人春色在线观看| 亚洲欧洲日本在线| 日本午夜一区二区三区| 欧美特黄一级视频| 国产一区高清在线| 国产精品视频久久久久| 91video| 伊人成人在线视频| 久久国产精品亚洲| 国产精品视频一区二区在线观看| 久久av影视| 亚洲韩国青草视频| 日本天堂在线播放| 欧美9999| 日韩三级视频在线看| 91欧美视频在线| 欧美日韩国产v| 欧美午夜www高清视频| 人妻久久久一区二区三区| 新版中文在线官网| 一区二区不卡在线播放 | 国产又粗又猛又爽| 蜜臀av一区二区| 国产精品久久久久久久久久久久久| 成人午夜免费影院| 欧美码中文字幕在线| 亚洲香蕉成人av网站在线观看| 一二三不卡视频| 神马午夜久久| 亚洲欧美国产日韩天堂区| 国产制服丝袜在线| 九九视频精品全部免费播放| 亚洲女同精品视频| аⅴ天堂中文在线网| 欧美美女视频| 久久中文字幕一区| 看片网站在线观看| 激情亚洲网站| 欧美专区在线观看| 中文字幕在线视频免费| 狠狠色丁香婷婷综合| 亚洲一区二区三区在线视频 | 日韩精品免费专区| 国产精品久久久久久久久男| 欧美性受xxx黑人xyx性爽| 秋霞电影一区二区| 51精品国产人成在线观看| 亚洲国产成人精品一区二区三区| 成人美女视频在线观看18| 九九99玖玖| 国产精品麻豆一区二区三区 | 国产三区二区一区久久| 五月婷婷六月丁香| 中文字幕欧美三区| www.-级毛片线天内射视视| 日本在线观看大片免费视频| 精品久久久久久久中文字幕| 国产极品美女高潮无套久久久| 国产成人精品123区免费视频| 欧美日韩1234| 50一60岁老妇女毛片| 国产伦精品一区二区三区视频 | 欧美老熟妇乱大交xxxxx| 精品国产乱码| 欧美剧在线观看| www.伊人久久| 国内精品伊人久久久久av影院 | 欧美黑人又粗又大又爽免费| 四虎视频在线精品免费网址| 亚洲第一区中文99精品| www在线观看免费视频| 亚洲一区二区| 国产91精品久久久| 国产精品日韩无码| 91女人视频在线观看| 亚洲第一综合网站| 亚洲精品mv| 日韩美女天天操| 久久美女免费视频| 黄色国产精品| 成人黄色免费网站在线观看| 少妇人妻一区二区| 亚洲精品国久久99热| 黑鬼大战白妞高潮喷白浆| 日韩精品一区二区三区中文在线| 亚洲欧美日韩区| 国产性一乱一性一伧一色| 免费人成精品欧美精品| 日韩 欧美一区二区三区| 欧美片一区二区| 国产精品免费观看| 亚洲人成网站色在线观看| 日日摸日日碰夜夜爽av| 欧美在线在线| 中文在线资源观看视频网站免费不卡| 青春草免费视频| 美女www一区二区| 久久久久久久久久久一区| 菠萝菠萝蜜在线视频免费观看| 色综合网站在线| 国模无码视频一区| 欧美 亚欧 日韩视频在线 | 玖玖精品视频| 精品高清视频| 青春草在线免费视频| 在线不卡欧美精品一区二区三区| 老头老太做爰xxx视频| 亚洲少妇在线| 国新精品乱码一区二区三区18| 黄a在线观看| 欧美日韩精品一区视频| 日本性高潮视频| 亚洲主播在线| 久久综合婷婷综合| 深夜成人在线| 日韩av在线一区二区| 国产精品theporn动漫| 国产麻豆精品一区二区| 精品日韩在线播放| 国产精品视频一区二区三区| 日韩视频免费观看| 一级久久久久久久| 1000精品久久久久久久久| 9l视频白拍9色9l视频| 青青草97国产精品麻豆| 国产精品久久国产精品99gif| 黄色毛片在线观看| 欧美综合天天夜夜久久| 91麻豆制片厂| 久久福利视频一区二区| 黄瓜视频免费观看在线观看www| 91精品福利观看| 色综合久久久888| 亚洲经典一区二区三区| 亚洲sss视频在线视频| 超碰97在线资源站| 国产亚洲高清视频| 奇米精品在线| 免费成人高清在线视频| 久久深夜福利免费观看| 国产视频手机在线观看| 一区二区三区日韩精品视频| 精品国产免费久久久久久婷婷| 伊人久久大香线蕉综合热线| 久久久精品国产一区二区三区| 在线中文字幕播放| 中文字幕日本欧美| 99精品视频免费看| 午夜av电影一区| 变态另类ts人妖一区二区| 老司机午夜精品| 国产在线xxxx| 中文字幕中文字幕精品| 国产精品午夜国产小视频| av大片在线| 日韩电影网在线| 中文字幕一二三四| 亚洲最新在线观看| www.av欧美| 国产自产v一区二区三区c| 国产真人做爰毛片视频直播| 综合伊思人在钱三区| 国产欧美日韩视频| 97人澡人人添人人爽欧美| 亚洲天堂成人在线视频| 99国产精品99| 欧美特级www| 国产极品国产极品| 久久婷婷色综合| 日本少妇一区二区三区| 久久婷婷麻豆| 成人午夜免费在线视频| 国产一区二区三区电影在线观看| 亚洲自拍av在线| 色8久久影院午夜场| 色综合久久久久久中文网| 九色在线免费| 日韩视频一区二区| 艳妇乳肉豪妇荡乳av无码福利| 亚洲一级片在线观看| jizz日本在线播放| 99精品欧美一区二区蜜桃免费 | 国产色播av在线| 久久精品国产69国产精品亚洲 | av亚洲精华国产精华| 中文字幕66页| 久久亚洲美女| 精品少妇在线视频| 中文字幕亚洲精品乱码| 日本一区二区精品视频| 红杏一区二区三区| 91在线网站视频| 国产黄色一区| 国产精品成人aaaaa网站| 高清视频在线观看三级| 欧美成人免费在线观看| 91caoporm在线视频| 亚洲欧美国产va在线影院| 蜜臀久久精品久久久久| 91精品欧美久久久久久动漫 | 久久av一区二区三区| 少妇一晚三次一区二区三区| 99久久九九| 先锋影音欧美| 欧美亚洲国产激情| 欧美一区二区在线视频观看| 欧美巨大xxxx| 国产一区免费观看| 99热这里只有精品首页| 国产欧美日韩视频| 精品亚洲a∨| 国产精品专区一| 91精品美女| 国产精品久久av| 视频一区在线免费看| 7m第一福利500精品视频| 在线观看男女av免费网址| 久久亚洲精品网站| 国产在线看片| 欧美另类极品videosbestfree| 黄色网页网址在线免费| 久久伊人精品视频| www.久久ai| 欧美高清无遮挡| 成人影音在线| 97av在线视频| 97se综合| 国产精品国产三级国产aⅴ浪潮| 精品成人av| 国产精品久久久久久久久免费| 成人亚洲网站| 91久久久久久| 超碰精品在线观看| 久久国产手机看片| 国产成人精品免费视| 日韩欧美一区二区三区四区五区| 国产真实有声精品录音| 亚洲色图自拍| 综合一区二区三区| cao在线观看| 久久精品30| 午夜在线观看av| 精品在线播放免费| 亚洲精品久久一区二区三区777 | 欧美日韩在线综合| 99热这里精品| 日韩av在线免费播放| 成人在线免费看| 欧美精品在线观看91| 日本不卡1234视频| 国产免费亚洲高清| 18国产精品| 日韩精品极品视频在线观看免费| 91日韩在线| 成人一区二区免费视频| 日本美女视频一区二区| 永久免费黄色片| 99v久久综合狠狠综合久久| jizz18女人高潮| 亚洲一区二区精品3399| 免费黄色网址在线| 777奇米四色成人影色区| 欧美 日韩 国产 精品| 亚洲图片在区色| 欧美人与禽性xxxxx杂性| 欧美在线激情网| 免费看一区二区三区| 欧美精品欧美精品| 欧美精品三区| 国产aaaaa毛片| 白白色亚洲国产精品| 欧美乱大交做爰xxxⅹ小说| 精品久久久久久亚洲国产300 | 久草在线资源站资源站| 国产精品久久一区主播| 99久久人爽人人添人人澡 | 久久精品久久99| 2020国产精品| 久久97人妻无码一区二区三区| 色噜噜狠狠色综合欧洲selulu| 国产成人精品亚洲精品色欲| 亚洲天堂色网站| 91九色在线播放| 91亚洲国产成人精品性色| 深爱激情综合网| 成人午夜免费在线视频| 久久er99热精品一区二区| 亚洲综合自拍网| 亚洲午夜久久久久久久久电影网| 中文字幕av久久爽| 精品网站999www| 丁香花高清在线观看完整版| 91嫩草在线视频| 日韩综合一区| 天天色综合天天色| www国产精品av| 日本一级淫片免费放| 日韩午夜电影在线观看| av在线免费观看网站| 欧洲亚洲在线视频| 国产精品久久久久av蜜臀| 特色特色大片在线| 九九视频精品免费| 色综合99久久久无码国产精品| 欧美日韩在线免费观看| 色偷偷在线观看| 欧美精品激情视频| 在线观看视频一区二区三区 | 亚洲区国产区| 折磨小男生性器羞耻的故事| 亚洲九九爱视频| 99riav国产| 欧美日韩成人黄色| 亚洲国产精品免费视频| 欧美日韩午夜爽爽| 国产精品一区一区| 国产乱国产乱老熟300| 91精品国产手机| av网站在线免费看推荐| 亚洲一区二区三区香蕉| 欧美日本二区| 精品伦一区二区三区| 亚洲国产一区二区视频| 亚洲国产精品久久人人爱潘金莲| 欧美人与物videos| 草草视频在线一区二区| 日本www在线视频| 2021中文字幕一区亚洲| 日本视频在线观看免费| 亚洲欧洲美洲在线综合| 日韩精品麻豆| 成年人免费观看的视频| 国内精品久久久久影院薰衣草 | 三级av在线播放| 国产成人精品在线| 久久麻豆精品| 日本黄色www| 香港成人在线视频| 精华区一区二区三区| 国产精品亚洲综合天堂夜夜| 久久福利影院| 日本少妇一区二区三区| 精品露脸国产偷人在视频| 黄色在线播放| 成人写真福利网| 亚洲国产高清一区| 人妻精品久久久久中文字幕| 欧美私人免费视频| 中文字幕伦理免费在线视频| 国产美女99p| 久久久久中文| 免费成人深夜夜行网站| 亚洲高清福利视频| 456成人影院在线观看| 人人妻人人澡人人爽精品欧美一区| 国产传媒一区在线| 国产高清中文字幕| 日韩在线观看网址| 欧美sss在线视频| 91精品无人成人www| 亚洲一区二区三区在线看| 男男电影完整版在线观看| 成人信息集中地欧美| 在线一区视频| 亚洲精品卡一卡二| 亚洲精品视频免费| 国产精选久久| 国产成人无码av在线播放dvd| 亚洲精品国产精华液|