±à¼ÍƼö: |
±¾ÎĽéÉÜÁË
Greenplum£¨GP£©·Ö²¼Ê½Êý¾Ý¿âµÄ¹þÏ£·Ö²¼²ßÂÔ£¬Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£
±¾ÎÄÀ´×Ô³ÌÐòÔ±ÖÂ֪¼£¬ÓÉ»ðÁú¹ûÈí¼þAlice±à¼¡¢ÍƼö¡£ |
|
Greenplum£¨GP£©ÊÇ·Ö²¼Ê½Êý¾Ý¿â£¬Òò´Ë£¬Êý¾ÝµÄ·Ö²¼ÊÇ»ù´¡¡£GPÌṩÁ˶àÖÖ·Ö²¼²ßÂÔ£º¹þÏ£·Ö²¼¡¢Ëæ»ú·Ö²¼ºÍ¸´ÖÆ±í¡£ÆäÖУ¬×î³£ÓõľÍÊǹþÏ£·Ö²¼¡£±¾ÆªÎÄÕÂÎÒ½«Ïò´ó¼Ò½éÉÜGPµÄ¹þÏ£·Ö²¼¡£
Ê×ÏÈ£¬ÎÒÃÇÏȻعËÒ»ÏÂÉÏÆªÎÄÕÂÓÃÓÚµ÷ÊÔµÄÄÇÕÅ±í£º
CREATE table
t1 AS SELECT g c1, g + 1 as c2 FROM generate_series(1,
10) g DISTRIBUTED BY (c1); |
´ó¼Ò¿ÉÒÔ¿´µ½½¨±íÓï¾äĩβÓÐDISTRIBUTED BY (c1)£¬Õâ¾Í±íʾÉÏÃæÕâÕűíÊÇÒ»ÕŹþÏ£·Ö²¼±í£¬ÇÒͨ¹ýÁÐc1µÄֵɢÁÐÊý¾Ý¡£ÎÒÃÇÔÙÀ´¿´Ï±íÀïµÄÊý¾Ý£º

ÒòΪpsqlĬÈÏÁ¬½ÓµÄÊÇMaster£¬ËùÒÔÕâÀïÖ»ÄÜ¿´µ½ÕûÕűíµÄÊý¾Ý¡£Èç¹ûÎÒÃÇÏë¹Û²ìÊý¾ÝÔÚSegmentÖеķֲ¼Çé¿ö£¬ÄÇôÓÐûÓа취ֻ¿´Ä³¸öSegmentÖд洢µÄÊý¾ÝÄØ£¿´ð°¸ÊÇÓеġ£ÓÉÓÚSegmentÒ²ÊÇÒ»¸öPostgresQL£¨PG£©ÊµÀý£¬psqlÌṩÁËÒ»¸öutilityģʽ£¬¿ÉÒÔÖ±½ÓÁ¬½ÓSegment£¨×¢ÒⲻҪͨ¹ý´Ëģʽ£¬ÈƹýMaster£¬Ö±½ÓÔÚSegmentÖ´ÐÐDDL»òÊý¾Ý²åÈëÓï¾ä£¬ÕâÑù×ö¿ÉÄÜ»áÒý·¢¼¯ÈºÒì³££©¡£Ö´ÐÐÒÔÏÂÃüÁֱÁ¬Segment£º
PGOPTIONS='-c
gp_session_role=utility' psql -p 6000 postgres |
Á¬½ÓÉÏSegmentºó£¬Ôٴβ鿴SegmentÉÏt1±íµÄÊý¾Ý£º

ÓÉÓÚÎÒÃÇÉϴδµÄ»·¾³Ö»ÓÐһ̨Segment£¬±ít1µÄÊý¾ÝÀíËùµ±È»È«²¿´æ´¢ÔÚÕą̂SegmentÉÏ¡£ËùÒÔ£¬ÏÂÃæÎÒÃÇÐèÒª½«¼¯ÈºÀ©ÈÝ£¬ÔÙ½«t1µÄÊý¾ÝÖØ·Ö²¼£¬È»ºóÔٹ۲졣
À©ÈÝ
GPµÄ¹Ù·½ÎĵµÖУ¬ÓжÔÀ©ÈݵÄÏêϸ½éÉÜ£¬¾ßÌå¿ÉÒÔ²éÔÄ¡¶GPDB62Docs¡·¡ª¡ª Chapter 4
Greenplum Database Administrator Guide ¡ª¡ª Managing
a Greenplum System ¡ª¡ª Expanding a Greenplum System¡£
1£¬³õʼ»¯ÐµÄSegments
cd /home/gpadmin/
#ÒÔ½»»¥Ä£Ê½´´½¨À©ÈÝÊäÈëÎļþ
gpexpand
# ÊÇ·ñ³õʼ»¯ÐµÄÀ©ÈÝ
> y
# ÊäÈëÐèÒªÀ©ÈݵÄÖ÷»úÃû£¬¶à¸öÖ÷»úÖ®¼äÒÔ¶ººÅ·Ö¸ô(ÈôÖ»ÔÚµ±Ç°ÒÑ´æÔÚÖ÷»úÔö¼Ósegments£¬ÊäÈë¿ÕÐм´¿É)
>
# ÊäÈëмÓÈëµÄprimary segmentsÊýÁ¿
> 1
# ÊäÈëÐÂprimary segmentsµÄĿ¼
> /home/data/primary |
Íê³Éºó£¬»áÔÚµ±Ç°Ä¿Â¼Éú³ÉÒ»¸öinput file£¬gpexpand_inputfile_yyyymmdd_xxxx¡£ 
2£¬Ö´ÐÐÀ©ÈÝ
# À©ÈÝǰÐèҪȷ±£ÏµÍ³°²×°ÁËrsyncÃüÁûÓеϰÏÈyum
-y install rsync
gpexpand -i input_file
# Èç¹ûÖ´ÐÐʧ°Ü£¬ÔÙ´ÎÖ´ÐÐǰÐè»Ø¹öÉÏ´Îʧ°ÜµÄÀ©ÈÝÐÅÏ¢
# gpexpand --rollback |
²é¿´À©ÈÝ״̬£º

3£¬Ö´ÐÐÊý¾ÝÖØ·Ö²¼
Ôٴβ鿴À©ÈÝ״̬£º

4£¬É¾³ý±¾´ÎÀ©ÈݵÄschemaÐÅÏ¢£º
ÎÒÃÇ¿´Ò»Ï´Ëʱºǫ́µÄ½ø³ÌÊý£º

¿ÉÒÔ¿´µ½ÐµÄSegmentÒÑÆô¶¯£¬ÖÁ´Ë£¬À©ÈÝÒÑÍê³É¡£
Êý¾Ý·Ö²¼
À©Èݺó£¬ÎÒÃÇ·Ö±ðÀûÓÃpsqlÁ¬½ÓÁ½¸öSegment£¬²é¿´Êý¾Ý·Ö²¼Çé¿ö¡£
µÚÒ»¸öSegment£º

µÚ¶þ¸öSegment£º

´ÓÉÏÃæÁ½ÕÅͼƬ¿ÉÒÔ¿´µ½£¬ÔÏÈÈ«²¿´æ´¢ÓÚµÚÒ»¸öSegmentÖеÄÊý¾Ý±»·ÖÉ¢µ½ÁËÁ½¸öSegmentÖУ¬²»¹ýÊý¾Ý±È½ÏÇãб£¨ÓÉÓÚt1±íµÄÊý¾ÝÁ¿±È½ÏÉÙ£¬µ±Ç°µÄÏÖÏó²¢²»ÄÜ˵Ã÷ʲôÎÊÌ⣩¡£
ͨ¹ýÔĶÁ¹Ù·½Îĵµ¡¶GPDB62Docs¡·¿ÉÖª£¬´Ó6.0°æ±¾¿ªÊ¼£¬GPʹÓÃÁËеĹþÏ£Ëã·¨¡ª¡ªJump
Consistent Hash¡£ÕâÊǹȸèÌá³öµÄÒ»¸öÒ»ÖÂÐÔ¹þÏ£Ëã·¨£¬Ð§Âʺܸߡ£±¾ÎÄÔݲ»¶ÔÕâ¸öËã·¨Õ¹¿ªÌÖÂÛ£¬ÎÒÃÇÖ±½Ó´ÓÔ´ÂëÖÐÕÒµ½Õâ¸öËã·¨µÄ´úÂ룺
/*
* The following jump consistent hash algorithm
is
* just the one from the original paper:
* https://arxiv.org/abs/1406.2294
*/
static inline int32
jump_consistent_hash(uint64 key, int32 num_segments)
{
int64 b = -1;
int64 j = 0;
while (j < num_segments)
{
b = j;
key = key * 2862933555777941757ULL + 1;
j = (b + 1) * ((double)(1LL << 31) / (double)((key
>> 33) + 1));
}
return b;
} |
¾Ý´Ë£¬ÎÒÃÇ¿ÉÒÔÑé֤һϣ¬ÉÏÃæµÄÊý¾ÝÊÇ·ñ°´ÕÕ´ËËã·¨·Ö²¼£º

Ö±½Óͨ¹ýÁÐc1µÄֵȥ¹þÏ££¬µÃµ½µÄ½á¹ûºÍt1±íʵ¼ÊµÄÊý¾Ý·Ö²¼ÊDz»Ò»Öµġ£Îª´Ë£¬ÎÒÃÇ¿ÉÒÔͨ¹ýµ÷ÊÔÔ´Â룬һ̽¾¿¾¹£¨µ÷ÊÔ·½·¨´ó¼Ò¿ÉÒԻعËÒ»ÏÂÉÏһƪÎÄÕ£©¡£Õâ´ÎÎÒÃÇÖ±½ÓÔÚjump_consistent_hash´¦´òÒ»¸ö¶Ïµã£¬Í¨¹ýpsqlÖ´ÐÐÒ»Ìõsql£º
insert into t1
values(1, 3); |
³ÌÐòÖжϺó²é¿´´«Èëjump_consistent_hashµÄ±äÁ¿Öµ£º

¿ÉÒÔ·¢ÏÖ£¬´«Èëjump_consistent_hashµÄÈë²Î²¢²»ÊÇÎÒÃDzåÈëµÄc1µÄÖµ1£¬¶øÊDZä³ÉÁË2389907270£¬ºÜÃ÷ÏÔÕâÊÇÀàËÆ¹þÏ£ÖµµÄÒ»¸ö¶«¶«¡£¼ÌÐø¿´Ïµ±Ç°¶ÑÕ»£º

ÏòÉÏËÝÔ´ÕÒµ½nodeResult.c:279´¦µÄÔ´Â룬ÎÒÃÇ¿´ÏÂh->hashÊÇÈçºÎ²úÉúµÄ£º

ͼÖÐ1´¦£¬½«h->hashÖÃΪ0¡£Í¼2¸ù¾Ýc1µÄÖµÖØÐ¼ÆËãhashkey£¬²¢¸³¸øh->hash¡£¼ÌÐø²é¿´cdbhashµÄ´úÂ룺

ÔÚcdbhashÖпÉÒÔ¿´µ½£¬datum¼´Îªc1µÄÕæÊµÖµ1£¬Í¨¹ýFunctionCallInvoke(&fcinfo)²úÉúÁËеÄhkey£¬Í¨¹ýµ÷ÊÔ¿ÉÒÔ·¢ÏÖ£¬´Ë´¦µ÷Óõĺ¯Êý¼´hashint4£º
Datum hashint4(PG_FUNCTION_ARGS)
{
return hash_uint32(PG_GETARG_INT32(0));
}
Datum hash_uint32(uint32 k)
{
register uint32 a,
b,
c; a = b = c = 0x9e3779b9 + (uint32) sizeof(uint32)
+ 3923095;
a += k; final(a, b, c); /* report the result */
return UInt32GetDatum(c);
} |
¿´µ½ÕâÀï£¬ÕæÏà´ó°×¡£ÔÀ´ÊǸù¾ÝÁеÄÀàÐ͵÷ÓÃÏàÓ¦µÄhashº¯Êý£¬ÏȶÔÁÐÖµ¼ÆËãÁËÒ»´ÎhashÖµ£¬È»ºóÔٶԴ˹þÏ£Öµ½øÐÐjump¹þÏ£ÕÒµ½¶ÔÓ¦µÄsegment±àºÅ¡£Èç´ËÒ»À´£¬ÎÒÃÇÔÚ²âÊÔ´úÂëÖÐÌí¼Óhash_uint32£¬¼ÌÐøÑéÖ¤£º

¿ÉÒÔ¿´µ½£¬Õâ´ÎµÄÑéÖ¤½á¹ûÓëʵ¼ÊµÄÊý¾Ý·Ö²¼½á¹ûÊÇÒ»Öµġ£ÖÁ´Ë£¬GPµÄ¹þÏ£·Ö²¼²ßÂÔ½éÉÜÍê±Ï¡£
|