Generating unique ID numbers
in Microsoft Azure
kyrt Takekazu Omi
takekazu.omi@kyrt.in
@takekazuomi
2014/3/29 1.0.1
Generating unique ID numbers
in Microsoft Azure
スケーラブルなID生成手法の比較と、twitter snowflakeに見る工夫
2014/2/26 kyrt @takekazuomi 2
Agenda
• Challenge
• スケーラブルなサービスとスケーラブルな採番
• twitter snowflake
• スケーラブルな分散採番サービスの例
• Cloud Design Patterns
• 応用例
kyrt @takekazuomi 32014/2/26
Challenge
スケーラブルなサービスには、スケーラブルな採番が必須
課題と背景的な話
「またの名をChallengeを課題と訳さないで」
2014/2/26 kyrt @takekazuomi 4
ID生成の要件
1. ユニークである
重複が無い。これはIDをキーにしたいので当然ですね。
2. 時系列で増えていく(または減っていく)
IDが生成される度に増加していくのは連番での重要な性質の一つ
3. 秒間の発行数
採番を一箇所で行わずに分散してするとスケールする
4. 連続性
連続した欠落の無い番号の生成
kyrt @takekazuomi 52014/2/26
ID生成のパターン
1. SQL Databaseの自動連番を使う
• スケールしない、耐障害性を考慮すると複数台必要
2. ID Providerが完全に独立して存在する
• GUID等、128bit 16 byte
3. 擬似ID Providerが、擬似IDを生成し、UNIQUE性は別システムで
担保される
4. ID Provider のNetwork Service を使う
• Azure Cache, memcached, redis のincrement 等
5. ID Provider のCluster Serviceが実装されていてCluster内で合意を
とってIDを生成する
• snowflake
kyrt @takekazuomi 6
最初の2つ
• SQL Database の利用
• 秒間の発番数、同時接続数に問題なければ、従来どおり利用可能
• 上記の問題があるなら、複数のDBを使う(sharding)という方法もある
• しかし、仕組みとしてはちょっと重い。コストも高い。
• 秒間100程度まで
• GUIDの利用
• クライアントで完結するので、速くてスケールする
しかし
• 128bit あって長い(16 byte)
• 時系列で並ばない→ 時間由来のデータをprefixにすることで解決
kyrt @takekazuomi 7
時系列のキーの例
.Netなら、Tikcs などを使う
こんな感じ
var id =
string.Format("{0:D19}{1:N}",DateTime.UtcNow.Ticks, Guid.NewGuid());
var reverseId =
string.Format("{0:D19}{1:N}“,long.MaxValue-DateTime.UtcNow.Ticks, Guid.NewGuid());
結果
0635317467093215594d1931d619d7041c69ececd37383ca4ae
85880545697615502266d18953688dc4fbdb84da60f4d8e25c8
しかし長い・・・・・19+32で51文字。(工夫の余地はあるけど)
kyrt @takekazuomi 8
擬似ID Provider パターン
• Clientで擬似的にIDを生成し
て、UNIQUE性は、永続化レ
イヤーで担保
• retryの発生頻度にパフォーマ
ンスが依存
• 性能が永続化レイヤーに依存
• スケールのためには永続化レ
イヤーの分散が必要
• SQL Database < Storage
Table (分散の容易度)
kyrt @takekazuomi 9
SQL Database
(Windows Azure)
Storage Table
or
④ retry
Client 永続化レイヤー
① 擬似IDでInsert
② 重複無しで成功
③ 重複有りで失敗
CacheなどのNetwork Service を利用
• RBDの自動連番より小さなレ
イテンシー(1-2ms)
• IDは時系列で増える
• 耐障害性に課題
• HA構成、永続化オプションを
考慮
• 工夫
• 起動時の時間+incremental
number
• 障害後にかぶらないように
kyrt @takekazuomi 10
Client Cache
IDを取得
Windows Azure
Cache
memcached
or
redis
or
課題整理
1. latency(レイテンシー)
HAのために、Node間通信、永続化に時間がかかる。retryが発生すると
時間がかかる
2. reliability(信頼性)
採番系が一箇所なのは、UNIQUEの担保には有利だが、障害に弱くなる。
→分散すればOk
3. scalability(スケーラビリティ)
分散が必要。ID生成が分散してNode間通信が少なければ、スケーラビリ
ティが上がる
4. data size(データサイズ)
data sizeを大きくして冗長性を増せば、retryの頻度は下がる
kyrt @takekazuomi 11
特性の比較
kyrt @takekazuomi 12
latency reliability scalability data size
SQL 自動連番 ◯ × × ◯
GUID等 ◯ ◯ ◯ ×
Pseudo ID and Retry △※1 ◯ ◯ △
Cache ◯ × △ ◯
Snowflake ◯ ◯ ◯ ◯
※1 Data Sizeを小さくすると、衝突が起きやすくなるのでレイテンシーが上がる
ここまでのまとめ
• 永続化ストレージ
• latency(↓)、 reliability(↑)、 scalability(↓)、 data size(↑)
• scalability改善には、パーティショニングが必要 → パーテーションを
跨いだUNIQUE性に制限、data size(↓)
• On Memory
• latency(↑)、 reliability(↓)、 scalability(↓)、 data size(↓)
• reliability改善
• 複数NodeでHA構成にすれば良い。しかし、更新の度に、Node間で通信して合
意をとると latency が悪化
• scalability改善
• シングルNodeだとNodeの性能上限=スケールの上限になってしまうので、複数
Node構成にしたい。しかし、
kyrt @takekazuomi 13
↑:良
↓:悪
こんなのがあったら
•GUIDのように速く
•SQL の自動採番のように並んで
•簡単に使える
•そんなに長くない(longぐらいで入ると嬉し
い)
kyrt @takekazuomi 14
twitter snowflake
https://github.com/twitter/snowflake/
kyrt @takekazuomi 15
snowflake の短い説明
• snowflake は、Twitter 社が作成した、UNIQUEなID生成のネッ
トワークサービス。いくつかの簡単な保証で高いスケーラビリ
ティを実現
• Twitter 社が、MySQLから Cassandra に移行するにあたって、
Cassandra には シーケンシャルな id 生成の仕組みが無かった
ことから作成
• 参考: Twitter IDs, JSON and Snowflake
https://dev.twitter.com/docs/twitter-ids-json-and-snowflake
• ソースは https://github.com/twitter/snowflake/ に公開
• ライセンス、 Apache License, Version 2.0
kyrt @takekazuomi 162014/2/26
基本的なアイディア
• Clock Skew (クロックスキュー)に上手く対応することで、
オンメモリの計算だけでUNIQなIDを生成する
• 永続化レイヤーの支援無しにUNIQなIDが生成できる、ID生成
はオンメモリなので速い(10k ids per second per process
Snowflake https://github.com/twitter/snowflake/ )というのが特
徴
• GUID v1と似ているが、半分のデータ量 64bit(long) で、おおよ
そ時系列で増えていく「(Roughly) Time Ordered」
kyrt @takekazuomi 17
データ構造
• snowflake では、64bitを上記のように分割して使います
• timeが時間由来の数字でミリ秒単位
• machine id は、datacenter id と、worker id で構成されていて、
Cluster内のNode固有の値
• sequence number は、同一時間の連番
kyrt @takekazuomi 18
ポイント
• 時間由来のデータが先頭 41bit なので発番の時間順に並びます
• ms で41bit だと (2^41)*(10^-3)/60/60/24/365 で約69年
• 各インスタンスは、 クラスター内でUNIQUEな、machine idを
持ちます
• machine id が重複しない限りはIDは重複しない
• 同時間内の発番では、 sequence number がインクリメントさ
れます
• ms 内の発番は、2^12 = 4096 まで
採番情報は on memory のみで処理
kyrt @takekazuomi 19
コード上の工夫
• なかなか興味深かったので、 IdWorker.scala をC#で写経
https://gist.github.com/takekazuomi/9571376
kyrt @takekazuomi 20
time skew対策
• 最後に発番してからtimestampが戻っていないか確認 L63
• 巻き戻っていればエラーで帰る(呼び出し側が再試行する)
kyrt @takekazuomi 21
time 41bit の有効利用
• 開始時間を採番の開始時間と合わせてbitを有効利用
• TwEpoch は、2010/11/04。2010/11/01 + 69年
kyrt @takekazuomi 22
sequence
• 同一timestampなら、_sequence をインクリメントして採番
`L72 <https://gist.github.com/takekazuomi/9571376#file-
idworker-cs-L72>`_
• timestamp が進んでいれば、_sequence = 0 で採番 `L82
<https://gist.github.com/takekazuomi/9571376#file-idworker-cs-
L82>`_
• 同一 timestamp 内で、_sequence がオーバーフローした場合は、
timestampが変わるまで待つ `L75
<https://gist.github.com/takekazuomi/9571376#file-idworker-cs-
L75>`_
kyrt @takekazuomi 23
起動時に
Worker Idの重複を確認
構成
• snowflake のWorkerは複数の
Nodeで構成
• Nodeの起動時にWorker Idの
重複をzookeeperを使って担
保
• GUID では、MAC Address
48bit が、machine Id相当
kyrt @takekazuomi 24
Client
snowflake cluster
ID要求
zookeeper cluster
machine idを重複させない仕組
• snowflakeでは、 machine id の下位5bitの Worker Idを
zookeeperで管理しています
• 起動時にWorker Idで、 Ephemeral Nodes を作成
kyrt @takekazuomi 25
/workerIdZkPath
/
/0 /1 /2 /n
worker id の ephemeral node
1. 同じNode名では1つのみ
2. sessionが切れるとnodeは消える
Micorosoft Azure でどうするか
• Azure Blobのリースを使うとほぼ同じことができます
• Worker Idのpathのleaseが取れば、重複なしで起動Ok
• インスタンスが生きてる間は、Leaseを更新
• 参考:Cloud Design Patterns
• patterns & practices
• Leader Election Pattern 、BlobDistributedMutex
kyrt @takekazuomi 26
/workerIdZkPath
/
/0 /2 /n/1
Blob Lease で
BlobDistributedMutex 利用
まとめ
• snowflakeは、on memory で時間情報を元に高速にIDを生成す
る
• IDの一部にはmachine idが含まれていて、nodeの起動時に
zookeeperを使って重複を確認する
• 起動後は、node-zookeeper間の通信は ephemeral nodes の
keep aliveのみ
• 時間の巻き戻り対策がされている(time service対策)
• zookeeper の ephemeral nodes 相当の機能はAzure Blobで実装
できる
kyrt @takekazuomi 27
Appendix
2014/2/26 kyrt @takekazuomi 28
リファレンス
• Twitter IDs, JSON and Snowflake
• https://dev.twitter.com/docs/twitter-ids-json-and-snowflake
• snowflake source code
• https://github.com/twitter/snowflake/
• Cloud Design Patterns / patterns & practices
• Leader Election Pattern http://msdn.microsoft.com/en-us/library/dn568104.aspx
• BlobDistributedMutex Code http://aka.ms/cloud-design-patterns-sample
• Apache ZooKeeper
• http://zookeeper.apache.org/
• http://zookeeper.apache.org/doc/r3.2.1/zookeeperProgrammers.html#Ephemeral+Nodes
• Twitterのsnowflakeについて(お勧め)
• http://www.slideshare.net/moaikids/20130901-snowflake
• 全ての情報は2014/3/29 時点のものです。
2014/2/12 kyrt @takekazuomi 29

More Related Content

PDF
ツイートID生成とツイッターリアルタイム検索システムの話
PDF
Twitterのsnowflakeについて
PPTX
スケールするシステムにおけるエンティティの扱いと 分散ID生成
PPTX
JAZUG クラウドデザインパターンのコードを覗く
PDF
もっとわかる Microsoft Azure 最新技術アップデート編 - 20150123
PDF
わんくま東京勉強会#46 Azureセッション資料
PPTX
99999999 azure iaas_newportal版
PDF
20150821 Azure 仮想マシンと仮想ネットワーク
ツイートID生成とツイッターリアルタイム検索システムの話
Twitterのsnowflakeについて
スケールするシステムにおけるエンティティの扱いと 分散ID生成
JAZUG クラウドデザインパターンのコードを覗く
もっとわかる Microsoft Azure 最新技術アップデート編 - 20150123
わんくま東京勉強会#46 Azureセッション資料
99999999 azure iaas_newportal版
20150821 Azure 仮想マシンと仮想ネットワーク

What's hot (19)

PPTX
20141110 tf azure_iaas
PDF
Microsoft Azure超超入門_20140412
PDF
細かすぎて伝わらないかもしれない Azure Container Networking Deep Dive
PPTX
AzureAD for Java
PPTX
Azure仮想マシンと仮想ネットワーク
PDF
第29回長岡開発者勉強会
PDF
S03 企業内システムと Microsoft Azure の VPN 接続
PDF
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
PDF
ソーシャルゲームにおけるAWS/MongoDB利用事例
PDF
[Azure Deep Dive] Azure ネットワーキングを理解しよう!
PDF
Azure仮想マシンと仮想ネットワークの基本 2016 ComCamp Fukuoka
PDF
17 E-5 震災とHackとクラウドと 亀渕分
PDF
さくらのクラウドDNS経由でワイルドカード証明書を後からインストールしたcertbotで取得する方法
PDF
Hyper-V 仮想マシンをAzure ARMへV2C移行...のメモ
PDF
[G-Tech2014講演資料] Microsoft Azureで負荷分散された仮想マシンを作ってみよう ~Amazon Web Servicesと比べな...
PDF
Real World Azure RBAC
PDF
S01 企業で活用が進む Microsoft Azureの仮想マシン (Windows)
PDF
SQL+NoSQL!? それならMySQL Clusterでしょ。
PPTX
クラウドデザイン パターンに見る クラウドファーストな アプリケーション設計 Data Management編
20141110 tf azure_iaas
Microsoft Azure超超入門_20140412
細かすぎて伝わらないかもしれない Azure Container Networking Deep Dive
AzureAD for Java
Azure仮想マシンと仮想ネットワーク
第29回長岡開発者勉強会
S03 企業内システムと Microsoft Azure の VPN 接続
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
ソーシャルゲームにおけるAWS/MongoDB利用事例
[Azure Deep Dive] Azure ネットワーキングを理解しよう!
Azure仮想マシンと仮想ネットワークの基本 2016 ComCamp Fukuoka
17 E-5 震災とHackとクラウドと 亀渕分
さくらのクラウドDNS経由でワイルドカード証明書を後からインストールしたcertbotで取得する方法
Hyper-V 仮想マシンをAzure ARMへV2C移行...のメモ
[G-Tech2014講演資料] Microsoft Azureで負荷分散された仮想マシンを作ってみよう ~Amazon Web Servicesと比べな...
Real World Azure RBAC
S01 企業で活用が進む Microsoft Azureの仮想マシン (Windows)
SQL+NoSQL!? それならMySQL Clusterでしょ。
クラウドデザイン パターンに見る クラウドファーストな アプリケーション設計 Data Management編
Ad

More from Takekazu Omi (20)

PDF
jazug34 Container Apps Key Vault
PDF
bicep 0.5 pre
PDF
Bicep + VS Code で楽々Azure Deploy
PDF
Bicep 入門 MySQL編
PDF
//Build 2021 FASTER 紹介
PDF
//build 2021 bicep 0.4
PDF
bicep 紹介
PDF
bicep dev container
PDF
Introduction of Azure Docker Integration
PPTX
Cosmos DB Consistency Levels and Introduction of TLA+
PPTX
20180421 Azure Architecture Cloud Design Patterns
PPTX
Azure Application Insights とか
PPTX
第8回 Tokyo Jazug Night Ignite 2017 落穂拾い Storage編
PDF
life with posh
PPTX
Cosmos DB 入門 multi model multi API編
PPTX
Global Azure Bootcamp 2017 DocumentDB Deep Dive
PPTX
Azure Storage Partition Internals
PPTX
Azure Service Fabric Cluster の作成
PPTX
Azure Service Fabric Actor
PPTX
祝GA、 Service Fabric 概要
jazug34 Container Apps Key Vault
bicep 0.5 pre
Bicep + VS Code で楽々Azure Deploy
Bicep 入門 MySQL編
//Build 2021 FASTER 紹介
//build 2021 bicep 0.4
bicep 紹介
bicep dev container
Introduction of Azure Docker Integration
Cosmos DB Consistency Levels and Introduction of TLA+
20180421 Azure Architecture Cloud Design Patterns
Azure Application Insights とか
第8回 Tokyo Jazug Night Ignite 2017 落穂拾い Storage編
life with posh
Cosmos DB 入門 multi model multi API編
Global Azure Bootcamp 2017 DocumentDB Deep Dive
Azure Storage Partition Internals
Azure Service Fabric Cluster の作成
Azure Service Fabric Actor
祝GA、 Service Fabric 概要
Ad

Recently uploaded (7)

PDF
ココロ分解帳|感情をやさしく分解し自分と他者を理解するためのモバイルノートアプリ
PDF
AIシステムのセキュリティ:脅威となりつつあるAIの現状と課題 [English] Security of AI Systems: The Current...
PDF
20250826_Devinで切り拓く沖縄ITの未来_AI駆動開発勉強会 沖縄支部 第2回
PDF
Working as an OSS Developer at Ruby Association Activity Report 2025
PDF
翔泳社 「C++ ゼロからはじめるプログラミング」対応 C++学習教材(三谷純)
PPTX
生成AIとモデルベース開発:実はとても相性が良いことを説明します。まあそうだろうなと思われる方はご覧ください。
ココロ分解帳|感情をやさしく分解し自分と他者を理解するためのモバイルノートアプリ
AIシステムのセキュリティ:脅威となりつつあるAIの現状と課題 [English] Security of AI Systems: The Current...
20250826_Devinで切り拓く沖縄ITの未来_AI駆動開発勉強会 沖縄支部 第2回
Working as an OSS Developer at Ruby Association Activity Report 2025
翔泳社 「C++ ゼロからはじめるプログラミング」対応 C++学習教材(三谷純)
生成AIとモデルベース開発:実はとても相性が良いことを説明します。まあそうだろうなと思われる方はご覧ください。

Generating unique id numbers in Azure