Hibernate Shard基礎(chǔ)分析
1.水平分區(qū)下的查詢
對于簡單查詢Hibernate Shard可以滿足。
水平分區(qū)下多庫查詢是一個(gè)挑戰(zhàn)。主要存在于以下三種操作:
1) distinct因?yàn)樾枰闅v所有shard分區(qū),并進(jìn)行合并判斷重復(fù)記錄。
2) order by類似 1)
3) aggregation count,sim,avg等聚合操作先分散到分區(qū)執(zhí)行,再進(jìn)行匯總。
是不是有點(diǎn)類似于 MapReduce ? 呵呵。
Hibernate Shard 目前通過 Criteria 接口的實(shí)現(xiàn)對 聚合提供了較好的支持, 因?yàn)?Criteria 以API接口指定了 Projection 操作,邏輯相對簡單。而HQL,原生 SQL 還不支持此類操作。
2. 再分區(qū)和虛擬分區(qū)
當(dāng)數(shù)據(jù)庫規(guī)模增大,需要調(diào)整分區(qū)邏輯和數(shù)據(jù)存儲時(shí), 需要再分區(qū)。
兩種方式:
1)數(shù)據(jù)庫數(shù)據(jù)遷移其他分區(qū);
2)改變記錄和分區(qū)映射關(guān)系。這兩種方式都比較麻煩。尤其“改變記錄和分區(qū)映射關(guān)系”,需要調(diào)整 ShardResolutionStrategy.
Hibernate Shard 提供了一種虛擬分區(qū)層。當(dāng)需要調(diào)整分區(qū)策略時(shí),只需要調(diào)整虛擬分區(qū)和物理分區(qū)映射關(guān)系即可。以下是使用虛擬分區(qū)時(shí)的配置創(chuàng)建過程:
Java代碼
- Map<Integer, Integer> virtualShardMap = new HashMap<Integer, Integer>();
- virtualShardMap.put(0, 0);
- virtualShardMap.put(1, 0);
- virtualShardMap.put(2, 1);
- virtualShardMap.put(3, 1);
- ShardedConfiguration shardedConfig =new ShardedConfiguration
(prototypeConfiguration,configurations,strategyFactory,virtualShardMap);- return shardedConfig.buildShardedSessionFactory();
3.局限:
1)Hibernate Shard 不支持垂直分區(qū), 垂直+水平混合分區(qū)。
2)水平分區(qū)下 查詢功能受到一定限制,有些功能不支持。實(shí)踐中,需要在應(yīng)用層面對水平分區(qū)算法進(jìn)行更多的考慮。
3)不支持跨分區(qū)的 關(guān)系 操作。例如:刪除A分區(qū)上的 s 表,B分區(qū)上的關(guān)聯(lián)子表 t的記錄無法進(jìn)行參照完整性約束檢查。 (其實(shí)這個(gè)相對 跨分區(qū)查詢的挑戰(zhàn)應(yīng)該說小的多,也許google工程師下個(gè)版本會支持,呵呵)
4)解析策略接口似乎和對象ID全局唯一性有些自相矛盾,AllShardsShardResolutionStrategy 的接口返回的是給定對象ID所在的 shard ID集合,按理應(yīng)該是明確的一個(gè) shard ID.
【編輯推薦】