首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Cobar + MySQL 分庫分表中間件技術驗證報告(阿里巴巴實踐)

     編輯:Java 綜合教學

Cobar + MySQL 分庫分表中間件技術驗證報告(阿里巴巴實踐)

Cobar 是阿里巴巴早期開源的數據庫中間件,定位於透明化分庫分表:應用通過 MySQL 協議連接 Cobar,Cobar 根據分片規則將 SQL 路由至後端多個 MySQL 實例。本文記錄技術驗證全過程,含架構原理、部署配置、JDBC/iBatis 接入、查詢限制、擴容痛點及約束總結。

架構定位與優缺點

維度說明
角色Client ↔ Cobar Proxy ↔ MySQL Shards
透明性應用無感知物理分片,標準 JDBC 訪問
核心能力讀寫分離、負載均衡、高可用、SQL 過濾、路由、結果合併
優點配置簡單、擴展靈活(Proxy 橫向擴展)、客戶端零改造
缺點跨分片查詢效率低/不支援、Join/子查詢/跨分片分頁受限、擴容需人工數據遷移

驗證環境拓撲

  • MySQL:128 個 Database (cobar_1 ~ cobar_128),端口 3306,root/password
  • Cobar:IP 10.20.130.119,端口 8066,邏輯庫 cobar,用戶 root/12345
  • 分片表:q_reportkeywordsum,分片鍵 custid (INT)
  • 驅動要求:必須用 Cobar 附帶的 mysql-connector-java-5.1.6,5.1.13 會報錯

接入代碼實戰

原生 JDBC

String url = "jdbc:mysql://10.20.130.119:8066/cobar";
String driver = "com.mysql.jdbc.Driver"; // 5.1.6 版本
Connection con = DriverManager.getConnection(url, "root", "12345");
// 正常執行 Statement / PreparedStatement

Spring + iBatis 整合

<bean id="sqlMapClientTemplate" class="com.alibaba.cobar.client.CobarSqlMapClientTemplate">
    <property name="sqlMapClient" ref="sqlMapClient"/>
</bean>

<bean id="transactionManager" class="com.alibaba.cobar.client.transaction.MultipleDataSourcesTransactionManager">
    <!-- 替換標準 DataSourceTransactionManager -->
</bean>

核心使用約束(必讀)

  1. 分片鍵必須出現在 WHERE/VALUES 中:
    • SELECT/UPDATE/DELETE:WHERE custid = 123(只能用 =,不可範圍/子查詢)
    • INSERT:VALUES (..., 123, ...) 對應位置必須為具體值
  2. 缺少分片鍵 = 全表掃描 128 個分片:
    select count(*) from q_reportkeywordsum; 
    -- 返回 128 行結果,極慢,生產嚴禁
  3. 範圍查詢不支援:custid < 10 會報錯或結果錯誤
  4. 分片鍵設 NOT NULL:防止 INSERT 漏填導致全分片寫入
  5. 主鍵全局唯一:分片間主鍵可重複,需外部 ID 生成器(如 Redis 原子遞增)
  6. 不支援:DDL、事務、跨庫 Join/子查詢/分頁排序

分片函數與拓撲約束

  • 分片函數 F(x):單元或多元,但自變量必須來自同一張邏輯表的分片字段
  • 拆分函數值域元素數 ≤ 1024(即最多 1024 個分片)
  • 應用 ↔ Cobar 連接池保持時間建議 1 小時(防 F5/防火牆斷開)

擴容痛點與應對

場景:初始 64 分片,單表 20GB 觸頂,需擴至 128/256 分片。
現狀:Cobar 無內建平滑擴容方案,只能:

  1. 停寫或雙寫
  2. 人工按新規則導出/導入數據
  3. 修改 Cobar 配置文件 rule.xml 重載

建議:初始規劃預留足夠分片數(如 1024),或遷移至支援 Online DDL/Resharding 的中間件(ShardingSphere、MyCat、TDDL)。

Redis 解決全局唯一 ID

// Redis 原子遞增生成全局唯一 ID
long nextId = redisTemplate.opsForValue().increment("global_id_seq");
// 插入時顯式指定 ID,避免分片間主鍵衝突
INSERT INTO q_reportkeywordsum (id, custid, ...) VALUES (?, ?, ...);

總結與選型建議

  • Cobar 適合早期業務、分片規則固定、無跨分片複雜查詢場景
  • 新項目優先考慮 ShardingSphere (Sharding-JDBC/Proxy)、MyCat、TDDL,支援分布式事務、自動擴容、更豐富 SQL 支援
  • 中間件不解決數據建模問題:合理設計分片鍵、冗余字段、讀寫分離策略才是核心
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved