Leaf分散ID生成システム

要件定義

分散システムにおいてデータやメッセージの一意識別は重要課題である。特にテーブルシャーディング環境では、データベースの自動採番機能では要件を満たせない。ID生成システムに求められる要件は以下の通り:

  • グローバル一意性: 重複IDの発生を排除
  • 単調増加傾向: インデックス構造を持つRDBMSの書き込み性能最適化
  • 厳密な単調増加: トランザクションバージョン管理など特殊要件対応
  • 情報セキュリティ: 連番推測を防止する非連続性

システム可用性についても高い水準が要求され、平均レイテンシとTP999レイテンシの最小化、99.999%の可用性、高スループットが必須条件となる。

Leafアーキテクチャ

Leafはセグメント発行方式とsnowflake改良方式を併用したハイブリッドアプローチを採用する。

セグメント発行方式

従来のDB直接発行方式を改良し、プロキシサーバによるバッチ取得を導入。主要テーブル設計:

フィールド説明
ビジネスタグvarchar(128)業務区分識別子
最大IDbigint(20)現在割当済み最大ID
ステップint(11)割当単位サイズ

ID取得プロセス:

BEGIN TRANSACTION;
UPDATE id_table SET max_id = max_id + STEP WHERE biz_tag = @tag;
SELECT max_id, step FROM id_table WHERE biz_tag = @tag;
COMMIT;

二重バッファ最適化

発行レイテンシ改善のため二重バッファメカニズムを実装:

  • 現在使用中のセグメントが10%消費された時点で次セグメントの非同期取得を開始
  • セグメント長 = ピーク時QPS × 600(10分相当)

高可用性設計

マスター-スレーブ構成によるDB冗長化:

  • 異なるデータセンターへの配置
  • セミ同期レプリケーション
  • IDCローカル優先のサービス呼出し

Snowflake拡張実装

セキュリティ要件が高い場景向けにsnowflakeパターンを拡張:

  1. ZooKeeperの永続順序ノードによるワーカーID自動割当
  2. ローカルファイルキャッシュによる依存性軽減
  3. 時刻巻き戻し検知メカニズム

時刻整合性制御

時刻不整合発生時の対応ロジック:

if (currentTimestamp < lastTimestamp) {
  long delta = lastTimestamp - currentTimestamp;
  if (delta <= 5) {
    Thread.sleep(delta * 2);
    currentTimestamp = System.currentTimeMillis();
    if (currentTimestamp < lastTimestamp) {
      throw new ClockMovedBackException();
    }
  } else {
    throw new ClockMovedBackException();
  }
}

タグ: 分散システム ID生成 snowflake セグメント発行 MySQL

7月6日 19:15 投稿