中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

網(wǎng)站調(diào)優(yōu)技能企業(yè)培訓(xùn)考試系統(tǒng)app

網(wǎng)站調(diào)優(yōu)技能,企業(yè)培訓(xùn)考試系統(tǒng)app,網(wǎng)站建設(shè)公司如何規(guī)避風(fēng)險(xiǎn),鮮花網(wǎng)站建設(shè)項(xiàng)目概述ShardingSphere 是一款開源的分布式數(shù)據(jù)庫(kù)中間件,支持分庫(kù)分表、讀寫分離、分布式事務(wù)等核心功能,兼容 MySQL、PostgreSQL、Oracle 等主流數(shù)據(jù)庫(kù)。本文將從基礎(chǔ)概念、環(huán)境搭建、核心配置、業(yè)務(wù)開發(fā)、常見(jiàn)問(wèn)題五個(gè)維度,提供一套完整的分庫(kù)分表…

ShardingSphere 是一款開源的分布式數(shù)據(jù)庫(kù)中間件,支持分庫(kù)分表、讀寫分離、分布式事務(wù)等核心功能,兼容 MySQL、PostgreSQL、Oracle 等主流數(shù)據(jù)庫(kù)。本文將從基礎(chǔ)概念、環(huán)境搭建、核心配置、業(yè)務(wù)開發(fā)、常見(jiàn)問(wèn)題五個(gè)維度,提供一套完整的分庫(kù)分表實(shí)戰(zhàn)教程。


?一、分庫(kù)分表核心概念?

?1. 為什么需要分庫(kù)分表???

隨著業(yè)務(wù)數(shù)據(jù)量增長(zhǎng),單庫(kù)單表面臨性能瓶頸(QPS 上限、存儲(chǔ)容量限制),分庫(kù)分表通過(guò)水平拆分?(按規(guī)則將數(shù)據(jù)分散到多個(gè)庫(kù)/表)解決以下問(wèn)題:

  • ?存儲(chǔ)瓶頸?:單庫(kù)存儲(chǔ)容量有限(如 MySQL 單庫(kù)建議不超過(guò) 500GB)。
  • ?查詢性能?:單表數(shù)據(jù)量過(guò)大(如超過(guò) 1000 萬(wàn)行)時(shí),SQL 查詢變慢。
  • ?寫入壓力?:單庫(kù)寫入 QPS 受限于硬件(如單機(jī) MySQL 寫入約 2000~5000 QPS)。
?2. 分庫(kù)分表的核心術(shù)語(yǔ)?
?術(shù)語(yǔ)??說(shuō)明?
?數(shù)據(jù)分片?將數(shù)據(jù)分散到多個(gè)庫(kù)/表的過(guò)程,分為垂直分片?(按業(yè)務(wù)拆分庫(kù))和水平分片?(按規(guī)則拆分表)。
?分片鍵(Shard Key)??決定數(shù)據(jù)分布的關(guān)鍵字段(如用戶 ID、訂單 ID),需保證數(shù)據(jù)均勻分布。
?分片算法?定義數(shù)據(jù)如何根據(jù)分片鍵分配到具體庫(kù)/表的規(guī)則(如哈希取模、范圍劃分、時(shí)間范圍)。
?分片規(guī)則?分片鍵與分片算法的組合,ShardingSphere 通過(guò)規(guī)則文件(rules 目錄)配置。

?二、環(huán)境搭建(以 Spring Boot + MySQL 為例)??

?1. 前置準(zhǔn)備?
  • JDK 1.8+
  • Maven 3.6+
  • MySQL 5.7+(需創(chuàng)建 2 個(gè)庫(kù),每個(gè)庫(kù) 2 張表,用于演示分庫(kù)分表)
  • ShardingSphere 5.3.2(最新穩(wěn)定版,支持 SPI 擴(kuò)展和云原生)
?2. 創(chuàng)建測(cè)試數(shù)據(jù)庫(kù)與表?

假設(shè)業(yè)務(wù)需求:將 order 表按 user_id 分片到 2 個(gè)庫(kù)(ds0ds1),每個(gè)庫(kù)內(nèi)分 2 張表(order_0、order_1)。

?步驟 1:創(chuàng)建庫(kù)?

CREATE DATABASE ds0;
CREATE DATABASE ds1;

?步驟 2:在每個(gè)庫(kù)中創(chuàng)建分表?

-- ds0 庫(kù)名
USE ds0;
CREATE TABLE order_0 (order_id BIGINT PRIMARY KEY,user_id BIGINT NOT NULL,amount DECIMAL(10,2),create_time DATETIME
);CREATE TABLE order_1 (order_id BIGINT PRIMARY KEY,user_id BIGINT NOT NULL,amount DECIMAL(10,2),create_time DATETIME
);-- ds1 庫(kù)名(結(jié)構(gòu)與 ds0 相同)
USE ds1;
CREATE TABLE order_0 (...); -- 同 ds0.order_0
CREATE TABLE order_1 (...); -- 同 ds0.order_1
?3. 引入 ShardingSphere 依賴?

pom.xml 中添加 Spring Boot Starter 依賴:

<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId><version>5.3.2</version>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope>
</dependency>

?三、核心配置:分庫(kù)分表規(guī)則?

ShardingSphere 的配置分為數(shù)據(jù)源配置分片規(guī)則配置,支持 YAML、Properties、Java Config 三種方式。以下以 YAML 為例(application.yml):

?1. 數(shù)據(jù)源配置(多數(shù)據(jù)源)??

ShardingSphere 需要連接多個(gè)物理數(shù)據(jù)庫(kù)(ds0、ds1),需在 dataSources 中定義:

spring:shardingsphere:datasources:ds0: # 第一個(gè)物理庫(kù)driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/ds0?serverTimezone=UTC&useSSL=false&characterEncoding=utf-8username: rootpassword: 123456ds1: # 第二個(gè)物理庫(kù)driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/ds1?serverTimezone=UTC&useSSL=false&characterEncoding=utf-8username: rootpassword: 123456
?2. 分片規(guī)則配置(核心)??

分片規(guī)則需定義庫(kù)分片規(guī)則?(將數(shù)據(jù)分配到哪個(gè)庫(kù))和表分片規(guī)則?(將數(shù)據(jù)分配到庫(kù)內(nèi)的哪張表)。

?示例:按 user_id 分片到 2 庫(kù) 2 表?

spring:shardingsphere:rules:sharding:# 庫(kù)名分片規(guī)則(示例:user_id 哈希取模 2,分配到 ds0 或 ds1)database-strategy:standard:sharding-column: user_id  # 分片鍵sharding-algorithm-name: db-inline  # 分片算法名稱(對(duì)應(yīng)下方 algorithms)# 表名分片規(guī)則(示例:user_id 哈希取模 2,分配到 order_0 或 order_1)table-strategy:standard:sharding-column: user_id  # 分片鍵(需與庫(kù)分片鍵一致,也可不同)sharding-algorithm-name: table-inline  # 分片算法名稱# 分片算法定義(內(nèi)聯(lián)表達(dá)式)sharding-algorithms:db-inline:type: INLINE  # 內(nèi)聯(lián)算法(支持 SpEL 表達(dá)式)props:algorithm-expression: ds$->{user_id % 2}  # user_id % 2 結(jié)果為 0 → ds0,1 → ds1table-inline:type: INLINEprops:algorithm-expression: order_$->{user_id % 2}  # user_id % 2 結(jié)果為 0 → order_0,1 → order_1
?3. 關(guān)鍵配置說(shuō)明?
  • ?分片鍵(sharding-column)??:必須選擇高頻查詢的字段(如 user_id),避免跨分片查詢(如按 order_id 查詢需全庫(kù)掃描)。
  • ?分片算法(sharding-algorithm)??:
    • INLINE:內(nèi)聯(lián)算法,通過(guò) SpEL 表達(dá)式靈活定義(如 ds$->{user_id % 2})。
    • HASH_MOD:哈希取模(等價(jià)于 INLINE$->{... % 2})。
    • RANGE:范圍劃分(如按時(shí)間范圍分片:2023-01-01 ~ 2023-06-01order_0)。
  • ?庫(kù)表分離策略?:庫(kù)分片和表分片可獨(dú)立配置(如庫(kù)按 user_id 分片,表按 order_id 分片)。

?四、業(yè)務(wù)開發(fā):CRUD 操作?

ShardingSphere 通過(guò)透明化路由屏蔽分庫(kù)分表細(xì)節(jié),業(yè)務(wù)代碼無(wú)需感知分片邏輯,僅需操作邏輯表名(如 order)即可。

?1. 使用 MyBatis-Plus 操作分片表?

假設(shè)使用 MyBatis-Plus 作為 ORM 框架,只需定義邏輯表對(duì)應(yīng)的實(shí)體類和 Mapper:

?實(shí)體類(Order)??:

@Data
@TableName("order") // 邏輯表名(無(wú)需寫分表后綴)
public class Order {@TableId(type = IdType.AUTO)private Long orderId; // 主鍵(非分片鍵)private Long userId;  // 分片鍵(必須與配置的 sharding-column 一致)private BigDecimal amount;private LocalDateTime createTime;
}

?Mapper 接口?:

public interface OrderMapper extends BaseMapper<Order> {
}
?2. 插入數(shù)據(jù)(自動(dòng)路由)??

插入時(shí),ShardingSphere 根據(jù) user_id 計(jì)算分片鍵,自動(dòng)路由到目標(biāo)庫(kù)和表:

@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;public void createOrder(Long userId, BigDecimal amount) {Order order = new Order();order.setOrderId(SnowflakeUtil.nextId()); // 自增主鍵或雪花算法生成order.setUserId(userId);order.setAmount(amount);order.setCreateTime(LocalDateTime.now());orderMapper.insert(order); // 自動(dòng)路由到 ds0/order_0 或 ds1/order_1}
}
?3. 查詢數(shù)據(jù)(路由與聚合)??
  • ?按分片鍵查詢?(高效):

    // 根據(jù) user_id 查詢訂單(ShardingSphere 自動(dòng)路由到對(duì)應(yīng)庫(kù)和表)
    List<Order> orders = orderMapper.selectList(Wrappers.<Order>lambdaQuery().eq(Order::getUserId, 123L)); 
  • ?跨分片查詢?(低效,需避免):

    // 不按分片鍵查詢(如按 order_id),需掃描所有庫(kù)和表,結(jié)果合并
    Order order = orderMapper.selectById(12345L); 

?五、高級(jí)功能與優(yōu)化?

?1. 讀寫分離?

ShardingSphere 支持主庫(kù)寫、從庫(kù)讀,通過(guò) readwrite-splitting 規(guī)則配置:

spring:shardingsphere:rules:readwrite-splitting:data-sources:ds0:dynamic: true  # 動(dòng)態(tài)切換主從write-data-source-name: ds0-write  # 主庫(kù)read-data-source-names: [ds0-read-1, ds0-read-2]  # 從庫(kù)ds1:dynamic: truewrite-data-source-name: ds1-writeread-data-source-names: [ds1-read-1, ds1-read-2]load-balance:algorithm-type: ROUND_ROBIN  # 從庫(kù)負(fù)載均衡策略(輪詢、隨機(jī)等)
?2. 分布式事務(wù)?

ShardingSphere 支持 ?Seata AT 模式實(shí)現(xiàn)跨庫(kù)事務(wù),需引入 Seata 依賴并配置:

<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-integration-seata-core</artifactId><version>5.3.2</version>
</dependency>

?業(yè)務(wù)代碼示例?:

@GlobalTransactional // Seata 全局事務(wù)注解
public void createOrderWithTx(Long userId, BigDecimal amount) {orderService.createOrder(userId, amount); // 寫庫(kù)操作accountService.deductBalance(userId, amount); // 跨庫(kù)扣減余額(觸發(fā)分布式事務(wù))
}
?3. 監(jiān)控與管理?

ShardingSphere 提供 ?Admin Console?(管理控制臺(tái))用于監(jiān)控和配置:

  • 訪問(wèn)地址:http://localhost:8088(默認(rèn)端口)
  • 功能:查看數(shù)據(jù)源狀態(tài)、分片規(guī)則、SQL 執(zhí)行統(tǒng)計(jì)、在線修改配置(無(wú)需重啟)。

?六、常見(jiàn)問(wèn)題與解決方案?

?1. 跨分片查詢性能差?

?原因?:未按分片鍵查詢時(shí),需掃描所有庫(kù)和表,導(dǎo)致網(wǎng)絡(luò)開銷和結(jié)果合并耗時(shí)。
?解決方案?:

  • 業(yè)務(wù)設(shè)計(jì)時(shí),盡量通過(guò)分片鍵(如 user_id)過(guò)濾數(shù)據(jù)。
  • 對(duì)非分片鍵字段建立索引(如 order_id),減少全表掃描。
?2. 分片鍵選擇不當(dāng)導(dǎo)致數(shù)據(jù)傾斜?

?原因?:分片鍵分布不均(如 user_id 為連續(xù)遞增 ID),導(dǎo)致部分庫(kù)/表數(shù)據(jù)量過(guò)大。
?解決方案?:

  • 選擇高基數(shù)字段(如 UUID、雪花算法生成的 ID)作為分片鍵。
  • 使用范圍分片(如按時(shí)間范圍)替代哈希分片,避免熱點(diǎn)。
?3. 分布式事務(wù)一致性?

?原因?:跨庫(kù)事務(wù)需協(xié)調(diào)多個(gè)數(shù)據(jù)源,可能出現(xiàn)部分提交、部分回滾。
?解決方案?:

  • 使用 Seata AT 模式(自動(dòng)補(bǔ)償)或 TCC 模式(手動(dòng)確認(rèn))。
  • 優(yōu)先保證最終一致性(如異步消息補(bǔ)償)。

?總結(jié)?

ShardingSphere 分庫(kù)分表的核心是通過(guò)分片規(guī)則定義數(shù)據(jù)分布,業(yè)務(wù)代碼無(wú)需感知底層分片邏輯。關(guān)鍵步驟包括:

  1. 設(shè)計(jì)合理的分片鍵和分片算法(避免數(shù)據(jù)傾斜、跨分片查詢)。
  2. 配置多數(shù)據(jù)源和分片規(guī)則(YAML/Java Config)。
  3. 使用 ORM 框架透明操作邏輯表(如 MyBatis-Plus)。
  4. 結(jié)合讀寫分離、分布式事務(wù)優(yōu)化性能和一致性。

通過(guò)本文的實(shí)戰(zhàn)教程,可快速掌握 ShardingSphere 分庫(kù)分表的核心能力,應(yīng)對(duì)大數(shù)據(jù)量場(chǎng)景下的性能挑戰(zhàn)。

http://www.risenshineclean.com/news/65518.html

相關(guān)文章:

  • wordpress特定頁(yè)面重定向百度seo價(jià)格查詢系統(tǒng)
  • 重慶網(wǎng)站設(shè)計(jì)哪家公司好百度競(jìng)價(jià)托管
  • 設(shè)計(jì)一個(gè)b2c網(wǎng)站b站不收費(fèi)網(wǎng)站
  • 學(xué)編程做網(wǎng)站網(wǎng)絡(luò)推廣員的前景
  • 搜索引擎的營(yíng)銷方法搜索引擎優(yōu)化的主要特征
  • 如何幫助網(wǎng)站吸引流量營(yíng)銷外包
  • 網(wǎng)站配色的方案最新新聞事件今天疫情
  • 百度網(wǎng)站架構(gòu)seo綜合查詢?cè)趺从玫?/a>
  • 做網(wǎng)站建設(shè)推廣好做嗎手機(jī)上怎么制作網(wǎng)頁(yè)
  • 凡科網(wǎng)站怎么樣櫻花bt引擎
  • 長(zhǎng)安網(wǎng)站設(shè)計(jì)每日新聞
  • 網(wǎng)站被入侵后需做的檢測(cè)(1)網(wǎng)站建站推廣
  • 成都網(wǎng)站制作的公司高明搜索seo
  • 嶗山區(qū)建設(shè)管理局網(wǎng)站怎么了黑seo工作內(nèi)容
  • 網(wǎng)站開發(fā)建設(shè)總結(jié)seo技巧
  • wordpress企業(yè)站實(shí)操天津seo排名效果好
  • 做靜態(tài)網(wǎng)站的軟件電話營(yíng)銷技巧和營(yíng)銷方法
  • 諸城 建設(shè)外貿(mào)網(wǎng)站網(wǎng)站維護(hù)中
  • 自己做網(wǎng)站排名好嗎seo網(wǎng)站優(yōu)化技術(shù)
  • 云南企業(yè)網(wǎng)站代發(fā)qq群發(fā)廣告推廣
  • 成都網(wǎng)頁(yè)設(shè)計(jì)班百度seo系統(tǒng)
  • 做消費(fèi)信貸網(wǎng)站百度天眼查公司
  • 網(wǎng)站制作需求分析中國(guó)營(yíng)銷網(wǎng)
  • 手機(jī)微網(wǎng)站怎么做的開封網(wǎng)絡(luò)推廣哪家好
  • 效果型網(wǎng)站建設(shè)seo查詢5118
  • 織夢(mèng)如何做幾種語(yǔ)言的網(wǎng)站技術(shù)培訓(xùn)學(xué)校機(jī)構(gòu)
  • 自己做電臺(tái)直播的網(wǎng)站自己建網(wǎng)站流程
  • div css快速做網(wǎng)站西安seo外包行者seo06
  • 黑龍江省建設(shè)局網(wǎng)站太原做網(wǎng)站的
  • 如何做招聘網(wǎng)站分析google官方下載安裝