問題
在使用數據庫的應用中,通常會通過對 ID 做 hash 映射到分庫分表,達成壓力均攤
在實際實施過程中,通常會有 2 個問題:
- 當實例進行擴容時,必須停服維護, rehash 用戶數據
- 不同實例壓力分擔不均,通常 ID 越大的那些實例壓力大
因此,實作中,通常會使用按段(segment)劃分維護數據集
本文,舉 3 個例子來闡述其思想:
- 美團 Leaf-segment 數據庫方案實現
分佈式ID生成器
- 永不遷移數據和避免熱點的 MySQL 橫向擴展方案
- Redis 集羣的按哈希槽實現分片
Leaf-segment 數據庫方案
該方案在官方的博客中也要詳細描述: 傳送門
這裏簡要闡述下其原理:
如圖,該圖摘自官方博客,服務向 Leaf 請求申請一個唯一的 test_tag ID
- DB 中保存當前 test_tag 的已被預定的最大 max_id
- 向 DB 預定 id 的 步長(step)
因此 Leaf 可以通過向 DB 預定最新的 ID 段,然後快速的在本地互不干擾的直接分配 ID 給服務
該方案,有以下優點: