mycat踩坑記,一次生產(chǎn)bug
【心中一萬的羊駝...】
進(jìn)入正題。
環(huán)境
- MyCat 版本:V1.6
- MyCat SEQ配置:
sequnceHandlerType=1,sequence表DDL是
CREATE TABLE `mycat_sequence` (
`name` varchar(50) NOT NULL,
`current_value` bigint(20) NOT NULL,
`increment` int(11) NOT NULL DEFAULT '1',
PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
- MyCat 配置表
tab自增主鍵: schema.xml 配置
<table name="tab" primaryKey="id" autoIncrement="true" dataNode="dn8"/>
插入 mycat_sequence 數(shù)據(jù),步長 increment=10
INSERT INTO mycat_sequence (name, current_value, `increment`)
VALUES('TAB', 1, 10);
問題描述
Spark任務(wù)通過JDBC連接MyCat,發(fā)送insert into tab xxx初始化一些數(shù)據(jù)。
MyCat配置了表tab自增主鍵,使用insert into tab xxx插入數(shù)據(jù),如果sql中沒有指定PK,MyCat應(yīng)該會自己拼裝上PK字段和值,然后將拼裝后的sql發(fā)送到MySQL上去執(zhí)行。
但是Spark初始化完成數(shù)據(jù)后,MySQL中已經(jīng)增加了110w+的數(shù)據(jù),mycat_sequence中tab1表的current_value是21。說明MyCat沒有組裝ID到insert語句中。
************************* 省略排查過程,直接上結(jié)論 *************************
總結(jié)
1、MyCat通過配置 primaryKey="id" autoIncrement="true" 來開啟自增主鍵
2、MyCat獲取PK值,先從自己的SEQ緩存中取,如果緩存中沒有,就去 mycat_sequence 中獲取,每次獲取increment個數(shù)值放入緩存,同時更新 current_value=current_value+increment。
3、客戶端發(fā)送到MyCat的 insert into tab(xx) value(xx) 中如果沒有包含主鍵ID,MyCat會自動拼裝上ID,將拼裝后的SQL insert into tab(xx, ID) value(xx, 12) 發(fā)送到MySQL上執(zhí)行。
關(guān)鍵來了:MyCat向insert拼裝ID,不識別insert ignore into,如過客戶端發(fā)送到MyCat的insert帶有ignore,MyCat直接將SQL發(fā)送到MySQL