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

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

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

ÒµÎñ×îСÖжϵÄÀ©ÈÝ·½°¸£º
ÒµÎñµÄ¿ìËÙÔö³¤²»¿É±ÜÃâµÄÐèÒª¶Ô×ÊÔ´½øÐÐÀ©ÈÝ£¬ÉçÇø°æ±¾µÄʵÏÖʹµÃÀ©Èݳɱ¾¸ß°º£¬ÐèÒª¶ÔÒµÎñ½øÐг¤Ê±¼äµÄÖжϡ£ÒòΪ£¬ÔÚÉçÇø°æ±¾PostgreSQL-XCÖУ¬Í¨¹ý¡°
DN=Hash(row) % nofdn¡±µÄ·½Ê½¾ö¶¨Ò»Ìõ¼Ç¼µÄ´æ´¢½Úµã£º
Ò²¾ÍÊÇ˵£¬ÏȶԷֲ¼ÁмÆËãhashÖµ£¬È»ºóʹÓÃÕâ¸öÖµ¶Ô¼¯ÈºÖеĽڵã¸öÊýȡģÀ´¾ö¶¨¼Ç¼ȥÄĸö½Úµã£¨Èçͼ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ÖÐÓ³Éä¹ØÏµµÄ£¬Ê±¼ä´Ó¼¸ÌìËõ¶Ìµ½¼¸Ãë

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

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

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

¶àÊý¾Ý¼Ç¼¸ßЧÅÅÐò½â¾ö·½°¸£º
ÒµÎñÔÚÁбí²éѯ³¡¾°Ï»áÊÕµ½ÈçϵIJéѯSQL£º
¼ÙÉèÕâÑùÒ»¸ö³¡¾°£¬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±¶£¬ÓÅ»¯µÄЧ¹û±È½ÏÃ÷ÏÔ¡£
2¡¢Á½µØÈýÖÐÐÄÈÝÔÖ£º
Á½µØÈýÖÐÐÄÈÝÔÖÊÇÊý¾Ý¿âµÄ±Ø±¸ÄÜÁ¦£¬¶Ô½ðÈÚÀàÒµÎñÀ´Ëµ£¬Êý¾Ý°²È«ÊÇ×î»ù±¾Ò²ÊÇ×îÖØÒªËßÇó£¬Òò´ËÎÒÃÇΪÁ˱£ÕϸßЧÎȶ¨µÄÊý¾ÝÈÝÔÖÄÜÁ¦£¬Ò²ÎªPostgreSQL-XZ½¨ÉèÁËÍêÉÆµÄÁ½µØÈýÖÐÐÄ×Ô¶¯ÈÝÔÖÄÜÁ¦¡£¾ßÌåµÄÁ½µØÈýÖÐÐIJ¿Êð½á¹¹ÈçÏ£º

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