ä½è ï¼mydbâ
1. èæ¯
å å®¹ä¸»æ°æ®é¡¹ç®æ°æ®åå¨å±ä½¿ç¨äºåå¸å¼å ³ç³»åæ°æ®åº TiDB (ç¼åæ¬ææ¶ï¼å å®¹ä¸»æ°æ® TiDB é群ççæ¬å·æ¯ 3.0.9)ï¼æ¬æä»ä¸æ¬¡ä¸å¡ä¼åè§£å³åå ¥çç¹çæ¡ä¾å ¥æï¼ä¸ºå¤§å®¶ç®åä»ç» TiDB æ¶æï¼å å®¹ä¸»æ°æ® TiDB éç¾¤åºæ¬æ åµï¼éå°çé®é¢åå¦ä½è§£å³çï¼æåä»ç»æ°æ®åºå¼åè§èçéè¦æ§ã
å å®¹ä¸»æ°æ®æ¯ä¹å®¶ç»ä¸ä¸å°ä½ç³»ä¸é常éè¦ä¸æ ¸å¿çç³»ç»ä¹ä¸ï¼æ¯ä¹å®¶å 容çæçæ¯æç³»ç»ï¼å®ç°äºæ±½è½¦ä¹å®¶å ¨å¹³å°å 容çä¸è´åï¼å³ææå 容å±ç¤ºæ°æ®çä¸è´ãææå å®¹ç¶æå坹夿¾ç¤ºçç»ä¸ãææå 容æºå¤´çç»ä¸ãåç»é¡¹ç®è§åæ¯æ¥å ¥ææä¹å®¶å å®¹ç±»ç³»ç»æäº§ççæ°æ®ï¼ä¸ºå å®¹ç±»æ°æ®å¶å®ç»ä¸æ åï¼å¹¶ä¸ºææä¸å¡åå°ç³»ç»æä¾ä¸å¿åçä¸è´æ§åºå£ã
2. TiDB ä»ç»
TiDB æ¯ä¸æ¬¾å¼æºåå¸å¼ HTAP (Hybrid Transactional and Analytical Processing) æ°æ®åºï¼ç»åäºä¼ ç»ç RDBMS å NoSQL çæä½³ç¹æ§ãTiDB å ¼å®¹ MySQLï¼æ¯ææ éçæ°´å¹³æ©å±ï¼å ·å¤å¼ºä¸è´æ§åé«å¯ç¨æ§ãTiDB çç®æ æ¯ä¸º OLTP (Online Transactional Processing) å OLAP (Online Analytical Processing) åºæ¯æä¾ä¸ç«å¼çè§£å³æ¹æ¡ãTiDB æ´ä½æ¶æå¦ä¸ï¼
ââ

ââ
TiDB Server
TiDB Server è´è´£æ¥æ¶ SQL 请æ±ï¼å¤ç SQL ç¸å ³çé»è¾ï¼å¹¶éè¿ PD æ¾å°åå¨è®¡ç®æéæ°æ®ç TiKV å°åï¼ä¸ TiKV 交äºè·åæ°æ®ï¼æç»è¿åç»æãTiDB Server æ¯æ ç¶æçï¼å ¶æ¬èº«å¹¶ä¸å卿°æ®ï¼åªè´è´£è®¡ç®ï¼å¯ä»¥æ éæ°´å¹³æ©å±ï¼å¯ä»¥éè¿è´è½½åè¡¡ç»ä»¶ï¼å¦ LVSãHAProxy æ F5ï¼å¯¹å¤æä¾ç»ä¸çæ¥å ¥å°åã
PD Server
Placement Driver (ç®ç§° PD) æ¯æ´ä¸ªé群çç®¡çæ¨¡åï¼å ¶ä¸»è¦å·¥ä½æä¸ä¸ªï¼
- 䏿¯åå¨é群çå ä¿¡æ¯ï¼æä¸ª Key åå¨å¨åªä¸ª TiKV èç¹ï¼ï¼
- äºæ¯å¯¹ TiKV é群è¿è¡è°åº¦åè´è½½åè¡¡ï¼å¦æ°æ®çè¿ç§»ãRaft group leader çè¿ç§»çï¼ï¼
- 䏿¯åé å ¨å±å¯ä¸ä¸éå¢çäºå¡ IDã
PD éè¿ Raft åè®®ä¿è¯èªèº«æ°æ®çå®å ¨æ§ãRaft ç leader server è´è´£å¤çæææä½ï¼å ¶ä½ç PD server ä» ç¨äºä¿è¯é«å¯ç¨ã建议é¨ç½²å¥æ°ä¸ª PD èç¹ã
TiKV Server
TiKV Server è´è´£å卿°æ®ï¼ä»å¤é¨ç TiKV æ¯ä¸ä¸ªåå¸å¼çæä¾äºå¡ç Key-Value åå¨å¼æãå卿°æ®çåºæ¬å使¯ Regionï¼æ¯ä¸ª Region è´è´£åå¨ä¸ä¸ª Key Rangeï¼ä» StartKey å° EndKey çå·¦éå³å¼åºé´ï¼çæ°æ®ï¼æ¯ä¸ª TiKV èç¹ä¼è´è´£å¤ä¸ª RegionãTiKV ä½¿ç¨ Raft åè®®åå¤å¶ï¼ä¿ææ°æ®çä¸è´æ§å容ç¾ã坿¬ä»¥ Region 为åä½è¿è¡ç®¡çï¼ä¸åèç¹ä¸çå¤ä¸ª Region ææä¸ä¸ª Raft Groupï¼äºä¸ºå¯æ¬ãæ°æ®å¨å¤ä¸ª TiKV ä¹é´çè´è½½åè¡¡ç± PD è°åº¦ï¼è¿é乿¯ä»¥ Region 为åä½è¿è¡è°åº¦ã
3. é群信æ¯
æ¬ç« è为大家ä»ç»ä¸å å®¹ä¸»æ°æ® TiDB é群çåºæ¬æ¶æã
3.1 åºæ¬ä¿¡æ¯
ç®åå å®¹ä¸»æ°æ® TiDB é群使ç¨ççæ¬æ¯ 3.0.9 çæ¬ï¼å个ç»ä»¶å¦ä¸è¡¨æç¤ºï¼
模ååç§° | çæ¬ä¿¡æ¯ | æ°é |
tidb | v3.0.9 | 5 |
pd | v3.0.9 | 3 |
tikv | v3.0.9 | 12ï¼åæºå¤å®ä¾ï¼ |
pump | v3.0.9 | 4 |
drainer | v3.0.9 | 3 |
TiDBãPDãTiKV å¨ç¬¬2ç« èå·²åä»ç»ï¼ä¸åèµè¿°ï¼è¿éç®å说ä¸ä¸ Pump å Drainer ç»ä»¶ãPump ç¨äºå®æ¶è®°å½ TiDB 产çç Binlogï¼å¹¶å° Binlog æç §äºå¡çæäº¤æ¶é´è¿è¡æåºï¼åæä¾ç» Drainer è¿è¡æ¶è´¹ï¼Drainer ä»å个 Pump 䏿¶é Binlog è¿è¡å½å¹¶ï¼åå° Binlog 忥å°ä¸æ¸¸ Kafkaã
3.2 é群ææ
ä¸é¢æ¯é群çåºæ¬æ¶æå¾
ââ
ââ
ã é群说æ ã
ä¸å¡æ°æ®åå ¥ TiDB 忥åºéè¿ä¸¤ç§æ¹å¼
(1)SQL SERVER éè¿ CDC 忥å°é群
(2)MySQL éè¿ Otter 忥å°é群
LVS å端æå¤ä¸ª TiDB èç¹ç¨äºä¸å¡è®¿é®ï¼2 个 Drainer 宿¶åæ¥ TiDB ä¸å¡æ°æ®å°ä¸æ¸¸ Kafka é群ç¨äºè·å TiDB å¢éæ°æ®ï¼ç¶åæ±æ»æä¸å¡æ°æ®åå ¥ TiDB æ±æ»åºï¼1个 Drainer 忥 TiDB æ°æ®å°æå¡å¨ç£çï¼ç¨äºåæé®é¢ï¼æ¯å¦æä¸ªæ¶é´æ®µ TPS ç¹å«é«ï¼å¯ä»¥å©ç¨ reparo å·¥å ·è§£ææå®æ¶é´æ®µå ç Binlog æ¥åæé®é¢ã
4. é®é¢æè¿°
æ°æ®åå ¥æµç¨æ¯ï¼Drainer å° TiDB Binlog åæ¥å° Kafkaï¼ç¨åºæ¶è´¹ Kafka æ°æ®åå ¥ TiDB æ±æ»åºã
ä¸å¡æ¹åé¦åå ¥ TiDB æ±æ»åºå¾æ ¢ï¼Kafka æ¶æ¯æå¤§éå 积ãæä»¬ä»ä¸é¢ TiDB çæ§å¾ä¹è½å¾ææ¾ççåºé群ååºå¾æ ¢ï¼ SQL 99 çååºæ¶é´å¨ 200ms å° 220ms ä¹é´ï¼ä½æ¯ insert æ¯ç§åªæ 4500 å·¦å³ãæä»¬å¸¦çè¿äºé®é¢å¼å§éæ¥åæã
(1)Duration 表示 SQL ååºæ¶é´ï¼å
æ¬ SQL 999/99/95/80
(2)Statement QPS 表示æ¯ç§å¢å æ¹æ¥çé
ââ
ââ
5. é®é¢åæ
5.1 åææ ¢æ¥å¿
é¦å æä»¬çä¸éç¾¤æ ¢æ¯å¦æ¯ç±äºæ ¢ SQL 导è´çå¢ï¼æä»¬ä½¿ç¨ pt-query-digest å·¥å ·å¯¹æ ¢æ¥å¿è¿è¡åæï¼æå第ä¸çæ ¢ SQL å¦ä¸ï¼é½æ¯ä¸äºç®åç insertï¼å¹³åèæ¶ 8msï¼ä¸ºä»ä¹è¿ä¹ç®åç insert èæ¶è¿ä¹é¿ï¼
Insert IGNORE Into table_name (ciz_id,data_type,field,`value`) values(37163712,'club','club_is_jinghua','0' ) \"G
5.2 æ¥ççæ§
æä»¬ç»§ç»åæï¼æ¥ççæ§ææ æ¯å¦æå¼å¸¸ï¼éè¿è§å¯çæ§ç³»ç» Hot Write 颿¿ï¼æä»¬åç°ä»¥ä¸å ç¹å¼å¸¸
(1)gRPC poll CPU ææ ä¸æä¸ª TiKV gRPC poll CPU ç弿æ¾é«äºå
¶å® TiKV èç¹
(2)QPS ææ ä¸æä¸ª TiKV ç QPS ææ¾é«äºå
¶å® TiKV èç¹
(3)CPU ææ ä¸æä¸ª TiKV èç¹ç CPU 使ç¨çææ¾é«äºå
¶ä» TiKV èç¹
åºäºä»¥ä¸åæï¼æä»¬å¯ä»¥å¾åºç»è®ºï¼é群åå¨åçç¹ï¼å¯¼è´äºé群åå ¥æ ¢ã
伿å¨ç¥ï¼å¨åå¸å¼æ°æ®åºä¸ï¼é¤äºæ¬èº«çåºç¡æ§è½å¤ï¼æéè¦çå°±æ¯å åå©ç¨ææèç¹è½åï¼é¿å 让å个èç¹æä¸ºç¶é¢ã严éççç¹é®é¢ï¼ä¼å¯¼è´å个èç¹æä¸ºèµæºç¶é¢ï¼è¿èå½±åæ´ä¸ªç³»ç»çååè½åã
ä¸é¢æ¯é¨åçæ§ææ æªå¾
ã gRPC poll CPU ãï¼ gRPC 线ç¨ç CPU 使ç¨ç
ä»çæ§æ²çº¿å¯ä»¥çå°ï¼æä¸ª TiKV ç gRPC poll CPU ææ¾é«äºå ¶å® TiKV èç¹ã
ââ
ââ
ã QPS ãï¼æ¯ä¸ª TiKV å®ä¾ä¸åç§å½ä»¤ç QPS
ä»çæ§æ²çº¿å¯ä»¥çå°ï¼æä¸ª TiKV ç QPS ææ¾é«äºå ¶å® TiKV èç¹ã
ââ
ââ
5.3 æ¥çç³»ç»è¡¨
ç¡®å®æ¯ä¸ªå« TiKV å®ä¾ççç¹é®é¢åï¼éè¦è¿ä¸æ¥ç¡®è®¤æ¯åªå¼ 表ççç¹ãä» TiDB 3.0 å¼å§ï¼æä»¬å¯ä»¥éè¿ SQL æ¥è¯¢ information_schema.TiDB_HOT_REGIONS 表å®ä½çç¹è¡¨/ç´¢å¼ï¼
select * from information_schema.TiDB_HOT_REGIONS where TYPE='write';
éè¿ç³»ç»è¡¨ï¼æä»¬çå°åå ¥çç¹çå å¼ è¡¨ä¸»è¦æ¯å å®¹æ°æ®çåå¼ æ±æ»è¡¨ï¼è¡¨ç»æ(å·²åè±æå¤ç)类似å¦ä¸
CREATE TABLE `table_name` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主é®',
`data_type` varchar(100) NOT NULL COMMENT 'æ°æ®ç±»å',
`ciz_id` bigint(11) NOT NULL COMMENT 'æ°æ®æ è¯',
`content` mediumtext DEFAULT NULL COMMENT 'å
容',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ¥å
¥æ¶é´',
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_type_cizid` (`data_type`,`ciz_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='XXX 表';
ä»è¡¨ç»ææä»¬çå°ï¼æ¯å¼ è¡¨é½æä¸ä¸ªèªå¢ id ä½ä¸ºä¸»é®ï¼èªå¢ id ä½ä¸ºä¸»é®å¨ MySQL 鿝æ¨èçï¼è¿æ ·å¯ä»¥æé«é¡ºåºåå ¥çæ§è½ãèTiDB 䏿°æ®æç §ä¸»é®ç Key ååæå¾å¤ Regionï¼æ¯ä¸ª Region çæ°æ®åªä¼ä¿åå¨ä¸ä¸ªèç¹ä¸é¢ã妿 TiDB ä¸ç表使ç¨èªå¢idä½ä¸ºä¸»é®ï¼ææ°åå ¥çæ°æ®å¤§æ¦çé½å¨åä¸ä¸ª Region ä¸ï¼ä¹å°±æ¯åä¸ä¸ª TiKV èç¹ä¸ï¼ä»èå¼èµ·çç¹ã
å°æ¤ä¸ºæ¢ï¼æä»¬å·²ç»ç¥ééç¾¤æ ¢æ¯åå ¥çç¹å¯¼è´çï¼ä¹ç¥éæ¯åªäºè¡¨å¯¼è´çï¼æ¥ä¸æ¥æä»¬çå¦ä½æ¥è§£å³è¿ä¸ªé®é¢ã
6. é®é¢è§£å³
æ¢ç¶èªå¢ id ä¼å¯¼è´ TiDB åå ¥çç¹ï¼æä»¬éè¦å¯¹è¡¨ç»æè¿è¡æ¹é
(1)廿èªå¢ id ç主é®ï¼ä½¿ç¨ varchar ç±»åä½ä¸ºä¸»é®
(2)é ç½® shard_row_id_bits ä»¥ææ£çç¹
æ¹é åçè¡¨ç»æå¦ä¸
CREATE TABLE `table_name` (
`global_id` varchar(20) NOT NULL COMMENT '主é®',
`data_type` varchar(100) NOT NULL COMMENT 'æ°æ®ç±»å',
`ciz_id` bigint(11) NOT NULL COMMENT 'æ°æ®æ è¯',
`content` mediumtext DEFAULT NULL COMMENT 'å
容',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ¥å
¥æ¶é´',
PRIMARY KEY (`global_id`),
UNIQUE KEY `uniq_type_cizid` (`data_type`,`ciz_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 SHARD_ROW_ID_BITS=4 COMMENT='XXX 表';
æ¹é å®è¡¨ç»æï¼ä¿®æ¹å®ä»£ç è¿è¡åæµï¼åæµææé常好ãä¸é¢æ¯æ£å¼ä¸çº¿åçææï¼
SQL 99 çååºæ¶é´ä»ä¹åç 200ms å° 220ms ä¹é´ï¼éä½å° 20ms å·¦å³
ââ
ââ
è¿éæè°¢å¼ååå¦(ç½å»ºç)ç积æé åï¼æµè¯ï¼æç»åä½è§£å³äºåå ¥çç¹çé®é¢ï¼é群æ§è½å¾å°å¤§å¹ æåã
7. æ»ç»
TiDB ä½ä¸ºä¸ä¸ªåå¸å¼æ°æ®åºï¼è½ç¶ä¼èªå¨ä¸å¨æçè¿è¡æ°æ®çéæ°åå¸ä»¥å°è¾¾å°½å¯è½çåè¡¡ï¼ä½æ¯ææ¶åç±äºä¸å¡ç¹æ§æè ä¸å¡è´è½½ççªåï¼ä»ç¶ä¼äº§ççç¹ï¼è¿æ¶åå¾å¾å°±ä¼åºç°æ§è½ç¶é¢ãTiDB æ¯ä¸ä¸ªåå¸å¼çæ°æ®åºï¼å¨è¡¨ç»æè®¾è®¡çæ¶åéè¦èèçäºæ åä¼ ç»çåæºæ°æ®åºææåºå«ï¼éè¦å¼åè è½å¤å¸¦çãè¿ä¸ªè¡¨çæ°æ®ä¼åæ£å¨ä¸åçæºå¨ä¸ãè¿ä¸ªåæï¼æè½åæ´å¥½ç设计ã
TiDB å¼å ¥æ±½è½¦ä¹å®¶åï¼æä»¬ä¸ç´å¨æ¢ç´¢ï¼ç ç©¶ï¼ç¸åºçï¼æä»¬å¶è®¢äº TiDB æ°æ®åºå¼åè§èï¼ç¨äºæå¯¼å¼åè æ´å¥½çä½¿ç¨ TiDB ï¼åæ¥ TiDB æä½³æ§è½ãä¸é¢æ¯ TiDB æ°æ®åºå¼åè§èä¸è¡¨ç»æè®¾è®¡è§èç䏿¡å 容 ï¼
ã强å¶ãå¯¹äº TiDB 3.0 çæ¬ï¼è¡¨ç主é®å¿ 须设置为 varchar ç±»åï¼å¹¶é ç½® SHARD_ROW_ID_BITS ï¼æ£ä¾
CREATE TABLE `tb_example` (
`user_id` varchar(20) NOT NULL COMMENT 'ç¨æ·id',
`name` varchar(10) NOT NULL DEFAULT '' COMMENT '人å',
`created_stime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´',
`modified_stime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'ä¿®æ¹æ¶é´',
PRIMARY KEY (`user_id`),
KEY `idx_modified_stime` (`modified_stime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 SHARD_ROW_ID_BITS=4 COMMENT='TiDB è§è表';
说æ
(1)ä¸è¦ä½¿ç¨èªå¢ id(æè
int ç±»å)ä½ä¸ºä¸»é®ï¼åå¨åå
¥çç¹é®é¢ï¼å¯¼è´åå
¥æ
¢
(2)主é®ä¸º varchar çç®çæ¯ä¸ºäºä½¿ç¨ shard_row_id_bits ææ£çç¹ï¼æé«å¹¶ååå
¥è½å
(3)shard_row_id_bits = 4 表示 tidb_rowid çå¼ä¼éæºå叿 16 ï¼16=2^4ï¼ ä¸ªèå´åºé´
(4)ä¸»é® varchar 设置å¤é¿å¤ç¨ï¼å¯ä»¥æç
§åè¿å¶çåè计ç®ï¼int æ¯ 10 ä½ï¼bigint æ¯ 20 ä½
夿³¨ï¼
è§èä¼éç TiDB çæ¬çè¿ä»£åæ¶æ´æ°ãæ¬æåºäº TiDB 3.0 ç¼åãä» TiDB 4.0 å¼å§ï¼
TiDB æä¾äºä¸ç§æ©å±è¯æ³(AutoRandom)ï¼ç¨äºè§£å³æ´æ°ç±»å主é®éè¿ AutoIncrement 屿§éå¼åé
ID æ¶çåçç¹é®é¢ãå¯ä»¥å©ç¨ AUTO_RANDOM å屿§ï¼å° AUTO_INCREMENT æ¹ä¸º AUTO_RANDOMï¼æå
¥æ°æ®æ¶è®© TiDB èªå¨ä¸ºæ´å主é®ååé
ä¸ä¸ªå¼ï¼æ¶é¤è¡ ID çè¿ç»æ§ï¼ä»èè¾¾å°ææ£çç¹çç®çã
æ´è¯¦ç»çå¼åè§è请åèæ±½è½¦ä¹å®¶ã TiDB æ°æ®åºå¼åè§è ãã