Use Physical Import Mode
This document introduces how to use the physical import mode in TiDB Lightning, including writing the configuration file and tuning performance.
Configure and use the physical import mode
You can use the following configuration file to execute data import using the physical import mode:
[lightning]
# log
level = "info"
file = "tidb-lightning.log"
max-size = 128 # MB
max-days = 28
max-backups = 14
# Checks the cluster minimum requirements before start.
check-requirements = true
[mydumper]
# The local data source directory or the external storage URL.
data-source-dir = "/data/my_database"
[tikv-importer]
# Import mode. "local" means using the physical import mode.
backend = "local"
# The method to resolve the conflicting data.
duplicate-resolution = 'remove'
# The directory of local KV sorting.
sorted-kv-dir = "./some-dir"
[tidb]
# The information of the target cluster. The address of any tidb-server from the cluster.
host = "172.16.31.1"
port = 4000
user = "root"
# Configure the password to connect to TiDB. Either plaintext or Base64 encoded.
password = ""
# Required. Table schema information is fetched from TiDB via this status-port.
status-port = 10080
# Required. The address of any pd-server from the cluster.
pd-addr = "172.16.31.4:2379"
# tidb-lightning imports the TiDB library, and generates some logs.
# Set the log level of the TiDB library.
log-level = "error"
[post-restore]
# Specifies whether to perform `ADMIN CHECKSUM TABLE <table>` for each table to verify data integrity after importing.
# The following options are available:
# - "required" (default): Perform admin checksum after importing. If checksum fails, TiDB Lightning will exit with failure.
# - "optional": Perform admin checksum. If checksum fails, TiDB Lightning will report a WARN log but ignore any error.
# - "off": Do not perform checksum after importing.
# Note that since v4.0.8, the default value has changed from "true" to "required".
#
# Note:
# 1. Checksum failure usually means import exception (data loss or data inconsistency), so it is recommended to always enable Checksum.
# 2. For backward compatibility, bool values "true" and "false" are also allowed for this field.
# "true" is equivalent to "required" and "false" is equivalent to "off".
checksum = "required"
# Specifies whether to perform `ANALYZE TABLE <table>` for each table after checksum is done.
# Options available for this field are the same as `checksum`. However, the default value for this field is "optional".
analyze = "optional"
For the complete configuration file, refer to the configuration file and command line parameters.
Conflict detection
Conflicting data refers to two or more records with the same PK/UK column data. When the data source contains conflicting data, the actual number of rows in the table is different from the total number of rows returned by the query using unique index.
TiDB Lightning offers three strategies for detecting conflicting data:
record
: only records conflicting records to thelightning_task_info.conflict_error_v1
table on the target TiDB. Note that the required version of the target TiKV is v5.2.0 or later versions; otherwise, it falls back to 'none'.remove
(recommended): records all conflicting records, like therecord
strategy. But it removes all conflicting records from the target table to ensure a consistent state in the target TiDB.none
: does not detect duplicate records.none
has the best performance in the three strategies, but might lead to inconsistent data in the target TiDB.
Before v5.3, Lightning does not support conflict detection. If there is conflicting data, the import process fails at the checksum step. When conflict detection is enabled, regardless of the record
or remove
strategy, if there is conflicting data, Lightning skips the checksum step (because it always fails).
Suppose an order_line
table has the following schema:
CREATE TABLE IF NOT EXISTS `order_line` (
`ol_o_id` int(11) NOT NULL,
`ol_d_id` int(11) NOT NULL,
`ol_w_id` int(11) NOT NULL,
`ol_number` int(11) NOT NULL,
`ol_i_id` int(11) NOT NULL,
`ol_supply_w_id` int(11) DEFAULT NULL,
`ol_delivery_d` datetime DEFAULT NULL,
`ol_quantity` int(11) DEFAULT NULL,
`ol_amount` decimal(6,2) DEFAULT NULL,
`ol_dist_info` char(24) DEFAULT NULL,
PRIMARY KEY (`ol_w_id`,`ol_d_id`,`ol_o_id`,`ol_number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
If Lightning detects conflicting data during the import, you can query the lightning_task_info.conflict_error_v1
table as follows:
mysql> select table_name,index_name,key_data,row_data from conflict_error_v1 limit 10;
+---------------------+------------+----------+-----------------------------------------------------------------------------+
| table_name | index_name | key_data | row_data |
+---------------------+------------+----------+-----------------------------------------------------------------------------+
| `tpcc`.`order_line` | PRIMARY | 21829216 | (2677, 10, 10, 11, 75656, 10, NULL, 5, 5831.97, "HT5DN3EVb6kWTd4L37bsbogj") |
| `tpcc`.`order_line` | PRIMARY | 49931672 | (2677, 10, 10, 11, 75656, 10, NULL, 5, 5831.97, "HT5DN3EVb6kWTd4L37bsbogj") |
| `tpcc`.`order_line` | PRIMARY | 21829217 | (2677, 10, 10, 12, 76007, 10, NULL, 5, 9644.36, "bHuVoRfidQ0q2rJ6ZC9Hd12E") |
| `tpcc`.`order_line` | PRIMARY | 49931673 | (2677, 10, 10, 12, 76007, 10, NULL, 5, 9644.36, "bHuVoRfidQ0q2rJ6ZC9Hd12E") |
| `tpcc`.`order_line` | PRIMARY | 21829218 | (2677, 10, 10, 13, 85618, 10, NULL, 5, 7427.98, "t3rsesgi9rVAKi9tf6an5Rpv") |
| `tpcc`.`order_line` | PRIMARY | 49931674 | (2677, 10, 10, 13, 85618, 10, NULL, 5, 7427.98, "t3rsesgi9rVAKi9tf6an5Rpv") |
| `tpcc`.`order_line` | PRIMARY | 21829219 | (2677, 10, 10, 14, 15873, 10, NULL, 5, 133.21, "z1vH0e31tQydJGhfNYNa4ScD") |
| `tpcc`.`order_line` | PRIMARY | 49931675 | (2677, 10, 10, 14, 15873, 10, NULL, 5, 133.21, "z1vH0e31tQydJGhfNYNa4ScD") |
| `tpcc`.`order_line` | PRIMARY | 21829220 | (2678, 10, 10, 1, 44644, 10, NULL, 5, 8463.76, "TWKJBt5iJA4eF7FIVxnugNmz") |
| `tpcc`.`order_line` | PRIMARY | 49931676 | (2678, 10, 10, 1, 44644, 10, NULL, 5, 8463.76, "TWKJBt5iJA4eF7FIVxnugNmz") |
+---------------------+------------+----------------------------------------------------------------------------------------+
10 rows in set (0.14 sec)
You can manually identify the records that need to be retained and insert these records into the table.
Performance tuning
The most direct and effective ways to improve import performance of the physical import mode are as follows:
- Upgrade the hardware of the node where Lightning is deployed, especially the CPU and the storage device of
sorted-key-dir
. - Use the parallel import feature to achieve horizontal scaling.
TiDB Lightning provides some concurrency-related configurations to affect import performance in the physical import mode. However, from long-term experience, it is recommended to keep the following four configuration items in the default value. Adjusting the four configuration items does not bring significant performance boost.
[lightning]
# The maximum concurrency of engine files.
# Each table is split into one "index engine" to store indices, and multiple
# "data engines" to store row data. These settings control the maximum
# concurrent number for each type of engines.
# The two settings controls the maximum concurrency of the two engine files.
index-concurrency = 2
table-concurrency = 6
# The concurrency of data. The default value is the number of logical CPUs.
region-concurrency =
# The maximum concurrency of I/O. When the concurrency is too high, the disk
# cache may be frequently refreshed, causing the cache miss and read speed
# to slow down. For different storage mediums, this parameter may need to be
# adjusted to achieve the best performance.
io-concurrency = 5
During the import, each table is split into one "index engine" to store indices, and multiple "data engines" to store row data.
index-concurrency
controls the maximum concurrency of the index engine. When you adjust index-concurrency
, make sure that index-concurrency * the number of source files of each table > region-concurrency
to ensure that the CPU is fully utilized. The ratio is usually between 1.5 ~ 2. Do not set index-concurrency
too high and not lower than 2 (default). Too high index-concurrency
causes too many pipelines to be built, which causes the index-engine import stage to pile up.
The same goes for table-concurrency
. Make sure that table-concurrency * the number of source files of each table > region-concurrency
to ensure that the CPU is fully utilized. A recommended value is around region-concurrency * 4 / the number of source files of each table
and not lower than 4.
If the table is large, Lightning will split the table into multiple batches of 100 GiB. The concurrency is controlled by table-concurrency
.
index-concurrency
and table-concurrency
has little effect on the import speed. You can leave them in the default value.
io-concurrency
controls the concurrency of file read. The default value is 5. At any given time, only 5 handles are performing read operations. Because the file read speed is usually not a bottleneck, you can leave this configuration in the default value.
After the file data is read, Lightning needs to do some post-processing, such as encoding and sorting the data locally. The concurrency of these operations is controlled by region-concurrency
. The default value is the number of CPU cores. You can leave this configuration in the default value. It is recommended to deploy Lightning on a separate server from other components. If you must deploy Lightning together with other components, you need to lower the value of region-concurrency
according to the load.
The num-threads
configuration of TiKV can also affect the performance. For new clusters, it is recommended to set num-threads
to the number of CPU cores.