Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Leaf¡ª¡ªÃÀÍŵãÆÀ·Ö²¼Ê½IDÉú³Éϵͳ
 
×÷ÕߣºÕÕ¶« À´Ô´£ºÃÀÍŵãÆÀ¼¼ÊõÍÅ¶Ó ·¢²¼ÓÚ£º 2017-5-11
  2771  次浏览      27
 

±³¾°

ÔÚ¸´ÔÓ·Ö²¼Ê½ÏµÍ³ÖУ¬ÍùÍùÐèÒª¶Ô´óÁ¿µÄÊý¾ÝºÍÏûÏ¢½øÐÐΨһ±êʶ¡£ÈçÔÚÃÀÍŵãÆÀµÄ½ðÈÚ¡¢Ö§¸¶¡¢²ÍÒû¡¢¾Æµê¡¢Ã¨ÑÛµçÓ°µÈ²úÆ·µÄϵͳÖУ¬Êý¾ÝÈÕ½¥Ôö³¤£¬¶ÔÊý¾Ý·Ö¿â·Ö±íºóÐèÒªÓÐÒ»¸öΨһ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ºÍ¸ßÐÔÄܵķþÎñ£¬ÎÒÃÇĿǰ»¹½ö½ö´ïµ½Á˼°¸ñÏߣ¬»¹ÓкܶàÌá¸ßµÄ¿Õ¼ä¡£

   
2771 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

ÆóÒµ¼Ü¹¹¡¢TOGAFÓëArchiMate¸ÅÀÀ
¼Ü¹¹Ê¦Ö®Â·-ÈçºÎ×öºÃÒµÎñ½¨Ä££¿
´óÐÍÍøÕ¾µçÉÌÍøÕ¾¼Ü¹¹°¸ÀýºÍ¼¼Êõ¼Ü¹¹µÄʾÀý
ÍêÕûµÄArchimateÊÓµãÖ¸ÄÏ£¨°üÀ¨Ê¾Àý£©
Ïà¹ØÎĵµ

Êý¾ÝÖÐ̨¼¼Êõ¼Ü¹¹·½·¨ÂÛÓëʵ¼ù
ÊÊÓÃArchiMate¡¢EA ºÍ iSpace½øÐÐÆóÒµ¼Ü¹¹½¨Ä£
ZachmanÆóÒµ¼Ü¹¹¿ò¼Ü¼ò½é
ÆóÒµ¼Ü¹¹ÈÃSOAÂ䵨
Ïà¹Ø¿Î³Ì

ÔÆÆ½Ì¨Óë΢·þÎñ¼Ü¹¹Éè¼Æ
ÖÐ̨սÂÔ¡¢ÖÐ̨½¨ÉèÓëÊý×ÖÉÌÒµ
ÒÚ¼¶Óû§¸ß²¢·¢¡¢¸ß¿ÉÓÃϵͳ¼Ü¹¹
¸ß¿ÉÓ÷ֲ¼Ê½¼Ü¹¹Éè¼ÆÓëʵ¼ù