Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
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で分かち書き...
DSIRNLP #4 / Twitterのsnowflakeについて
ID生成の性能も結構大事
•例:1つのID生成に1msかかるとした場合、ID生
成処理にどれくらい時間がかかる?
•Webサイト10億ページ
the number of ind...
DSIRNLP #4 / Twitterのsnowflakeについて
どんな風にIDを生成する?
•数値のカウントアップ
•各RDBMSの number increment 機能を使って
•例:Oracle の sequence
•例:MySQL...
DSIRNLP #4 / Twitterのsnowflakeについて
どんな風にIDを生成する?
•数値のカウントアップ
•順序の保証、一意性の保証を何かしらの手段で
行う必要がある。
•ナイーブには「IDを発行する人は1人だけ」
という形で保証...
DSIRNLP #4 / Twitterのsnowflakeについて
どんな風にIDを生成する?
•RFC 4122 “A Universally Unique IDentifier(UUID)”
•http://www.ietf.org/rfc/...
DSIRNLP #4 / Twitterのsnowflakeについて
どんな風にIDを生成する?
•RFC 4122 “A Universally Unique IDentifier(UUID)”
8
ver. description
1 The ...
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 : 複数のマシンで並列動作させても一意...
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なI...
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-p...
DSIRNLP #4 / Twitterのsnowflakeについて
参考:New Tweets per second record, and how!
16
•https://blog.twitter.com/2013/new-tweets-p...
DSIRNLP #4 / Twitterのsnowflakeについて
snowflake
•64bitのlong値でIDを表現 (※先頭1bitは0)
•3つの要素で構成
•timestamp (41 bit) :
現在のunixtime(ms)か...
DSIRNLP #4 / Twitterのsnowflakeについて
snowflake
•Q: timestampは41 bitで大丈夫?
•A: WebサービスのIDとして用いる分には大丈夫
では
•snowflakeでは
「現在のunixtim...
DSIRNLP #4 / Twitterのsnowflakeについて
snowflake
19
•ID生成部のソース
https://github.com/twitter/snowflake/blob/master/src/main/scala/co...
DSIRNLP #4 / Twitterのsnowflakeについて
•ID生成部のソース
https://github.com/twitter/snowflake/blob/master/src/main/scala/com/twitter/se...
DSIRNLP #4 / Twitterのsnowflakeについて
snowflake
21
1回前に取得したunixtimeより今の
unixtimeが古い場合はthrow exception
(OSの時刻ズレが起きた可能性)
•ID生成部のソ...
DSIRNLP #4 / Twitterのsnowflakeについて
snowflake
22
sequence番号のカウントアップ
同じtimestamp値の中で12bit分
(0-4095)まで採番できる
•ID生成部のソース
https://...
DSIRNLP #4 / Twitterのsnowflakeについて
•ID生成部のソース
https://github.com/twitter/snowflake/blob/master/src/main/scala/com/twitter/se...
DSIRNLP #4 / Twitterのsnowflakeについて
snowflake
24
今回使用したunixtimeを保存
•ID生成部のソース
https://github.com/twitter/snowflake/blob/master...
DSIRNLP #4 / Twitterのsnowflakeについて
snowflake
25
ID生成
(timestamp << 22 + datacenterId <<
17 + workerId << 12 + sequence)
•ID生...
DSIRNLP #4 / Twitterのsnowflakeについて
•ID生成部のソース
https://github.com/twitter/snowflake/blob/master/src/main/scala/com/twitter/se...
DSIRNLP #4 / Twitterのsnowflakeについて
snowflake
•利点
•IDソート ≒ 時系列ソート
ID情報だけでID生成時のtimestamp値に基づい
た時系列ソートが可能
•ID値からID生成時のtimestam...
DSIRNLP #4 / Twitterのsnowflakeについて
snowflake
28
(369070365764354048 >> 22 + 1288834974657)
= 1376828206851 (2013/8/18 21:16:...
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-clo...
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-fo...
DSIRNLP #4 / Twitterのsnowflakeについて
shakeflake(仮称)
•参考:
http://developer.smartnews.be/blog/2013/07/31/
shakeflake-is-a-tool-fo...
まとめ
DSIRNLP #4 / Twitterのsnowflakeについて
•Twitter社がOSSとして提供しているID生成器
”snowflake”のご紹介
•こういうツールが必要とされる背景
•仕組み
•etc, etc...
•何かのご参考にな...
Thanks for your listening :)
Upcoming SlideShare
Loading in …5
×

Twitterのsnowflakeについて

16,126 views

Published on

Published in: Technology
  • Be the first to comment

Twitterのsnowflakeについて

  1. 1. Twitterのsnowflakeに ついて DSIRNLP #4 @just_do_neet
  2. 2. DSIRNLP #4 / Twitterのsnowflakeについて 今日話す内容 •snowflake •Twitter社がOSSとして提供しているID生成器 •なぜこのようなツールが必要なのか •仕組みについて •etc,etc... 2
  3. 3. DSIRNLP #4 / Twitterのsnowflakeについて ID生成は結構大事(小並感) •たいていの処理の際にIDの生成は必要になる •例1:クローリングした各Webサイト群それぞ れにIDを割り振る •例2:n-gramで分かち書きをした各ワード群 それぞれにIDを割り振る •etc, etc... 3
  4. 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. 5. DSIRNLP #4 / Twitterのsnowflakeについて どんな風にIDを生成する? •数値のカウントアップ •各RDBMSの number increment 機能を使って •例:Oracle の sequence •例:MySQL のauto increment •Pros : 実装が簡単 •Cons : ID生成処理が1台のRDBMSに集中し 分散できない。スケールしない。 5
  6. 6. DSIRNLP #4 / Twitterのsnowflakeについて どんな風にIDを生成する? •数値のカウントアップ •順序の保証、一意性の保証を何かしらの手段で 行う必要がある。 •ナイーブには「IDを発行する人は1人だけ」 という形で保証。 •仕組み上、処理性能がスケールしにくい 6
  7. 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. 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. 9. DSIRNLP #4 / Twitterのsnowflakeについて どんな風にIDを生成する? •RFC 4122 “A Universally Unique IDentifier(UUID)” •version 1 (time-based) 9
  10. 10. DSIRNLP #4 / Twitterのsnowflakeについて どんな風にIDを生成する? •RFC 4122 “A Universally Unique IDentifier(UUID)” •Pros : 複数のマシンで並列動作させても一意な IDを生成させる事ができる。 •Cons : しかし128bitはIDのサイズとしては大きい気 がする... 10
  11. 11. DSIRNLP #4 / Twitterのsnowflakeについて どんな風にIDを生成する? •ID生成器に求められるもの •並列に一意なIDの生成が行える。 •できる限り小さいサイズでIDの生成が行える。 11
  12. 12. DSIRNLP #4 / Twitterのsnowflakeについて snowflake 12
  13. 13. DSIRNLP #4 / Twitterのsnowflakeについて snowflake • •TwitterがOSSとして公開しているID生成器 https://github.com/twitter/snowflake/ •Time-basedなID(timestampを基に生成) •64bitでIDを表現 •複数台のマシンを用いて並列に一意なIDの生成 が行える 13
  14. 14. DSIRNLP #4 / Twitterのsnowflakeについて snowflake 14
  15. 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. 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. 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. 18. DSIRNLP #4 / Twitterのsnowflakeについて snowflake •Q: timestampは41 bitで大丈夫? •A: WebサービスのIDとして用いる分には大丈夫 では •snowflakeでは 「現在のunixtime - 採番開始時のunixtime」 をtimestamp値として使用 •timestampがオーバーフローするのは、採番 開始からおおよそ69年後 18
  19. 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. 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. 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. 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. 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. 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. 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. 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. 27. DSIRNLP #4 / Twitterのsnowflakeについて snowflake •利点 •IDソート ≒ 時系列ソート ID情報だけでID生成時のtimestamp値に基づい た時系列ソートが可能 •ID値からID生成時のtimestamp値が復元可能 27 timestamp = (id >> 22) + twepoch
  28. 28. DSIRNLP #4 / Twitterのsnowflakeについて snowflake 28 (369070365764354048 >> 22 + 1288834974657) = 1376828206851 (2013/8/18 21:16:46)
  29. 29. DSIRNLP #4 / Twitterのsnowflakeについて snowflake •利点 •整数列圧縮を用いた効率的な情報圧縮が容易 (Variable Byte Code , PFor Delta , Simple9, etc...) 29
  30. 30. DSIRNLP #4 / Twitterのsnowflakeについて snowflake •弱点 •OSの時刻ズレに弱い •運用面で工夫が多少必要 30 https://github.com/twitter/snowflake/#system-clock-dependency
  31. 31. DSIRNLP #4 / Twitterのsnowflakeについて snowflake •弱点? •ID採番時にsnowflakeサーバーにthrift 経由で接 続するようになっている。 •小∼中規模で運用するには若干重厚な気が 31
  32. 32. DSIRNLP #4 / Twitterのsnowflakeについて shakeflake(仮称) •snowflakeを模して社内で作成した軽量なID生成器 •redis 2.6 + lua scripting版 •JavaVM版 32
  33. 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. 34. DSIRNLP #4 / Twitterのsnowflakeについて shakeflake(仮称) •参考: http://developer.smartnews.be/blog/2013/07/31/ shakeflake-is-a-tool-for-generating-unique-id- numbers/ 34
  35. 35. まとめ
  36. 36. DSIRNLP #4 / Twitterのsnowflakeについて •Twitter社がOSSとして提供しているID生成器 ”snowflake”のご紹介 •こういうツールが必要とされる背景 •仕組み •etc, etc... •何かのご参考になれば幸いです。 まとめ 36
  37. 37. Thanks for your listening :)

×