ShardingSphere 集成 CosId 實戰

来源:https://www.cnblogs.com/Ahoo-Wang/archive/2022/05/06/ShardingSphere-Integration-CosId.html
-Advertisement-
Play Games

1.基本介紹 1.1.概念 高層模塊不能依賴於一個“具體化、細節化”的低層模塊,而是通過一個抽象的“規範/標準”建立兩者之間的依賴關係,簡言之就是:不依賴於實現,而是依賴於抽象。這裡“實現”一詞有的地方也稱為“細節”,在編碼中主要體現的是我們根據業務模型具體自定義的普通類,比如:員工類、商品類等。而 ...


ShardingSphere 集成 CosId

背景

在軟體系統演進過程中,隨著業務規模的增長 (TPS/存儲容量),我們需要通過集群化部署來分攤計算、存儲壓力。
應用服務的無狀態設計使其具備了伸縮性。在使用 Kubernetes 部署時我們只需要一行命令即可完成服務伸縮
(kubectl scale --replicas=5 deployment/order-service)。

但對於有狀態的資料庫就不那麼容易了,此時資料庫變成系統的性能瓶頸是顯而易見的。

分庫分表

從微服務的角度來理解垂直拆分其實就是微服務拆分。以限界上下文來定義服務邊界將大服務/單體應用拆分成多個自治的粒度更小的服務,因為自治性規範要求,資料庫也需要進行業務拆分。
但垂直拆分後的單個微服務依然會面臨 TPS/存儲容量 的挑戰,所以這裡我們重點討論水平拆分的方式。

分庫分表

資料庫分庫分表方案是邏輯統一,物理分區自治的方案。其核心設計在於中間層映射方案的設計 (上圖 Mapping),即分片演算法的設計。
幾乎所有編程語言都內置實現了散列表(java:HashMap/csharp:Dictionary/python:dict/go:map ...)。分片演算法跟散列表高度相似(hashCode),都得通過 key/shardingValue 映射到對應的槽位(slot)。

那麼 shardingValue 從哪裡來呢?CosId!!!

CosId:分散式 ID 生成器

CosId 旨在提供通用、靈活、高性能的分散式 ID 生成器。CosId 目前提供了以下三種演算法:

  • SnowflakeId : 單機 TPS 性能:409W/s , 主要解決 時鐘回撥問題機器號分配問題 並且提供更加友好、靈活的使用體驗。
  • SegmentId: 每次獲取一段 (Step) ID,來降低號段分發器的網路IO請求頻次提升性能,提供多種存儲後端:關係型資料庫、RedisZookeeper 供用戶選擇。
  • SegmentChainId(推薦):SegmentChainId (lock-free) 是對 SegmentId 的增強。性能可達到近似 AtomicLongTPS 性能:12743W+/s

shardingValue 問題解決了,但這就夠了嗎?ShardingSphere!!!

摘自 CosId 官網:https://github.com/Ahoo-Wang/CosId

ShardingSphere

Apache ShardingSphere 是一款開源分散式資料庫生態項目,由 JDBC、Proxy 和 Sidecar(規劃中) 3 款產品組成。其核心採用可插拔架構,通過組件擴展功能。對上以資料庫協議及 SQL 方式提供諸多增強功能,包括數據分片、訪問路由、數據安全等;對下原生支持 MySQL、PostgreSQL、SQL Server、Oracle 等多種數據存儲引擎。Apache ShardingSphere 項目理念,是提供資料庫增強計算服務平臺,進而圍繞其上構建生態。充分利用現有資料庫的計算與存儲能力,通過插件化方式增強其核心能力,為企業解決在數字化轉型中面臨的諸多使用難點,為加速數字化應用賦能。

摘自 Apache ShardingSphere 官網:https://shardingsphere.apache.org/index_zh.html

接下來進入本文的主要內容:如何基於 ShardingSphere 可插拔架構(SPI)來集成 CosId,以及應用配置指南。

安裝

Spring-Boot 應用 為例

  • ShardingSphere v5.1.0+

因為 ShardingSphere v5.1.0 PR,已經合併了 cosid-shardingsphere 模塊,所以只需要引用 ShardingSphere 依賴即可。

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
    <version>5.1.1</version>
</dependency>
  • ShardingSphere v5.0.0
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
    <version>5.0.0</version>
</dependency>
<dependency>
    <groupId>me.ahoo.cosid</groupId>
    <artifactId>cosid-shardingsphere</artifactId>
    <version>1.8.15</version>
</dependency>

分散式 ID

KeyGenerateAlgorithm

UML Class Diagram

KeyGenerateAlgorithm

上圖展示了目前所有 ShardingSphere 內置的 KeyGenerateAlgorithm 實現,這裡我們只講 CosIdKeyGenerateAlgorithm ,其他實現請閱讀https://shardingsphere.apache.org/document/current/cn/features/sharding/concept/key-generator/

CosIdKeyGenerateAlgorithm

配置

type: COSID

名稱 數據類型 說明 預設值
id-name String IdGenerator 的名稱(在 IdGeneratorProvider 中已註冊) __share__
as-string String 是否生成字元串類型的ID fasle
spring:
  shardingsphere:
    rules:
      sharding:
        key-generators:
          cosid:
            type: COSID
            props:
              id-name: __share__

分片演算法

ShardingAlgorithm

UML Class Diagram

ShardingAlgorithm

CosIdModShardingAlgorithm

CosId取模分片演算法

演算法說明

CosIdModShardingAlgorithm

單值分片鍵(PreciseShardingValue)演算法複雜度:O(1)

範圍值分片鍵(RangeShardingValue)演算法複雜度:O(N),其中N為範圍值個數。

性能基準測試

精確值/單值(PreciseShardingValue) 範圍值/多值(RangeShardingValue)

配置

type: COSID_MOD

名稱 數據類型 說明 預設值
logic-name-prefix String 邏輯表/數據源名首碼
mod int 除數
spring:
  shardingsphere:
    rules:
      sharding:
        sharding-algorithms:
          alg-name:
            type: COSID_MOD
            props:
              mod: 4
              logic-name-prefix: t_table_

CosIdIntervalShardingAlgorithm

基於間隔的時間範圍分片演算法。

演算法說明

CosIdIntervalShardingAlgorithm

精確值/單值分片鍵(PreciseShardingValue)演算法複雜度:O(1)

範圍值分片鍵(RangeShardingValue)演算法複雜度:O(N),其中N為範圍值單位時間個數。

性能基準測試

精確值/單值(PreciseShardingValue) 範圍值/多值(RangeShardingValue)

配置

type: COSID_INTERVAL

名稱 數據類型 說明 預設值
logic-name-prefix String 邏輯表/數據源名首碼
datetime-lower String 時間分片下界值,時間戳格式:yyyy-MM-dd HH:mm:ss
datetime-upper String 時間分片上界值,時間戳格式:yyyy-MM-dd HH:mm:ss
sharding-suffix-pattern String 分片真實表/數據源尾碼格式
datetime-interval-unit ChronoUnit 分片鍵時間間隔單位
datetime-interval-amount int 分片鍵時間間隔
ts-unit String 時間戳單位:SECOND/MILLISECOND MILLISECOND
zone-id String 分片鍵時區 ZoneId.systemDefault().getId()
spring:
  shardingsphere:
    rules:
      sharding:
        sharding-algorithms:
          alg-name:
            type: COSID_INTERVAL
            props:
              logic-name-prefix: logic-name-prefix
              datetime-lower: 2021-12-08 22:00:00
              datetime-upper: 2022-12-01 00:00:00
              sharding-suffix-pattern: yyyyMM
              datetime-interval-unit: MONTHS
              datetime-interval-amount: 1

CosIdSnowflakeIntervalShardingAlgorithm

演算法說明

我們知道 SnowflakeId 的位分區方式,SnowflakeId 可以解析出時間戳,即 SnowflakeId 可以作為時間,所以 SnowflakeId 可以作為 INTERVAL 的分片演算法的分片值。
(當沒有CreateTime可用作分片時[這是一個非常極端的情況],或者對性能有非常極端的要求時, 分散式ID主鍵 作為查詢範圍可能是持久層性能更好的選擇。 )

配置

type: COSID_INTERVAL_SNOWFLAKE

名稱 數據類型 說明 預設值
logic-name-prefix String 邏輯表/數據源名首碼
datetime-lower String 時間分片下界值,時間戳格式:yyyy-MM-dd HH:mm:ss
datetime-upper String 時間分片上界值,時間戳格式:yyyy-MM-dd HH:mm:ss
sharding-suffix-pattern String 分片真實表/數據源尾碼格式
datetime-interval-unit ChronoUnit 分片鍵時間間隔單位
datetime-interval-amount int 分片鍵時間間隔
id-name String IdGenerator 的名稱(在 IdGeneratorProvider 中已註冊) __share__
spring:
  shardingsphere:
    rules:
      sharding:
        sharding-algorithms:
          alg-name:
            type: COSID_INTERVAL_SNOWFLAKE
            props:
              logic-name-prefix: logic-name-prefix
              datetime-lower: 2021-12-08 22:00:00
              datetime-upper: 2022-12-01 00:00:00
              sharding-suffix-pattern: yyyyMM
              datetime-interval-unit: MONTHS
              datetime-interval-amount: 1
              id-name: cosid-name

總結

本文主要討論了分庫分表產生的背景以及如何基於 ShardingSphere 可插拔架構集成 CosId 的應用實戰。
ShardingSphere 採用可插拔架構,使得開發者非常方便的自定義滿足自身應用場景的功能擴展,如果你也對參與 ShardingSphere 社區貢獻感興趣請參考 https://shardingsphere.apache.org/community/cn/contribute/contributor/

閱讀源碼的小技巧之類圖

相信很多小伙伴在閱讀源碼過程中總是難以自拔的遍歷式以方法為單位一行行查看源碼的實現細節,以至於迷失在細節中(如果你還能堅持下來,那真是佩服你的毅力之堅韌!)。這樣的閱讀方式是非常糟糕的、低效的。
閱讀源碼跟閱讀書籍一樣有非常多的相似之處:先建立一個概覽圖(索引),然後再逐層往下精進。(自上而下的方式更有利於閱讀過程中不迷失在具體細節中)
推薦大家使用IDEA的插件 Diagrams 用於生成源碼級別的概覽圖:UML類圖。

引用說明

作者:Ahoo Wang (阿虎)

Github: https://github.com/Ahoo-Wang/

SmartSql(高性能、高生產力,超輕量級的ORM!): https://github.com/Ahoo-Wang/SmartSql

SmartCode(不只是代碼生成器!): https://github.com/Ahoo-Wang/SmartCode

CoSky 高性能、低成本微服務治理平臺 : https://github.com/Ahoo-Wang/CoSky

CosId 通用、靈活、高性能的分散式 ID 生成器 : https://github.com/Ahoo-Wang/CosId

Govern EventBus 歷經多年生產環境驗證的事件驅動架構框架: https://github.com/Ahoo-Wang/govern-eventbus


本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天做了一個案例,可以好好做做能夠將之前的內容結合起來,最主要的是能對組件化編碼流程有一個大概的清晰認知,這一套做下來,明天自己再做一遍複習一下,其實組件化流程倒是基本上沒什麼問題了,主要是很多vue的方法需要多熟悉一下,畢竟打破了之前的一些對於傳統js的認知,還需要多熟悉一下。 這兩天可能內容不是 ...
  • 大家好,我是半夏👴,一個剛剛開始寫文的沙雕程式員.如果喜歡我的文章,可以關註➕ 點贊 👍 加我微信:frontendpicker,一起學習交流前端,成為更優秀的工程師~關註公眾號:搞前端的半夏,瞭解更多前端知識! 點我探索新世界! 原文鏈接 ==>http://sylblog.xin/archi ...
  • 一、主要區別 1、{} 和 new Object() 除了本身創建的對象,都繼承了 Object 原型鏈上(Object.prototype)的屬性或者方法,eg:toString();當創建的對象相同時,可以說 {} 等價於 new Object() 。2、Object.create() 是將創建 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 1. 非同步編程的實現方式? JavaScript中的非同步機制可以分為以下幾種: 回調函數 的方式,使用回調函數的方式有一個缺點是,多個回調函數嵌套的時候會造成回調函數地獄,上下兩層的回調函數間的代碼耦合度太高,不利於代碼的可維護。 Pro ...
  • DOM 事件是處理 Web 頁面交互的基礎,是掌握前端開發技術的基礎。 W3C協會早在1988年就開始了DOM標準的制定,W3C DOM標準可以分為DOM1,DOM2,DOM3三個版本。 1.Html事件處理 原始事件模型,事件處理程式被設置為html控制項的性質值,一般是html控制項的 onclic ...
  • 背景 在我們日常工作中,代碼寫著寫著就出現下列的一些臭味。但是還好我們有SOLID這把‘尺子’, 可以拿著它不斷去衡量我們寫的代碼,除去代碼臭味。這就是我們要學習SOLID原則的原因所在。 設計的臭味 僵化性 具有聯動性,動一處,會牽連到其他地方 脆弱性 不敢改動,動一處,全局癱瘓 頑固性 不易改動 ...
  • SaaS賽道是一個超大賽道,足夠容納上萬家服務商,不太可能有哪個服務商能滿足所有場景,大部分SaaS服務商在某個垂直領域,提供差異化的產品和服務。SaaS產品大部分都是面向B端客戶,少部分面向C端客戶,本文主要講的B端SaaS產品。 B端SaaS產品的挑戰 B端SaaS產品為企業提供協同辦公的工具, ...
  • 1.基本介紹 裡斯科瓦(Barbara Liskov)使美國麻省理工學院電氣工程於電腦科學系資深教授,她是美國國家工程院院士,在程式語言、分散式計算、程式設計方法及軟體工程領域做出了卓越貢獻。裡斯科瓦於1987年提出了一個關於繼承的原則,也就是現在我們稱為的“里氏替換原則”。 里氏替換原則基於子類 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...