1 本地文件方式 磁盤io 讀寫慢
2
數據庫mysql 設置當前num和步長,單點問題 注意併發修改
當掛掉的時候 有缺失的一段,但不會重複
3 snowflake
4 本地時間戳??mycat看到的 snowflake的變種?
ID= 64 位二進制 (42(毫秒)+5(機器 ID)+5(業務編碼)+12(重複累加)
換算成十進制爲 18 位數的 long 類型,每毫秒可以併發 12 位二進制的累加。
5
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 一個取獲取設置的值