±³¾°
ÔÚ¸´ÔÓ·Ö²¼Ê½ÏµÍ³ÖУ¬ÍùÍùÐèÒª¶Ô´óÁ¿µÄÊý¾ÝºÍÏûÏ¢½øÐÐΨһ±êʶ¡£ÈçÔÚÃÀÍŵãÆÀµÄ½ðÈÚ¡¢Ö§¸¶¡¢²ÍÒû¡¢¾Æµê¡¢Ã¨ÑÛµçÓ°µÈ²úÆ·µÄϵͳÖУ¬Êý¾ÝÈÕ½¥Ôö³¤£¬¶ÔÊý¾Ý·Ö¿â·Ö±íºóÐèÒªÓÐÒ»¸öΨһIDÀ´±êʶһÌõÊý¾Ý»òÏûÏ¢£¬Êý¾Ý¿âµÄ×ÔÔöIDÏÔÈ»²»ÄÜÂú×ãÐèÇó£»ÌرðÒ»µãµÄÈç¶©µ¥¡¢ÆïÊÖ¡¢ÓÅ»ÝȯҲ¶¼ÐèÒªÓÐΨһID×ö±êʶ¡£´Ëʱһ¸öÄܹ»Éú³ÉÈ«¾ÖΨһIDµÄϵͳÊǷdz£±ØÒªµÄ¡£¸ÅÀ¨ÏÂÀ´£¬ÄÇÒµÎñϵͳ¶ÔIDºÅµÄÒªÇóÓÐÄÄÐ©ÄØ£¿
È«¾ÖΨһÐÔ£º²»ÄܳöÏÖÖØ¸´µÄIDºÅ£¬¼ÈÈ»ÊÇΨһ±êʶ£¬ÕâÊÇ×î»ù±¾µÄÒªÇó¡£
Ç÷ÊÆµÝÔö£ºÔÚMySQL InnoDBÒýÇæÖÐʹÓõÄÊǾۼ¯Ë÷Òý£¬ÓÉÓÚ¶àÊýRDBMSʹÓÃB-treeµÄÊý¾Ý½á¹¹À´´æ´¢Ë÷ÒýÊý¾Ý£¬ÔÚÖ÷¼üµÄÑ¡ÔñÉÏÃæÎÒÃÇÓ¦¸Ã¾¡Á¿Ê¹ÓÃÓÐÐòµÄÖ÷¼ü±£Ö¤Ð´ÈëÐÔÄÜ¡£
µ¥µ÷µÝÔö£º±£Ö¤ÏÂÒ»¸öIDÒ»¶¨´óÓÚÉÏÒ»¸öID£¬ÀýÈçÊÂÎñ°æ±¾ºÅ¡¢IMÔöÁ¿ÏûÏ¢¡¢ÅÅÐòµÈÌØÊâÐèÇó¡£
ÐÅÏ¢°²È«£ºÈç¹ûIDÊÇÁ¬ÐøµÄ£¬¶ñÒâÓû§µÄ°ÇÈ¡¹¤×÷¾Í·Ç³£ÈÝÒ××öÁË£¬Ö±½Ó°´ÕÕ˳ÐòÏÂÔØÖ¸¶¨URL¼´¿É£»Èç¹ûÊǶ©µ¥ºÅ¾Í¸üΣÏÕÁË£¬¾º¶Ô¿ÉÒÔÖ±½ÓÖªµÀÎÒÃÇÒ»ÌìµÄµ¥Á¿¡£ËùÒÔÔÚһЩӦÓó¡¾°Ï£¬»áÐèÒªIDÎÞ¹æÔò¡¢²»¹æÔò¡£
ÉÏÊö123¶ÔÓ¦ÈýÀ಻ͬµÄ³¡¾°£¬3ºÍ4ÐèÇó»¹ÊÇ»¥³âµÄ£¬ÎÞ·¨Ê¹ÓÃͬһ¸ö·½°¸Âú×ã¡£
ͬʱ³ýÁ˶ÔIDºÅÂë×ÔÉíµÄÒªÇó£¬ÒµÎñ»¹¶ÔIDºÅÉú³ÉϵͳµÄ¿ÉÓÃÐÔÒªÇ󼫸ߣ¬ÏëÏóһϣ¬Èç¹ûIDÉú³Éϵͳ̱»¾£¬Õû¸öÃÀÍŵãÆÀÖ§¸¶¡¢ÓÅ»Ýȯ·¢È¯¡¢ÆïÊÖÅɵ¥µÈ¹Ø¼ü¶¯×÷¶¼ÎÞ·¨Ö´ÐУ¬Õâ¾Í»á´øÀ´Ò»³¡ÔÖÄÑ¡£
ÓÉ´Ë×ܽáÏÂÒ»¸öIDÉú³ÉϵͳӦ¸Ã×öµ½Èçϼ¸µã£º
ƽ¾ùÑÓ³ÙºÍTP999ÑÓ³Ù¶¼Òª¾¡¿ÉÄܵͣ»
¿ÉÓÃÐÔ5¸ö9£»
¸ßQPS¡£
³£¼û·½·¨½éÉÜ
UUID
UUID(Universally Unique Identifier)µÄ±ê×¼ÐÍʽ°üº¬32¸ö16½øÖÆÊý×Ö£¬ÒÔÁ¬×ֺŷÖΪÎå¶Î£¬ÐÎʽΪ8-4-4-4-12µÄ36¸ö×Ö·û£¬Ê¾Àý£º550e8400-e29b-41d4-a716-446655440000£¬µ½Ä¿Ç°ÎªÖ¹Òµ½çÒ»¹²ÓÐ5ÖÖ·½Ê½Éú³ÉUUID£¬ÏêÇé¼ûIETF·¢²¼µÄUUID¹æ·¶
A Universally Unique IDentifier (UUID) URN Namespace¡£
Óŵ㣺
ÐÔÄܷdz£¸ß£º±¾µØÉú³É£¬Ã»ÓÐÍøÂçÏûºÄ¡£
ȱµã£º
²»Ò×ÓÚ´æ´¢£ºUUIDÌ«³¤£¬16×Ö½Ú128λ£¬Í¨³£ÒÔ36³¤¶ÈµÄ×Ö·û´®±íʾ£¬ºÜ¶à³¡¾°²»ÊÊÓá£
ÐÅÏ¢²»°²È«£º»ùÓÚMACµØÖ·Éú³ÉUUIDµÄËã·¨¿ÉÄÜ»áÔì³ÉMACµØÖ·Ð¹Â¶£¬Õâ¸ö©¶´Ôø±»ÓÃÓÚѰÕÒ÷Àöɯ²¡¶¾µÄÖÆ×÷ÕßλÖá£
ID×÷ΪÖ÷¼üʱÔÚÌØ¶¨µÄ»·¾³»á´æÔÚһЩÎÊÌ⣬±ÈÈç×öDBÖ÷¼üµÄ³¡¾°Ï£¬UUID¾Í·Ç³£²»ÊÊÓãº
¢Ù MySQL¹Ù·½ÓÐÃ÷È·µÄ½¨ÒéÖ÷¼üÒª¾¡Á¿Ô½¶ÌÔ½ºÃ[4]£¬36¸ö×Ö·û³¤¶ÈµÄUUID²»·ûºÏÒªÇó¡£
All indexes other than the clustered index are
known as secondary indexes. In InnoDB, each record
in a secondary index contains the primary key
columns for the row, as well as the columns specified
for the secondary index. InnoDB uses this primary
key value to search for the row in the clustered
index. If the primary key is long, the secondary
indexes use more space, so it is advantageous
to have a short primary key. |
¢Ú ¶ÔMySQLË÷Òý²»Àû£ºÈç¹û×÷ΪÊý¾Ý¿âÖ÷¼ü£¬ÔÚInnoDBÒýÇæÏ£¬UUIDµÄÎÞÐòÐÔ¿ÉÄÜ»áÒýÆðÊý¾ÝλÖÃÆµ·±±ä¶¯£¬ÑÏÖØÓ°ÏìÐÔÄÜ¡£
Ààsnowflake·½°¸
ÕâÖÖ·½°¸´óÖÂÀ´ËµÊÇÒ»ÖÖÒÔ»®·ÖÃüÃû¿Õ¼ä£¨UUIDÒ²Ë㣬ÓÉÓڱȽϳ£¼û£¬ËùÒÔµ¥¶À·ÖÎö£©À´Éú³ÉIDµÄÒ»ÖÖËã·¨£¬ÕâÖÖ·½°¸°Ñ64-bit·Ö±ð»®·Ö³É¶à¶Î£¬·Ö¿ªÀ´±êʾ»úÆ÷¡¢Ê±¼äµÈ£¬±ÈÈçÔÚsnowflakeÖеÄ64-bit·Ö±ð±íʾÈçÏÂͼ£¨Í¼Æ¬À´×ÔÍøÂ磩Ëùʾ£º

41-bitµÄʱ¼ä¿ÉÒÔ±íʾ£¨1L<<41£©/(1000L*3600*24*365)=69ÄêµÄʱ¼ä£¬10-bit»úÆ÷¿ÉÒÔ·Ö±ð±íʾ1024̨»úÆ÷¡£Èç¹ûÎÒÃǶÔIDC»®·ÖÓÐÐèÇ󣬻¹¿ÉÒÔ½«10-bit·Ö5-bit¸øIDC£¬·Ö5-bit¸ø¹¤×÷»úÆ÷¡£ÕâÑù¾Í¿ÉÒÔ±íʾ32¸öIDC£¬Ã¿¸öIDCÏ¿ÉÒÔÓÐ32̨»úÆ÷£¬¿ÉÒÔ¸ù¾Ý×ÔÉíÐèÇó¶¨Òå¡£12¸ö×ÔÔöÐòÁкſÉÒÔ±íʾ2^12¸öID£¬ÀíÂÛÉÏsnowflake·½°¸µÄQPSԼΪ409.6w/s£¬ÕâÖÖ·ÖÅ䷽ʽ¿ÉÒÔ±£Ö¤ÔÚÈκÎÒ»¸öIDCµÄÈκÎһ̨»úÆ÷ÔÚÈÎÒâºÁÃëÄÚÉú³ÉµÄID¶¼ÊDz»Í¬µÄ¡£
ÕâÖÖ·½Ê½µÄÓÅȱµãÊÇ£º
Óŵ㣺
ºÁÃëÊýÔÚ¸ß룬×ÔÔöÐòÁÐÔÚµÍ룬Õû¸öID¶¼ÊÇÇ÷ÊÆµÝÔöµÄ¡£
²»ÒÀÀµÊý¾Ý¿âµÈµÚÈý·½ÏµÍ³£¬ÒÔ·þÎñµÄ·½Ê½²¿Êð£¬Îȶ¨ÐÔ¸ü¸ß£¬Éú³ÉIDµÄÐÔÄÜÒ²ÊǷdz£¸ßµÄ¡£
¿ÉÒÔ¸ù¾Ý×ÔÉíÒµÎñÌØÐÔ·ÖÅäbit룬·Ç³£Áé»î¡£
ȱµã£º
Ç¿ÒÀÀµ»úÆ÷ʱÖÓ£¬Èç¹û»úÆ÷ÉÏʱÖӻز¦£¬»áµ¼Ö·¢ºÅÖØ¸´»òÕß·þÎñ»á´¦ÓÚ²»¿ÉÓÃ״̬¡£
Ó¦ÓþÙÀýMongdb objectID
MongoDB¹Ù·½Îĵµ ObjectID¿ÉÒÔËã×÷ÊǺÍsnowflakeÀàËÆ·½·¨£¬Í¨¹ý¡°Ê±¼ä+»úÆ÷Âë+pid+inc¡±¹²12¸ö×Ö½Ú£¬Í¨¹ý4+3+2+3µÄ·½Ê½×îÖÕ±êʶ³ÉÒ»¸ö24³¤¶ÈµÄÊ®Áù½øÖÆ×Ö·û¡£
Êý¾Ý¿âÉú³É
ÒÔMySQL¾ÙÀý£¬ÀûÓøø×Ö¶ÎÉèÖÃauto_increment_incrementºÍauto_increment_offsetÀ´±£Ö¤ID×ÔÔö£¬Ã¿´ÎÒµÎñʹÓÃÏÂÁÐSQL¶ÁдMySQLµÃµ½IDºÅ¡£
begin;
REPLACE INTO Tickets64 (stub) VALUES ('a');
SELECT LAST_INSERT_ID();
commit; |

ÕâÖÖ·½°¸µÄÓÅȱµãÈçÏ£º
Óŵ㣺
·Ç³£¼òµ¥£¬ÀûÓÃÏÖÓÐÊý¾Ý¿âϵͳµÄ¹¦ÄÜʵÏÖ£¬³É±¾Ð¡£¬ÓÐDBAרҵά»¤¡£
IDºÅµ¥µ÷×ÔÔö£¬¿ÉÒÔʵÏÖһЩ¶ÔIDÓÐÌØÊâÒªÇóµÄÒµÎñ¡£
ȱµã£º
Ç¿ÒÀÀµDB£¬µ±DBÒ쳣ʱÕû¸öϵͳ²»¿ÉÓã¬ÊôÓÚÖÂÃüÎÊÌâ¡£ÅäÖÃÖ÷´Ó¸´ÖÆ¿ÉÒÔ¾¡¿ÉÄܵÄÔö¼Ó¿ÉÓÃÐÔ£¬µ«ÊÇÊý¾ÝÒ»ÖÂÐÔÔÚÌØÊâÇé¿öÏÂÄÑÒÔ±£Ö¤¡£Ö÷´ÓÇл»Ê±µÄ²»Ò»Ö¿ÉÄܻᵼÖÂÖØ¸´·¢ºÅ¡£
ID·¢ºÅÐÔÄÜÆ¿¾±ÏÞÖÆÔÚµ¥Ì¨MySQLµÄ¶ÁдÐÔÄÜ¡£
¶ÔÓÚMySQLÐÔÄÜÎÊÌ⣬¿ÉÓÃÈçÏ·½°¸½â¾ö£ºÔÚ·Ö²¼Ê½ÏµÍ³ÖÐÎÒÃÇ¿ÉÒԶಿÊð¼¸Ì¨»úÆ÷£¬Ã¿Ì¨»úÆ÷ÉèÖò»Í¬µÄ³õʼֵ£¬ÇÒ²½³¤ºÍ»úÆ÷ÊýÏàµÈ¡£±ÈÈçÓÐÁ½Ì¨»úÆ÷¡£ÉèÖò½³¤stepΪ2£¬TicketServer1µÄ³õʼֵΪ1£¨1£¬3£¬5£¬7£¬9£¬11...£©¡¢TicketServer2µÄ³õʼֵΪ2£¨2£¬4£¬6£¬8£¬10...£©¡£ÕâÊÇFlickrÍŶÓÔÚ2010Äê׫ÎĽéÉܵÄÒ»ÖÖÖ÷¼üÉú³É²ßÂÔ£¨Ticket
Servers: Distributed Unique Primary Keys on the Cheap
£©¡£ÈçÏÂËùʾ£¬ÎªÁËʵÏÖÉÏÊö·½°¸·Ö±ðÉèÖÃÁ½Ì¨»úÆ÷¶ÔÓ¦µÄ²ÎÊý£¬TicketServer1´Ó1¿ªÊ¼·¢ºÅ£¬TicketServer2´Ó2¿ªÊ¼·¢ºÅ£¬Á½Ì¨»úÆ÷ÿ´Î·¢ºÅÖ®ºó¶¼µÝÔö2¡£
TicketServer1:
auto-increment-increment = 2
auto-increment-offset = 1
TicketServer2:
auto-increment-increment = 2
auto-increment-offset = 2 |
¼ÙÉèÎÒÃÇÒª²¿ÊðN̨»úÆ÷£¬²½³¤ÐèÉèÖÃΪN£¬Ã¿Ì¨µÄ³õʼֵÒÀ´ÎΪ0,1,2...N-1ÄÇôÕû¸ö¼Ü¹¹¾Í±ä³ÉÁËÈçÏÂͼËùʾ£º

ÕâÖּܹ¹Ã²ËÆÄܹ»Âú×ãÐÔÄܵÄÐèÇ󣬵«ÓÐÒÔϼ¸¸öȱµã£º
ϵͳˮƽÀ©Õ¹±È½ÏÀ§ÄÑ£¬±ÈÈ綨ÒåºÃÁ˲½³¤ºÍ»úÆ÷̨ÊýÖ®ºó£¬Èç¹ûÒªÌí¼Ó»úÆ÷¸ÃÔõô×ö£¿¼ÙÉèÏÖÔÚÖ»ÓÐһ̨»úÆ÷·¢ºÅÊÇ1,2,3,4,5£¨²½³¤ÊÇ1£©£¬Õâ¸öʱºòÐèÒªÀ©ÈÝ»úÆ÷һ̨¡£¿ÉÒÔÕâÑù×ö£º°ÑµÚ¶þ̨»úÆ÷µÄ³õʼֵÉèÖõñȵÚһ̨³¬¹ýºÜ¶à£¬±ÈÈç14£¨¼ÙÉèÔÚÀ©ÈÝʱ¼äÖ®ÄÚµÚһ̨²»¿ÉÄÜ·¢µ½14£©£¬Í¬Ê±ÉèÖò½³¤Îª2£¬ÄÇôÕą̂»úÆ÷Ï·¢µÄºÅÂë¶¼ÊÇ14ÒÔºóµÄżÊý¡£È»ºóÕªµôµÚһ̨£¬°ÑIDÖµ±£ÁôÎªÆæÊý£¬±ÈÈç7£¬È»ºóÐ޸ĵÚһ̨µÄ²½³¤Îª2¡£ÈÃËü·ûºÏÎÒÃǶ¨ÒåµÄºÅ¶Î±ê×¼£¬¶ÔÓÚÕâ¸öÀý×ÓÀ´Ëµ¾ÍÊÇÈõÚһ̨ÒÔºóÖ»ÄܲúÉúÆæÊý¡£À©ÈÝ·½°¸¿´ÆðÀ´¸´ÔÓÂð£¿Ã²ËÆ»¹ºÃ£¬ÏÖÔÚÏëÏóÒ»ÏÂÈç¹ûÎÒÃÇÏßÉÏÓÐ100̨»úÆ÷£¬Õâ¸öʱºòÒªÀ©ÈݸÃÔõô×ö£¿¼òÖ±ÊÇØ¬ÃΡ£ËùÒÔϵͳˮƽÀ©Õ¹·½°¸¸´ÔÓÄÑÒÔʵÏÖ¡£
IDûÓÐÁ˵¥µ÷µÝÔöµÄÌØÐÔ£¬Ö»ÄÜÇ÷ÊÆµÝÔö£¬Õâ¸öȱµã¶ÔÓÚÒ»°ãÒµÎñÐèÇó²»ÊǺÜÖØÒª£¬¿ÉÒÔÈÝÈÌ¡£
Êý¾Ý¿âѹÁ¦»¹ÊǺܴó£¬Ã¿´Î»ñÈ¡ID¶¼µÃ¶Áдһ´ÎÊý¾Ý¿â£¬Ö»ÄÜ¿¿¶Ñ»úÆ÷À´Ìá¸ßÐÔÄÜ¡£
Leaf·½°¸ÊµÏÖ
LeafÕâ¸öÃû×ÖÊÇÀ´×Ե¹úÕÜѧ¼Ò¡¢Êýѧ¼ÒÀ³²¼Äá´ÄµÄÒ»¾ä»°£º
There are no two identical leaves in the world
"ÊÀ½çÉÏûÓÐÁ½Æ¬ÏàͬµÄÊ÷Ò¶"
×ۺ϶ԱÈÉÏÊö¼¸ÖÖ·½°¸£¬Ã¿ÖÖ·½°¸¶¼²»ÍêÈ«·ûºÏÎÒÃǵÄÒªÇó¡£ËùÒÔLeaf·Ö±ðÔÚÉÏÊöµÚ¶þÖֺ͵ÚÈýÖÖ·½°¸ÉÏ×öÁËÏàÓ¦µÄÓÅ»¯£¬ÊµÏÖÁËLeaf-segmentºÍLeaf-snowflake·½°¸¡£
Leaf-segmentÊý¾Ý¿â·½°¸
µÚÒ»ÖÖLeaf-segment·½°¸£¬ÔÚʹÓÃÊý¾Ý¿âµÄ·½°¸ÉÏ£¬×öÁËÈçϸı䣺
Ô·½°¸Ã¿´Î»ñÈ¡ID¶¼µÃ¶Áдһ´ÎÊý¾Ý¿â£¬Ôì³ÉÊý¾Ý¿âѹÁ¦´ó¡£¸ÄΪÀûÓÃproxy serverÅúÁ¿»ñÈ¡£¬Ã¿´Î»ñȡһ¸ösegment(step¾ö¶¨´óС)ºÅ¶ÎµÄÖµ¡£ÓÃÍêÖ®ºóÔÙÈ¥Êý¾Ý¿â»ñȡеĺŶΣ¬¿ÉÒÔ´ó´óµÄ¼õÇáÊý¾Ý¿âµÄѹÁ¦¡£
¸÷¸öÒµÎñ²»Í¬µÄ·¢ºÅÐèÇóÓÃbiz_tag×Ö¶ÎÀ´Çø·Ö£¬Ã¿¸öbiz-tagµÄID»ñÈ¡Ï໥¸ôÀ룬»¥²»Ó°Ïì¡£Èç¹ûÒÔºóÓÐÐÔÄÜÐèÇóÐèÒª¶ÔÊý¾Ý¿âÀ©ÈÝ£¬²»ÐèÒªÉÏÊöÃèÊöµÄ¸´ÔÓµÄÀ©ÈݲÙ×÷£¬Ö»ÐèÒª¶Ôbiz_tag·Ö¿â·Ö±í¾ÍÐС£
Êý¾Ý¿â±íÉè¼ÆÈçÏ£º

ÖØÒª×Ö¶Î˵Ã÷£ºbiz_tagÓÃÀ´Çø·ÖÒµÎñ£¬max_id±íʾ¸Ãbiz_tagĿǰËù±»·ÖÅäµÄIDºÅ¶ÎµÄ×î´óÖµ£¬step±íʾÿ´Î·ÖÅäµÄºÅ¶Î³¤¶È¡£ÔÀ´»ñÈ¡IDÿ´Î¶¼ÐèҪдÊý¾Ý¿â£¬ÏÖÔÚÖ»ÐèÒª°ÑstepÉèÖõÃ×ã¹»´ó£¬±ÈÈç1000¡£ÄÇôֻÓе±1000¸öºÅ±»ÏûºÄÍêÁËÖ®ºó²Å»áÈ¥ÖØÐ¶Áдһ´ÎÊý¾Ý¿â¡£¶ÁдÊý¾Ý¿âµÄƵÂÊ´Ó1¼õСµ½ÁË1/step£¬´óÖ¼ܹ¹ÈçÏÂͼËùʾ£º

test_tagÔÚµÚһ̨Leaf»úÆ÷ÉÏÊÇ1~1000µÄºÅ¶Î£¬µ±Õâ¸öºÅ¶ÎÓÃÍêʱ£¬»áÈ¥¼ÓÔØÁíÒ»¸ö³¤¶ÈΪstep=1000µÄºÅ¶Î£¬¼ÙÉèÁíÍâÁ½Ì¨ºÅ¶Î¶¼Ã»ÓиüУ¬Õâ¸öʱºòµÚһ̨»úÆ÷мÓÔØµÄºÅ¶Î¾ÍÓ¦¸ÃÊÇ3001~4000¡£Í¬Ê±Êý¾Ý¿â¶ÔÓ¦µÄbiz_tagÕâÌõÊý¾ÝµÄmax_id»á´Ó3000±»¸üгÉ4000£¬¸üкŶεÄSQLÓï¾äÈçÏ£º
Begin
UPDATE table SET max_id=max_id+step WHERE biz_tag=xxx
SELECT tag, max_id, step FROM table WHERE biz_tag=xxx
Commit |
ÕâÖÖģʽÓÐÒÔÏÂÓÅȱµã£º
Óŵ㣺
Leaf·þÎñ¿ÉÒԺܷ½±ãµÄÏßÐÔÀ©Õ¹£¬ÐÔÄÜÍêÈ«Äܹ»Ö§³Å´ó¶àÊýÒµÎñ³¡¾°¡£
IDºÅÂëÊÇÇ÷ÊÆµÝÔöµÄ8byteµÄ64λÊý×Ö£¬Âú×ãÉÏÊöÊý¾Ý¿â´æ´¢µÄÖ÷¼üÒªÇó¡£
ÈÝÔÖÐԸߣºLeaf·þÎñÄÚ²¿ÓкŶλº´æ£¬¼´Ê¹DBå´»ú£¬¶Ìʱ¼äÄÚLeafÈÔÄÜÕý³£¶ÔÍâÌṩ·þÎñ¡£
¿ÉÒÔ×Ô¶¨Òåmax_idµÄ´óС£¬·Ç³£·½±ãÒµÎñ´ÓÔÓеÄID·½Ê½ÉÏÇ¨ÒÆ¹ýÀ´¡£
ȱµã£º
IDºÅÂë²»¹»Ëæ»ú£¬Äܹ»Ð¹Â¶·¢ºÅÊýÁ¿µÄÐÅÏ¢£¬²»Ì«°²È«¡£
TP999Êý¾Ý²¨¶¯´ó£¬µ±ºÅ¶ÎʹÓÃÍêÖ®ºó»¹ÊÇ»áhangÔÚ¸üÐÂÊý¾Ý¿âµÄI/OÉÏ£¬tg999Êý¾Ý»á³öÏÖż¶ûµÄ¼â´Ì¡£
DBå´»ú»áÔì³ÉÕû¸öϵͳ²»¿ÉÓá£
Ë«bufferÓÅ»¯
¶ÔÓÚµÚ¶þ¸öȱµã£¬Leaf-segment×öÁËһЩÓÅ»¯£¬¼òµ¥µÄ˵¾ÍÊÇ£º
Leaf È¡ºÅ¶ÎµÄʱ»úÊÇÔںŶÎÏûºÄÍêµÄʱºò½øÐеģ¬Ò²¾ÍÒâζןŶÎÁÙ½çµãµÄIDÏ·¢Ê±¼äÈ¡¾öÓÚÏÂÒ»´Î´ÓDBÈ¡»ØºÅ¶ÎµÄʱ¼ä£¬²¢ÇÒÔÚÕâÆÚ¼ä½øÀ´µÄÇëÇóÒ²»áÒòΪDBºÅ¶ÎûÓÐÈ¡»ØÀ´£¬µ¼ÖÂÏß³Ì×èÈû¡£Èç¹ûÇëÇóDBµÄÍøÂçºÍDBµÄÐÔÄÜÎȶ¨£¬ÕâÖÖÇé¿ö¶ÔϵͳµÄÓ°ÏìÊDz»´óµÄ£¬µ«ÊǼÙÈçÈ¡DBµÄʱºòÍøÂç·¢Éú¶¶¶¯£¬»òÕßDB·¢ÉúÂý²éѯ¾Í»áµ¼ÖÂÕû¸öϵͳµÄÏìӦʱ¼ä±äÂý¡£
Ϊ´Ë£¬ÎÒÃÇÏ£ÍûDBÈ¡ºÅ¶ÎµÄ¹ý³ÌÄܹ»×öµ½ÎÞ×èÈû£¬²»ÐèÒªÔÚDBÈ¡ºÅ¶ÎµÄʱºò×èÈûÇëÇóỊ̈߳¬¼´µ±ºÅ¶ÎÏû·Ñµ½Ä³¸öµãʱ¾ÍÒì²½µÄ°ÑÏÂÒ»¸öºÅ¶Î¼ÓÔØµ½ÄÚ´æÖС£¶ø²»ÐèÒªµÈµ½ºÅ¶ÎÓþ¡µÄʱºò²ÅÈ¥¸üкŶΡ£ÕâÑù×ö¾Í¿ÉÒԺܴó³Ì¶ÈÉϵĽµµÍϵͳµÄTP999Ö¸±ê¡£ÏêϸʵÏÖÈçÏÂͼËùʾ£º

²ÉÓÃË«bufferµÄ·½Ê½£¬Leaf·þÎñÄÚ²¿ÓÐÁ½¸öºÅ¶Î»º´æÇøsegment¡£µ±Ç°ºÅ¶ÎÒÑÏ·¢10%ʱ£¬Èç¹ûÏÂÒ»¸öºÅ¶Îδ¸üУ¬ÔòÁíÆôÒ»¸ö¸üÐÂÏß³ÌÈ¥¸üÐÂÏÂÒ»¸öºÅ¶Î¡£µ±Ç°ºÅ¶ÎÈ«²¿Ï·¢Íêºó£¬Èç¹ûϸöºÅ¶Î×¼±¸ºÃÁËÔòÇл»µ½Ï¸öºÅ¶ÎΪµ±Ç°segment½Ó×ÅÏ·¢£¬Ñ»·Íù¸´¡£
ÿ¸öbiz-tag¶¼ÓÐÏû·ÑËÙ¶È¼à¿Ø£¬Í¨³£ÍƼösegment³¤¶ÈÉèÖÃΪ·þÎñ¸ß·åÆÚ·¢ºÅQPSµÄ600±¶£¨10·ÖÖÓ£©£¬ÕâÑù¼´Ê¹DBå´»ú£¬LeafÈÔÄܳÖÐø·¢ºÅ10-20·ÖÖÓ²»ÊÜÓ°Ïì¡£
ÿ´ÎÇëÇóÀ´ÁÙʱ¶¼»áÅжÏϸöºÅ¶ÎµÄ״̬£¬´Ó¶ø¸üд˺ŶΣ¬ËùÒÔż¶ûµÄÍøÂç¶¶¶¯²»»áÓ°ÏìϸöºÅ¶ÎµÄ¸üС£
Leaf¸ß¿ÉÓÃÈÝÔÖ
¶ÔÓÚµÚÈýµã¡°DB¿ÉÓÃÐÔ¡±ÎÊÌ⣬ÎÒÃÇĿǰ²ÉÓÃÒ»Ö÷Á½´ÓµÄ·½Ê½£¬Í¬Ê±·Ö»ú·¿²¿Êð£¬MasterºÍSlaveÖ®¼ä²ÉÓðëͬ²½·½Ê½[5]ͬ²½Êý¾Ý¡£Í¬Ê±Ê¹Óù«Ë¾AtlasÊý¾Ý¿âÖмä¼þ(ÒÑ¿ªÔ´£¬¸ÄÃûΪDBProxy)×öÖ÷´ÓÇл»¡£µ±È»ÕâÖÖ·½°¸ÔÚһЩÇé¿ö»áÍË»¯³ÉÒ첽ģʽ£¬ÉõÖÁÔڷdz£¼«¶ËÇé¿öÏÂÈÔÈ»»áÔì³ÉÊý¾Ý²»Ò»ÖµÄÇé¿ö£¬µ«ÊdzöÏֵĸÅÂʷdz£Ð¡¡£Èç¹ûÄãµÄϵͳҪ±£Ö¤100%µÄÊý¾ÝǿһÖ£¬¿ÉÒÔÑ¡ÔñʹÓá°ÀàPaxosËã·¨¡±ÊµÏÖµÄǿһÖÂMySQL·½°¸£¬ÈçMySQL
5.7ǰ¶Îʱ¼ä¸Õ¸ÕGAµÄMySQL Group Replication¡£µ«ÊÇÔËά³É±¾ºÍ¾«Á¦¶¼»áÏàÓ¦µÄÔö¼Ó£¬¸ù¾Ýʵ¼ÊÇé¿öÑ¡Ðͼ´¿É¡£

ͬʱLeaf·þÎñ·ÖIDC²¿Êð£¬ÄÚ²¿µÄ·þÎñ»¯¿ò¼ÜÊÇ¡°MTthrift RPC¡±¡£·þÎñµ÷ÓõÄʱºò£¬¸ù¾Ý¸ºÔؾùºâËã·¨»áÓÅÏȵ÷ÓÃͬ»ú·¿µÄLeaf·þÎñ¡£ÔÚ¸ÃIDCÄÚLeaf·þÎñ²»¿ÉÓõÄʱºò²Å»áÑ¡ÔñÆäËû»ú·¿µÄLeaf·þÎñ¡£Í¬Ê±·þÎñÖÎÀíÆ½Ì¨OCTO»¹ÌṩÁËÕë¶Ô·þÎñµÄ¹ýÔØ±£»¤¡¢Ò»¼ü½ØÁ÷¡¢¶¯Ì¬Á÷Á¿·ÖÅäµÈ¶Ô·þÎñµÄ±£»¤´ëÊ©¡£
Leaf-snowflake·½°¸
Leaf-segment·½°¸¿ÉÒÔÉú³ÉÇ÷ÊÆµÝÔöµÄID£¬Í¬Ê±IDºÅÊǿɼÆËãµÄ£¬²»ÊÊÓÃÓÚ¶©µ¥IDÉú³É³¡¾°£¬±ÈÈ羺¶ÔÔÚÁ½ÌìÖÐÎç12µã·Ö±ðϵ¥£¬Í¨¹ý¶©µ¥idºÅÏà¼õ¾ÍÄÜ´óÖ¼ÆËã³ö¹«Ë¾Ò»ÌìµÄ¶©µ¥Á¿£¬Õâ¸öÊDz»ÄÜÈÌÊܵġ£Ãæ¶ÔÕâÒ»ÎÊÌ⣬ÎÒÃÇÌṩÁË
Leaf-snowflake·½°¸¡£

Leaf-snowflake·½°¸ÍêÈ«ÑØÓÃsnowflake·½°¸µÄbitλÉè¼Æ£¬¼´ÊÇ¡°1+41+10+12¡±µÄ·½Ê½×é×°IDºÅ¡£¶ÔÓÚworkerIDµÄ·ÖÅ䣬µ±·þÎñ¼¯ÈºÊýÁ¿½ÏСµÄÇé¿öÏ£¬ÍêÈ«¿ÉÒÔÊÖ¶¯ÅäÖá£Leaf·þÎñ¹æÄ£½Ï´ó£¬¶¯ÊÖÅäÖóɱ¾Ì«¸ß¡£ËùÒÔʹÓÃZookeeper³Ö¾Ã˳Ðò½ÚµãµÄÌØÐÔ×Ô¶¯¶Ôsnowflake½ÚµãÅäÖÃwokerID¡£Leaf-snowflakeÊǰ´ÕÕÏÂÃæ¼¸¸ö²½ÖèÆô¶¯µÄ£º
Æô¶¯Leaf-snowflake·þÎñ£¬Á¬½ÓZookeeper£¬ÔÚleaf_forever¸¸½Úµãϼì²é×Ô¼ºÊÇ·ñÒѾע²á¹ý£¨ÊÇ·ñÓиÃ˳Ðò×ӽڵ㣩¡£
Èç¹ûÓÐ×¢²á¹ýÖ±½ÓÈ¡»Ø×Ô¼ºµÄworkerID£¨zk˳Ðò½ÚµãÉú³ÉµÄintÀàÐÍIDºÅ£©£¬Æô¶¯·þÎñ¡£
Èç¹ûûÓÐ×¢²á¹ý£¬¾ÍÔڸø¸½ÚµãÏÂÃæ´´½¨Ò»¸ö³Ö¾Ã˳Ðò½Úµã£¬´´½¨³É¹¦ºóÈ¡»ØË³ÐòºÅµ±×ö×Ô¼ºµÄworkerIDºÅ£¬Æô¶¯·þÎñ¡£

ÈõÒÀÀµZooKeeper
³ýÁËÿ´Î»áÈ¥ZKÄÃÊý¾ÝÒÔÍ⣬Ҳ»áÔÚ±¾»úÎļþϵͳÉÏ»º´æÒ»¸öworkerIDÎļþ¡£µ±ZooKeeper³öÏÖÎÊÌ⣬ǡºÃ»úÆ÷³öÏÖÎÊÌâÐèÒªÖØÆôʱ£¬Äܱ£Ö¤·þÎñÄܹ»Õý³£Æô¶¯¡£ÕâÑù×öµ½Á˶ÔÈý·½×é¼þµÄÈõÒÀÀµ¡£Ò»¶¨³Ì¶ÈÉÏÌá¸ßÁËSLA
½â¾öʱÖÓÎÊÌâ
ÒòΪÕâÖÖ·½°¸ÒÀÀµÊ±¼ä£¬Èç¹û»úÆ÷µÄʱÖÓ·¢ÉúÁ˻ز¦£¬ÄÇô¾Í»áÓпÉÄÜÉú³ÉÖØ¸´µÄIDºÅ£¬ÐèÒª½â¾öʱÖÓ»ØÍ˵ÄÎÊÌâ¡£

²Î¼ûÉÏͼÕû¸öÆô¶¯Á÷³Ìͼ£¬·þÎñÆô¶¯Ê±Ê×Ïȼì²é×Ô¼ºÊÇ·ñд¹ýZooKeeper leaf_forever½Úµã£º
Èôд¹ý£¬ÔòÓÃ×ÔÉíϵͳʱ¼äÓëleaf_forever/${self}½Úµã¼Ç¼ʱ¼ä×ö±È½Ï£¬ÈôСÓÚleaf_forever/${self}ʱ¼äÔòÈÏΪ»úÆ÷ʱ¼ä·¢ÉúÁË´ó²½³¤»Ø²¦£¬·þÎñÆô¶¯Ê§°Ü²¢±¨¾¯¡£
Èôδд¹ý£¬Ö¤Ã÷ÊÇзþÎñ½Úµã£¬Ö±½Ó´´½¨³Ö¾Ã½Úµãleaf_forever/${self}²¢Ð´Èë×ÔÉíϵͳʱ¼ä£¬½ÓÏÂÀ´×ÛºÏ¶Ô±ÈÆäÓàLeaf½ÚµãµÄϵͳʱ¼äÀ´ÅжÏ×ÔÉíϵͳʱ¼äÊÇ·ñ׼ȷ£¬¾ßÌå×ö·¨ÊÇÈ¡leaf_temporaryϵÄËùÓÐÁÙʱ½Úµã(ËùÓÐÔËÐÐÖеÄLeaf-snowflake½Úµã)µÄ·þÎñIP£ºPort£¬È»ºóͨ¹ýRPCÇëÇóµÃµ½ËùÓнڵãµÄϵͳʱ¼ä£¬¼ÆËãsum(time)/nodeSize¡£
Èôabs( ϵͳʱ¼ä-sum(time)/nodeSize ) < ãÐÖµ£¬ÈÏΪµ±Ç°ÏµÍ³Ê±¼ä׼ȷ£¬Õý³£Æô¶¯·þÎñ£¬Í¬Ê±Ð´ÁÙʱ½Úµãleaf_temporary/${self}
ά³Ö×âÔ¼¡£
·ñÔòÈÏΪ±¾»úϵͳʱ¼ä·¢Éú´ó²½³¤Æ«ÒÆ£¬Æô¶¯Ê§°Ü²¢±¨¾¯¡£
ÿ¸ôÒ»¶Îʱ¼ä(3s)Éϱ¨×ÔÉíϵͳʱ¼äдÈëleaf_forever/${self}¡£
ÓÉÓÚÇ¿ÒÀÀµÊ±ÖÓ£¬¶Ôʱ¼äµÄÒªÇó±È½ÏÃô¸Ð£¬ÔÚ»úÆ÷¹¤×÷ʱNTPͬ²½Ò²»áÔì³ÉÃë¼¶±ðµÄ»ØÍË£¬½¨Òé¿ÉÒÔÖ±½Ó¹Ø±ÕNTPͬ²½¡£ÒªÃ´ÔÚʱÖӻز¦µÄʱºòÖ±½Ó²»Ìṩ·þÎñÖ±½Ó·µ»ØERROR_CODE£¬µÈʱÖÓ×·Éϼ´¿É¡£»òÕß×öÒ»²ãÖØÊÔ£¬È»ºóÉϱ¨±¨¾¯ÏµÍ³£¬¸ü»òÕßÊÇ·¢ÏÖÓÐʱÖӻز¦Ö®ºó×Ô¶¯Õª³ý±¾Éí½Úµã²¢±¨¾¯£¬ÈçÏ£º
//·¢ÉúÁ˻ز¦£¬´Ë¿Ìʱ¼äСÓÚÉϴη¢ºÅʱ¼ä
if (timestamp < lastTimestamp) {
long offset = lastTimestamp - timestamp;
if (offset <= 5) {
try {
//ʱ¼äÆ«²î´óССÓÚ5ms£¬ÔòµÈ´ýÁ½±¶Ê±¼ä
wait(offset << 1);//wait
timestamp = timeGen();
if (timestamp < lastTimestamp) {
//»¹ÊÇСÓÚ£¬Å×Òì³£²¢Éϱ¨
throwClockBackwardsEx(timestamp);
}
} catch (InterruptedException e) {
throw e;
}
} else {
//throw
throwClockBackwardsEx(timestamp);
}
}
//·ÖÅäID |
´ÓÉÏÏßÇé¿öÀ´¿´£¬ÔÚ2017ÄêÈòÃë³öÏÖÄÇÒ»´Î³öÏÖ¹ý²¿·Ö»úÆ÷»Ø²¦£¬ÓÉÓÚLeaf-snowflakeµÄ²ßÂÔ±£Ö¤£¬³É¹¦±ÜÃâÁ˶ÔÒµÎñÔì³ÉµÄÓ°Ïì¡£
LeafÏÖ×´
LeafÔÚÃÀÍŵãÆÀ¹«Ë¾ÄÚ²¿·þÎñ°üº¬½ðÈÚ¡¢Ö§¸¶½»Òס¢²ÍÒû¡¢ÍâÂô¡¢¾ÆµêÂÃÓΡ¢Ã¨ÑÛµçÓ°µÈÖÚ¶àÒµÎñÏß¡£Ä¿Ç°LeafµÄÐÔÄÜÔÚ4C8GµÄ»úÆ÷ÉÏQPSÄÜѹ²âµ½½ü5w/s£¬TP999
1ms£¬ÒѾÄܹ»Âú×ã´ó²¿·ÖµÄÒµÎñµÄÐèÇó¡£Ã¿ÌìÌṩÒÚÊýÁ¿¼¶µÄµ÷ÓÃÁ¿£¬×÷Ϊ¹«Ë¾ÄÚ²¿¹«¹²µÄ»ù´¡¼¼ÊõÉèÊ©£¬±ØÐë±£Ö¤¸ßSLAºÍ¸ßÐÔÄܵķþÎñ£¬ÎÒÃÇĿǰ»¹½ö½ö´ïµ½Á˼°¸ñÏߣ¬»¹ÓкܶàÌá¸ßµÄ¿Õ¼ä¡£
|