主頁 > .NET開發 > 資料庫中間件ShardingSphere-Proxy(一)

資料庫中間件ShardingSphere-Proxy(一)

2022-03-28 06:01:10 .NET開發

1.現實中的問題

我們知道資料庫的資料,基本80%的業務是查詢,20%的業務涵蓋了增刪改,經過長期的業務變更和積累資料庫的資料到達了一定的數量之后,直接影響的是用戶與系統的互動,查詢時的速度,插入資料時的流暢度,系統的可用性,這些指標對用戶體驗都是會有影響的,不說用戶,你自己用是什么感覺?我經歷過且常見的無非以下幾個解決方案,從用戶,代碼,資料庫,不知道有沒有人跟我有相似的經歷

1.最簡單粗暴的就是從用戶下手,也就是通過業務的手段來約束,限定查詢時間,限定查詢條件,大批量需要申請后臺工程師匯出,不是說對這些方法嗤之以鼻,在某些場景下這樣也是不錯的方法.

2.檢查代碼,查詢陳述句什么的能優化的做下優化,這一點確實也是比較關鍵的,再好的架構和服務器,也頂不住遞回死回圈查詢這些.

3.結合一些資料庫監控工具或者對常用查詢的表,做一些資料庫基本的屬性設定,例如資料庫加索引,分磁區.

雖然確實可以使用這些技術手段來提升本身的查詢速度,但是達到一定量級,這些手段得到的改善也不是很大,因為資料的量是實實在在的存在,假設此時加上并發量的增大,資料庫引擎在查詢或者計算時,使用的是服務器的CPU和記憶體,當資源消耗過高時,直接降低系統可用性,往往這個時候就需要通過整體業務上的變通或者技術架構的轉換上來著手解決問題了,
然而現實中業務上的改變,可能在落實上會存在很大的問題,但是可以從技術架構上來嘗試解決,主要在代碼整體架構或者資料庫存盤架構解決了,我們主要介紹資料架構層面的方案,

1.分庫
  • 在水平分庫中,就是將資料庫中的表,存到不同的資料庫,但是不同庫的表數量和結構是一樣的,只是每個庫的資料都不一樣,沒有交集,庫的并集是全量資料

  • 在垂直分庫中,以表為依據,按照業務歸屬不同,將不同的表拆分到不同的庫中,不同的庫存盤的可能是不同的表,庫的并集是全量資料

2.分表
  • 水平分表就是將一張表分為多張表,表的結構都一樣,每個表的資料都不一樣,沒有交集,所有表的并集是全量資料;

  • 垂直分表將一張表欄位拆分為不同的表,合并起來就是整個全量資料,但是這種可以歸屬于設計之初的設計缺陷

雖然使用分庫分表可以一定程度解決上面所說的問題,但是分了之后也有可能再變大,總不能一直無腦拆分下去把,此時應該使用讀寫分離,也就是說讀寫分離應該是在分庫分表的基礎之上來實施的,

2.什么是ShardingSphere-Proxy?

ShardingSphere中一共有3個核心組件 ShardingSphere-JDBC 定位是一個Java的框架 、ShardingSphere-ProxyShardingSphere-Sidecar 還在開發中,我們主要介紹ShardingSphere-Proxy和ShardingSphere-Proxy的實際應用,

ShardingSphere-Proxy定位為透明化的資料庫代理端,提供封裝了資料庫二進制協議的服務端版本,用于完成對異構語言的支持,主要目的對資料庫實作分庫分表和讀寫分離,應用場景不管是傳統的單體專案,或者現有流行的微服務專案中都可以使用,但是目前只支持 MySQL 和 PostgreSQL , 它在整個系統架構中定位是一個資料庫中間件

在這里我們選擇使用ShardingSphere-Proxy中間件,來作為我們實作分庫分表的工具,寫這個的目的主要是記錄ShardingSphere-Proxy的使用和一些基本的概念,至于說具體分成什么樣,如果您只想知道到底是分表,還是分庫,又或者是分庫分表,我可能幫不了什么,但是您可以按照現在所困擾的問題展開分析,然后使用ShardingSphere-Proxy落地,

3.分庫分表方案

實作分庫分表的方案根據不同的需求可能會延伸出很多,但是我們在邏輯上抽象出2種,一種是行程內和業務系統集成,一種是拆分出分庫分表作為獨立行程

1.行程內方案

行程內的方案通常是將分庫分表實作業務放到系統內部,通常存在以下缺陷

  • 1.系統和分庫分表會存在資源競爭

  • 2.一個例外的話,另外一個也會例外,依賴性太強,

  • 3.無法適應異構,對其他語言的支持

2.行程外方案

行程外方案將分庫分表邏輯拆分,使用單獨的工具實作客戶端將請求發送到系統, 系統通過資料庫中間件在內部進行分庫分表邏輯,然后存盤資料庫,通常存在以下缺陷

  • 1.維護量上升

  • 2.相對行程內,性能會差一點,但是如果內網部署基本可以接受

4.ShardingSphere-Proxy基本概念

使用ShardingSphere-Proxy在進行實作分庫分表或者查詢時,主要有6個階段,這整個階段中的核心步驟是由中間件來實作的,

  • 1.選擇具體資料庫

  • 2.sql決議將中間件連接成為真實資料庫連接

  • 3.sql路由,選擇一個真實資料庫執行

  • 4.sql重寫優化

  • 5.sql執行真實資料庫獲取結果

  • 6.結果合并從多個表或者庫中獲取結果

用戶主要是針對路由規則的配置,實作將資料分片到不同表以及不同的庫,那我們應該思考如何對資料進行分片呢,需要哪些條件?

  • 1.分片鍵:資料表中的欄位,選擇以哪個欄位作為分片的條件,

  • 2.分片演算法:它的作用就是根據分片資料欄位如何去實作資料的分片,

5.專案環境及搭建

ShardingSphere-Proxy是由java開發,所以首先我們需要準備java的基本環境,

1.環境準備
  • 1.下載Mysql
  • 2.下載jdk1.8 提取碼:wgl2
  • 3.下載mysql-connector-java-5.1.47.jar
  • 4.下載ShardingSphere-Proxy
    • 4.1 使用tar命令解壓 tar zxvf apache-shardingsphere-5.0.0-shardingsphere-proxy-bin.tar.gz
    • 4.2 將下載的mysql-connector-java-5.1.47.jar 拷貝到lib目錄下
6.分庫分表配置
1.ShardingSphere-Proxy 分表

1.以資料采集資料庫的電源資訊資料表為例,如果沒有資料庫就創建資料庫

2.在ShardingSphere-Proxy中的conf下找到config-sharding.yaml組態檔進行配置

3.在config-sharding.yaml中配置資料庫連接

dataSources:
  dataacquisitionsources_0:
    url: jdbc:mysql://localhost:3306/dataacquisition?serverTimezone=UTC&useSSL=false
    username: root
    password: 123456
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
    minPoolSize: 1

4.配置表和資料的分片規則

    1. actualDataNodes節點用來配置分成幾張表{0..1}就是2張,如果配置10張那就{0..9}
    1. 如果多張表分表就使用多個邏輯表名和節點,注意一定要注意配置格式
rules:
- !SHARDING
  tables:
    powerinformation:# 邏輯表名
      actualDataNodes: dataacquisitionsources_0.powerinformation_${0..1} #分表
      tableStrategy: #資料分表策略
        standard:
          shardingColumn: id #分表欄位
          shardingAlgorithmName: powerinformation_MOD
  shardingAlgorithms:
    powerinformation_MOD:
      type: MOD
      props:
        sharding-count: 2

5.配置客戶端連接虛擬資料庫,一般和真實庫名對應

schemaName: dataacquisition

6.打開配置目錄的server.yaml組態檔,來設定用戶和密碼

rules:
  - !AUTHORITY
    users:
      - root@%:root
      - sharding@:sharding
    provider:
      type: ALL_PRIVILEGES_PERMITTED

7.啟動bin目錄下的start.bat,如果出現以下畫面,那么恭喜你中間件被成功配置

8.使用客戶端連接虛擬服務器3307埠

9.執行腳本在虛擬服務器上創建表結構,那么中間件會默認按照預定的規則分表

create table powerinformation
(
 id int not null  AUTO_INCREMENT PRIMARY key,
 Station Text,
 voltage DECIMAL,
 resistance DECIMAL,
 electricity DECIMAL,
 createDate DATETIME
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=2
;

10.打開客戶端查看真實庫已經分表成功

2.ShardingSphere-Proxy 分庫

1.創建2個資料庫分別取名為dataacquisition_0和dataacquisition_1

2.打開組態檔,對代理配置不同資料庫連接

dataSources:
  dataacquisitionsources_0:
    url: jdbc:mysql://127.0.0.1:3306/dataacquisition_0?serverTimezone=UTC&useSSL=false #連接庫0
    username: root
    password: sa@123456
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
    minPoolSize: 1
  dataacquisitionsources_1:
    url: jdbc:mysql://127.0.0.1:3306/dataacquisition_1?serverTimezone=UTC&useSSL=false #連接庫1
    username: root
    password: sa@123456
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
    minPoolSize: 1  

3.配置分庫規則,由于現在是2個不同的庫,所以不需要配置資料分到表的規則

rules:
- !SHARDING
  tables:
    powerinformation:
      actualDataNodes: dataacquisitionsources_${0..1}.powerinformation  #庫名運算式
      databaseStrategy: #資料分庫策略
          standard:
            shardingColumn: id
            shardingAlgorithmName: powerinformation_MOD     
  shardingAlgorithms:
    powerinformation_MOD:
      type: MOD
      props:
        sharding-count: 2

4.在虛擬庫中添加表和資料將會分配到2個不同的庫

3.ShardingSphere-Proxy 分庫分表

1.按照分庫的操作執行,分庫配置不變
2.組態檔配置分庫分表的規則

rules:
- !SHARDING
  tables:
    powerinformation:
      actualDataNodes: dataacquisitionsources_${0..1}.powerinformation_${0..1}
      tableStrategy:
        standard:
          shardingColumn: id
          shardingAlgorithmName: powerinformation_MOD
      databaseStrategy:
          standard:
            shardingColumn: id
            shardingAlgorithmName: powerinformation_MOD     
  shardingAlgorithms:
    powerinformation_MOD:
      type: MOD
      props:
        sharding-count: 2
7.搭建常見問題

1.由于是yaml檔案,一定要注意對應節點的格式對齊

2.建議使用大于等于5.0.0+版本 折騰4.0.0版本被惡心吐了

3.如果出現 near 0這種錯誤就是在配置中使用了特殊符號 建議使用 下劃線的"_"

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/450323.html

標籤:.NET技术

上一篇:.Net Core IOC(依賴注入)

下一篇:[WPF] 假裝可變字體

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more