mysql 天數減1 分布式系統中的唯一id(1)

2021-10-13 23:50:58 字數 1998 閱讀 6019

一、背景

分布式系統中資料庫中會用到唯一id

這個唯一id的需要滿足以下特點:

1. 整個系統id唯一

2. id是數字型別,而且是趨勢遞增的

3. id簡短,查詢效率快

什麼是遞增?

二、分布式id的幾種生成方案

2.1、uuid

優點:

1. **實現簡單。

2. 本機生成,沒有效能問題

3. 因為是全球唯一的id,所以遷移資料容易

缺點:

1. 每次生成的id是無序的,無法保證趨勢遞增

2. uuid的字串儲存,查詢效率慢

3. 儲存空間大

4. id本事無業務含義,不可讀

應用場景:

1. 類似生成token令牌的場景

2. 不適用一些要求有趨勢遞增的id場景

利用mysql的主鍵自增auto_increment,預設每次id加1(步增可配置)。

優點:

1. 數位化,id遞增

2. 查詢效率高

缺點:

1. 存在單點和高可用高穩定問題,如果mysql掛了,系統就掛了

2. 資料庫壓力大,高併發抗不住

這個方案解決mysql了的單點問題,在auto_increment基本上面,設定step步長

每台的初始值分別為1,2,3...n,步長為n(這個案例步長為4)

優點:

解決了單點問題

缺點:

1. 一旦把步長定好後,就無法擴容;

2. 單個資料庫的壓力大,資料庫自身效能無法滿足高併發

應用場景:

資料不需要擴容的場景

雪花演算法生成64位的二進位制正整數,然後轉換成10進製的數。64位二進位制數由如下部分組成:

1. 1位識別符號:始終是0

2. 41位時間戳:41位時間截不是儲存當前時間的時間截,而是儲存時間截的差值(當前時間截 - 開始時間截 )得到的值,這裡的的開始時間截,一般是我們的id生成器開始使用的時間,由我們程式來指定的

3. 10位機器標識碼:可以部署在1024個節點,如果機器分機房(idc)部署,這10位可以由 5位機房id + 5位機器id 組成

4. 12位序列:毫秒內的計數,12位的計數順序號支援每個節點每毫秒(同一機器,同一時間截)產生4096個id序號

優點:

1. 此方案每秒能夠產生409.6萬個id,效能快

2. 時間戳在高位,自增序列在低位,整個id是趨勢遞增的,按照時間有序遞增

3. 靈活度高,可以根據業務需求,調整bit位的劃分,滿足不同的需求

缺點:

依賴機器的時鐘,如果伺服器時鐘回撥,會導致重複id生成

在分布式場景中,伺服器時鐘回撥會經常遇到,一般存在10ms之間的回撥

利用redis的incr原子性操作自增,一般演算法為:

年份 + 當天距當年第多少天 + 天數 + 小時 + redis自增

優點:

有序遞增,可讀性強

缺點:

占用頻寬,每次要向redis進行請求

整體測試了這個效能如下:

需求:同時10萬個請求獲取id

1、併發執行完耗時:9s左右

2、單任務平均耗時:74ms

3、單執行緒最小耗時:不到1ms

4、單執行緒最大耗時:4.1s

效能還可以,如果對效能要求不是太高的話,這個方案基本符合要求。但不完全符合業務希望id從 1 開始趨勢遞增。(當然演算法可以調整為 就乙個 redis自增,不需要什麼年份,多少天等)。

知行研發-劉學千

分布式隨筆1 分布式概述

分布式,好寬泛的話題,來來咱扯兩句。你乙個人再強壯,也扛不了100袋大公尺,單機的資源也很有限,大 的大資料量 高併發以及各種業務需求 童鞋們的web應用,伺服器 rdb mq 服務 快取以及各類基礎設施,更別說還有安全 大資料方面的需求 於是,我們常見的面向服務的dubbo springcloud...

分布式 2分布式事務

分布式 1概述cap和base 分布式 2分布式事務 分布式 3分布式一致性演算法 分布式 4集群 分布式 5服務限流演算法 分布式 6分布式id 分布式 7效能壓測 分布式 8日誌鏈路跟蹤 分布式 9分布式鎖 redis鎖的幾種實現 參考 分布式系統間各種問題 宕機 網路不穩定 本地事務無法滿足需...

分布式系統漫談 拾肆 分布式系統常用優化思路

本文說說系統優化的常用手段吧,其中可能有一些內容在系列前面的文章裡已經總結過了,這裡還是再系統地整理出來,方便將知識彙總,有個整體上的認識。本文只講方 沒有具體實現。限於水平總結得可能不全,後面還會補充。本文將系統主要分為前端優化和架構優化兩個層面來說。前端優化 1.頁面優化 延遲載入 對一些還沒有...