使用 zebra 對資料庫表進行水平拆分

2021-09-25 06:51:41 字數 2150 閱讀 7490

zebra 是美團點評開發的資料庫訪問層中介軟體,**維護在 github:meituan-dianping/zebra

zebra是乙個基於jdbc api協議上開發出的高可用、高效能的資料庫訪問層解決方案,是美團點評內部使用的資料庫訪問層中介軟體。具有以下的功能點:

zebra 的 quickstart 提供了完整的使用說明文件,這裡就不再贅述用法,而是直接提供乙個使用 zebra 進行資料庫分表的 demo。

資料庫表為簽到表(sign_in),表結構如下:

簽到表用於記錄使用者簽到資料,customer_id 為使用者 id,其餘欄位是為了 demo 測試而建,無特殊含義。

選擇簽到表的 customer_id 作為維度。

選取維度時需要考慮下面的情況:

在 sql 語句中,顧客 customer_id 是在 crud 操作中作為查詢目標屬性和條件屬性**現次數最多的字段,這樣能滿足 zebra 要求中的維度必須出現在 sql 語句中的限制;同時很多查詢,檢索的 sql 都是基於同一顧客進行的,方便業務邏輯變更;此外,顧客 id 在簽到表中與主鍵直接相關,一條簽到記錄必然有乙個顧客 id ,根據顧客 id 能更快的定位簽到記錄所在範圍。

<?xml version="1.0" encoding="utf-8"?>

>> 16)))"

tbsuffix="everydb:[0,4]"

ismaster="true">

通過維度和路由規則定位到對應表的過程,在針對簽到表的 crud 操作中,通過維度 customer_id 字段及其值,經路由規則計算後能定位到對應表。

資料庫的路由規則

dbrule="#customer_id# * 0"

單庫,無需定義規則,指出 [維度] 即可。

資料庫名字尾

dbindexes="db"

與zebra配置中的sharddatasource資料來源的key相同即可。

表的路由規則

主表:sign_in

維度:key

表下標偏移:offset

表數量:len

雜湊值:hash = crc32(key)

擾動函式:ha = (hash ^ (hash >>> 16))

取模運算:in = (len - 1) & ha

對映到的表下標:index = offset + in

tbrule: offset + ((len - 1) & (crc32(key) ^ (crc32(key) >>> 16)))

如:offset = 3,len = 2,key 為 #customer_id#

tbrule = "3 + ((2 - 1) & (crc32(#customer_id#) ^ ((crc32(#customer_id#) >>> 16)))"

在表sign_in3,sign_in4中路由。

注意:說明:

表名字尾

tbsuffix="everydb:[0,999]"

everydb:[a,b]:a始終為0,b不小於實際表的最大index即可。

主維度ismaster="true"

只有乙個維度

部分測試 sql 如下:

insert into sign_in (id, customer_id, date, current_sign_in_store_id, type, create_eid, create_date)

value (#, #, #, #, #, #, now())

select *

from sign_in

where customer_id = #;

select *

from sign_in

where id = #

指定 customerid ,執行 sql 時將被路由到具體的分表中。

private void testinsert() 

}

完整**上傳 github,你可以在 這裡 找

對資料庫進行操作

對資料庫進行操作 一 ddl 資料庫定義語言 對資料庫 表結構進行操作 建庫 建表 修改表結構 刪庫 刪表等等 sql語句大小寫不敏感 1.建立資料庫 2.顯示所有的資料庫 3.切換到要使用的資料庫,use 資料庫名稱 4.4.刪除資料庫 drop database if exists 資料庫名 5...

使用sequelize對資料庫進行增刪改查

首先我們需要在自己的資料夾下執行一下cmd npm init y y 的主要目的是跳過配置一系列的package.json 其次我們需要安裝兩個sequelize和mysql2 yarn add sequelize mysql2 s 或者npm install sequelize mysql2 s ...

使用sql進對資料庫表資料進行先分組後排序

在實際業務中,有一些場景需要對一組列表資料先分組後然後組內排序,這時不能單純的使用傳統的group by和order by語句了,因為會提示 x欄位必須在group by聚合函式中,為了解決此問題,我們可以使用row number over partition by 分組字段 order by 排序...