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
  • 1. 說明 /* Performs operations on System.String instances that contain file or directory path information. These operations are performed in a cross-pla ...
  • 視頻地址:【WebApi+Vue3從0到1搭建《許可權管理系統》系列視頻:搭建JWT系統鑒權-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設置鑒權屬性 /*jwt鑒權*/ "JwtSetting": { "Issuer" ...
  • 引言 集成測試可在包含應用支持基礎結構(如資料庫、文件系統和網路)的級別上確保應用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和記憶體中測試伺服器結合使用來支持集成測試。 簡介 集成測試與單元測試相比,能夠在更廣泛的級別上評估應用的組件,確認多個組件一起工作以生成預 ...
  • 在.NET Emit編程中,我們探討了運算操作指令的重要性和應用。這些指令包括各種數學運算、位操作和比較操作,能夠在動態生成的代碼中實現對數據的處理和操作。通過這些指令,開發人員可以靈活地進行算術運算、邏輯運算和比較操作,從而實現各種複雜的演算法和邏輯......本篇之後,將進入第七部分:實戰項目 ...
  • 前言 多表頭表格是一個常見的業務需求,然而WPF中卻沒有預設實現這個功能,得益於WPF強大的控制項模板設計,我們可以通過修改控制項模板的方式自己實現它。 一、需求分析 下圖為一個典型的統計表格,統計1-12月的數據。 此時我們有一個需求,需要將月份按季度劃分,以便能夠直觀地看到季度統計數據,以下為該需求 ...
  • 如何將 ASP.NET Core MVC 項目的視圖分離到另一個項目 在當下這個年代 SPA 已是主流,人們早已忘記了 MVC 以及 Razor 的故事。但是在某些場景下 SSR 還是有意想不到效果。比如某些靜態頁面,比如追求首屏載入速度的時候。最近在項目中回歸傳統效果還是不錯。 有的時候我們希望將 ...
  • System.AggregateException: 發生一個或多個錯誤。 > Microsoft.WebTools.Shared.Exceptions.WebToolsException: 生成失敗。檢查輸出視窗瞭解更多詳細信息。 內部異常堆棧跟蹤的結尾 > (內部異常 #0) Microsoft ...
  • 引言 在上一章節我們實戰了在Asp.Net Core中的項目實戰,這一章節講解一下如何測試Asp.Net Core的中間件。 TestServer 還記得我們在集成測試中提供的TestServer嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 ...
  • 在發現結果為真的WHEN子句時,CASE表達式的真假值判斷會終止,剩餘的WHEN子句會被忽略: CASE WHEN col_1 IN ('a', 'b') THEN '第一' WHEN col_1 IN ('a') THEN '第二' ELSE '其他' END 註意: 統一各分支返回的數據類型. ...
  • 在C#編程世界中,語法的精妙之處往往體現在那些看似微小卻極具影響力的符號與結構之中。其中,“_ =” 這一組合突然出現還真不知道什麼意思。本文將深入剖析“_ =” 的含義、工作原理及其在實際編程中的廣泛應用,揭示其作為C#語法奇兵的重要角色。 一、下劃線 _:神秘的棄元符號 下劃線 _ 在C#中並非 ...