分佈式全局序列號

1 本地文件方式 磁盤io 讀寫慢

數據庫mysql 設置當前num和步長,單點問題 注意併發修改

當掛掉的時候 有缺失的一段,但不會重複

3 snowflake

4 本地時間戳??mycat看到的 snowflake的變種?

ID= 64 位二進制 (42(毫秒)+5(機器 ID)+5(業務編碼)+12(重複累加)

換算成十進制爲 18 位數的 long 類型,每毫秒可以併發 12 位二進制的累加。 

zk方式 利用分佈式鎖 每個線程原子的設置某個節點從current 到 current+period

每個線程可以用一段period,用完去zk上取

6

ID 結構:long 64 位,ID 最大可佔 63 位
* |current time millis(微秒時間戳 38 位,可以使用 17 年)|clusterId(機房或者 ZKid,通過配置文件配置 5
位)|instanceId(實例 ID,可以通過 ZK 或者配置文件獲取,5 位)|threadId(線程 ID,9 位)
|increment(自增,6 位)
* 一共 63 位,可以承受單機房單機器單線程 1000*(2^6)=640000 的併發。

其中的instanceId 是從zk獲取的

mycat中的實現用了選主,

主的instanceId = 1,從節點發現自己不是leader,創建一個代表自己的slave節點,data是ready

然後主成爲leader的時候會對將ready替換成0到(1<<5)-1的某一個 這樣從節點就能獲取到這個由主節點分配的instanceId 

主節點和從節點都有一個定時任務 一個去設置更新instanceId 一個取獲取設置的值 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章