IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    ĺˆ†ĺ¸ƒĺźçłťçťŸä¸­ĺ”Żä¸€ ID çš„ç”Ÿćˆć–šćł•

    伯小乐发表于 2017-02-05 15:29:23
    love 0

    ćœŹć–‡ä¸ťčŚäť‹çťĺœ¨ä¸€ä¸Şĺˆ†ĺ¸ƒĺźçłťçťŸä¸­, ć€Žäšˆć ˇç”Ÿćˆĺ…¨ĺą€ĺ”Żä¸€çš„ ID

    一, é—Žé˘˜ćčż°

    ĺœ¨ĺˆ†ĺ¸ƒĺźçłťçťŸĺ­˜ĺœ¨ĺ¤šä¸Ş Shard çš„ĺœşć™Żä¸­, ĺŒć—śĺœ¨ĺ„ä¸Ş Shard ć’ĺ…Ľć•°ćŽć—ś, ć€Žäšˆçť™čż™äş›ć•°ćŽç”Ÿćˆĺ…¨ĺą€çš„ unique ID?

    ĺœ¨ĺ•ćœşçłťçťŸä¸­ (䞋匂一个 MySQL 厞䞋), unique ID çš„ç”Ÿćˆć˜Żéžĺ¸¸çŽ€ĺ•çš„, ç›´ćŽĽĺˆŠç”¨ MySQL 自希的自增 ID ĺŠŸčƒ˝ĺ°ąĺŻäťĽĺŽžçŽ°.

    ä˝†ĺœ¨ä¸€ä¸Şĺ­˜ĺœ¨ĺ¤šä¸Ş Shards çš„ĺˆ†ĺ¸ƒĺźçłťçťŸ (䞋匂多个 MySQL ĺŽžäž‹çť„ćˆä¸€ä¸Şé›†çž¤, ĺœ¨čż™ä¸Şé›†çž¤ä¸­ć’ĺ…Ľć•°ćŽ), čż™ä¸Şé—Žé˘˜äźšĺ˜ĺž—ĺ¤ć‚, ć‰€ç”Ÿćˆçš„ĺ…¨ĺą€çš„ unique ID čŚćťĄčśłäťĽä¸‹éœ€ćą‚:

    1. äżčŻç”Ÿćˆçš„ ID 全幀唯一
    2. äťŠĺŽć•°ćŽĺœ¨ĺ¤šä¸Ş Shards äš‹é—´čżç§ťä¸äźšĺ—ĺˆ° ID ç”Ÿćˆć–šĺźçš„é™ĺˆś
    3. ç”Ÿćˆçš„ ID ä¸­ćœ€ĺĽ˝čƒ˝ĺ¸Śä¸Šć—śé—´äżĄćŻ, 䞋匂 ID çš„ĺ‰ k ä˝ć˜Ż Timestamp, čż™ć ˇčƒ˝ĺ¤Ÿç›´ćŽĽé€ščż‡ĺŻš ID çš„ĺ‰ k ä˝çš„ćŽ’ĺşćĽĺŻšć•°ćŽćŒ‰ć—śé—´ćŽ’ĺş
    4. ç”Ÿćˆçš„ ID ćœ€ĺĽ˝ä¸ĺ¤§äşŽ 64 bits
    5. ç”Ÿćˆ ID çš„é€ŸĺşŚćœ‰čŚćą‚. 䞋匂, ĺœ¨ä¸€ä¸ŞéŤ˜ĺžĺé‡çš„ĺœşć™Żä¸­, éœ€čŚćŻç§’ç”Ÿćˆĺ‡ ä¸‡ä¸Ş ID (Twitter ćœ€ć–°çš„ĺł°ĺ€źĺˆ°čžžäş† 143,199 Tweets/s, äšŸĺ°ąć˜Ż 10万+/ç§’)
    6. ć•´ä¸ŞćœĺŠĄćœ€ĺĽ˝ć˛Ąćœ‰ĺ•ç‚š

    ĺŚ‚ćžœć˛Ąćœ‰ä¸Šé˘čż™äş›é™ĺˆś, é—Žé˘˜äźšç›¸ĺŻšçŽ€ĺ•, 䞋匂:

    1. ç›´ćŽĽĺˆŠç”¨ UUID.randomUUID() ćŽĽĺŁćĽç”Ÿćˆ unique ID (http://www.ietf.org/rfc/rfc4122.txt). ä˝†čż™ä¸Şć–šćĄˆç”Ÿćˆçš„ ID ćœ‰ 128 bits, ĺŚĺ¤–, ç”Ÿćˆçš„ ID ä¸­äšŸć˛Ąćœ‰ĺ¸Ś Timestamp
    2. ĺˆŠç”¨ä¸€ä¸Şä¸­ĺżƒćœĺŠĄĺ™¨ćĽçťŸä¸€ç”Ÿćˆ unique ID. ä˝†čż™ç§ć–šćĄˆĺŻčƒ˝ĺ­˜ĺœ¨ĺ•ç‚šé—Žé˘˜; ĺŚĺ¤–, čŚć”ŻćŒéŤ˜ĺžĺçŽ‡çš„çłťçťŸ, čż™ä¸Şć–šćĄˆčż˜čŚĺšĺžˆĺ¤šć”ščż›ĺˇĽä˝œ (䞋匂, ćŻćŹĄäťŽä¸­ĺżƒćœĺŠĄĺ™¨ć‰šé‡čŽˇĺ–ä¸€ć‰š IDs, ćĺ‡ ID äş§ç”Ÿçš„ĺžĺçŽ‡)
    3. Flickr 的做法 (http://code.flickr.net/2010/02/08/ticket-servers-distributed-unique-primary-keys-on-the-cheap/). ä˝†äť–čż™ä¸Şć–šćĄˆ ID ä¸­ć˛Ąćœ‰ĺ¸Ś Timestamp, ç”Ÿćˆçš„ ID ä¸čƒ˝ćŒ‰ć—śé—´ćŽ’ĺş

    ĺœ¨čŚćťĄčśłĺ‰é˘ 6 ç‚ščŚćą‚çš„ĺœşć™Żä¸­, ć€ŽäšˆćĽç”Ÿćˆĺ…¨ĺą€ unique ID 呢?

    Twitter çš„ Snowflake ć˜Żä¸€ç§ćŻ”čžƒĺĽ˝çš„ĺšćł•. ä¸‹é˘ä¸ťčŚäť‹çť Twitter Snowflake, äťĽĺŠĺŽƒçš„ĺ˜ç§

    äşŒ, Twitter Snowflake

    https://github.com/twitter/snowflake

    Snowflake ç”Ÿćˆçš„ unique ID çš„çť„ćˆ (ç”ąéŤ˜ä˝ĺˆ°ä˝Žä˝):

    • 41 bits: Timestamp (母秒级)
    • 10 bits: 节炚 ID (datacenter ID 5 bits + worker ID 5 bits)
    • 12 bits: sequence number

    一兹 63 bits (ćœ€éŤ˜ä˝ć˜Ż 0)

    unique ID ç”Ÿćˆčż‡ç¨‹:

    • 10 bits çš„ćœşĺ™¨ĺˇ, ĺœ¨ ID ĺˆ†é… Worker 启动的旜候, 䝎一个 Zookeeper é›†çž¤čŽˇĺ– (äżčŻć‰€ćœ‰çš„ Worker ä¸äźšćœ‰é‡ĺ¤çš„ćœşĺ™¨ĺˇ)
    • 41 bits çš„ Timestamp: ćŻćŹĄčŚç”Ÿćˆä¸€ä¸Şć–° ID 的旜候, éƒ˝äźščŽˇĺ–ä¸€ä¸‹ĺ˝“ĺ‰çš„ Timestamp, ç„śĺŽĺˆ†ä¸¤ç§ćƒ…ĺ†ľç”Ÿćˆ sequence number:
    • ĺŚ‚ćžœĺ˝“ĺ‰çš„ Timestamp ĺ’Œĺ‰ä¸€ä¸Şĺˇ˛ç”Ÿćˆ ID çš„ Timestamp ç›¸ĺŒ (ĺœ¨ĺŒä¸€ćŻŤç§’ä¸­), ĺ°ąç”¨ĺ‰ä¸€ä¸Ş ID çš„ sequence number + 1 ä˝œä¸şć–°çš„ sequence number (12 bits); ĺŚ‚ćžœćœŹćŻŤç§’ĺ†…çš„ć‰€ćœ‰ ID ç”¨ĺŽŒ, ç­‰ĺˆ°ä¸‹ä¸€ćŻŤç§’çť§çť­ (这个等垅过程中, ä¸čƒ˝ĺˆ†é…ĺ‡şć–°çš„ ID)
    • ĺŚ‚ćžœĺ˝“ĺ‰çš„ Timestamp ćŻ”ĺ‰ä¸€ä¸Ş ID çš„ Timestamp 大, éšćœşç”Ÿćˆä¸€ä¸Şĺˆĺ§‹ sequence number (12 bits) ä˝œä¸şćœŹćŻŤç§’ĺ†…çš„çŹŹä¸€ä¸Ş sequence number

    整个过程中, ĺŞć˜Żĺœ¨ Worker ĺŻĺŠ¨çš„ć—śĺ€™äźšĺŻšĺ¤–éƒ¨ćœ‰äžčľ– (éœ€čŚäťŽ Zookeeper čŽˇĺ– Worker 号), äš‹ĺŽĺ°ąĺŻäťĽç‹ŹçŤ‹ĺˇĽä˝œäş†, ĺšĺˆ°äş†ĺŽťä¸­ĺżƒĺŒ–.

    ĺź‚ĺ¸¸ćƒ…ĺ†ľčŽ¨čŽş:

    • ĺœ¨čŽˇĺ–ĺ˝“ĺ‰ Timestamp ć—ś, ĺŚ‚ćžœčŽˇĺ–ĺˆ°çš„ć—śé—´ćˆłćŻ”ĺ‰ä¸€ä¸Şĺˇ˛ç”Ÿćˆ ID çš„ Timestamp čż˜čŚĺ°ć€ŽäšˆĺŠž? Snowflake çš„ĺšćł•ć˜Żçť§çť­čŽˇĺ–ĺ˝“ĺ‰ćœşĺ™¨çš„ć—śé—´, ç›´ĺˆ°čŽˇĺ–ĺˆ°ć›´ĺ¤§çš„ Timestamp ć‰čƒ˝çť§çť­ĺˇĽä˝œ (ĺœ¨čż™ä¸Şç­‰ĺž…čż‡ç¨‹ä¸­, ä¸čƒ˝ĺˆ†é…ĺ‡şć–°çš„ ID)

    äťŽčż™ä¸Şĺź‚ĺ¸¸ćƒ…ĺ†ľĺŻäťĽçœ‹ĺ‡ş, ĺŚ‚ćžœ Snowflake ć‰€čżčĄŒçš„é‚Łäş›ćœşĺ™¨ć—śé’Ÿćœ‰ĺ¤§çš„ĺĺˇŽć—ś, 整个 Snowflake çłťçťŸä¸čƒ˝ć­Łĺ¸¸ĺˇĽä˝œ (ĺĺˇŽĺž—čśŠĺ¤š, ĺˆ†é…ć–° ID 旜等垅的旜间蜊䚅)

    䝎 Snowflake çš„ĺŽ˜ć–šć–‡ćĄŁ (https://github.com/twitter/snowflake/#system-clock-dependency) ä¸­äšŸĺŻäťĽçœ‹ĺˆ°, ĺŽƒć˜ŽçĄŽčŚćą‚ “You should use NTP to keep your system clock accurate”. č€Œä¸”ćœ€ĺĽ˝ćŠŠ NTP é…ç˝Žćˆä¸äźšĺ‘ĺŽč°ƒć•´çš„ć¨Ąĺź. äšŸĺ°ąć˜ŻčŻ´, NTP çş ć­Łć—śé—´ć—ś, ä¸äźšĺ‘ĺŽĺ›žć‹¨ćœşĺ™¨ć—śé’Ÿ.

    三, Snowflake çš„ĺ…śäť–ĺ˜ç§

    Snowflake ćœ‰ä¸€äş›ĺ˜ç§, ĺ„ä¸Şĺş”ç”¨çť“ĺˆč‡Şĺˇąçš„ĺŽžé™…ĺœşć™ŻĺŻš Snowflake 做了一些攚动. čż™é‡Œä¸ťčŚäť‹çť 3 种.

    1. Boundary flake

    http://boundary.com/blog/2012/01/12/flake-a-decentralized-k-ordered-unique-id-generator-in-erlang/

    ĺ˜ĺŒ–:

    • ID é•żĺşŚć‰Šĺą•ĺˆ° 128 bits:
    • ćœ€éŤ˜ 64 bits ć—śé—´ćˆł;
    • ç„śĺŽć˜Ż 48 bits çš„ Worker 号 (ĺ’Œ Mac ĺœ°ĺ€ä¸€ć ˇé•ż);
    • ćœ€ĺŽć˜Ż 16 bits çš„ Seq Number
    • ç”ąäşŽĺŽƒç”¨ 48 bits ä˝œä¸ş Worker ID, ĺ’Œ Mac ĺœ°ĺ€çš„é•żĺşŚä¸€ć ˇ, čż™ć ˇĺŻĺŠ¨ć—śä¸éœ€čŚĺ’Œ Zookeeper é€ščŽŻčŽˇĺ– Worker ID. ĺšĺˆ°äş†ĺŽŒĺ…¨çš„ĺŽťä¸­ĺżƒĺŒ–
    • ĺŸşäşŽ Erlang

    ĺŽƒčż™ć ˇĺšçš„ç›Žçš„ć˜Żç”¨ć›´ĺ¤šçš„ bits ĺŽžçŽ°ć›´ĺ°çš„ĺ†˛çŞćŚ‚çŽ‡, čż™ć ˇĺ°ąć”ŻćŒć›´ĺ¤šçš„ Worker ĺŒć—śĺˇĽä˝œ. ĺŒć—ś, ćŻćŻŤç§’čƒ˝ĺˆ†é…ĺ‡şć›´ĺ¤šçš„ ID

    2. Simpleflake

    http://engineering.custommade.com/simpleflake-distributed-id-generation-for-the-lazy/

    Simpleflake çš„ć€čˇŻć˜Żĺ–ćśˆ Worker 号, äżç•™ 41 bits çš„ Timestamp, ĺŒć—śćŠŠ sequence number ć‰Šĺą•ĺˆ° 22 bits;

    Simpleflake 的牚炚:

    • sequence number ĺŽŒĺ…¨é éšćœşäş§ç”Ÿ (čż™ć ˇäšŸĺŻźč‡´äş†ç”Ÿćˆçš„ ID ĺŻčƒ˝ĺ‡şçŽ°é‡ĺ¤)
    • ć˛Ąćœ‰ Worker 号, äšŸĺ°ąä¸éœ€čŚĺ’Œ Zookeeper 通莯, ĺŽžçŽ°äş†ĺŽŒĺ…¨ĺŽťä¸­ĺżƒĺŒ–
    • Timestamp äżćŒĺ’Œ Snowflake 一致, äťŠĺŽĺŻäťĽć— çźĺ‡çş§ĺˆ° Snowflake

    Simpleflake çš„é—Žé˘˜ĺ°ąć˜Ż sequence number ĺŽŒĺ…¨éšćœşç”Ÿćˆ, äźšĺŻźč‡´ç”Ÿćˆçš„ ID é‡ĺ¤çš„ĺŻčƒ˝. čż™ä¸Şç”Ÿćˆ ID é‡ĺ¤çš„ćŚ‚çŽ‡éšç€ćŻç§’ç”Ÿćˆçš„ ID ć•°çš„ĺ˘žé•żč€Œĺ˘žé•ż.

    所䝼, Simpleflake çš„é™ĺˆśĺ°ąć˜ŻćŻç§’ç”Ÿćˆçš„ ID ä¸čƒ˝ĺ¤Şĺ¤š (ćœ€ĺĽ˝ĺ°äşŽ 100揥/ç§’, ĺŚ‚ćžœĺ¤§äşŽ 100揥/ç§’çš„ĺœşć™Ż, Simpleflake ĺ°ąä¸é€‚ç”¨äş†, ĺťşčŽŽĺˆ‡ć˘ĺ›ž Snowflake).

    3. instagram 的做法

    ĺ…ˆçŽ€ĺ•äť‹çťä¸€ä¸‹ instagram çš„ĺˆ†ĺ¸ƒĺźĺ­˜ĺ‚¨ć–šćĄˆ:

    • ĺ…ˆćŠŠćŻä¸Ş Table ĺˆ’ĺˆ†ä¸şĺ¤šä¸Şé€ťčž‘ĺˆ†ç‰‡ (logic Shard), é€ťčž‘ĺˆ†ç‰‡çš„ć•°é‡ĺŻäťĽĺžˆĺ¤§, 䞋匂 2000 ä¸Şé€ťčž‘ĺˆ†ç‰‡
    • ç„śĺŽĺˆśĺŽšä¸€ä¸Şč§„ĺˆ™, č§„ĺŽšćŻä¸Şé€ťčž‘ĺˆ†ç‰‡č˘Ťĺ­˜ĺ‚¨ĺˆ°ĺ“Şä¸Şć•°ćŽĺş“ĺŽžäž‹ä¸Šé˘; ć•°ćŽĺş“ĺŽžäž‹ä¸éœ€čŚĺžˆĺ¤š. 䞋匂, ĺŻšćœ‰ 2 个 PostgreSQL ĺŽžäž‹çš„çłťçťŸ (instagram 使用 PostgreSQL); ĺŻäťĽä˝żç”¨ĺĽ‡ć•°é€ťčž‘ĺˆ†ç‰‡ĺ­˜ć”žĺˆ°çŹŹä¸€ä¸Şć•°ćŽĺş“ĺŽžäž‹, ĺść•°é€ťčž‘ĺˆ†ç‰‡ĺ­˜ć”žĺˆ°çŹŹäşŒä¸Şć•°ćŽĺş“ĺŽžäž‹çš„č§„ĺˆ™
    • 每个 Table ćŒ‡ĺŽšä¸€ä¸Şĺ­—ćŽľä˝œä¸şĺˆ†ç‰‡ĺ­—ćŽľ (䞋匂, ĺŻšç”¨ćˆˇčĄ¨, ĺŻäťĽćŒ‡ĺŽš uid ä˝œä¸şĺˆ†ç‰‡ĺ­—ćŽľ)
    • ć’ĺ…Ľä¸€ä¸Şć–°çš„ć•°ćŽć—ś, ĺ…ˆć šćŽĺˆ†ç‰‡ĺ­—ćŽľçš„ĺ€ź, ĺ†łĺŽšć•°ćŽč˘Ťĺˆ†é…ĺˆ°ĺ“Şä¸Şé€ťčž‘ĺˆ†ç‰‡ (logic Shard)
    • ç„śĺŽĺ†ć šćŽ logic Shard ĺ’Œ PostgreSQL 厞䞋的寚应关糝, çĄŽĺŽščż™ćĄć•°ćŽĺş”čŻĽč˘Ťĺ­˜ć”žĺˆ°ĺ“Şĺ° PostgreSQL 厞䞋上

    instagram unique ID çš„çť„ćˆ:

    • 41 bits: Timestamp (母秒)
    • 13 bits: 每个 logic Shard çš„äťŁĺˇ (ćœ€ĺ¤§ć”ŻćŒ 8 x 1024 个 logic Shards)
    • 10 bits: sequence number; 每个 Shard ćŻćŻŤç§’ćœ€ĺ¤šĺŻäťĽç”Ÿćˆ 1024 个 ID

    ç”Ÿćˆ unique ID ć—ś, 41 bits çš„ Timestamp ĺ’Œ Snowflake çąťäźź, čż™é‡Œĺ°ąä¸çť†čŻ´äş†.

    ä¸ťčŚäť‹çťä¸€ä¸‹ 13 bits çš„ logic Shard 代号 ĺ’Œ 10 bits çš„ sequence number ć€Žäšˆç”Ÿćˆ.

    logic Shard 代号:

    • ĺ‡čŽžć’ĺ…Ľä¸€ćĄć–°çš„ç”¨ćˆˇčŽ°ĺ˝•, ć’ĺ…Ľć—ś, 根据 uid ćĽĺˆ¤ć–­čż™ćĄčŽ°ĺ˝•ĺş”čŻĽč˘Ťć’ĺ…Ľĺˆ°ĺ“Şä¸Ş logic Shard 中.
    • ĺ‡čŽžĺ˝“ĺ‰čŚć’ĺ…Ľçš„čŽ°ĺ˝•äźšč˘Ťć’ĺ…Ľĺˆ°çŹŹ 1341 号 logic Shard 中 (ĺ‡čŽžĺ˝“ĺ‰çš„čż™ä¸Ş Table ä¸€ĺ…ąćœ‰ 2000 个 logic Shard)
    • ć–°ç”Ÿćˆ ID çš„ 13 bits ćŽľčŚĺĄŤçš„ĺ°ąć˜Ż 1341 这个数字

    sequence number ĺˆŠç”¨ PostgreSQL 每个 Table 上的 auto-increment sequence ćĽç”Ÿćˆ:

    • ĺŚ‚ćžœĺ˝“ĺ‰čĄ¨ä¸Šĺˇ˛çťćœ‰ 5000 ćĄčŽ°ĺ˝•, é‚Łäšˆčż™ä¸ŞčĄ¨çš„ä¸‹ä¸€ä¸Ş auto-increment sequence ĺ°ąć˜Ż 5001 (ç›´ćŽĽč°ƒç”¨ PL/PGSQL ćäž›çš„ć–šćł•ĺŻäťĽčŽˇĺ–ĺˆ°)
    • 焜后把 这个 5001 寚 1024 ĺ–ć¨Ąĺ°ąĺž—ĺˆ°äş† 10 bits çš„ sequence number

    instagram čż™ä¸Şć–šćĄˆçš„äź˜ĺŠżĺœ¨äşŽ:

    • ĺˆŠç”¨ logic Shard ĺˇćĽć›żć˘ Snowflake 使用的 Worker 号, ĺ°ąä¸éœ€čŚĺˆ°ä¸­ĺżƒčŠ‚ç‚ščŽˇĺ– Worker ĺˇäş†. ĺšĺˆ°äş†ĺŽŒĺ…¨ĺŽťä¸­ĺżƒĺŒ–
    • ĺŚĺ¤–ä¸€ä¸Şé™„ĺ¸Śçš„ĺĽ˝ĺ¤„ĺ°ąć˜Ż, ĺŻäťĽé€ščż‡ ID ç›´ćŽĽçŸĽé“čż™ćĄčŽ°ĺ˝•č˘Ťĺ­˜ć”žĺœ¨ĺ“Şä¸Ş logic Shard 上

    ĺŒć—ś, äťŠĺŽĺšć•°ćŽčżç§ťçš„ć—śĺ€™, äšŸć˜ŻćŒ‰ logic Shard ä¸şĺ•ä˝ĺšć•°ćŽčżç§ťçš„, ć‰€äťĽčż™ç§ĺšćł•äšŸä¸äźšĺ˝ąĺ“ĺˆ°äťŠĺŽçš„ć•°ćŽčżç§ť

    ĺˆ†ĺ¸ƒĺźçłťçťŸä¸­ĺ”Żä¸€ ID çš„ç”Ÿćˆć–šćł•ďźŒéŚ–ĺ‘äşŽć–‡çŤ  - äźŻäšĺœ¨çşżă€‚



沪ICP备19023445号-2号
友情链接