Twitterのsnowflakeについて

9,113 views
8,863 views

Published on

Published in: Technology
0 Comments
33 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
9,113
On SlideShare
0
From Embeds
0
Number of Embeds
8
Actions
Shares
0
Downloads
28
Comments
0
Likes
33
Embeds 0
No embeds

No notes for slide

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 :)

×