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類圖。

引用說明


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

-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
  • 分組和樹形結構是不一樣的。 樹形結構是以遞歸形式存在。分組是以鍵值對存在的形式,類似於GroupBy這樣的形式。 舉個例子 ID NAME SEX Class 1 張三 男 1 2 李四 女 2 3 王二 男 1 當以Sex為分組依據時則是 Key Value 男 1 張三 男 1 3 王二 男 1 ...
  • NetCore中將SQLServer資料庫備份為Sql腳本 描述: 最近寫項目收到了一個需求, 就是將SQL Server資料庫備份為Sql腳本, 如果是My Sql之類的還好說, 但是在網上搜了一大堆, 全是教你怎麼操作SSMS的, 就很d疼! 解決方案: 通過各種查找資料, 還有一些老哥的幫助, ...
  • 我的Notion Clowd.Squirrel Squirrel.Windows 是一組工具和適用於.Net的庫,用於管理 Desktop Windows 應用程式的安裝和更新。 Squirrel.Windows 對 Windows 應用程式的實現語言沒有任何要求,甚至無需服務端即可完成增量更新。 ...
  • 轉載請註明來源 https://www.cnblogs.com/brucejiao/p/16188865.html 謝謝! 轉載請註明來源 https://www.cnblogs.com/brucejiao/p/16188865.html 謝謝! 轉載請註明來源 https://www.cnblog ...
  • 1. Netty源碼研究筆記(3)——Channel系列 依舊是通過先縱向再橫向的研究方法,在開篇中,我們發現不管是Sever還是Client,最終的啟動是通過調用channel的對應方法來完成的,而這個動作實際在channel綁定的eventLoop中執行。 接下來,我們繼續EchoSever、E ...
  • 大家好,今天給大家介紹一款輕量、快速、穩定可編排的組件式規則引擎框架LiteFlow。 一、LiteFlow的介紹 LiteFlow官方網站和代碼倉庫地址 官方網站:https://yomahub.com/liteflow Gitee托管倉庫:https://gitee.com/dromara/li ...
  • 我使用Spring AOP實現了用戶操作日誌功能 今天答辯完了,復盤了一下系統,發現還是有一些東西值得拿出來和大家分享一下。 需求分析 系統需要對用戶的操作進行記錄,方便未來溯源 首先想到的就是在每個方法中,去實現記錄的邏輯,但是這樣做肯定是不現實的,首先工作量大,其次違背了軟體工程設計原則(開閉原 ...
  • 《零基礎學Java》 繪製幾何圖形 Java可以分別使用 Graphics 和 Graphics2D 繪製圖形,Graphics類 使用不同的方法繪製不同的圖形(drawLine()方法可f以繪製線、drawRect()方法用於繪製矩形、drawOval()方法用於繪製橢圓形)。 Graphics類 ...
  • 本期教程人臉識別第三方平臺為虹軟科技,本文章講解的是人臉識別RGB活體追蹤技術,免費的功能很多可以自行搭配,希望在你看完本章課程有所收穫。 ...
  • 很多人都喜歡使用黑色的主題樣式,包括我自己,使用了差不多三年的黑色主題,但是個人覺得在進行視窗轉換的時候很廢眼睛。 比如IDEA是全黑的,然後需要看PDF或者WORD又變成白色的了,這樣來回切換導致眼睛很累,畢竟現在網頁以及大部分軟體的界面都是白色的。那麼還是老老實實的使用原來比較順眼的模式吧。 1 ...