Руководство по настройке и практике распределённой базы данных TiDB
Почему стоит выбрать TiDB в 2026 году?
TiDB, как распределённая база данных HTAP (гибридная транзакционная и аналитическая обработка) нового поколения, стала основным решением для модернизации корпоративных баз данных в 2026 году. Она идеально решает проблему узкого места одиночного сервера и сложность шардинга традиционного MySQL.
Ключевые преимущества TiDB
| Измерение | TiDB | Шардинг MySQL | CockroachDB | Amazon Aurora |
|---|---|---|---|---|
| Масштабирование | Прозрачное горизонтальное | Шардинг на уровне приложения | Горизонтальное | Вертикальное + масштабирование чтения |
| Совместимость с MySQL | Очень высокая (95%+) | Нативный MySQL | Средняя | Высокая |
| HTAP | Нативная поддержка | Требуются дополнительные компоненты | Не поддерживается | Ограниченная |
| Операционная сложность | Средняя (TiUP) | Высокая | Средняя | Низкая (управляемая) |
| Строгая согласованность | Протокол Raft | Нативная | Протокол Raft | Ограниченная |
| Открытый исходный код | Полностью открытый | - | Открытый | Закрытый |
Ключевые вехи TiDB в 2026 году
- TiDB 8.x стабильная: Улучшение производительности на 40%+, поддержка больших объёмов данных
- Улучшения MPP в TiFlash: Значительно улучшена аналитика в реальном времени, больше оконных функций
- Serverless TiDB: Облачная модель оплаты по факту использования, более низкий порог входа
- Управление ресурсами: Изоляция CPU/IO для мультитенантных сценариев
- Глобальная сортировка: Резко снижает накладные расходы при крупномасштабном импорте данных
Обзор архитектуры TiDB
TiDB использует архитектуру разделения вычислений и хранения с четырьмя основными компонентами:
Ответственность компонентов
┌─────────────────────────────────────────────────────┐
│ Client (MySQL Protocol) │
└──────────────┬──────────────────────────────────────┘
│
┌──────────────▼──────────────────────────────────────┐
│ TiDB Server (SQL Layer) │
│ ┌─────────┐ ┌──────────┐ ┌───────────────┐ │
│ │ Parser │ │ Optimizer│ │ Executor │ │
│ └─────────┘ └──────────┘ └───────────────┘ │
└──────────────┬──────────────────────────────────────┘
│
┌──────────────▼──────────────────────────────────────┐
│ PD (Placement Driver) │
│ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │
│ │ Scheduler│ │ Meta │ │ TSO Clock │ │
│ └──────────┘ └──────────┘ └──────────────┘ │
└──────────────┬──────────────────────────────────────┘
│
┌──────────────▼──────────────────────────────────────┐
│ TiKV (Row Store) TiFlash (Column Store) │
│ ┌─────────┐ ┌──────────────┐ │
│ │ Raft │ │ DeltaTree │ │
│ │ RocksDB │ │ ClickHouse │ │
│ └─────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────┘
- TiDB Server: Слой SQL-вычислений без состояния, обрабатывает разбор, оптимизацию и выполнение SQL
- PD (Placement Driver): Мозг кластера, управляет планированием, метаданными и глобальными временными метками
- TiKV: Система хранения по строкам на основе RocksDB + Raft, обрабатывает транзакционные чтение/запись
- TiFlash: Система столбцового хранения на основе технологии ClickHouse, обрабатывает аналитику в реальном времени
Механизм потока данных
- Путь записи: Клиент → TiDB → PD (получить TSO) → TiKV (запись Raft) → TiFlash (асинхронная синхронизация)
- Путь чтения (OLTP): Клиент → TiDB → TiKV (точечное/диапазонное сканирование)
- Путь чтения (OLAP): Клиент → TiDB → TiFlash (параллельные вычисления MPP)
💡 Используйте инструмент Форматирование SQL для форматирования SQL-запросов TiDB и упрощения анализа плана выполнения.
Развёртывание TiDB с помощью TiUP
TiUP — официальный инструмент управления кластером TiDB, поддерживающий развёртывание, масштабирование и обновления в один клик.
Настройка окружения
# Установить TiUP
curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh
source ~/.bash_profile
# Проверить установку
tiup --version
Минимальное развёртывание тестового кластера
# topo.yaml - Минимальная конфигурация топологии
global:
user: "tidb"
ssh_port: 22
deploy_dir: "/tidb-deploy"
data_dir: "/tidb-data"
monitored:
node_exporter_port: 9100
blackbox_exporter_port: 9115
server_configs:
tidb:
log.level: "info"
performance.max-procs: 4
tikv:
readpool.coprocessor.max-concurrency: 8
raftstore.apply-pool-size: 3
raftstore.store-pool-size: 3
pd:
schedule.max-merge-region-size: 20
pd_servers:
- host: 10.0.1.1
tidb_servers:
- host: 10.0.1.1
tikv_servers:
- host: 10.0.1.1
tiflash_servers:
- host: 10.0.1.1
monitoring_servers:
- host: 10.0.1.1
grafana_servers:
- host: 10.0.1.1
# Развёртывание кластера
tiup cluster deploy tidb-prod v8.5.1 topo.yaml
# Запуск кластера
tiup cluster start tidb-prod
# Проверка состояния кластера
tiup cluster display tidb-prod
# Подключение к TiDB
mysql -h 10.0.1.1 -P 4000 -u root
Основные требования для промышленного развёртывания
- Развёртывание 3 узлов PD: Обеспечение высокой доступности планировщика
- Развёртывание минимум 3 узлов TiKV: Запись большинством Raft
- Развёртывание 2+ узлов TiDB: Балансировка нагрузки фронтенда
- Развёртывание TiFlash отдельно: Предотвращение конкуренции за I/O с TiKV
- SSD-диски: Каталог данных TiKV должен использовать NVMe SSD
- Сеть: Задержка между узлами < 0.5 мс, пропускная способность ≥ 10 Гбит/с
Контрольный список совместимости MySQL
TiDB обладает высокой совместимостью с протоколом MySQL 5.7 / 8.0, но некоторые различия требуют внимания:
Совместимые функции
| Функция | Поддержка | Примечания |
|---|---|---|
| SELECT / INSERT / UPDATE / DELETE | ✅ Полностью поддерживается | |
| JOIN (все типы) | ✅ Полностью поддерживается | |
| Подзапросы | ✅ Полностью поддерживается | |
| Оконные функции | ✅ Полностью поддерживается | TiDB 6.0+ |
| CTE (обобщённые табличные выражения) | ✅ Полностью поддерживается | TiDB 6.0+ |
| Prepared Statement | ✅ Полностью поддерживается | |
| Тип JSON | ✅ Полностью поддерживается | |
| UTF8 / UTF8MB4 | ✅ Полностью поддерживается |
Несовместимые функции
| Функция | Статус | Альтернатива |
|---|---|---|
| Хранимые процедуры | ❌ Не поддерживается | Использовать логику приложения |
| Триггеры | ❌ Не поддерживается | Использовать события приложения |
| Внешние ключи | ⚠️ Только синтаксис, не применяется | Обеспечивать целостность в приложении |
| Синтаксис XA | ⚠️ Частичная поддержка | Использовать внутренний 2PC TiDB |
| Непрерывность auto-increment | ⚠️ Не гарантируется | Использовать AUTO_ID_CACHE или последовательности |
| SAVEPOINT | ✅ Поддерживается | TiDB 6.2+ |
| SELECT ... FOR UPDATE | ⚠️ Пессимистичная блокировка | Необходимо явно включить |
Скрипт проверки совместимости
-- Проверить версию и совместимость TiDB
SELECT tidb_version();
-- Проверить текущий режим транзакций
SELECT @@tidb_txn_mode;
-- Проверить поведение auto-increment
SHOW VARIABLES LIKE 'auto_increment%';
-- Проверить поддержку кодировок
SHOW CHARACTER SET WHERE Charset LIKE '%utf%';
💡 Используйте инструмент Форматирование JSON для проверки структур данных JSON в TiDB.
Оптимизация SQL и анализ плана выполнения
EXPLAIN и EXPLAIN ANALYZE
TiDB предоставляет богатые инструменты анализа плана выполнения:
-- Просмотр плана выполнения
EXPLAIN SELECT o.order_id, c.customer_name
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
WHERE o.order_date >= '2026-01-01'
AND o.status = 'shipped';
-- Просмотр фактической статистики выполнения (со временем, количеством строк)
EXPLAIN ANALYZE SELECT o.order_id, c.customer_name
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
WHERE o.order_date >= '2026-01-01'
AND o.status = 'shipped';
Ключевые операторы плана выполнения
| Оператор | Значение | Направление оптимизации |
|---|---|---|
| TableFullScan | Полное сканирование таблицы | Добавить подходящий индекс |
| IndexRangeScan | Диапазонное сканирование по индексу | Уже хорошо, проверить стоимость поиска в таблице |
| IndexLookUp | Индекс + поиск в таблице | Рассмотреть покрывающий индекс |
| IndexReader | Чтение индекса (без поиска) | Покрывающий индекс, оптимально |
| HashJoin | Хеш-соединение | Проверить размер данных на стороне Build |
| MergeJoin | Соединение слиянием | Убедиться, что обе стороны отсортированы |
| IndexJoin | Индексное вложенное соединение | Подходит для управления малой таблицой большой |
| StreamAgg | Потоковая агрегация | Уже оптимально |
| HashAgg | Хеш-агрегация | Проверить мощность группировки |
| TopN | Сортировка TopN | Уже оптимально |
| Sort | Полная сортировка | Проверить, можно ли использовать порядок индекса |
Практические примеры настройки SQL
-- Пример 1: Избежать полного сканирования таблицы
-- Проблема: Низкая избирательность по status вызывает полное сканирование
EXPLAIN SELECT * FROM orders WHERE status = 'pending';
-- Решение: Добавить составной индекс
ALTER TABLE orders ADD INDEX idx_status_date (status, order_date);
-- Пример 2: Покрывающий индекс для устранения поиска в таблице
-- Проблема: IndexLookUp имеет высокую стоимость поиска
EXPLAIN SELECT customer_id, order_date FROM orders WHERE status = 'shipped';
-- Решение: Покрывающий индекс
ALTER TABLE orders ADD INDEX idx_cover (status, customer_id, order_date);
-- Пример 3: Оптимизировать порядок JOIN
-- Проблема: Сторона Build в HashJoin слишком велика
EXPLAIN ANALYZE SELECT *
FROM order_items oi
JOIN products p ON oi.product_id = p.product_id
WHERE p.category = 'electronics';
-- Решение: Добавить индекс на ведущую таблицу + обновить статистику
ANALYZE TABLE products;
ANALYZE TABLE order_items;
Управление планами SQL (SPM)
-- Создать SQL Binding для фиксации оптимального плана
CREATE SESSION BINDING FOR
SELECT * FROM orders WHERE status = 'shipped'
USING
SELECT * FROM orders USE INDEX (idx_status_date) WHERE status = 'shipped';
-- Просмотр существующих привязок
SHOW SESSION BINDINGS;
-- Удалить привязку
DROP SESSION BINDING FOR
SELECT * FROM orders WHERE status = 'shipped';
Стратегии распределённых индексов
Проектирование индексов в распределённых базах данных существенно отличается от MySQL на одном сервере и требует учёта стоимости меж-Region запросов и риска горячих точек.
Принципы проектирования индексов
- Уменьшить сканирование Region: Префикс индекса должен быть рассеян, чтобы избежать концентрации в нескольких Region
- Контролировать количество индексов: Каждый индекс увеличивает накладные расходы на запись и хранение
- Предпочитать составные индексы: Уменьшить поиск в таблице, один составной индекс заменяет несколько одноколоночных
- Избегать слишком широких индексов: Общая ширина столбцов индекса должна быть < 200 байт
- Учитывать размещение индекса: TiDB поддерживает размещение индексов на разных движках хранения
Стратегия размещения индексов (Placement Rules)
-- Разместить индекс холодных данных на HDD-хранилище
ALTER TABLE orders ADD INDEX idx_create_time (create_time)
PLACEMENT POLICY 'cold_storage';
-- Создать политику размещения
CREATE PLACEMENT POLICY cold_storage LEADER_CONSTRAINTS '[+disk=hdd]' FOLLOWER_CONSTRAINTS '[+disk=hdd]';
Невидимые индексы
-- Создать невидимый индекс (не влияет на запросы, обслуживание только при записи)
ALTER TABLE orders ADD INDEX idx_test (customer_id) INVISIBLE;
-- Убедиться, что индекс невидим
SHOW INDEXES FROM orders;
-- Сделать видимым после подтверждения отсутствия влияния на производительность
ALTER TABLE orders ALTER INDEX idx_test VISIBLE;
Диагностика и устранение горячих точек
Горячие точки — наиболее распространённая проблема в распределённых базах данных, вызывающая неравномерную нагрузку на определённые узлы.
Идентификация горячих точек
-- Просмотр распределения Region горячих точек
SELECT STORE_ID, COUNT(*) AS region_count
FROM INFORMATION_SCHEMA.TIKV_REGION_STATUS
GROUP BY STORE_ID
ORDER BY region_count DESC;
-- Просмотр горячих точек записи
SELECT TABLE_NAME, INDEX_NAME, WRITTEN_BYTES, READ_BYTES
FROM INFORMATION_SCHEMA.TIKV_REGION_STATUS
WHERE WRITTEN_BYTES > 1048576
ORDER BY WRITTEN_BYTES DESC
LIMIT 20;
Типичные сценарии горячих точек и решения
Сценарий 1: Горячая точка автоинкрементного ID
-- Проблема: AUTO_INCREMENT приводит к концентрации записей в одной Region
CREATE TABLE logs (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
content TEXT,
created_at TIMESTAMP
);
-- Решение 1: Использовать SHARD_ROW_ID_BITS для рассеивания
CREATE TABLE logs (
id BIGINT AUTO_INCREMENT,
content TEXT,
created_at TIMESTAMP,
PRIMARY KEY (id)
) SHARD_ROW_ID_BITS = 4;
-- Решение 2: Использовать временную метку как префикс первичного ключа
CREATE TABLE logs (
created_at TIMESTAMP,
id BIGINT AUTO_INCREMENT,
content TEXT,
PRIMARY KEY (created_at, id)
) SHARD_ROW_ID_BITS = 4;
Сценарий 2: Горячая точка индекса
-- Проблема: Записи в индексе времени концентрируются в конечной Region
ALTER TABLE orders ADD INDEX idx_created (created_at);
-- Решение: Использовать SHARD_ROW_ID_BITS + PRE_SPLIT_REGIONS
CREATE TABLE orders (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
order_no VARCHAR(64),
created_at TIMESTAMP,
amount DECIMAL(10,2)
) SHARD_ROW_ID_BITS = 4
PRE_SPLIT_REGIONS = 4;
Сценарий 3: Полная горячая точка малой таблицы
-- Проблема: Данные малой таблицы в одной Region, горячая точка чтения при высокой конкурентности
-- Решение: Использовать Follower Read для распределения нагрузки чтения
SET @@tidb_replica_read = 'leader-and-follower';
-- Или включить на уровне сессии
SET SESSION tidb_replica_read = 'follower';
Оптимизация планирования PD
# Просмотр текущей конфигурации планирования
tiup ctl:v8.5.1 pd -u http://10.0.1.1:2379 config show all
# Настройка параметров планирования горячих точек
tiup ctl:v8.5.1 pd -u http://10.0.1.1:2379 config set hot-region-schedule-limit 8
tiup ctl:v8.5.1 pd -u http://10.0.1.1:2379 config set balance-hot-region-schedule-limit 4
# Включить Region Merge для уменьшения пустых Region
tiup ctl:v8.5.1 pd -u http://10.0.0.1:2379 config set enable-merge-region true
Аналитика в реальном времени TiFlash на практике
TiFlash — столбцовый движок хранения TiDB, позволяющий выполнять OLAP-аналитику в реальном времени без ETL.
Включение синхронизации TiFlash
-- Включить синхронизацию TiFlash для всей базы данных
ALTER DATABASE orders_db SET TIFLASH REPLICA 2;
-- Включить синхронизацию TiFlash для одной таблицы (2 реплики)
ALTER TABLE orders SET TIFLASH REPLICA 2;
-- Проверить прогресс синхронизации
SELECT * FROM INFORMATION_SCHEMA.TIFLASH_REPLICA_STATUS;
-- Синхронизировать определённые столбцы в TiFlash (уменьшить накладные расходы)
ALTER TABLE orders SET TIFLASH REPLICA 1
INCLUDE (order_id, customer_id, amount, order_date);
Запросы в режиме MPP
-- Принудительно использовать движок MPP TiFlash
SET @@tidb_isolation_read_engines = 'tiflash';
SET @@tidb_enforce_mpp = 1;
-- Аналитика продаж в реальном времени
SELECT
DATE(order_date) AS dt,
p.category,
COUNT(*) AS order_count,
SUM(oi.quantity * oi.unit_price) AS revenue,
AVG(oi.quantity * oi.unit_price) AS avg_order_value
FROM orders o
JOIN order_items oi ON o.order_id = oi.order_id
JOIN products p ON oi.product_id = p.product_id
WHERE o.order_date >= '2026-01-01'
GROUP BY DATE(order_date), p.category
ORDER BY dt DESC, revenue DESC;
-- Восстановить выбор движка по умолчанию
SET @@tidb_isolation_read_engines = 'tidb,tikv,tiflash';
SET @@tidb_enforce_mpp = 0;
Интеллектуальная маршрутизация HTAP
-- TiDB автоматически маршрутизирует: малые запросы к TiKV, большие к TiFlash
-- Ручная настройка не требуется, оптимизатор решает автоматически
-- Проверить, какой движок фактически использует запрос
EXPLAIN ANALYZE SELECT COUNT(*), SUM(amount)
FROM orders WHERE order_date >= '2026-01-01';
-- Наблюдать, содержит ли оператор информацию о tiflash
Резервное копирование и аварийное восстановление (BR)
BR (Backup & Restore) — встроенный инструмент распределённого резервного копирования и восстановления TiDB.
Полное резервное копирование и восстановление
# Полное резервное копирование в S3
tiup br:v8.5.1 backup full \
--pd "10.0.1.1:2379" \
--storage "s3://tidb-backup/full-20260611" \
--s3.region "us-east-1" \
--send-credentials-to-tikv true \
--concurrency 4
# Полное восстановление
tiup br:v8.5.1 restore full \
--pd "10.0.1.1:2379" \
--storage "s3://tidb-backup/full-20260611" \
--s3.region "us-east-1"
Инкрементальное резервное копирование
# Инкрементальное резервное копирование (на основе TS последней копии)
tiup br:v8.5.1 backup full \
--pd "10.0.1.1:2379" \
--storage "s3://tidb-backup/incr-20260611" \
--last-backup-ts 450335849738604544
Резервное копирование на уровне базы данных/таблицы
# Резервное копирование на уровне базы данных
tiup br:v8.5.1 backup db \
--db "orders_db" \
--pd "10.0.1.1:2379" \
--storage "s3://tidb-backup/orders-db-20260611"
# Резервное копирование на уровне таблицы
tiup br:v8.5.1 backup table \
--db "orders_db" \
--table "orders" \
--pd "10.0.1.1:2379" \
--storage "s3://tidb-backup/orders-table-20260611"
Восстановление на определённый момент времени (PITR)
# Восстановление на определённый момент времени
tiup br:v8.5.1 restore full \
--pd "10.0.1.1:2379" \
--storage "s3://tidb-backup/full-20260611" \
--restored-ts "2026-06-11T14:30:00+08:00"
💡 Используйте инструмент Хеш-шифрование для проверки контрольных сумм целостности данных резервных копий.
Система мониторинга Grafana
Кластеры TiDB поставляются с полной системой мониторинга Prometheus + Grafana.
Основные дашборды мониторинга
| Дашборд | Ключевые метрики | Рекомендуемый порог тревоги |
|---|---|---|
| TiDB Overview | QPS, соединения, медленные запросы | Медленный запрос > 1с |
| TiKV Details | CPU, IO, количество Region | CPU > 80% |
| PD Details | Задачи планирования, распределение Region | Задержка планирования > 5мин |
| TiFlash Details | Задержка синхронизации, количество задач MPP | Задержка синхронизации > 10с |
| BR | Прогресс резервного копирования, длительность | Ошибка резервного копирования |
| Node Exporter | Диск, память, сеть | Использование диска > 85% |
Детали ключевых метрик
# Ключевые метрики TiDB
tidb_server_query_duration:
description: "Латентность запросов P99"
alert: "> 500мс в течение 5 минут"
tidb_server_slow_query:
description: "Количество медленных запросов"
alert: "> 10/мин"
tikv_grpc_message_duration:
description: "Латентность gRPC-запросов TiKV"
alert: "P99 > 200мс"
tikv_engine_write_bytes:
description: "Пропускная способность записи"
monitoring: "Следить за резкими падениями"
pd_scheduler_balance_region:
description: "Скорость планирования Region"
alert: "Ноль более 10 минут"
tiflash_sync_apply_duration:
description: "Задержка синхронизации данных TiFlash"
alert: "P99 > 10с"
Пользовательские правила тревог
# Пример правила тревоги Prometheus
groups:
- name: tidb_alerts
rules:
- alert: TiDBHighQPS
expr: sum(rate(tidb_server_handle_query_duration_seconds_count[1m])) > 50000
for: 5m
labels:
severity: warning
annotations:
summary: "QPS TiDB слишком высок"
description: "Текущий QPS превышает 50000 в течение 5 минут"
- alert: TiKVHighWriteLag
expr: histogram_quantile(0.99, rate(tikv_grpc_message_duration_seconds_bucket{type="write"}[5m])) > 0.5
for: 3m
labels:
severity: critical
annotations:
summary: "Латентность записи TiKV слишком высока"
description: "Латентность записи P99 превышает 500мс"
Частые ошибки и устранение неполадок
Ошибка 1: Таймаут чтения/записи Region
Error: region is unavailable, wait for a while and retry
Шаги устранения неполадок:
# 1. Проверить статус Region
tiup ctl:v8.5.1 pd -u http://10.0.1.1:2379 region check miss-peer
# 2. Проверить состояние TiKV
tiup ctl:v8.5.1 pd -u http://10.0.1.1:2379 store
# 3. Просмотреть медленные логи
tiup cluster audit tidb-prod --limit 50
Ошибка 2: Конфликт записи
Error: Write conflict, txn start_ts conflicts with another txn
Решение:
-- Настроить параметры повторных попыток транзакции
SET @@tidb_retry_limit = 20;
SET @@tidb_txn_retry_interval = 100; -- миллисекунды
-- Проверить уровень конфликтов
SELECT * FROM INFORMATION_SCHEMA.TIDB_TRX
WHERE state = 'LockRcolliding' LIMIT 10;
Ошибка 3: OOM (нехватка памяти)
Error: Out Of Memory Quota!
Решение:
-- Установить лимит памяти запроса
SET @@tidb_mem_quota_query = 1073741824; -- 1GB
-- Включить управление ресурсами
CREATE RESOURCE GROUP rg_report
RU_PER_SEC = 500
PRIORITY = LOW;
-- Привязать пользователя к группе ресурсов
ALTER USER report_user RESOURCE GROUP rg_report;
Ошибка 4: Задержка синхронизации TiFlash
-- Проверить прогресс синхронизации
SELECT TABLE_ID, REPLICA_COUNT, PROGRESS, AVAILABLE
FROM INFORMATION_SCHEMA.TIFLASH_REPLICA_STATUS;
-- Проверить состояние узлов TiFlash
SELECT * FROM INFORMATION_SCHEMA.TIFLASH_TABLES
WHERE REPLICA_AVAILABLE = 0;
Миграция с MySQL на TiDB
Сравнение решений для миграции
| Решение | Сценарий использования | Время простоя | Сложность |
|---|---|---|---|
| DM полное+инкрементальное | Крупномасштабная миграция | Почти нулевое | Средняя |
| Dumpling + TiDB Lightning | Одноразовая миграция | Часы | Низкая |
| mysqldump + source | Небольшой объём данных | Часы | Низкая |
Использование миграции DM (рекомендуется)
# dm-task.yaml - Конфигурация задачи миграции DM
name: mysql-to-tidb
task-mode: all
target-database:
host: "10.0.2.1"
port: 4000
user: "root"
password: ""
mysql-instances:
- source-id: "mysql-replica-01"
block-allow-list: "bw-rule-1"
block-allow-list:
bw-rule-1:
do-dbs: ["orders_db", "users_db"]
ignore-tables:
- db-name: "orders_db"
tbl-name: "log_*"
# Запустить задачу DM
dmctl start-task dm-task.yaml
# Проверить статус задачи
dmctl query-status mysql-to-tidb
# Проверить целостность данных
dmctl check-task dm-task.yaml
Предмиграционная проверка совместимости
-- Проверить использование хранимых процедур
SELECT ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_TYPE
FROM information_schema.routines
WHERE ROUTINE_SCHEMA NOT IN ('mysql', 'sys');
-- Проверить ограничения внешних ключей
SELECT TABLE_SCHEMA, TABLE_NAME, CONSTRAINT_NAME
FROM information_schema.table_constraints
WHERE CONSTRAINT_TYPE = 'FOREIGN KEY';
-- Проверить триггеры
SELECT TRIGGER_SCHEMA, TRIGGER_NAME, EVENT_OBJECT_TABLE
FROM information_schema.triggers;
-- Проверить столбцы auto-increment
SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, AUTO_INCREMENT
FROM information_schema.columns
WHERE EXTRA LIKE '%auto_increment%';
Тесты производительности
Тест TPCC
# Тестирование производительности OLTP с TPCC
git clone https://github.com/pingcap/go-tpc.git
cd go-tpc
# Подготовка данных
go-tpc tpcc prepare \
--host 10.0.1.1 --port 4000 \
--warehouses 1000 --threads 50
# Запуск теста
go-tpc tpcc run \
--host 10.0.1.1 --port 4000 \
--warehouses 1000 --threads 50 \
--time 600s
# Очистка
go-tpc tpcc cleanup \
--host 10.0.1.1 --port 4000 \
--warehouses 1000
Тест TPC-H (HTAP)
# Тестирование производительности OLAP с TPC-H
go-tpc tpch prepare \
--host 10.0.1.1 --port 4000 \
--scale 100 --threads 10
# Принудительное выполнение в TiFlash
go-tpc tpch run \
--host 10.0.1.1 --port 4000 \
--scale 100 --threads 10 \
--time 300s \
--engine tiflash
Типичная справка по производительности
| Сценарий | Конфигурация узлов | QPS/TPS | Латентность P99 |
|---|---|---|---|
| OLTP (TPCC) | 3×TiDB + 3×TiKV | 15 000 TPS | < 50мс |
| OLAP (TPC-H) | + 2×TiFlash | 22 запроса/5мин | Зависит от запроса |
| Смешанный HTAP | Вышеуказанная конфигурация | TP стабильно + AP 10x | Независимо |
Часто задаваемые вопросы
В1: Подходит ли TiDB для замены шардинга MySQL?
Да, это наиболее типичный сценарий использования TiDB. TiDB обеспечивает прозрачное горизонтальное масштабирование без логики шардинга на уровне приложения, сохраняя при этом совместимость с протоколом MySQL для минимальных затрат на миграцию. Настоятельно рекомендуется, когда одна таблица превышает 50 миллионов строк или операционная сложность шардинга слишком высока.
В2: Какой уровень изоляции транзакций у TiDB?
TiDB по умолчанию использует уровень изоляции RC (Read Committed) (v6.0+), а также поддерживает семантику RR (Repeatable Read). RR TiDB фактически является Snapshot Isolation (SI), которая предотвращает фантомные чтения, но имеет тонкие отличия от RR MySQL в определённых сценариях (например, поведение текущего чтения).
В3: Каков оптимальный масштаб данных для TiDB?
- Одна таблица: От десятков миллионов до десятков миллиардов строк; TiDB рекомендуется при превышении 50 миллионов строк
- Общие данные кластера: Масштаб от TB до PB
- Размер Region: По умолчанию 96 МБ, рекомендуется держаться близко к этому значению
В4: Как выбрать между TiDB и CockroachDB?
| Измерение | TiDB | CockroachDB |
|---|---|---|
| Совместимость SQL | MySQL | PostgreSQL |
| HTAP | Нативная поддержка | Не поддерживается |
| Сообщество | В основном Китай/APAC | Глобальное |
| Облачный сервис | TiDB Cloud | CockroachDB Cloud |
Если ваш стек основан на MySQL и нужен HTAP, выбирайте TiDB; если на PostgreSQL и только OLTP — CockroachDB.
В5: Как работать с большими транзакциями в TiDB?
TiDB по умолчанию ограничивает 100 МБ и 5000 строк на транзакцию. Решения для больших транзакций:
-- Настроить лимиты транзакции (не рекомендуется устанавливать слишком высоко)
SET @@tidb_txn_entry_size_limit = 536870912; -- 512MB
SET @@tidb_txn_total_size_limit = 1073741824; -- 1GB
-- Рекомендуется: пакетные фиксации
-- Разбивать большие транзакции на маленькие в приложении, 1000-5000 строк на пакет
В6: Какая лицензия у TiDB?
TiDB Server, TiKV и PD используют полностью открытую лицензию Apache 2.0. TiFlash также является открытым начиная с v8.0+. TiDB Cloud (Serverless/Dedicated) — коммерческий сервис.
Итоги
TiDB стала эталонным продуктом в области распределённых баз данных в 2026 году. Её совместимость с MySQL, возможности HTAP и облачная архитектура делают её идеальным выбором для модернизации корпоративных баз данных. Ключевые выводы:
- Архитектура: Четыре компонента TiDB/TiKV/PD/TiFlash, разделение вычислений и хранения
- Развёртывание: Управление TiUP в один клик, требования к SSD и сети для продакшена
- Настройка SQL: Использовать EXPLAIN ANALYZE, освоить SPM для привязки планов
- Проектирование индексов: Учитывать распределённые особенности, избегать индексов горячих точек
- Управление горячими точками: Рассеивание SHARD_ROW_ID_BITS, распределение Follower Read
- HTAP: Столбцовый TiFlash + движок MPP для аналитики в реальном времени
- Аварийное восстановление: BR поддерживает стратегии полного/инкрементального/PITR восстановления
- Мониторинг: Полная система Grafana, ключевые метрики нельзя игнорировать
- Миграция: Инкрементальная миграция DM обеспечивает переключение практически без простоя
Попробуйте эти локальные браузерные инструменты — регистрация не требуется →