±à¼ÍƼö: |
ÎÄÕ½éÉÜÁË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 ͨ¹ýÒÔÉÏÕâЩ»úÖÆÀ´¸ßЧµØÍ¬²½Êý¾Ý£¬²¢ÇÒ±£Ö¤Êý¾ÝµÄÒ»Ö¡£
|