资源描述:
《table-checksum》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、mk-table-checksum@qcbetterThanksTencent@FelixliangAgenda•如何判断masterslave数据一致•binlog顺序性;MySQL可重复读隔离级别•使用及参数•精确数据切分方法及必要性•平台集成•其他之前•之前09年slave分裂扩容,切换数据迁移都是停机校验,•新的在线校验方式节约变更时间,checksum数据保障数据一致性方面会有很大帮助的。•新的校验方式基于Slavebinlog传递,每条sql在master和slave上执行时,所有表的数据
2、,应该是一致的这么个道理的。如何判断MS数据时候一致•1停机校验:•32G4RAID5+8RAID10SAS•测试:200G(总共)/5G(单表数据)*64s=2560s•停机时间太长•checksumtable_name如何判断MS数据时候一致•2不停机校验:master逐表写锁定slavechecksum•begin;Locktablet2write;checksumtablet2;commit;•单表锁定,时间为分钟级,数据量越大,锁时间越长(5G表64s)如何判断MS数据时候一致•3不停机校验
3、:按块做校验,保证每个块(chunk)时间够短•mk-table-checksum的雏形•chunk•SELECT'test_checksum','tt2',0ASchunk_num,'id>=1andid<4',COUNT(*)AScnt,LOWER(CONV(BIT_XOR(CAST(CRC32(CONCAT_WS('#','id','name'))asUNSIGNED)),10,16))AScrcFROM`test_checksum`.`tt2`whereid>=1andid<4;•这个sele
4、ct语句可以实现按数据段进行数据校验,每个段的数据校验时间可控,最大的优点无需锁表mk-table-checksum原理•master上执行下面两个语句,记录结果到checksum表中•核心语句为•replaceintoxxxselectxxx•updatexxx•slave获取这两个binlog然后重放,slave判断master_crc/this_crc,master_cnt/this_cnt是否一样•REPLACE/*test_checksum.tt2:1/3*/INTOdb_infobase.
5、checksum(db,tbl,chunk,boundaries,this_cnt,this_crc)SELECT'test_checksum','tt2',0ASchunk_num,'id>=1andid<4',COUNT(*)AScnt,LOWER(CONV(BIT_XOR(CAST(CRC32(CONCAT_WS('#','id','name'))asUNSIGNED)),10,16))AScrcFROM`test_checksum`.`tt2`whereid>=1andid<4;•UPDATE
6、db_infobase.checksumSETmaster_crc='e9216fca',master_cnt=’2'WHEREdb='test_checksum'ANDtbl='tt2'ANDchunk='0'/*!*/;如何保证checksum时DRDB是同一时刻的校验值•binlog记录一系列的replaceupdate语句执行书序是一致的开启事物,看到的也是开始时的状态,•//但是这里我还是有一点不理解,masterbinlog不是应该在事物提交后传递到slave传递的时候不是应该是延时,这时
7、候有修改的话不就还是不一致么?还说这种情况下是不可能一致的?•CREATETABLEdb_infobase.checksum(•dbchar(64)NOTNULL,•tblchar(64)NOTNULL,•chunkintNOTNULL,•boundarieschar(100)NOTNULL,•this_crcchar(40)NOTNULL,•this_cntintNOTNULL,•master_crcchar(40)NULL,•master_cntintNULL,•tstimestampNOTNUL
8、L,•PRIMARYKEY(db,tbl,chunk)•)ENGINE=InnoDB;数据分块校验原理•获得每个chunk大致涉及的rows:n_rows=$chunk_size/$avg_row_length•确定校验份数:假设指定chunk-size为10M,则将该表分为5000/10=500份•计算每一份(块)的起始值:假设表id为主键,通过selectmin(id),max(id)fromtt2;假设最小、最大值为0、10000,则第1个区间数据