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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
TiDB-Binlog ¼Ü¹¹ÑݽøÓëʵÏÖÔ­Àí
 
×÷Õߣº ÍõÏà
  2021  次浏览      27
2019-12-31
 
±à¼­ÍƼö:
ÎÄÕ½éÉÜÁËTiDB-Binlog ×ÜÌå¼Ü¹¹Í¼²¢ÇÒÒÔ×îÐ嵀 cluster °æ±¾µÄ¼Ü¹¹À´½éÉÜ TiDB-Binlog µÄʵÏÖÔ­ÀíµÈ£¬Ï£Íû¶ÔÄúÓÐËù°ïÖú¡£
±¾ÎÄÀ´×Ôjianshu£¬ÓÉ»ðÁú¹ûÈí¼þLuca±à¼­¡¢ÍƼö¡£

¼ò½é

TiDB-Binlog ×é¼þÓÃÓÚÊÕ¼¯ TiDB µÄ binlog£¬²¢Ìṩʵʱ±¸·ÝºÍͬ²½¹¦ÄÜ¡£¸Ã×é¼þÔÚ¹¦ÄÜÉÏÀàËÆÓÚ MySQL µÄÖ÷´Ó¸´ÖÆ£¬MySQL µÄÖ÷´Ó¸´ÖÆÒÀÀµÓڼǼµÄ binlog Îļþ£¬TiDB-Binlog ×é¼þÒ²ÊÇÈç´Ë£¬Ö÷ÒªµÄ²»Í¬µãÊÇ TiDB ÊÇ·Ö²¼Ê½µÄ£¬Òò´ËÐèÒªÊÕ¼¯¸÷¸ö TiDB ʵÀý²úÉúµÄ binlog£¬²¢°´ÕÕÊÂÎñÌá½»µÄʱ¼äÅÅÐòºó²ÅÄÜͬ²½µ½ÏÂÓΡ£Èç¹ûÄãÐèÒª²¿Êð TiDB ¼¯ÈºµÄ´Ó¿â£¬»òÕßÏë¶©ÔÄ TiDB Êý¾ÝµÄ±ä¸üÊä³öµ½ÆäËûµÄϵͳÖУ¬TiDB-Binlog ÔòÊDZز»¿ÉÉٵŤ¾ß¡£

¼Ü¹¹Ñݽø

TiDB-Binlog Õâ¸ö×é¼þÒѾ­·¢²¼ÁË 2 Äê¶àʱ¼ä£¬¾­Àú¹ý¼¸´Î¼Ü¹¹Ñݽø£¬È¥ÄêʮԵ½ÏÖÔÚ´ó¹æÄ£Ê¹ÓõÄÊÇ Kafka °æ±¾£¬¼Ü¹¹Í¼ÈçÏ£º

TiDB-Binlog ¼Ü¹¹Ñݽø

Kafka °æ±¾µÄ TiDB-Binlog Ö÷Òª°üÀ¨Á½¸ö×é¼þ£º

Pump£ºÒ»¸öÊØ»¤½ø³Ì£¬ÔÚÿ¸ö TiDB Ö÷»úµÄºǫ́ÔËÐС£ÆäÖ÷Òª¹¦ÄÜÊÇʵʱ¼Ç¼ TiDB ²úÉúµÄ binlog ²¢Ë³ÐòдÈë Kafka ÖС£

Drainer£º ´Ó Kafka ÖÐÊÕ¼¯ binlog£¬²¢°´ÕÕ TiDB ÖÐÊÂÎñµÄÌύ˳Ðòת»¯ÎªÖ¸¶¨Êý¾Ý¿â¼æÈÝµÄ SQL Óï¾ä»òÕßÖ¸¶¨¸ñʽµÄÊý¾Ý£¬×îºóͬ²½µ½Ä¿µÄÊý¾Ý¿â»òÕßдµ½Ë³ÐòÎļþ¡£

Õâ¸ö¼Ü¹¹µÄ¹¤×÷Ô­ÀíΪ£º

TiDB ÐèÒªÓë Pump °ó¶¨£¬¼´ TiDB ʵÀýÖ»Äܽ«ËüÉú³ÉµÄ binlog ·¢Ë͵½Ò»¸öÖ¸¶¨µÄ Pump ÖУ»

Pump ½« binlog ÏÈдµ½±¾µØÎļþ£¬ÔÙÒì²½µØÐ´Èëµ½ Kafka£»

Drainer ´Ó Kafka ÖжÁ³ö binlog£¬¶Ô binlog ½øÐÐÅÅÐò£¬¶Ô binlog ½âÎöºóÉú³É SQL »òÖ¸¶¨¸ñʽµÄÊý¾ÝÔÙͬ²½µ½ÏÂÓΡ£

¸ù¾ÝÓû§µÄ·´À¡£¬ÒÔ¼°ÎÒÃÇ×Ô¼º×öµÄһЩ²âÊÔ£¬·¢Ïָð汾Ö÷Òª´æÔÚһЩÎÊÌâ¡£

Ê×ÏÈ£¬TiDB µÄ¸ºÔØ¿ÉÄܲ»¾ùºâ£¬²¿·Ö TiDB ÒµÎñ½Ï¶à£¬²úÉúµÄ binlog Ò²±È½Ï¶à£¬¶ÔÓ¦µÄ Pump µÄ¸ºÔظߣ¬µ¼ÖÂÊý¾Ýͬ²½Ñӳٸߡ£

Æä´Î£¬ÒÀÀµ Kafka ¼¯Èº£¬Ôö¼ÓÁËÔËά³É±¾£»¶øÇÒ TiDB ²úÉúµÄµ¥Ìõ binlog µÄ´óС¿É´ï 2G£¨ÀýÈçÅúÁ¿É¾³ýÊý¾Ý¡¢ÅúÁ¿Ð´ÈëÊý¾Ý£©£¬ÐèÒªÅäÖà Kafka µÄÏûÏ¢´óСÏà¹ØÉèÖ㬶ø Kafka ²¢²»Ì«Êʺϵ¥ÌõÊý¾Ý½Ï´óµÄ³¡¾°¡£

×îºó£¬Drainer ÐèÒª¶ÁÈ¡ Kafka ÖÐµÄ binlog¡¢¶Ô binlog ½øÐÐÅÅÐò¡¢½âÎö binlog£¬Í¬²½Êý¾Ýµ½ÏÂÓεȹ¤×÷£¬¿ÉÒÔ¿´³ö Drainer µÄ¹¤×÷½Ï¶à£¬¶øÇÒ Drainer ÊÇÒ»¸öµ¥µã£¬ËùÒÔÍùÍùͬ²½Êý¾ÝµÄÆ¿¾±¶¼ÔÚ Drainer¡£

ÒÔÉÏÕâЩÎÊÌâÎÒÃǺÜÄÑÔÚÒÑÓеĿò¼ÜϽøÐÐÓÅ»¯£¬Òò´ËÎÒÃÇ¶Ô TiDB-Binlog ½øÐÐÁËÖØ¹¹£¬×îа汾µÄ TiDB-Binlog µÄ×ÜÌå¼Ü¹¹ÈçÏÂͼËùʾ£º

TiDB-Binlog ×ÜÌå¼Ü¹¹

а汾 TiDB-Binlog ²»ÔÙʹÓà Kafka ´æ´¢ binlog£¬ÈÔÈ»±£ÁôÁË Pump ºÍ Drainer Á½¸ö×é¼þ£¬µ«ÊǶԹ¦ÄܽøÐÐÁ˵÷Õû£º

Pump ÓÃÓÚʵʱ¼Ç¼ TiDB ²úÉúµÄ binlog£¬²¢½« binlog °´ÕÕÊÂÎñµÄÌύʱ¼ä½øÐÐÅÅÐò£¬ÔÙÌṩ¸ø Drainer ½øÐÐÏû·Ñ¡£

Drainer ´Ó¸÷¸ö Pump ÖÐÊÕ¼¯ binlog ½øÐй鲢£¬ÔÙ½« binlog ת»¯³É SQL »òÕßÖ¸¶¨¸ñʽµÄÊý¾Ý£¬×îÖÕͬ²½µ½ÏÂÓΡ£

¸Ã°æ±¾µÄÖ÷ÒªÓŵãΪ£º

¶à¸ö Pump ÐγÉÒ»¸ö¼¯Èº£¬¿ÉÒÔˮƽÀ©ÈÝ£¬¸÷¸ö Pump ¿ÉÒÔ¾ùÔȵسе£ÒµÎñµÄѹÁ¦¡£

TiDB ͨ¹ýÄÚÖÃµÄ Pump Client ½« binlog ·Ö·¢µ½¸÷¸ö Pump£¬¼´Ê¹Óв¿·Ö Pump ³öÏÖ¹ÊÕÏÒ²²»Ó°Ïì TiDB µÄÒµÎñ¡£

Pump ÄÚ²¿ÊµÏÖÁ˼òµ¥µÄ kv À´´æ´¢ binlog£¬·½±ã¶Ô binlog Êý¾ÝµÄ¹ÜÀí¡£

Ô­À´ Drainer µÄ binlog ÅÅÐòÂß¼­ÒƵ½ÁË Pump À´×ö£¬¶ø Pump ÊÇ¿ÉÀ©Õ¹µÄ£¬ÕâÑù¾ÍÄÜÌá¸ßÕûÌåµÄͬ²½ÐÔÄÜ¡£

Drainer ²»ÔÙÐèÒªÏñÔ­À´Ò»Ñù¶ÁȡһÅú binlog µ½ÄÚ´æÀï½øÐжÑÅÅÐò£¬Ö»ÐèÒªÒÀ´Î¶ÁÈ¡¸÷¸ö Pump µÄ binlog ½øÐй鲢ÅÅÐò£¬ÕâÑù¿ÉÒÔ´ó´ó½ÚÊ¡ÄÚ´æµÄʹÓã¬Í¬Ê±Ò²¸üÈÝÒ××öÄÚ´æ¿ØÖÆ¡£

ÓÉÓڸð汾×î´óµÄÌØµãÊǶà¸ö Pump ×é³ÉÁËÒ»¸ö¼¯Èº£¨cluster£©£¬Òò´Ë¸Ã°æ±¾ÃüÃûΪ cluster °æ±¾¡£ÏÂÃæÎÒÃÇÒÔ×îÐ嵀 cluster °æ±¾µÄ¼Ü¹¹À´½éÉÜ TiDB-Binlog µÄʵÏÖÔ­Àí¡£

¹¤×÷Ô­Àí

binlog

Ê×ÏÈÎÒÃÇÏȽéÉÜһϠTiDB ÖÐµÄ binlog£¬TiDB µÄÊÂÎñ²ÉÓà 2pc Ëã·¨£¬Ò»¸ö³É¹¦µÄÊÂÎñ»áдÁ½Ìõ binlog£¬°üÀ¨Ò»Ìõ Prewrite binlog ºÍ Ò»Ìõ Commit binlog£»Èç¹ûÊÂÎñʧ°Ü£¬»á·¢Ò»Ìõ Rollback binlog¡£

binlog µÄ½á¹¹¶¨ÒåΪ£º

// Binlog ¼Ç¼ÊÂÎñÖÐËùÓеıä¸ü£¬¿ÉÒÔÓà Binlog ¹¹½¨ SQL
message Binlog {
// Binlog µÄÀàÐÍ£¬°üÀ¨ Prewrite¡¢Commit¡¢Rollback µÈ
optional BinlogType tp = 1 [(gogoproto.nullable) = false];

// Prewrite, Commit ºÍ Rollback ÀàÐ굀 binlog µÄ start_ts£¬¼Ç¼ÊÂÎñ¿ªÊ¼µÄ ts
optional int64 start_ts = 2 [(gogoproto.nullable) = false];

// commit_ts ¼Ç¼ÊÂÎñ½áÊøµÄ ts£¬Ö»¼Ç¼ÔÚ commit ÀàÐ굀 binlog ÖÐ
optional int64 commit_ts = 3 [(gogoproto.nullable) = false];

// prewrite key Ö»¼Ç¼ÔÚ Prewrite ÀàÐ굀 binlog ÖУ¬
// ÊÇÒ»¸öÊÂÎñµÄÖ÷¼ü£¬ÓÃÓÚ²éѯ¸ÃÊÂÎñÊÇ·ñÌá½»
optional bytes prewrite_key = 4;

// prewrite_value ¼Ç¼ÔÚ Prewrite ÀàÐ굀 binlog ÖУ¬ÓÃÓڼǼÿһÐÐÊý¾ÝµÄ¸Ä±ä
optional bytes prewrite_value = 5;

// ddl_query ¼Ç¼ ddl Óï¾ä
optional bytes ddl_query = 6;

// ddl_job_id ¼Ç¼ ddl µÄ job id
optional int64 ddl_job_id = 7 [(gogoproto.nullable) = false];
}

binlog ¼°Ïà¹ØµÄÊý¾Ý½á¹¹¶¨Òå¼û: binlog.proto

ÆäÖÐ start_ts ΪÊÂÎñ¿ªÊ¼Ê±µÄ ts£¬commit_ts ΪÊÂÎñÌá½»µÄ ts¡£ts ÊÇÓÉÎïÀíʱ¼äºÍÂß¼­Ê±¼äת»¯¶ø³ÉµÄ£¬ÔÚ TiDB ÖÐÊÇΨһµÄ£¬ÓÉ PD À´Í³Ò»Ìṩ¡£ÔÚ¿ªÊ¼Ò»¸öÊÂÎñʱ£¬TiDB »áÇëÇó PD£¬»ñȡһ¸ö ts ×÷ΪÊÂÎñµÄ start_ts£¬ÔÚÊÂÎñÌύʱÔòÔÙ´ÎÇëÇó PD »ñȡһ¸ö ts ×÷Ϊ commit_ts¡£ ÎÒÃÇÔÚ Pump ºÍ Drainer ÖоÍÊǸù¾Ý binlog µÄ commit_ts À´¶Ô binlog ½øÐÐÅÅÐòµÄ¡£

TiDB µÄ binlog ¼Ç¼Ϊ row ģʽ£¬¼´±£´æÃ¿Ò»ÐÐÊý¾ÝµÄ¸Ä±ä¡£Êý¾ÝµÄ±ä»¯¼Ç¼ÔÚ prewrite_value ×Ö¶ÎÖУ¬¸Ã×ֶεÄÊý¾ÝÖ÷ÒªÓÉÐòÁл¯ºóµÄ TableMutation ½á¹¹µÄÊý¾Ý×é³É¡£TableMutation µÄ½á¹¹ÈçÏÂËùʾ£º

// TableMutation ´æ´¢±íÖÐÊý¾ÝµÄ±ä»¯
message TableMutation {
// ±íµÄ id£¬Î¨Ò»±êʶһ¸ö±í
optional int64 table_id = 1 [(gogoproto.nullable) = false];

// ±£´æ²åÈëµÄÿÐÐÊý¾Ý
repeated bytes inserted_rows = 2;

// ±£´æÐÞ¸ÄǰºÍÐ޸ĺóµÄÿÐеÄÊý¾Ý
repeated bytes updated_rows = 3;

// ÒÑ·ÏÆú
repeated int64 deleted_ids = 4;

// ÒÑ·ÏÆú
repeated bytes deleted_pks = 5;

// ɾ³ýÐеÄÊý¾Ý
repeated bytes deleted_rows = 6;

// ¼Ç¼Êý¾Ý±ä¸üµÄ˳Ðò
repeated MutationType sequence = 7;
}

ÏÂÃæÒÔÒ»¸öÀý×ÓÀ´ËµÃ÷ binlog ÖÐÊÇÔõô´æ´¢Êý¾ÝµÄ±ä»¯µÄ¡£

ÀýÈç table µÄ½á¹¹Îª£º

create table test (id int, name varchar(24), primary key id)

°´ÕÕ˳ÐòÖ´ÐÐÈçÏ SQL£º

begin;
insert into test(id, name) values(1, "a");
insert into test(id, name) values(2, "b");
update test set name = "c" where id = 1;
update test set name = "d" where id = 2;
delete from test where id = 2;
insert into test(id, name) values(2, "c");
commit;

ÔòÉú³ÉµÄ TableMutation µÄÊý¾ÝÈçÏÂËùʾ£º

inserted_rows:
1, "a"
2, "b"
2, "c"

updated_rows:
1, "a", 1, "c"
2, "b", 2, "d"

deleted_rows:
2, "d"

sequence:
Insert, Insert, Update, Update, DeleteRow, Insert

¿ÉÒÔ´ÓÀý×ÓÖп´³ö£¬sequence Öб£´æµÄÊý¾Ý±ä¸üÀàÐ͵Ä˳ÐòΪִÐÐ SQL µÄ˳Ðò£¬¾ßÌå±ä¸üµÄÊý¾ÝÄÚÈÝÔò±£´æµ½ÁËÏàÓ¦µÄ±äÁ¿ÖС£

Drainer ÔÚ°Ñ binlog Êý¾Ýͬ²½µ½ÏÂÓÎǰ£¬¾ÍÐèÒª°ÑÉÏÃæµÄÕâЩÊý¾Ý»¹Ô­³É SQL£¬ÔÙͬ²½µ½ÏÂÓΡ£

ÁíÍâÐèҪ˵Ã÷µÄÊÇ£¬TiDB ÔÚд binlog ʱ£¬»áͬʱÏò TiKV ·¢ÆðдÊý¾ÝÇëÇóºÍÏò Pump ·¢ËÍ Prewrite binlog£¬Èç¹û TiKV ºÍ Pump ÆäÖÐÒ»¸öÇëÇóʧ°Ü£¬Ôò¸ÃÊÂÎñʧ°Ü¡£µ± Prewrite ³É¹¦ºó£¬TiDB Ïò TiKV ·¢Æð Commit ÏûÏ¢£¬²¢Òì²½µØÏò Pump ·¢ËÍÒ»Ìõ Commit binlog¡£ÓÉÓÚ TiDB ÊÇͬʱÏò TiKV ºÍ Pump ·¢ËÍÇëÇóµÄ£¬ËùÒÔÖ»Òª±£Ö¤ Pump ´¦Àí Prewrite binlog ÇëÇóµÄʱ¼äСÓÚµÈÓÚ TiKV Ö´ÐÐ Prewrite µÄʱ¼ä£¬¿ªÆô binlog ¾Í²»»á¶ÔÊÂÎñµÄÑÓ³ÙÔì³ÉÓ°Ïì¡£

Pump Client

´ÓÉÏÃæµÄ½éÉÜÖÐÎÒÃÇÖªµÀÓɶà¸ö Pump ×é³ÉÒ»¸ö¼¯Èº£¬¹²Í¬³Ðµ£Ð´ binlog µÄÇëÇó£¬ÄÇô¾ÍÐèÒª±£Ö¤ TiDB Äܹ»½«Ð´ binlog µÄÇëÇ󾡿ÉÄܾùÔȵطַ¢µ½¸÷¸ö Pump£¬²¢ÇÒÐèҪʶ±ð²»¿ÉÓÃµÄ Pump£¬¼°Ê±»ñÈ¡µ½Ð¼ÓÈ뼯ȺÖÐ Pump ÐÅÏ¢¡£Õⲿ·ÖµÄ¹¤×÷ÊÇÔÚ Pump Client ÖÐʵÏֵġ£

Pump Client ÒÔ°üµÄÐÎʽ¼¯³ÉÔÚ TiDB ÖУ¬´úÂëÁ´½Ó£ºpump_client¡£

Pump Client ά»¤ Pump ¼¯ÈºµÄÐÅÏ¢£¬Pump µÄÐÅÏ¢Ö÷ÒªÀ´×ÔÓÚ PD Öб£´æµÄ Pump µÄ״̬ÐÅÏ¢£¬×´Ì¬ÐÅÏ¢µÄ¶¨ÒåÈçÏ£¨´úÂëÁ´½Ó£ºStatus£©£º

type Status struct {
// Pump/Drainer ʵÀýµÄΨһ±êʶ
NodeID string `json:"nodeId"`

// Pump/Drainer µÄ·þÎñµØÖ·
Addr string `json:"host"`

// Pump/Drainer µÄ״̬£¬Öµ¿ÉÒÔΪ online¡¢pausing¡¢paused¡¢closing¡¢offline
State string `json:"state"`

// Pump/Drainer ÊÇ·ñ alive£¨Ä¿Ç°Ã»ÓÐʹÓøÃ×ֶΣ©
IsAlive bool `json:"isAlive"`

// PumpµÄ·ÖÊý£¬¸Ã·ÖÊýÊÇÓɽڵãµÄ¸ºÔØ¡¢´ÅÅÌʹÓÃÂÊ¡¢´æ´¢µÄÊý¾ÝÁ¿´óСµÈÒòËØ¼ÆËãµÃÀ´µÄ£¬
// ÕâÑù Pump Client ¿ÉÒÔ¸ù¾Ý·ÖÊýÀ´Ñ¡È¡ºÏÊ浀 Pump ·¢ËÍ binlog£¨´ýʵÏÖ£©
Score int64 `json:"score"`

// Pump µÄ±êÇ©£¬¿ÉÒÔͨ¹ý label ¶Ô TiDB ºÍ Pump ½øÐзÖ×飬
// TiDB Ö»Äܽ« binlog ·¢Ë͵½Ïàͬ label µÄ Pump£¨´ýʵÏÖ£©
Label *Label `json:"label"`

// Pump£º ±£´æµÄ binlog µÄ×î´óµÄ commit_ts
// Drainer£ºÒÑÏû·ÑµÄ binlog µÄ×î´óµÄ commit_ts
MaxCommitTS int64 `json:"maxCommitTS"`

// ¸Ã״̬ÐÅÏ¢µÄ¸üÐÂʱ¼ä¶ÔÓ¦µÄ ts.
UpdateTS int64 `json:"updateTS"`
}

Pump Client ¸ù¾Ý Pump Éϱ¨µ½ PD µÄÐÅÏ¢ÒÔ¼°Ð´ binlog ÇëÇóµÄʵ¼ÊÇé¿ö½« Pump »®·ÖΪ¿ÉÓà Pump Óë²»¿ÉÓà Pump Á½¸ö²¿·Ö¡£

»®·ÖµÄ·½·¨°üÀ¨£º

³õʼ»¯Ê±´Ó PD ÖлñÈ¡ËùÓÐ Pump µÄÐÅÏ¢£¬½«×´Ì¬Îª online µÄ Pump ¼ÓÈëµ½¿ÉÓà Pump ÁбíÖУ¬ÆäËû Pump ¼ÓÈëµ½·Ç¿ÉÓÃÁбíÖС£

Pump ÿ¸ô¹Ì¶¨µÄʱ¼ä»á·¢ËÍÐÄÌøµ½ PD£¬²¢¸üÐÂ×Ô¼ºµÄ״̬¡£Pump Client ¼à¿Ø PD ÖÐ Pump ÉÏ´«µÄ״̬ÐÅÏ¢£¬¼°Ê±¸üÐÂÄÚ´æÖÐά»¤µÄ Pump ÐÅÏ¢£¬Èç¹û״̬ÓÉ·Ç online ת»»Îª online Ôò½«¸Ã Pump ¼ÓÈëµ½¿ÉÓà Pump ÁÐ±í£»·´Ö®¼ÓÈëµ½·Ç¿ÉÓÃÁбíÖС£

ÔÚд binlog µ½ Pump ʱ£¬Èç¹û¸Ã Pump ÔÚÖØÊÔ¶à´ÎºóÈÔȻд binlog ʧ°Ü£¬Ôò°Ñ¸Ã Pump ¼ÓÈëµ½·Ç¿ÉÓà Pump ÁбíÖС£

¶¨Ê±·¢ËÍ̽»îÇëÇó£¨Êý¾ÝΪ¿ÕµÄ binlog дÇëÇ󣩵½·Ç¿ÉÓà Pump ÁбíÖеÄ״̬Ϊ online µÄ Pump£¬Èç¹û·µ»Ø³É¹¦£¬Ôò°Ñ¸Ã Pump ÖØÐ¼ÓÈëµ½¿ÉÓà Pump ÁбíÖС£

ͨ¹ýÉÏÃæµÄÕâЩ´ëÊ©£¬Pump Client ¾Í¿ÉÒÔ¼°Ê±µØ¸üÐÂËùά»¤µÄ Pump ¼¯ÈºÐÅÏ¢£¬±£Ö¤½« binlog ·¢Ë͵½¿ÉÓÃµÄ Pump ÖС£

ÁíÍâÒ»¸öÎÊÌâÊÇ£¬Ôõô±£Ö¤ Pump Client ¿ÉÒÔ½« binlog дÇëÇó¾ùÔȵطַ¢µ½¸÷¸ö Pump£¿ÎÒÃÇĿǰÌṩÁ˼¸ÖÖ·ÓɲßÂÔ£º

range£º °´ÕÕ˳ÐòÒÀ´Îѡȡ Pump ·¢ËÍ binlog£¬¼´µÚÒ»´ÎѡȡµÚÒ»¸ö Pump£¬µÚ¶þ´ÎѡȡµÚ¶þ¸ö Pump...

hash£º¶Ô binlog µÄ start_ts ½øÐÐ hash£¬È»ºóѡȡ hash Öµ¶ÔÓ¦µÄ Pump¡£

score£º¸ù¾Ý Pump Éϱ¨µÄ·ÖÊý°´ÕÕ¼ÓȨƽ¾ùË㷨ѡȡ Pump ·¢ËÍ binlog£¨´ýʵÏÖ£©¡£

ÐèҪעÒâµÄµØ·½ÊÇ£¬ÒÔÉϵIJßÂÔÖ»ÊÇÕë¶Ô Prewrite binlog£¬¶ÔÓÚ Commit binlog£¬Pump Client »á½«Ëü·¢Ë͵½¶ÔÓ¦µÄ Prewrite binlog ËùÑ¡ÔñµÄ Pump£¬ÕâÑù×öÊÇÒòΪÔÚ Pump ÖÐÐèÒª½«°üº¬ Prewrite binlog ºÍ Commit binlog µÄÍêÕû binlog£¨¼´Ö´Ðгɹ¦µÄÊÂÎñµÄ binlog£©Ìṩ¸ø Drainer£¬½« Commit binlog ·¢Ë͵½ÆäËû Pump ûÓÐÒâÒå¡£

Pump Client Ïò Pump Ìύд binlog µÄÇëÇó½Ó¿ÚΪ pump.proto ÖÐµÄ WriteBinlog£¬Ê¹Óà grpc ·¢ËÍ binlog ÇëÇó¡£

Pump

Pump Ö÷ÒªÓÃÀ´³Ðµ£ binlog µÄдÇëÇó£¬Î¬»¤ binlog Êý¾Ý£¬²¢½«ÓÐÐòµÄ binlog Ìṩ¸ø Drainer¡£ÎÒÃǽ« Pump ³éÏó³ÉÁËÒ»¸ö¼òµ¥µÄ kv Êý¾Ý¿â£¬key Ϊ binlog µÄ start _ts£¨Priwrite binlog£© »òÕß commit_ts£¨Commit binlog£©£¬value Ϊ binlog µÄÔªÊý¾Ý£¬binlog µÄÊý¾ÝÔò´æÔÚÊý¾ÝÎļþÖС£Drainer Ïñ²éÊý¾Ý¿âÒ»ÑùµÄÀ´»ñÈ¡ËùÐèÒªµÄ binlog¡£

Pump ÄÚÖÃÁË leveldb ÓÃÓÚ´æ´¢ binlog µÄÔªÐÅÏ¢¡£ÔÚ Pump ÊÕµ½ binlog µÄдÇëÇóʱ£¬»áÊ×ÏȽ« binlog Êý¾ÝÒÔ append µÄÐÎʽдµ½ÎļþÖУ¬È»ºó½« binlog µÄ ts¡¢ÀàÐÍ¡¢Êý¾Ý³¤¶È¡¢Ëù±£´æµÄÎļþÒÔ¼°ÔÚÎļþÖеÄλÖÃÐÅÏ¢±£´æÔÚ leveldb ÖУ¬Èç¹ûΪ Prewrite binlog£¬ÔòÒÔ start_ts×÷Ϊ key£»Èç¹ûÊÇ Commit binlog£¬ÔòÒÔ commit_ts ×÷Ϊ key¡£

µ± Drainer Ïò Pump ÇëÇó»ñȡָ¶¨ ts Ö®ºóµÄ binlog ʱ£¬Pump Ôò²éѯ leveldb ÖдóÓڸà ts µÄ binlog µÄÔªÊý¾Ý£¬Èç¹ûµ±Ç°Êý¾ÝΪ Prewrite binlog£¬Ôò±ØÐëÕÒµ½¶ÔÓ¦µÄ Commit binlog£»Èç¹ûΪ Commit binlog Ôò¼ÌÐøÏòÇ°ÍÆ½ø¡£ÕâÀïÓиöÎÊÌ⣬ÔÚ binlog Ò»½ÚÖÐÌáµ½£¬Èç¹û TiKV ³É¹¦Ð´ÈëÁËÊý¾Ý£¬²¢ÇÒ Pump ³É¹¦½ÓÊÕµ½ÁË Prewrite binlog£¬Ôò¸ÃÊÂÎñ¾ÍÌá½»³É¹¦ÁË£¬ÄÇôÈç¹ûÔÚ TiDB ·¢ËÍ Commit binlog µ½ Pump ǰ·¢ÉúÁËһЩÒì³££¨ÀýÈç TiDB Òì³£Í˳ö£¬»òÕßÇ¿ÖÆÖÕÖ¹ÁË TiDB ½ø³Ì£©£¬µ¼Ö Pump ûÓнÓÊÕµ½ Commit binlog£¬ÄÇô Pump ÖоͻáÒ»Ö±ÕÒ²»µ½Ä³Ð© Prewrite binlog ¶ÔÓ¦µÄ Commit binlog¡£ÕâÀïÎÒÃÇÔÚ Pump ÖÐ×öÁË´¦Àí£¬Èç¹ûij¸ö Prewrite binlog ³¬¹ýÁËÊ®·ÖÖÓ¶¼Ã»ÓÐÕÒµ½¶ÔÓ¦µÄ Commit binlog£¬Ôòͨ¹ý binlog Êý¾ÝÖÐµÄ prewrite_key È¥²éѯ TiKV ¸ÃÊÂÎñÊÇ·ñÌá½»£¬Èç¹ûÒѾ­Ìá½»³É¹¦£¬Ôò TiKV »á·µ»Ø¸ÃÊÂÎñµÄ commit_ts£»·ñÔò Pump ¾Í¶ªÆú¸ÃÌõ Prewrite binlog¡£

binlog ÔªÊý¾ÝÖÐÌṩÁËÊý¾Ý´æ´¢µÄÎļþºÍλÖ㬿ÉÒÔͨ¹ýÕâЩÐÅÏ¢¶ÁÈ¡ binlog ÎļþµÄÖ¸¶¨Î»ÖûñÈ¡µ½Êý¾Ý¡£ÒòΪ binlog Êý¾Ý»ù±¾ÉÏÊǰ´Ë³ÐòдÈëµ½ÎļþÖеģ¬Òò´ËÎÒÃÇÖ»ÐèҪ˳ÐòµØ¶Á binlog Îļþ¼´¿É£¬ÕâÑù¾Í±£Ö¤Á˲»»áÒòΪƵ·±µØ¶ÁÈ¡Îļþ¶øÓ°Ïì Pump µÄÐÔÄÜ¡£×îÖÕ£¬Pump ÒÔ commit_ts ΪÅÅÐò±ê×¼½« binlog Êý¾Ý´«Ê䏸 Drainer¡£Drainer Ïò Pump ÇëÇó binlog Êý¾ÝµÄ½Ó¿ÚΪ pump.proto ÖÐµÄ PullBinlogs£¬ÒÔ grpc streaming µÄÐÎʽ´«Êä binlog Êý¾Ý¡£

ÖµµÃÒ»ÌáµÄÊÇ£¬Pump ÖÐÓÐÒ»¸ö fake binlog »úÖÆ¡£Pump »á¶¨Ê±£¨Ä¬ÈÏÈýÃ룩Ïò±¾µØ´æ´¢ÖÐдÈëÒ»ÌõÊý¾ÝΪ¿ÕµÄ binlog£¬ÔÚÉú³É¸Ã binlog ǰ£¬»áÏò PD Öлñȡһ¸ö ts£¬×÷Ϊ¸Ã binlog µÄ start_ts Óë commit_ts£¬ÕâÖÖ binlog ÎÒÃǽÐ×÷ fake binlog¡£ÕâÑù×öµÄÔ­ÒòÔÚ Drainer ÖнéÉÜ¡£

Drainer

Drainer ´Ó¸÷¸ö Pump ÖлñÈ¡ binlog£¬¹é²¢ºó°´ÕÕ˳Ðò½âÎö binlog¡¢Éú³É SQL »òÕßÖ¸¶¨¸ñʽµÄÊý¾Ý£¬È»ºóÔÙͬ²½µ½ÏÂÓΡ£

¼ÈȻҪ´Ó¸÷¸ö Pump »ñÈ¡Êý¾Ý£¬Drainer ¾ÍÐèҪά»¤ Pump ¼¯ÈºµÄÐÅÏ¢£¬¼°Ê±»ñÈ¡µ½ÐÂÔö¼ÓµÄ Pump£¬²¢Ê¶±ð³ö²»¿ÉÓÃµÄ Pump£¬Õⲿ·Ö¹¦ÄÜÓë Pump Client ÀàËÆ£¬Drainer Ò²ÊÇͨ¹ý PD Öд洢µÄ Pump µÄ״̬ÐÅÏ¢À´Î¬»¤ Pump ÐÅÏ¢¡£ÁíÍâÐèҪעÒâµÄÊÇ£¬Èç¹ûÐÂÔö¼ÓÁËÒ»¸ö Pump£¬±ØÐëÈøà Pump ֪ͨ Drainer ×Ô¼ºÉÏÏßÁË£¬Õâô×öÊÇΪÁ˱£Ö¤²»»á¶ªÊý¾Ý¡£ÀýÈ磺

¼¯ÈºÖÐÒѾ­´æÔÚ Pump1 ºÍ Pump2£¬Drainer ¶ÁÈ¡ Pump1 ºÍ Pump2 µÄÊý¾Ý²¢½øÐй鲢£º

Pump1 ´æ´¢µÄ binlog Ϊ£û 1£¬3£¬5£¬7£¬9 £ý£¬Pump2 ´æ´¢µÄ binlog Ϊ£û2£¬4£¬6£¬10£ý¡£Drainer ´ÓÁ½¸ö Pump »ñÈ¡ binlog£¬¼ÙÉ赱ǰÒѾ­¶ÁÈ¡µ½ÁË£û1£¬2£¬3£¬4£¬5£¬6£¬7£ýÕâЩ binlog£¬ÒÑ´¦ÀíµÄ binlog µÄλÖÃΪ 7¡£´Ëʱ Pump3 ¼ÓÈ뼯Ⱥ£¬´Ó Pump3 Éϱ¨×Ô¼ºµÄÉÏÏßÐÅÏ¢µ½ PD£¬µ½ Drainer ´Ó PD ÖлñÈ¡µ½ Pump3 ÐÅÏ¢ÐèÒªÒ»¶¨µÄʱ¼ä£¬Èç¹û Pump3 ûÓÐ֪ͨ Drainer ¾ÍÖ±½ÓÌṩд binlog ·þÎñ£¬Ð´ÈëÁË binlog£û8£¬12£ý£¬Drainer ÔÚ´ËÆÚ¼ä¼ÌÐø¶ÁÈ¡ Pump1 ºÍ Pump2 µÄ binlog£¬¼ÙÉè¶ÁÈ¡µ½ÁË 9£¬Ö®ºó²Åʶ±ðµ½ÁË Pump3 ²¢½« Pump3 ¼ÓÈëµ½¹é²¢ÅÅÐòÖУ¬´Ëʱ Pump3 µÄ binlog 8 ¾Í¶ªÊ§ÁË¡£ÎªÁ˱ÜÃâÕâÖÖÇé¿ö£¬ÐèÒªÈà Pump3 ֪ͨ Drainer ×Ô¼ºÒѾ­ÉÏÏߣ¬Drainer ÊÕµ½Í¨Öªºó½« Pump3 ¼ÓÈëµ½¹é²¢ÅÅÐò£¬²¢·µ»Ø³É¹¦¸ø Pump3£¬È»ºó Pump3 ²ÅÄÜÌṩд binlog µÄ·þÎñ¡£

Drainer ͨ¹ýÈçÉÏËùʾµÄ·½Ê½¶Ô binlog ½øÐй鲢ÅÅÐò£¬²¢ÍƽøÍ¬²½µÄλÖá£ÄÇô¿ÉÄÜ»á´æÔÚÕâÖÖÇé¿ö£ºÄ³¸ö Pump ÓÉÓÚÒ»Ð©ÌØÊâµÄÔ­ÒòһֱûÓÐÊÕµ½ binlog Êý¾Ý£¬ÄÇô Drainer ÖеĹ鲢ÅÅÐò¾ÍÎÞ·¨¼ÌÐøÏÂÈ¥£¬ÕýÈçÎÒÃÇÓÃÁ½ÌõÍÈ×ß·£¬ÆäÖÐÒ»Ö»ÍȲ»¶¯¾Í²»ÄܼÌÐøÇ°½ø¡£ÎÒÃÇʹÓà Pump Ò»½ÚÖÐÌáµ½µÄ fake binlog µÄ»úÖÆÀ´±ÜÃâÕâÖÖÎÊÌ⣬Pump ÿ¸ôÖ¸¶¨µÄʱ¼ä¾ÍÉú³ÉÒ»Ìõ fake binlog£¬¼´Ê¹Ä³Ð© Pump һֱûÓÐÊý¾ÝдÈ룬Ҳ¿ÉÒÔ±£Ö¤¹é²¢ÅÅÐòÕý³£ÏòÇ°ÍÆ½ø¡£

Drainer ½«ËùÓÐ Pump µÄÊý¾Ý°´ÕÕ commit_ts ½øÐй鲢ÅÅÐòºó£¬½« binlog Êý¾Ý´«µÝ¸ø Drainer ÖеÄÊý¾Ý½âÎö¼°Í¬²½Ä£¿é¡£Í¨¹ýÉÏÃæµÄ binlog ¸ñʽµÄ½éÉÜ£¬ÎÒÃÇ¿ÉÒÔ¿´³ö binlog ÎļþÖв¢Ã»Óд洢±í½á¹¹µÄÐÅÏ¢£¬Òò´ËÐèÒªÔÚ Drainer ÖÐά»¤ËùÓпâºÍ±íµÄ½á¹¹ÐÅÏ¢¡£ÔÚÆô¶¯ Drainer ʱ£¬Drainer »áÇëÇó TiKV£¬»ñÈ¡µ½ËùÓÐÀúÊ·µÄ DDL job µÄÐÅÏ¢£¬¶ÔÕâЩ DDL job ½øÐйýÂË£¬Ê¹Óà Drainer Æô¶¯Ê±Ö¸¶¨µÄ initial-commit-ts£¨»òÕß checkpoint Öб£´æµÄ commit_ts£©Ö®Ç°µÄ DDL ÔÚÄÚ´æÖй¹½¨¿âºÍ±í½á¹¹ÐÅÏ¢¡£ÕâÑù Drainer ¾ÍÓÐÁËÒ»·Ý ts ¶ÔӦʱ¼äµãµÄ¿âºÍ±íµÄ¿ìÕÕ£¬ÔÚ¶ÁÈ¡µ½ DDL ÀàÐ굀 binlog ʱ£¬Ôò¸üпâºÍ±íµÄÐÅÏ¢£»¶ÁÈ¡µ½ DML ÀàÐ굀 binlog ʱ£¬Ôò¸ù¾Ý¿âºÍ±íµÄÐÅÏ¢À´Éú³É SQL¡£

ÔÚÉú³É SQL Ö®ºó£¬¾Í¿ÉÒÔͬ²½µ½ÏÂÓÎÁË¡£ÎªÁËÌá¸ß Drainer ͬ²½µÄËÙ¶È£¬Drainer ÖÐʹÓöà¸öЭ³ÌÀ´Ö´ÐÐ SQL¡£ÔÚÉú³É SQL ʱ£¬ÎÒÃÇ»áʹÓÃÖ÷¼ü£¯Î¨Ò»¼üµÄÖµ×÷Ϊ¸ÃÌõ SQL µÄ key£¬Í¨¹ý¶Ô key ½øÐÐ hash À´½« SQL ·¢Ë͵½¶ÔÓ¦µÄЭ³ÌÖС£µ±Ã¿¸öЭ³ÌÊÕ¼¯µ½ÁË×ã¹»¶àµÄ SQL£¬»òÕß³¬¹ýÁËÒ»¶¨µÄʱ¼ä£¬Ôò½«ÕâÒ»ÅúµÄ SQL ÔÚÒ»¸öÊÂÎñÖÐÌá½»µ½ÏÂÓΡ£

µ«ÊÇÓÐЩ SQL ÊÇÏà¹ØµÄ£¬Èç¹û±»·Öµ½Á˲»Í¬µÄЭ³Ì£¬ÄÇ SQL µÄÖ´ÐÐ˳Ðò¾Í²»Äܵõ½±£Ö¤£¬Ôì³ÉÊý¾ÝµÄ²»Ò»Ö¡£ÀýÈ磺

SQL1: delete from test.test where id = 1;

SQL2: replace into test.test (id, name ) values(1, "a");

°´ÕÕ˳ÐòÖ´Ðкó±íÖдæÔÚ id £½ 1 ¸ÃÐÐÊý¾Ý£¬Èç¹ûÕâÁ½Ìõ SQL ·Ö±ð·ÖÅäµ½ÁËЭ³Ì 1 ºÍЭ³Ì 2 ÖУ¬²¢ÇÒЭ³Ì 2 ÏÈÖ´ÐÐÁË SQL£¬Ôò±íÖв»ÔÙ´æÔÚ id £½ 1 µÄÊý¾Ý¡£ÎªÁ˱ÜÃâÕâÖÖÇé¿öµÄ·¢Éú£¬Drainer ÖмÓÈëÁ˳åÍ»¼ì²âµÄ»úÖÆ£¬Èç¹û¼ì²â³öÀ´Á½Ìõ SQL ´æÔÚ³åÍ»£¨ÐÞ¸ÄÁËͬһÐÐÊý¾Ý£©£¬ÔòÔÝʱ²»½«ºóÃæµÄ SQL ·¢Ë͵½Ð­³Ì£¬¶øÊÇÉú³ÉÒ»¸ö Flush ÀàÐ굀 job ·¢Ë͵½ËùÓеÄЭ³Ì£¬ ÿ¸öЭ³ÌÔÚÓöµ½ Flush job ʱ¾Í»áÂíÉÏÖ´ÐÐËù»º´æµÄ SQL¡£½Ó×ŲŻá°Ñ¸ÃÌõÓгåÍ»µÄ SQL ·¢Ë͵½¶ÔÓ¦µÄЭ³ÌÖС£ÏÂÃæ¸ø³öÒ»¸öÀý×Ó˵Ã÷һϳåÍ»¼ì²âµÄ»úÖÆ£º

ÓÐÒÔÏÂÕâЩ SQL£¬ÆäÖÐ id Ϊ±íµÄÖ÷¼ü£º

SQL1: update itest set id = 4, name = "c", age = 15 where id = 3; key: 3, 4

SQL2: update itest set id = 5, name = "b", age = 14 where id = 2; key£º5, 2

SQL3£ºdelete from itest where id = 3; key: 3

Ê×ÏȽ« SQL1 ·¢Ë͵½Ö¸¶¨µÄЭ³Ì£¬ÕâʱËùÓÐµÄ keys Ϊ£Û3£¬4£Ý£»

SQL2 µÄ key£Û5£¬2£ÝÓë keys ÖеģÛ3£¬4£Ý¶¼Ã»ÓгåÍ»£¬½« SQL2 ·¢Ë͵½Ö¸¶¨µÄЭ³Ì£¬Õâʱ keys Ϊ£Û3£¬4£¬5£¬2£Ý£»

SQL3 µÄ key£Û3£ÝÓë keys ÖеģÛ3£Ý´æÔÚ³åÍ»£¬·¢ËÍ Flush job µ½ËùÓÐЭ³Ì£¬SQL1 ºÍ SQL2 ±»Ö´ÐУ¬Çå¿Õ keys£»

½« SQL3 ·¢Ë͵½Ö¸¶¨µÄЭ³Ì£¬Í¬Ê±¸üРkeys Ϊ£Û3£Ý¡£

Drainer ͨ¹ýÒÔÉÏÕâЩ»úÖÆÀ´¸ßЧµØÍ¬²½Êý¾Ý£¬²¢ÇÒ±£Ö¤Êý¾ÝµÄÒ»Ö¡£

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

»ùÓÚEAµÄÊý¾Ý¿â½¨Ä£
Êý¾ÝÁ÷½¨Ä££¨EAÖ¸ÄÏ£©
¡°Êý¾Ýºþ¡±£º¸ÅÄî¡¢ÌØÕ÷¡¢¼Ü¹¹Óë°¸Àý
ÔÚÏßÉ̳ÇÊý¾Ý¿âϵͳÉè¼Æ ˼·+Ч¹û
 
Ïà¹ØÎĵµ

GreenplumÊý¾Ý¿â»ù´¡Åàѵ
MySQL5.1ÐÔÄÜÓÅ»¯·½°¸
ijµçÉÌÊý¾ÝÖÐ̨¼Ü¹¹Êµ¼ù
MySQL¸ßÀ©Õ¹¼Ü¹¹Éè¼Æ
Ïà¹Ø¿Î³Ì

Êý¾ÝÖÎÀí¡¢Êý¾Ý¼Ü¹¹¼°Êý¾Ý±ê×¼
MongoDBʵս¿Î³Ì
²¢·¢¡¢´óÈÝÁ¿¡¢¸ßÐÔÄÜÊý¾Ý¿âÉè¼ÆÓëÓÅ»¯
PostgreSQLÊý¾Ý¿âʵսÅàѵ