關於分庫分表那些事

2021-10-04 08:48:32 字數 3311 閱讀 6271

1、 為什麼要分庫分表(設計高併發系統的時候,資料庫層面該如何設計)?有哪些分庫分表中介軟體?不同的分庫分表中介軟體都有什麼優點和缺點?如何對資料庫如何進行垂直拆分或水平拆分的?

1.2、分表

2、分庫分表的中介軟體

2、mycat:proxy

3、垂直和水平拆分

3.2、垂直拆分

3.3、range和hash分法(分發資料)

hash: 按照某個字段hash一下均勻分散

2、 乙個未分庫分表的系統,未來要分庫分表,如何設計才可以讓系統從未分庫分表動態切換到分庫分表上?

雙寫遷移

3、 如何設計可以動態擴容縮容的分庫分表方案?

4、 分庫分表之後,id 主鍵如何處理?

2、uuid

uuid.

randomuuid()

.tostring()

.replace

("-",""

)->asdfa34234teagsfg5sfgsd234234d

使用場景:隨機生成個什麼檔名、編號之類的。

3、snowflake演算法

0 | 0001100 10100010 10111110 10001001 01011100 00 | 10001 | 1 1001 | 0000 00000000
public

class

idworker

if(datacenterid > maxdatacenterid || datacenterid <0)

system.out.

printf

("worker starting. timestamp left shift %d, datacenter id bits %d, worker id bits %d, sequence bits %d, workerid %d"

, timestampleftshift, datacenteridbits, workeridbits, sequencebits, workerid)

;this

.workerid = workerid;

this

.datacenterid = datacenterid;

this

.sequence = sequence;

}private

long twepoch =

1288834974657l;

private

long workeridbits =

5l;private

long datacenteridbits =

5l;// 這個是二進位制運算,就是 5 bit最多只能有31個數字,也就是說機器id最多只能是32以內

private

long maxworkerid =

-1l ^(-

1l << workeridbits)

;// 這個是乙個意思,就是 5 bit最多只能有31個數字,機房id最多只能是32以內

private

long maxdatacenterid =

-1l ^(-

1l << datacenteridbits)

;private

long sequencebits =

12l;

private

long workeridshift = sequencebits;

private

long datacenteridshift = sequencebits + workeridbits;

private

long timestampleftshift = sequencebits + workeridbits + datacenteridbits;

private

long sequencemask =

-1l ^(-

1l << sequencebits)

;private

long lasttimestamp =

-1l;

public

long

getworkerid()

public

long

getdatacenterid()

public

long

gettimestamp()

public

synchronized

long

nextid()

if(lasttimestamp == timestamp)

}else

// 這兒記錄一下最近一次生成id的時間戳,單位是毫秒

lasttimestamp = timestamp;

// 這兒就是將時間戳左移,放到 41 bit那兒;

// 將機房 id左移放到 5 bit那兒;

// 將機器id左移放到5 bit那兒;將序號放最後12 bit;

// 最後拼接起來成乙個 64 bit的二進位制數字,轉換成 10 進製就是個 long 型

return

((timestamp - twepoch)

<< timestampleftshift)

|(datacenterid << datacenteridshift)

|(workerid << workeridshift)

| sequence;

}private

long

tilnextmillis

(long lasttimestamp)

return timestamp;

}private

long

timegen()

// ---------------測試---------------

public

static

void

main

(string[

] args)

}}

c void main(string args)

}

}

```

關於分庫分表 Mysql篇

關於分庫分表,要關心硬體,業務,分布式,和資料庫選型.基本指標 庫物理檔案大小 100g 表 100 字段 200 單錶記錄數 500w 可以用說用到mysql的地方,只要資料量一大,馬上就會遇到乙個問題,要分庫分表.這裡引用乙個問題為什麼要分庫分表呢?mysql處理不了大的表嗎?其實是可以處理的大...

關於分庫分表的實現

無論怎麼做分庫分表,其基本思路都是一樣的。需要有分庫路由,分庫規則,分庫關鍵字等。下面簡單用spring在dao層做乙個分庫的實現。假如有2個資料來源,通過在routekey選擇不同的資料來源。設計路由關鍵字 public enum routekey public static routekey c...

關於MySQL分庫分表緣由

關於分庫分表,要關心硬體,業務,分布式,和資料庫選型.基本指標 庫物理檔案大小 100g 表 100 字段 200 單錶記錄數 500w 分庫分表直接目的是要控制表的數量,控制資料的容量,最終的目的是降低響應延遲,更容易的運維 可以用說用到mysql的地方,只要資料量一大,馬上就會遇到乙個問題,要分...