More Related Content Similar to Twitterのsnowflakeについて (20) 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
13. DSIRNLP #4 / Twitterのsnowflakeについて
snowflake
•
•TwitterがOSSとして公開しているID生成器
https://github.com/twitter/snowflake/
•Time-basedなID(timestampを基に生成)
•64bitでIDを表現
•複数台のマシンを用いて並列に一意なIDの生成
が行える
13
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