±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚcloud.tencent.com£¬Î¢ÐÅÖ§¸¶ÒµÎñ¿ìËÙ·¢Õ¹£¬ÐèÒªÒ»¿îÊý¾Ý¿âÄܹ»°²È«¸ßЧµÄÖ§³Å΢ÐÅÖ§¸¶ÉÌ»§ÏµÍ³ºËÐÄÒµÎñ£¬Õâ¸öÖØÈÎÂäÔÚÁËÌÚѶÊý¾Ý¿âÍŶÓ×ÔÑÐPostgreSQLÉÏ¡£
|
|
ÌÚѶ×ÔÑÐPostgreSQL·Ö²¼Ê½¼¯Èº PostgreSQL-XZ
ÌÚѶPostgreSQL-XZÊÇÓÉPostgreSQL-XCÉçÇø°æ±¾µØ»¯¶øÀ´£¬ÄÜÖ§³ÅˮƽÀ©Õ¹Êý¾Ý¿â¼¯Èº¡£ËäÈ»PostgreSQL-XCºÜÇ¿´ó£¬µ«ÔÚÐÔÄÜ¡¢À©Õ¹ÐÔ¡¢°²È«¡¢ÔËά·½Ã滹ÊÇÓÐÃ÷ÏÔµÄÆ¿¾±£¬¶øÌÚѶPostgreSQL¾¹ý¶àÄêµÄ»ýÀÛ£¬ÔÚÕâЩ·½Ãæ¶¼ÓнϴóÌáÉýºÍÇ¿»¯¡£ÓÉÓÚÊÇÓÃÓÚ΢ÐÅÖ§¸¶µÄºËÐÄÊý¾Ý¿â£¬ÌÚѶPostgreSQL±»¶¨Î»Îª°²È«¡¢¸ßЧ£¬Îȶ¨£¬¿É¿¿µÄÊý¾Ý¿â¼¯Èº¡£ÏÂÃæ½«ÒÔÌÚѶPostgreSQL-XZΪ´ú±í½éÉÜÌÚѶ×ÔÑÐPostgreSQLËù×öµÄÓÅ»¯ºÍ¸Ä½ø¡£
Ò».ÊÂÎñ¹ÜÀíϵͳµÄÓÅ»¯
PostgreSQL-XCÔÚÊÂÎñ¹ÜÀíϵͳ·½°¸±¾ÉíÓÐÒ»¸öÃ÷ÏÔµÄȱµã£¬ÄǾÍÊÇÊÂÎñ¹ÜÀí»úÖÆ»á³ÉΪϵͳµÄÆ¿¾±£¬GTM£¨Global
Transaction ManagerÈ«¾ÖÊÂÎñ¹ÜÀíÆ÷£©»áÏÞÖÆÏµÍ³µÄÀ©Õ¹¹æÄ£¡£Èçͼ1Ëùʾ£¬ÊÇÿ¸öÇëÇó¹ýÀ´CN(Coordinator
е÷½Úµã)¶¼»áÏòGTMÉêÇë±ØÐèµÄgxid£¨È«¾ÖÊÂÎñID£©ºÍgsnapshot£¨È«¾Ö¿ìÕÕ£©ÐÅÏ¢£¬²¢°ÑÕâЩÐÅÏ¢Ëæ×ÅSQLÓï¾ä±¾ÉíÒ»Æð·¢ÍùDN£¨DatanodeÊý¾Ý¿â½Úµã£©½øÐÐÖ´ÐС£ÁíÍ⣬PostgreSQL-XCµÄ¹ÜÀí»úÖÆ£¬Ö»ÓÐÖ÷DN²Å»á»ñÈ¡µÄgxid£¬¶ø±¸DNûÓÐ×Ô¼ºµÄgxid£¬Òò´ËÎÞ·¨Ìṩֻ¶Á·þÎñ£¬¶ÔϵͳҲÊDz»Ð¡µÄÀË·Ñ¡£

ͼ1
¶øÌÚѶPostgreSQL-XZ¸Ä½øÁËÊÂÎñ¹ÜÀí»úÖÆ£¬¸Ä½øºó£¬CN²»ÔÙ´ÓGTM»ñÈ¡gxidºÍgsnapshot£¬Ã¿¸ö½ÚµãʹÓÃ×Ô¼ºµÄ±¾µØxid£¨ÊÂÎñID£©ºÍgsnapshot£¨¿ìÕÕ£©£¬Èç´ËGTM±ã²»»á³ÉΪϵͳµÄÆ¿¾±£»²¢ÇÒ£¬DN±¸»ú¾Í»¹¿ÉÒÔÌṩֻ¶Á·þÎñ£¬³ä·ÖÀûÓÃϵͳÏÐÖÃ×ÊÔ´¡£Èçͼ2£¬ÓÅ»¯ºóµÄÊÂÎñ¹ÜÀíϵͳ¼Ü¹¹ÈçÏ£º

ͼ2
¶þ.±¸»úÖ»¶ÁʵÏÖÓëÓÅ»¯
µ±È»£¬ÊÂÎñ¹ÜÀíϵͳµÄÓÅ»¯Îª½øÐб¸DNÖ»¶ÁÌṩÁË»ù´¡£¬È»¶øÔʼ¼¯Èº²¢Ã»ÓиºÔØ¡¢µ÷¶ÈµÈÄÜÁ¦¡£ÔÚÕâ·½Ãæ£¬ÎÒÃÇÒ²×öÁË´óÁ¿µÄ´´Ð£¬×ܽáÆðÀ´°üÀ¨£º
Õý³£CNºÍÖ»¶ÁCN½øÐзÖÀë¡£
Õý³£CN´æ´¢Ö÷ÓÃDNµÄÔªÊý¾ÝÐÅÏ¢
Ö»¶ÁCN´æ´¢±¸ÓÃDNµÄÔªÊý¾ÝÐÅÏ¢
DNÖ®¼äʹÓÃhot standby£¨Èȱ¸·Ý±£»¤£©Ä£Ê½½øÐÐÈÕ־ͬ²½
ͨ¹ýÕâЩ·½Ê½£¬¼¯Èº¿ÉÒÔÌṩ´øÓÐÖÇÄܸºÔØÄÜÁ¦µÄ±¸DNÖ»¶Á¹¦ÄÜ£¬³ä·ÖÀûÓÃϵͳ×ÊÔ´¡£

ͼ3
Èý.ÒµÎñ×îСÖжϵÄÀ©ÈÝ·½°¸
ÒµÎñµÄ¿ìËÙÔö³¤²»¿É±ÜÃâµÄÐèÒª¶Ô×ÊÔ´½øÐÐÀ©ÈÝ£¬ÉçÇø°æ±¾µÄʵÏÖʹµÃÀ©Èݳɱ¾¸ß°º£¬ÐèÒª¶ÔÒµÎñ½øÐг¤Ê±¼äµÄÖжϡ£ÒòΪ£¬ÔÚÉçÇø°æ±¾PostgreSQL-XCÖУ¬Í¨¹ý
DN=Hash(row) % nofdnµÄ·½Ê½¾ö¶¨Ò»Ìõ¼Ç¼µÄ´æ´¢½Úµã£º
Ò²¾ÍÊÇ˵£¬ÏȶԷֲ¼ÁмÆËãhashÖµ£¬È»ºóʹÓÃÕâ¸öÖµ¶Ô¼¯ÈºÖеĽڵã¸öÊýȡģÀ´¾ö¶¨¼Ç¼ȥÄĸö½Úµã£¨Èçͼ4£©¡£
ÕâÖÖ·½°¸¼òµ¥£¬µ«Êµ¼ÊÓ¦ÓÃÖÐÐèÒª³¤Ê±¼äÍ£»úÀ©ÈÝ¡£ÕâÊÇÒòΪ£¬À©Èݺó½ÚµãÊý»á±ä¶à£¬Êý¾ÝÎÞ·¨°´ÕÕÔÓеķֲ¼Âß¼½øÐжÁд£¬ÐèÒªÖØÐ·ֲ¼½ÚµãÊý¾Ý¡£¶øÔÙ¾ùºâÊý¾ÝÐèҪͣ»ú²¢ÊÖ¹¤Ç¨ÒÆÔÙ¾ùºâµ½¸÷¸ö½Úµã¡£¶ÔÓÚ¹æÄ£½Ï´óµÄ½»Ò×ϵͳÀ´Ëµ£¬ÓÉÓÚÔÓÐ½Úµã´æ´¢µÄÊǺ£Á¿Êý¾Ý£¬ÔÙ¾ùºâ¹ý³Ì¿ÉÄÜ»á³ÖÐøºÃ¼¸Ìì¡£ÏàÐÅÕâÊÇÒµÎñÍêÈ«ÎÞ·¨ÈÌÊܵġ£

ͼ4
Òò´ËÎÒÃÇÒýÈëÁËÒ»ÖÖÐÂµÄ·Ö±í·½·¨¡ªsharded table¡£ShardedtableµÄÊý¾Ý·Ö²¼²ÉÓÃÈçÏ£¨Í¼5£©µÄ·½Ê½£º
ÒýÈëÒ»¸ö³éÏóµÄÖмä²ã--shard map¡£Shard mapÖÐÿһÏî´æ´¢shardidºÍDNµÄÓ³Éä¹ØÏµ¡£
Sharded tableÖеÄÿÌõ¼Ç¼ͨ¹ýHash(row) % #shardmap entryÀ´¾ö¶¨¼Ç¼´æ´¢µ½Äĸöshardid£¬Í¨¹ý²éѯshardmapµÄ´æ´¢µÄDN¡£
ÿ¸öDNÉÏ´æ´¢·ÖÅäµ½±¾½ÚµãshardidÐÅÏ¢£¬½ø¶ø½øÐпɼûÐÔµÄÅжϡ£
ͨ¹ýÉÏÃæµÄ·½°¸£¬ÔÚÀ©ÈÝмӽڵãʱ£¬¾ÍÖ»ÐèÒª°ÑһЩshardmapÖеÄshardidÓ³É䵽мӵĽڵ㣬²¢°Ñ¶ÔÓ¦µÄÊý¾Ý°áǨ¹ýÈ¥¾Í¿ÉÒÔÁË¡£À©ÈÝÒ²½ö½öÐèÒªÇл»shardmapÖÐÓ³Éä¹ØÏµµÄ£¬Ê±¼ä´Ó¼¸ÌìËõ¶Ìµ½¼¸Ãë¡£

ͼ5
ËÄ.Êý¾ÝÇãб½â¾ö·½°¸
Êý¾ÝÇãбÊÇÖ¸£¬ÔÚ·Ö²¼Ê½Êý¾Ý¿âϵͳÖлáÒòΪÎïÀí½Úµã¡¢hash»òshard·Ö²¼ÔÒò£¬µ¼ÖÂijЩDNÎïÀí¿Õ¼ä²»×㣬¶øÁíÍâµÄÎïÀí¿Õ¼äÊ£Óà½Ï´ó¡£ÀýÈ磬Èç¹ûÒÔÉÌ»§×÷Ϊ·Ö²¼key£¬¾©¶«Ã¿ÌìµÄÊý¾ÝÁ¿ºÍÒ»¸öÆÕͨµçÉ̵ÄÊý¾ÝÁ¿¿Ï¶¨ÊÇÌìµØ²î±ð¡£¿ÉÄÜij¸ö´óÉÌ»§Ò»¸öÔµÄÊý¾Ý¾Í»á°ÑÒ»¸öDNµÄÎïÀí¿Õ¼äÈûÂú£¬ÕâʱϵͳֻÓÐÍ£»úÀ©ÈÝÒ»Ìõ·¡£Òò´ËÎÒÃDZØÐëÒªÓÐÒ»¸öÓÐЧµÄÊÖ¶ÎÀ´½â¾öÊý¾ÝÇãб£¬±£Ö¤ÔÚ±íÊý¾Ý·Ö²¼²»¾ùÔÈʱϵͳÈÔÈ»Äܹ»¸ßЧÎȶ¨µÄÔËÐС£
Ê×ÏÈÎÒÃǰÑϵͳµÄDN·ÖΪgroup£¨ÈçÏÂͼ6£©£¬Ã¿¸ögroupÀïÃæ£º
°üº¬Ò»¸ö»òÕß¶à¸öDN
ÿ¸ögroupÓÐÒ»¸öshardmap
ÔÚ½¨sharded±íʱ£¬¿ÉÒÔÖ¸¶¨´æ´¢µÄgroup£¬Ò²¾ÍÊÇҪô´æ´¢ÔÚgroup1£¬ÒªÃ´group2
CN¿ÉÒÔ·ÃÎÊËùÓеÄgroup£¬¶øÇÒCNÉÏÒ²´æ´¢ËùÓбíµÄ·ÃÎÊ·½Ê½ÐÅÏ¢

ͼ6
¶ÔÓÚϵͳÖÐÊý¾ÝÁ¿½Ï´óÓû§½øÐÐÌØ±ðµÄʶ±ð£¬²¢ÎªËûÃÇ´´½¨°×Ãûµ¥£¬Ê¹Óò»Í¬µÄÊý¾Ý·Ö²¼Âß¼£¨ÈçÏÂͼ7£©£ºÆÕͨÓû§Ê¹ÓÃĬÈϵÄÊý¾Ý·Ö²¼Âß¼£¬Ò²¾ÍÊÇ£º
Shardid = Hash(merchantid) % #shardmap
´óÉÌ»§Ê¹Óö¨ÖƵÄÊý¾Ý·Ö²¼Âß¼£¬Ò²¾ÍÊÇ£º
Shardid = Hash(merchantid) % #shardmap + fcreate_timedayoffset
from 1970-01-01

ͼ7
ͨ¹ýÔÚ´óÉÌ»§group·Ö²¼Âß¼ÖмÓÈëÈÕÆÚÆ«ÒÆ£¬À´ÊµÏÖͬһ¸öÓû§µÄÊý¾ÝÔÚgroupÄÚ²¿¶à¸ö½Úµã¼ä¾ùÔÈ·Ö²¼¡£´Ó¶øÓÐЧµÄ½â¾öÊý¾Ý·Ö²¼²»¾ùÔÈÎÊÌâ¡£
ÏÂÃæÊÇÒ»¸öÀý×Ó£¨ÈçÏÂͼ8£©£º

ͼ8
Îå.9000W¼Ç¼¸ßЧÅÅÐò½â¾ö·½°¸
ÒµÎñÔÚÁбí²éѯ³¡¾°Ï»áÊÕµ½ÈçϵIJéѯSQL£º

ÔÚ΢ÐÅÖ§¸¶µÄ³¡¾°ÖУ¬Ä³¸öÉÌ»§Ã¿ÌìµÄÊý¾ÝÓÐ300W£¬Ò»¸öÔÂÊý¾Ý³¬¹ý9000WÌõ£¬Ò²¾ÍÊÇ˵PostgreSQLÐèÒªÃæÏòÒ»¸ö9000WÊý¾Ý¼¶Êý¾Ý½øÐпìËÙÅÅÐò£¬¶øÇÒÒµÎñÂß¼ÒªÇóÐèÒªÃë¼¶Êä³ö£¬¿ìËÙ»ñÈ¡ÅÅÐò½á¹û¡£

Ϊ´Ë£¬ÎÒÃÇÌṩ±í¶¨Òå·½°¸£¬¼´½¨Á¢¼¯Èº·ÖÇø±í¡£¸ù¾ÝÉÏÊöÐèÇ󣬿ÉÒÔ²ÉÓð´ÔÂ·Ö±í£¬¼´Ã¿¸öÔÂÒ»ÕÅ±í£¬²¢¶ÔÅÅÐò×Ö¶Îffinish_time½¨Á¢Ë÷Òý£¬ÕâÑùÿ¸ö·ÖÇø½øÐÐɨÃèÊÇ¿ÉÒÔʹÓÃË÷Òý¡£

ÎÒÃÇÔÙͨ¹ýһϵÁÐÖ´Ðмƻ®µÄÓÅ»¯£¬CNÏÂÍÆorder byºÍlimit offset×Ӿ䵽DN£»DNÉÏÔÚÖ´ÐжÔÓ¦µÄsqlʹÓÃʹÓÃMerge
AppendËã×Ó¶Ô¸÷¸ö×Ó±íÖ´ÐеĽá¹û½øÐлã×ÜÊä³ö£¬Õâ¸öËã×Ó±¾Éí»á±£Ö¤Êä³öÊÇÓÐÐòµÄ£¬Ò²¾ÍÊÇ˵¶Ô×Ó±í½øÐÐË÷ÒýɨÃ裬ͬʱMerge
AppendÓÖ¶Ô¸÷¸ö×Ó±íµÄ½á¹û½øÐй鲢£¬½ø¶ø±£Ö¤½Úµã±¾ÉíµÄ½á¹ûÊÇÅÅÐòµÄ¡£CN¶Ô¶à¸öDNµÄ½á¹ûͬÑùʹÓÃMerge
Append½øÐй鲢£¬±£Ö¤Õû¸öÊä³ö½á¹ûÊÇÓÐÐòµÄ£¬´Ó¶øÍê³ÉÕû¸öÅÅÐò¹ý³Ì¡£

ÏÂÃæÊÇÎÒÃǶÔÅÅÐò½øÐеÄÐÔÄܲâÊÔ½á¹û£º


ͨ¹ýÔÚ24ºËCPU£¬64GÄÚ´æµÄ»úÐÍÉϽøÐвâÊÔ£¬9000WÊý¾ÝµÄÅÅÐòÔÚ×î¶Ì¿ÉÒÔÔÚ25 msÄÚÍê³É£¬QPS×î¸ß¿É´ï5400¡£
Áù.²¢ÐÐÓÅ»¯
Ëæ×ŵ±Ç°Ó²¼þµÄ·¢Õ¹£¬ÏµÍ³×ÊÔ´Ô½À´Ô½·á¸»£¬¶àCPU´óÄÚ´æ³ÉÁËϵͳ±êÅ䣬³ä·ÖÀûÓÃÕâЩ×ÊÔ´¿ÉÒÔÓÐЧµÄÌáÉýµÄ´¦ÀíЧÂÊÓÅ»¯ÐÔÄÜ¡£ÌÚѶÔÚ2014Äêµ×¿ªÊ¼½øÐÐPostgreSQL¶àºËÖ´ÐÐÓÅ»¯¡£
ĿǰPostgreSQL9.6ÉçÇø°æÒ²»á°üº¬²¿·Ö²¢Ðл¯ÌØÐÔ£¬µ«ÊÇûÓÐÎÒÃÇÕâ±ßÕâô·á¸»£¬ÏÂÃæ½éÉÜÏÂÌÚѶPostgreSQL²¢Ðл¯µÄÔÀíºÍЧ¹û£º

ϵͳ´´½¨Ò»¸öÈ«¾ÖµÄ¹²ÏíÄÚ´æ¹ÜÀíÆ÷£¬Ê¹ÓÃbitmap¹ÜÀíËã·¨½øÐйÜÀí
ϵͳÆô¶¯Ê±´´½¨Ò»¶¨Êý¾ÝµÄExecutor£¬ÕâЩExecutorÓÃÀ´Ö´ÐÐÖ´Ðмƻ®µÄË鯬
ϵͳ»á´´½¨Ò»¸ö¼Æ»®¶ÓÁУ¬ËùÓеÄExecutor¶¼»áÔÚÈÎÎñ¶ÓÁÐÉϵȴý¼Æ»®
ÿ¸öExecutor¶ÔÓ¦Ò»¸öÈÎÎñ½á¹û¶ÓÁУ¬ExecutorÔÚÊä³ö½á¹ûʱ¾Í°Ñ½á¹ûµÄÖ¸Õë¹Òµ½½á¹û¶ÓÁÐÖÐÈ¥
¼Æ»®¶ÓÁУ¬½á¹û¶ÓÁУ¬¼Æ»®·ÖƬִÐнá¹û¶¼´æ·ÅÔÚ¹²ÏíÄÚ´æ¹ÜÀíÆ÷ÖУ¬ÕâÑùËùÓеĽø³Ì¶¼¿ÉÒÔ·ÃÎʵ½ÕâЩ½á¹¹
Postgres»á»°½ø³ÌÔÚÊÕµ½sqlʱ£¬ÅжÏÊÇ·ñ¿ÉÒÔ²¢Ðл¯£¬²¢½øÐÐÈÎÎñµÄ·Ö·¢£»ÔÚ½á¹û¶ÓÁÐÖÐÓнá¹ûʱ¾Í¶Á³ö·µ»Ø
ÎÒÃÇÍê³ÉÓÅ»¯µÄËã×Ó£º
Seqscan
Hash join
Nestloop join
Remote query
Hash Agg
Sort Agg
Append
ͨ¹ýÔÚ24ºËCPU£¬64GÄÚ´æµÄ»úÐÍϲâÊÔ£¬¸÷¸öËã×ÓµÄÓÅ»¯½á¹û£º





ÕûÌåÀ´ËµÐÔÄÜÆÕ±éÊÇÓÅ»¯Ç°µÄ10-12±¶£¬ÓÅ»¯µÄЧ¹û±È½ÏÃ÷ÏÔ¡£
Æß.ÌÚѶPostgreSQL-XZµÄÁ½µØÈýÖÐÐÄÈÝÔÖ
Á½µØÈýÖÐÐÄÈÝÔÖÊǽðÈÚ¼¶Êý¾Ý¿âµÄ±Ø±¸ÄÜÁ¦£¬¶ÔÓÚ½ðÈÚÀàÒµÎñÊý¾Ý°²È«ÊÇ×î»ù±¾Ò²ÊÇ×îÖØÒªËßÇó£¬Òò´ËÎÒÃÇΪÁ˱£ÕϸßЧÎȶ¨µÄÊý¾ÝÈÝÔÖÄÜÁ¦£¬Ò²ÎªPostgreSQL-XZ½¨ÉèÁËÍêÉÆµÄÁ½µØÈýÖÐÐÄ×Ô¶¯ÈÝÔÖÄÜÁ¦¡£¾ßÌåµÄÁ½µØÈýÖÐÐIJ¿Êð½á¹¹ÈçÏ£º

ͬ³Ç½Úµã¼ä²ÉÓÃǿͬ²½·½Ê½£¬±£ÕÏÊý¾ÝǿһÖ£»ÒìµØ²ÉÓÃ×¨ÍøÒ첽ͬ²½¡£
½ÚµãÄÚ£¬Ã¿Ì¨ÎïÀí»úÉϲ¿ÊðCAgent£¬agentÊÕ¼¯»úÆ÷״̬²¢½øÐÐÉϱ¨£¬²¢½øÐÐÏàÓ¦µÄ¸æ¾¯ºÍµ¹»»Ö´Ðй¦ÄÜ¡£
ÿ¸öIDCÖÁÉÙ²¿ÊðÒ»¸öJCenter£¬JCenter¸ºÔðÊÕ¼¯Éϱ¨Ã¿¸öagentÉϱ¨µÄ״̬µ½ZK¼¯Èº¡£Õâô¶à¸öJCenterÖÐÖ»ÓÐÒ»¸öÊÇÖ÷Óã¬Ö÷ÓõÄJCenter³ýÁ˽øÐÐ״̬Éϱ¨»¹½øÐйÊÕϲþöºÍµ¹»»¡£ÔÚÖ÷ÓõÄJCenterÒì³£ºó£¬ÏµÍ³Í¨¹ýZK×Ô¶¯²Ã¾öÌôѡһ¸ö±¸ÓõÄJCenterÉýÖ÷¡£
JCenterºÍCAgentÊÇÁ½µØÈýÖÐÐĵĿØÖƺͲþö½Úµã¡£
¶ÔÓÚÊý¾Ý¿â½Úµã£¬CNÔÚÿ¸öIDCÖÁÉÙ²¿ÊðÒ»¸ö¡£DNÔÚÿ¸öÖÐÐIJ¿ÊðÒ»¸ö£¬Ò»¸öΪÖ÷£¬ÁíÍâÁ½¸ö²¢Áª×÷Ϊ±¸»ú·ÅÔÚÖ÷»úÉÏ£¬Ò»¸öΪͬ²½±¸»ú£¬ÁíÍâÒ»¸öΪÒì²½±¸»ú¡£
ÔÚÖ÷»ú¹ÊÕÏå´»úʱ£¬JCenterÓÅÏÈÑ¡Ôñͬ³ÇµÄ±¸»úÉýÖ÷¡£
Ŀǰ£¬ÌÚÑ¶ÔÆÒѾÌá¹©ÔÆÊý¾Ý¿âPostgreSQLµÄÄÚ²âʹÓ㬲¢½«ÌṩÄÚºËÓÅ»¯°æºÍÉçÇø°æÁ½¸ö°æ±¾À´Âú×ã¸ü¶à¿Í»§µÄÒªÇó¡£ |