twitterのsnowflakeについて

37
Twitterのsnowflakeに ついて DSIRNLP #4 @just_do_neet

Upload: moai-kids

Post on 22-Apr-2015

5.324 views

Category:

Technology


0 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Twitterのsnowflakeについて

TwitterのsnowflakeについてDSIRNLP #4

@just_do_neet

Page 2: Twitterのsnowflakeについて

DSIRNLP #4 / Twitterのsnowflakeについて

今日話す内容•snowflake

•Twitter社がOSSとして提供しているID生成器

•なぜこのようなツールが必要なのか

•仕組みについて

•etc,etc...

2

Page 3: Twitterのsnowflakeについて

DSIRNLP #4 / Twitterのsnowflakeについて

ID生成は結構大事(小並感)•たいていの処理の際にIDの生成は必要になる

•例1:クローリングした各Webサイト群それぞれにIDを割り振る

•例2:n-gramで分かち書きをした各ワード群それぞれにIDを割り振る

•etc, etc...

3

Page 4: Twitterのsnowflakeについて

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

Page 5: Twitterのsnowflakeについて

DSIRNLP #4 / Twitterのsnowflakeについて

どんな風にIDを生成する?•数値のカウントアップ

•各RDBMSの number increment 機能を使って

•例:Oracle の sequence

•例:MySQL のauto increment

•Pros : 実装が簡単

•Cons : ID生成処理が1台のRDBMSに集中し分散できない。スケールしない。

5

Page 6: Twitterのsnowflakeについて

DSIRNLP #4 / Twitterのsnowflakeについて

どんな風にIDを生成する?•数値のカウントアップ

•順序の保証、一意性の保証を何かしらの手段で行う必要がある。

•ナイーブには「IDを発行する人は1人だけ」という形で保証。

•仕組み上、処理性能がスケールしにくい

6

Page 7: Twitterのsnowflakeについて

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

Page 8: Twitterのsnowflakeについて

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.

Page 9: Twitterのsnowflakeについて

DSIRNLP #4 / Twitterのsnowflakeについて

どんな風にIDを生成する?•RFC 4122 “A Universally Unique IDentifier(UUID)”

•version 1 (time-based)

9

Page 10: Twitterのsnowflakeについて

DSIRNLP #4 / Twitterのsnowflakeについて

どんな風にIDを生成する?•RFC 4122 “A Universally Unique IDentifier(UUID)”

•Pros : 複数のマシンで並列動作させても一意なIDを生成させる事ができる。

•Cons : しかし128bitはIDのサイズとしては大きい気がする...

10

Page 11: Twitterのsnowflakeについて

DSIRNLP #4 / Twitterのsnowflakeについて

どんな風にIDを生成する?• ID生成器に求められるもの

•並列に一意なIDの生成が行える。

•できる限り小さいサイズでIDの生成が行える。

11

Page 12: Twitterのsnowflakeについて

DSIRNLP #4 / Twitterのsnowflakeについて

snowflake

12

Page 13: Twitterのsnowflakeについて

DSIRNLP #4 / Twitterのsnowflakeについて

snowflake•

•TwitterがOSSとして公開しているID生成器https://github.com/twitter/snowflake/

•Time-basedなID(timestampを基に生成)

•64bitでIDを表現

•複数台のマシンを用いて並列に一意なIDの生成が行える

13

Page 14: Twitterのsnowflakeについて

DSIRNLP #4 / Twitterのsnowflakeについて

snowflake

14

Page 15: Twitterのsnowflakeについて

DSIRNLP #4 / Twitterのsnowflakeについて

参考:New Tweets per second record, and how!

15

•https://blog.twitter.com/2013/new-tweets-per-second-record-and-how

Page 16: Twitterのsnowflakeについて

DSIRNLP #4 / Twitterのsnowflakeについて

参考:New Tweets per second record, and how!

16

•https://blog.twitter.com/2013/new-tweets-per-second-record-and-how

Page 17: Twitterのsnowflakeについて

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

Page 18: Twitterのsnowflakeについて

DSIRNLP #4 / Twitterのsnowflakeについて

snowflake•Q: timestampは41 bitで大丈夫?

•A: WebサービスのIDとして用いる分には大丈夫では

•snowflakeでは「現在のunixtime - 採番開始時のunixtime」をtimestamp値として使用

•timestampがオーバーフローするのは、採番開始からおおよそ69年後

18

Page 19: Twitterのsnowflakeについて

DSIRNLP #4 / Twitterのsnowflakeについて

snowflake

19

• ID生成部のソース https://github.com/twitter/snowflake/blob/master/src/main/scala/com/twitter/service/snowflake/IdWorker.scala

Page 20: Twitterのsnowflakeについて

DSIRNLP #4 / Twitterのsnowflakeについて

• ID生成部のソース https://github.com/twitter/snowflake/blob/master/src/main/scala/com/twitter/service/snowflake/IdWorker.scala

snowflake

20

現在のunixtimeを取得

Page 21: Twitterのsnowflakeについて

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

Page 22: Twitterのsnowflakeについて

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

Page 23: Twitterのsnowflakeについて

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経過する)まで待つ

Page 24: Twitterのsnowflakeについて

DSIRNLP #4 / Twitterのsnowflakeについて

snowflake

24

今回使用したunixtimeを保存

• ID生成部のソース https://github.com/twitter/snowflake/blob/master/src/main/scala/com/twitter/service/snowflake/IdWorker.scala

Page 25: Twitterのsnowflakeについて

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

Page 26: Twitterのsnowflakeについて

DSIRNLP #4 / Twitterのsnowflakeについて

• ID生成部のソース https://github.com/twitter/snowflake/blob/master/src/main/scala/com/twitter/service/snowflake/IdWorker.scala

snowflake

26

twepoch が採番開始時のunixtime1288834974657 = 2010/11/04 10:42:54

Page 27: Twitterのsnowflakeについて

DSIRNLP #4 / Twitterのsnowflakeについて

snowflake•利点

• IDソート ≒ 時系列ソートID情報だけでID生成時のtimestamp値に基づいた時系列ソートが可能

• ID値からID生成時のtimestamp値が復元可能

27

timestamp = (id >> 22) + twepoch

Page 28: Twitterのsnowflakeについて

DSIRNLP #4 / Twitterのsnowflakeについて

snowflake

28

(369070365764354048 >> 22 + 1288834974657) = 1376828206851 (2013/8/18 21:16:46)

Page 29: Twitterのsnowflakeについて

DSIRNLP #4 / Twitterのsnowflakeについて

snowflake•利点

•整数列圧縮を用いた効率的な情報圧縮が容易(Variable Byte Code , PFor Delta , Simple9, etc...)

29

Page 30: Twitterのsnowflakeについて

DSIRNLP #4 / Twitterのsnowflakeについて

snowflake•弱点

•OSの時刻ズレに弱い

•運用面で工夫が多少必要

30

https://github.com/twitter/snowflake/#system-clock-dependency

Page 31: Twitterのsnowflakeについて

DSIRNLP #4 / Twitterのsnowflakeについて

snowflake•弱点?

• ID採番時にsnowflakeサーバーにthrift 経由で接続するようになっている。

•小~中規模で運用するには若干重厚な気が

31

Page 32: Twitterのsnowflakeについて

DSIRNLP #4 / Twitterのsnowflakeについて

shakeflake(仮称)

•snowflakeを模して社内で作成した軽量なID生成器

•redis 2.6 + lua scripting版

•JavaVM版

32

Page 35: Twitterのsnowflakeについて

まとめ

Page 36: Twitterのsnowflakeについて

DSIRNLP #4 / Twitterのsnowflakeについて

•Twitter社がOSSとして提供しているID生成器”snowflake”のご紹介

•こういうツールが必要とされる背景

•仕組み

•etc, etc...

•何かのご参考になれば幸いです。

まとめ

36

Page 37: Twitterのsnowflakeについて

Thanks for your listening :)