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的地方,只要資料量一大,馬上就會遇到乙個問題,要分...