SlideShare a Scribd company logo
Twitterのsnowflakeに
ついて
DSIRNLP #4
@just_do_neet
DSIRNLP #4 / Twitterのsnowflakeについて
今日話す内容
•snowflake
•Twitter社がOSSとして提供しているID生成器
•なぜこの���うなツールが必要なのか
•仕組みについて
•etc,etc...
2
DSIRNLP #4 / Twitterのsnowflakeについて
ID生成は結構大事(小並感)
•たいていの処理の際にIDの生成は必要になる
•例1:クローリングした各Webサイト群それぞ
れにIDを割り振る
•例2:n-gramで分かち書きをした各ワード群
それぞれにIDを割り振る
•etc, etc...
3
DSIRNLP #4 / Twitterのsnowflakeについて
ID生成の性能も結構大事
•例:1つのID生成に1msかかるとした場合、ID生
成処理にどれくらい時間がかかる?
•Webサイト10億ページ
the number of individual web pages out there is growing by several billion pages per day.
(at 2008. via http://googleblog.blogspot.jp/2008/07/we-knew-web-was-big.html)
→約11日
•Webサイト240万ページ
日本語wikipediaの総項目数. via http://ja.wikipedia.org/wiki/Wikipedia:
%E5%85%A8%E8%A8%80%E8%AA%9E%E7%89%88%E3%81%AE
%E7%B5%B1%E8%A8%88
→約40分
4
DSIRNLP #4 / Twitterのsnowflakeについて
どんな風にIDを生成する?
•数値のカウントアップ
•各RDBMSの number increment 機能を使って
•例:Oracle の sequence
•例:MySQL のauto increment
•Pros : 実装が簡単
•Cons : ID生成処理が1台のRDBMSに集中し
分散できない。スケールしない。
5
DSIRNLP #4 / Twitterのsnowflakeについて
どんな風にIDを生成する?
•数値のカウントアップ
•順序の保証、一意性の保証を何かしらの手段で
行う必要がある。
•ナイーブには「IDを発行する人は1人だけ」
という形で保証。
•仕組み上、処理性能がスケールしにくい
6
DSIRNLP #4 / Twitterのsnowflakeについて
どんな風にIDを生成する?
•RFC 4122 “A Universally Unique IDentifier(UUID)”
•http://www.ietf.org/rfc/rfc4122.txt
• “UUIDは、分散システム上でどこかが統制を取らずとも、一意に特定可
能な識別子の作成を目的としており...” (wikipedia)
•128bitのデータでIDを表現。
例:550e8400-e29b-41d4-a716-446655440000
7
DSIRNLP #4 / Twitterのsnowflakeについて
どんな風にIDを生成する?
•RFC 4122 “A Universally Unique IDentifier(UUID)”
8
ver. description
1 The time-based version specified in this document.
2 DCE Security version, with embedded POSIX UIDs.
3
The name-based version specified in this document that uses
MD5 hashing.
4
The randomly or pseudo-randomly generated version specified
in this document.
5
The name-based version specified in this document that uses
SHA-1 hashing.
DSIRNLP #4 / Twitterのsnowflakeについて
どんな風にIDを生成する?
•RFC 4122 “A Universally Unique IDentifier(UUID)”
•version 1 (time-based)
9
DSIRNLP #4 / Twitterのsnowflakeについて
どんな風にIDを生成する?
•RFC 4122 “A Universally Unique IDentifier(UUID)”
•Pros : 複数のマシンで並列動作させても一意な
IDを生成させる事ができる。
•Cons : しかし128bitはIDのサイズとしては大きい気
がする...
10
DSIRNLP #4 / Twitterのsnowflakeについて
どんな風にIDを生成する?
•ID生成器に求められるもの
•並列に一意なIDの生成が行える。
•できる限り小さいサイズでIDの生成が行える。
11
DSIRNLP #4 / Twitterのsnowflakeについて
snowflake
12
DSIRNLP #4 / Twitterのsnowflakeについて
snowflake
•
•TwitterがOSSとして公開しているID生成器
https://github.com/twitter/snowflake/
•Time-basedなID(timestampを基に生成)
•64bitでIDを表現
•複数台のマシンを用いて並列に一意なIDの生成
が行える
13
DSIRNLP #4 / Twitterのsnowflakeについて
snowflake
14
DSIRNLP #4 / Twitterのsnowflakeについて
参考:New Tweets per second record, and how!
15
•https://blog.twitter.com/2013/new-tweets-per-
second-record-and-how
DSIRNLP #4 / Twitterのsnowflakeについて
参考:New Tweets per second record, and how!
16
•https://blog.twitter.com/2013/new-tweets-per-
second-record-and-how
DSIRNLP #4 / Twitterのsnowflakeについて
snowflake
•64bitのlong値でIDを表現 (※先頭1bitは0)
•3つの要素で構成
•timestamp (41 bit) :
現在のunixtime(ms)から、ある時点のunixtimeを引いた値
•machine id (10 bit):
生成器に割り当てられたID。datacenter id + worker id。
•sequence (12 bit):
生成器ごとに採番するsequence番号
17
DSIRNLP #4 / Twitterのsnowflakeについて
snowflake
•Q: timestampは41 bitで大丈夫?
•A: WebサービスのIDとして用いる分には大丈夫
では
•snowflakeでは
「現在のunixtime - 採番開始時のunixtime」
をtimestamp値として使用
•timestampがオーバーフローするのは、採番
開始からおおよそ69年後
18
DSIRNLP #4 / Twitterのsnowflakeについて
snowflake
19
•ID生成部のソース
https://github.com/twitter/snowflake/blob/master/src/main/scala/com/twitter/service/snowflake/IdWorker.scala
DSIRNLP #4 / Twitterのsnowflakeについて
•ID生成部のソース
https://github.com/twitter/snowflake/blob/master/src/main/scala/com/twitter/service/snowflake/IdWorker.scala
snowflake
20
現在のunixtimeを取得
DSIRNLP #4 / Twitterのsnowflakeについて
snowflake
21
1回前に取得したunixtimeより今の
unixtimeが古い場合はthrow exception
(OSの時刻ズレが起きた可能性)
•ID生成部のソース
https://github.com/twitter/snowflake/blob/master/src/main/scala/com/twitter/service/snowflake/IdWorker.scala
DSIRNLP #4 / Twitterのsnowflakeについて
snowflake
22
sequence番号のカウントアップ
同じtimestamp値の中で12bit分
(0-4095)まで採番できる
•ID生成部のソース
https://github.com/twitter/snowflake/blob/master/src/main/scala/com/twitter/service/snowflake/IdWorker.scala
DSIRNLP #4 / Twitterのsnowflakeについて
•ID生成部のソース
https://github.com/twitter/snowflake/blob/master/src/main/scala/com/twitter/service/snowflake/IdWorker.scala
snowflake
23
万が一sequence番号が枯渇した場合
は、unixtimeが新しくなる( 1ms経過
する)まで待つ
DSIRNLP #4 / Twitterのsnowflakeについて
snowflake
24
今回使用したunixtimeを保存
•ID生成部のソース
https://github.com/twitter/snowflake/blob/master/src/main/scala/com/twitter/service/snowflake/IdWorker.scala
DSIRNLP #4 / Twitterのsnowflakeについて
snowflake
25
ID生成
(timestamp << 22 + datacenterId <<
17 + workerId << 12 + sequence)
•ID生成部のソース
https://github.com/twitter/snowflake/blob/master/src/main/scala/com/twitter/service/snowflake/IdWorker.scala
DSIRNLP #4 / Twitterのsnowflakeについて
•ID生成部のソース
https://github.com/twitter/snowflake/blob/master/src/main/scala/com/twitter/service/snowflake/IdWorker.scala
snowflake
26
twepoch が採番開始時のunixtime
1288834974657 = 2010/11/04 10:42:54
DSIRNLP #4 / Twitterのsnowflakeについて
snowflake
•利点
•IDソート ≒ 時系列ソート
ID情報だけでID生成時のtimestamp値に基づい
た時系列ソートが可能
•ID値からID生成時のtimestamp値が復元可能
27
timestamp = (id >> 22) + twepoch
DSIRNLP #4 / Twitterのsnowflakeについて
snowflake
28
(369070365764354048 >> 22 + 1288834974657)
= 1376828206851 (2013/8/18 21:16:46)
DSIRNLP #4 / Twitterのsnowflakeについて
snowflake
•利点
•整数列圧縮を用いた効率的な情報圧縮が容易
(Variable Byte Code , PFor Delta , Simple9,
etc...)
29
DSIRNLP #4 / Twitterのsnowflakeについて
snowflake
•弱点
•OSの時刻ズレに弱い
•運用面で工夫が多少必要
30
https://github.com/twitter/snowflake/#system-clock-dependency
DSIRNLP #4 / Twitterのsnowflakeについて
snowflake
•弱点?
•ID採番時にsnowflakeサーバーにthrift 経由で接
続するようになっている。
•小∼中規模で運用するには若干重厚な気が
31
DSIRNLP #4 / Twitterのsnowflakeについて
shakeflake(仮称)
•snowflakeを模して社内で作成した軽量なID生成器
•redis 2.6 + lua scripting版
•JavaVM版
32
DSIRNLP #4 / Twitterのsnowflakeについて
shakeflake(仮称)
•参考:
http://developer.smartnews.be/blog/2013/07/31/
shakeflake-is-a-tool-for-generating-unique-id-
numbers/
33
DSIRNLP #4 / Twitterのsnowflakeについて
shakeflake(仮称)
•参考:
http://developer.smartnews.be/blog/2013/07/31/
shakeflake-is-a-tool-for-generating-unique-id-
numbers/
34
まとめ
DSIRNLP #4 / Twitterのsnowflakeについて
•Twitter社がOSSとして提供しているID生成器
”snowflake”のご紹介
•こういうツールが必要とされる背景
•仕組み
•etc, etc...
•何かのご参考になれば幸いです。
まとめ
36
Thanks for your listening :)

More Related Content

Twitterのsnowflakeについて

  • 2. DSIRNLP #4 / Twitterのsnowflakeについて 今日話す内容 •snowflake •Twitter社がOSSとして提供しているID生成器 •なぜこのようなツールが必要なのか •仕組みについて •etc,etc... 2
  • 3. DSIRNLP #4 / Twitterのsnowflakeについて ID生成は結構大事(小並感) •たいていの処理の際にIDの生成は必要になる •例1:クローリングした各Webサイト群それぞ れにIDを割り振る •例2:n-gramで分かち書きをした各ワード群 それぞれにIDを割り振る •etc, etc... 3
  • 4. DSIRNLP #4 / Twitterのsnowflakeについて ID生成の性能も結構大事 •例:1つのID生成に1msかかるとした場合、ID生 成処理にどれくらい時間がかかる? •Webサイト10億ページ the number of individual web pages out there is growing by several billion pages per day. (at 2008. via http://googleblog.blogspot.jp/2008/07/we-knew-web-was-big.html) →約11日 •Webサイト240万ページ 日本語wikipediaの総項目数. via http://ja.wikipedia.org/wiki/Wikipedia: %E5%85%A8%E8%A8%80%E8%AA%9E%E7%89%88%E3%81%AE %E7%B5%B1%E8%A8%88 →約40分 4
  • 5. DSIRNLP #4 / Twitterのsnowflakeについて どんな風にIDを生成する? •数値のカウントアップ •各RDBMSの number increment 機能を使って •例:Oracle の sequence •例:MySQL のauto increment •Pros : 実装が簡単 •Cons : ID生成処理が1台のRDBMSに集中し 分散できない。スケールしない。 5
  • 6. DSIRNLP #4 / Twitterのsnowflakeについて どんな風にIDを生成する? •数値のカウントアップ •順序の保証、一意性の保証を何かしらの手段で 行う必要がある。 •ナイーブには「IDを発行する人は1人だけ」 という形で保証。 •仕組み上、処理性能がスケールしにくい 6
  • 7. DSIRNLP #4 / Twitterのsnowflakeについて どんな風にIDを生成する? •RFC 4122 “A Universally Unique IDentifier(UUID)” •http://www.ietf.org/rfc/rfc4122.txt • “UUIDは、分散システム上でどこかが統制を取らずとも、一意に特定可 能な識別子の作成を目的としており...” (wikipedia) •128bitのデータでIDを表現。 例:550e8400-e29b-41d4-a716-446655440000 7
  • 8. DSIRNLP #4 / Twitterのsnowflakeについて どんな風にIDを生成する? •RFC 4122 “A Universally Unique IDentifier(UUID)” 8 ver. description 1 The time-based version specified in this document. 2 DCE Security version, with embedded POSIX UIDs. 3 The name-based version specified in this document that uses MD5 hashing. 4 The randomly or pseudo-randomly generated version specified in this document. 5 The name-based version specified in this document that uses SHA-1 hashing.
  • 9. DSIRNLP #4 / Twitterのsnowflakeについて どんな風にIDを生成する? •RFC 4122 “A Universally Unique IDentifier(UUID)” •version 1 (time-based) 9
  • 10. DSIRNLP #4 / Twitterのsnowflakeについて どんな風にIDを生成する? •RFC 4122 “A Universally Unique IDentifier(UUID)” •Pros : 複数のマシンで並列動作させても一意な IDを生成させる事ができる。 •Cons : しかし128bitはIDのサイズ��しては大きい気 がする... 10
  • 11. DSIRNLP #4 / Twitterのsnowflakeについて どんな風にIDを生成する? •ID生成器に求められるもの •並列に一意なIDの生成が行える。 •できる限り小さいサイズでIDの生成が行える。 11
  • 12. DSIRNLP #4 / Twitterのsnowflakeについて snowflake 12
  • 13. DSIRNLP #4 / Twitterのsnowflakeについて snowflake • •TwitterがOSSとして公開しているID生成器 https://github.com/twitter/snowflake/ •Time-basedなID(timestampを基に生成) •64bitでIDを表現 •複数台のマシンを用いて並列に一意なIDの生成 が行える 13
  • 14. DSIRNLP #4 / Twitterのsnowflakeについて snowflake 14
  • 15. DSIRNLP #4 / Twitterのsnowflakeについて 参考:New Tweets per second record, and how! 15 •https://blog.twitter.com/2013/new-tweets-per- second-record-and-how
  • 16. DSIRNLP #4 / Twitterのsnowflakeについて 参考:New Tweets per second record, and how! 16 •https://blog.twitter.com/2013/new-tweets-per- second-record-and-how
  • 17. DSIRNLP #4 / Twitterのsnowflakeについて snowflake •64bitのlong値でIDを表現 (※先頭1bitは0) •3つの要素で構成 •timestamp (41 bit) : 現在のunixtime(ms)から、ある時点のunixtimeを引いた値 •machine id (10 bit): 生成器に割り当てられたID。datacenter id + worker id。 •sequence (12 bit): 生成器ごとに採番するsequence番号 17
  • 18. DSIRNLP #4 / Twitterのsnowflakeについて snowflake •Q: timestampは41 bitで大丈夫? •A: WebサービスのIDとして用いる分には大丈夫 では •snowflakeでは 「現在のunixtime - 採番開始時のunixtime」 をtimestamp値として使用 •timestampがオーバーフローするのは、採番 開始からおおよそ69年後 18
  • 19. DSIRNLP #4 / Twitterのsnowflakeについて snowflake 19 •ID生成部のソース https://github.com/twitter/snowflake/blob/master/src/main/scala/com/twitter/service/snowflake/IdWorker.scala
  • 20. DSIRNLP #4 / Twitterのsnowflakeについて •ID生成部のソース https://github.com/twitter/snowflake/blob/master/src/main/scala/com/twitter/service/snowflake/IdWorker.scala snowflake 20 現在のunixtimeを取得
  • 21. DSIRNLP #4 / Twitterのsnowflakeについて snowflake 21 1回前に取得したunixtimeより今の unixtimeが古い場合はthrow exception (OSの時刻ズレが起きた可能性) •ID生成部のソース https://github.com/twitter/snowflake/blob/master/src/main/scala/com/twitter/service/snowflake/IdWorker.scala
  • 22. DSIRNLP #4 / Twitterのsnowflakeについて snowflake 22 sequence番号のカウントアップ 同じtimestamp値の中で12bit分 (0-4095)まで採番できる •ID生成部のソース https://github.com/twitter/snowflake/blob/master/src/main/scala/com/twitter/service/snowflake/IdWorker.scala
  • 23. DSIRNLP #4 / Twitterのsnowflakeについて •ID生成部のソース https://github.com/twitter/snowflake/blob/master/src/main/scala/com/twitter/service/snowflake/IdWorker.scala snowflake 23 万が一sequence番号が枯渇した場合 は、unixtimeが新しくなる( 1ms経過 する)まで待つ
  • 24. DSIRNLP #4 / Twitterのsnowflakeについて snowflake 24 今回使用したunixtimeを保存 •ID生成部のソース https://github.com/twitter/snowflake/blob/master/src/main/scala/com/twitter/service/snowflake/IdWorker.scala
  • 25. DSIRNLP #4 / Twitterのsnowflakeについて snowflake 25 ID生成 (timestamp << 22 + datacenterId << 17 + workerId << 12 + sequence) •ID生成部のソース https://github.com/twitter/snowflake/blob/master/src/main/scala/com/twitter/service/snowflake/IdWorker.scala
  • 26. DSIRNLP #4 / Twitterのsnowflakeについて •ID生成部のソース https://github.com/twitter/snowflake/blob/master/src/main/scala/com/twitter/service/snowflake/IdWorker.scala snowflake 26 twepoch が採番開始時のunixtime 1288834974657 = 2010/11/04 10:42:54
  • 27. DSIRNLP #4 / Twitterのsnowflakeについて snowflake •利点 •IDソート ≒ 時系列ソート ID情報だけでID生成時のtimestamp値に基づい た時系列ソートが可能 •ID値からID生成時のtimestamp値が復元可能 27 timestamp = (id >> 22) + twepoch
  • 28. DSIRNLP #4 / Twitterのsnowflakeについて snowflake 28 (369070365764354048 >> 22 + 1288834974657) = 1376828206851 (2013/8/18 21:16:46)
  • 29. DSIRNLP #4 / Twitterのsnowflakeについて snowflake •利点 •整数列圧縮を用いた効率的な情報圧縮が容易 (Variable Byte Code , PFor Delta , Simple9, etc...) 29
  • 30. DSIRNLP #4 / Twitterのsnowflakeについて snowflake •弱点 •OSの時刻ズレに弱い •運用面で工夫が多少必要 30 https://github.com/twitter/snowflake/#system-clock-dependency
  • 31. DSIRNLP #4 / Twitterのsnowflakeについて snowflake •弱点? •ID採番時にsnowflakeサーバーにthrift 経由で接 続するようになっている。 •小∼中規模で運用するには若干重厚な気が 31
  • 32. DSIRNLP #4 / Twitterのsnowflakeについて shakeflake(仮称) •snowflakeを模して社内で作成した軽量なID生成器 •redis 2.6 + lua scripting版 •JavaVM版 32
  • 33. DSIRNLP #4 / Twitterのsnowflakeについて shakeflake(仮称) •参考: http://developer.smartnews.be/blog/2013/07/31/ shakeflake-is-a-tool-for-generating-unique-id- numbers/ 33
  • 34. DSIRNLP #4 / Twitterのsnowflakeについて shakeflake(仮称) •参考: http://developer.smartnews.be/blog/2013/07/31/ shakeflake-is-a-tool-for-generating-unique-id- numbers/ 34
  • 36. DSIRNLP #4 / Twitterのsnowflakeについて •Twitter社がOSSとして提供しているID生成器 ”snowflake”のご紹介 •こういうツールが必要とされる背景 •仕組み •etc, etc... •何かのご参考になれば幸いです。 まとめ 36
  • 37. Thanks for your listening :)