Todos os produtos
Search
Central de documentação

Data Transmission Service:White paper de desempenho do DTS

Última atualização: Sep 22, 2026

Benchmarks de desempenho para a sincronização de dados unidirecional do DTS entre instâncias do ApsaraDB RDS for MySQL, abrangendo sincronização completa, sincronização incremental, atualizações quentes e operações DDL.

Ambiente de teste

Bancos de dados de origem e destino

Nota

A expansão automática de armazenamento está ativada para as instâncias do ApsaraDB RDS for MySQL neste teste.

Banco de dados

Região

Tipo

Versão

Especificação

CPU

Memória

Banco de dados de origem

China (Hangzhou)

Instâncias Standard do ApsaraDB RDS for MySQL com a RDS High-availability Edition

8.0

mysql.x4.xlarge.2c (dedicated)

8

32 GB

Banco de dados de destino

Cliente

Nota

Adicione o endereço IP da instância ECS a ser usada como cliente às listas de permissões de IP das instâncias do ApsaraDB RDS for MySQL. Para mais informações, consulte Configure an IP address whitelist.

Tipo

Região

Tipo de rede

SO

Especificação

vCPU

Memória

IP público

Instância ECS

China (Hangzhou)

VPC

Nota

A instância ECS usa a mesma VPC e o mesmo vSwitch que as instâncias do ApsaraDB RDS for MySQL.

CentOS 7.9 64 bits

ecs.c7.8xlarge (tipo otimizado para computação c7)

32

64

Sim

Ferramentas de teste

Visão geral

Ferramenta

Versão

Descrição

SysBench

1.0.20

Uma ferramenta de benchmark modular e multithread para testes de desempenho de banco de dados em várias plataformas.

BenchmarkSQL

5.0 (baseado em Java 8)

Uma ferramenta de benchmark OLTP de código aberto para avaliação de desempenho e testes de estresse de banco de dados.

Instalação

Instalar o Sysbench

  1. Instale o Sysbench na instância ECS.

    # Install the dependency library of Sysbench.
    yum -y install make automake libtool pkgconfig libaio-devel
    yum -y install mariadb-devel openssl-devel
    
    # Download the source code of Sysbench.
    wget "https://codeload.github.com/akopytov/sysbench/zip/refs/tags/1.0.20" -O sysbench-1.0.20.zip
    
    # Install the Unzip utility.
    yum -y install unzip
    
    # Decompress the source code.
    unzip sysbench-1.0.20.zip
    
    # Compile the source code.
    cd sysbench-1.0.20
    ./autogen.sh
    ./configure
    sed -i 's/MYSQL_OPT_COMPRESSION_ALGORITHMS/MYSQL_OPT_COMPRESS/g' ./src/drivers/mysql/drv_mysql.c
    make -j
    
    # Install Sysbench.
    make install
  2. Prepare os scripts Lua: dm_large_table_write_only.lua (gravação em tabelas grandes), dm_hot_update_only.lua (atualizações de dados quentes) e dm_ddl_only.lua (sincronização DDL).

    Scripts Lua

    dm_large_table_write_only.lua

    #!/usr/bin/env sysbench
    -- Copyright (C) 2006-2017 Alexey Kopytov <akopytov@gmail.com>
    
    -- This program is free software; you can redistribute it and/or modify
    -- it under the terms of the GNU General Public License as published by
    -- the Free Software Foundation; either version 2 of the License, or
    -- (at your option) any later version.
    
    -- This program is distributed in the hope that it will be useful,
    -- but WITHOUT ANY WARRANTY; without even the implied warranty of
    -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    -- GNU General Public License for more details.
    
    -- You should have received a copy of the GNU General Public License
    -- along with this program; if not, write to the Free Software
    -- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
    
    -- ----------------------------------------------------------------------
    -- Large table benchmark for data migration
    -- ----------------------------------------------------------------------
    require("oltp_common")
    
    local function get_table_num()
       return sysbench.rand.uniform(1, sysbench.opt.tables)
    end
    
    local function get_id()
       return sysbench.rand.default(1, sysbench.opt.table_size)
    end
    
    -- Generate large string template, size 1024 * 50
    local function get_large_templete()
       local large_temp = ""
       for i=1,1024 do
          large_temp = large_temp .. "#########-#########-#########-#########-#########-"
       end
       return large_temp
    end
    
    -- Generate large string template, size 1024 * 50
    local large_template = get_large_templete()
    
    -- Generate large value, size 1024 * 50
    local function get_large_value()
       return sysbench.rand.string(large_template)
    end
    
    function large_create_table(drv, con, table_num)
       if drv:name() == "mysql"
       then
          print(string.format("Creating mysql table 'sbtest%d'...", table_num))
       else
          error("Unsupported database driver:" .. drv:name())
       end
    
       query = string.format([[
    CREATE TABLE sbtest%d(
      id int not null auto_increment,
      k INTEGER DEFAULT '0' NOT NULL,
      c longtext,
      pad longtext,
      primary key (id)
    ) ]],table_num)
    
       con:query(query)
    
       if (sysbench.opt.table_size > 0) then
          print(string.format("Inserting %d records into 'sbtest%d'",
                              sysbench.opt.table_size, table_num))
       end
       query = "INSERT INTO sbtest" .. table_num .. "(k, c, pad) VALUES"
       con:bulk_insert_init(query)
    
       for i = 1, sysbench.opt.table_size do
    
          local large_value = get_large_value()
          query = string.format("(%d, '%s', '%s')",
                                   sysbench.rand.default(1, sysbench.opt.table_size),
                                   large_value, large_value)
          con:bulk_insert_next(query)
       end
    
       con:bulk_insert_done()
    
       if sysbench.opt.create_secondary then
          print(string.format("Creating a secondary index on 'sbtest%d'...",
                              table_num))
          con:query(string.format("CREATE INDEX k_%d ON sbtest%d(k)",
                                  table_num, table_num))
       end
    end
    
    function execute_delete_inserts_large()
       local tnum = get_table_num()
    
       for i = 1, sysbench.opt.delete_inserts do
          local id = get_id()
          local k = get_id()
    
          param[tnum].deletes[1]:set(id)
    
          param[tnum].inserts[1]:set(id)
          param[tnum].inserts[2]:set(k)
          param[tnum].inserts[3]:set_rand_str(large_template)
          param[tnum].inserts[4]:set_rand_str(large_template)
    
          stmt[tnum].deletes:execute()
          stmt[tnum].inserts:execute()
       end
    end
    
    function execute_non_index_updates_large()
       local tnum = get_table_num()
    
       for i = 1, sysbench.opt.non_index_updates do
          param[tnum].non_index_updates[1]:set_rand_str(large_template)
          param[tnum].non_index_updates[2]:set(get_id())
    
          stmt[tnum].non_index_updates:execute()
       end
    end
    
    local t = sysbench.sql.type
    local stmt_defs = {
       point_selects = {
          "SELECT c FROM sbtest%u WHERE id=?",
          t.INT},
       simple_ranges = {
          "SELECT c FROM sbtest%u WHERE id BETWEEN ? AND ?",
          t.INT, t.INT},
       sum_ranges = {
          "SELECT SUM(k) FROM sbtest%u WHERE id BETWEEN ? AND ?",
           t.INT, t.INT},
       order_ranges = {
          "SELECT c FROM sbtest%u WHERE id BETWEEN ? AND ? ORDER BY c",
           t.INT, t.INT},
       distinct_ranges = {
          "SELECT DISTINCT c FROM sbtest%u WHERE id BETWEEN ? AND ? ORDER BY c",
          t.INT, t.INT},
       index_updates = {
          "UPDATE sbtest%u SET k=k+1 WHERE id=?",
          t.INT},
       non_index_updates = {
          "UPDATE sbtest%u SET c=? WHERE id=?",
          {t.CHAR, 51200}, t.INT},
       deletes = {
          "DELETE FROM sbtest%u WHERE id=?",
          t.INT},
       inserts = {
          "INSERT INTO sbtest%u (id, k, c, pad) VALUES (?, ?, ?, ?)",
          t.INT, t.INT, {t.CHAR, 51200}, {t.CHAR, 51200}},
    }
    
    function prepare_for_each_large_table(key)
       for t = 1, sysbench.opt.tables do
          stmt[t][key] = con:prepare(string.format(stmt_defs[key][1], t))
    
          local nparam = #stmt_defs[key] - 1
    
          if nparam > 0 then
             param[t][key] = {}
          end
    
          for p = 1, nparam do
             local btype = stmt_defs[key][p+1]
             local len
    
             if type(btype) == "table" then
                len = btype[2]
                btype = btype[1]
             end
             if btype == sysbench.sql.type.VARCHAR or
                btype == sysbench.sql.type.CHAR then
                   param[t][key][p] = stmt[t][key]:bind_create(btype, len)
             else
                param[t][key][p] = stmt[t][key]:bind_create(btype)
             end
          end
    
          if nparam > 0 then
             stmt[t][key]:bind_param(unpack(param[t][key]))
          end
       end
    end
    
    -- Overwrite oltp_common create_table function  
    create_table = large_create_table
    
    -- Overwrite oltp_common prepare_for_each_table function  
    prepare_for_each_table = prepare_for_each_large_table
    
    -- Overwrite oltp_common execute_delete_inserts function  
    execute_delete_inserts = execute_delete_inserts_large
    
    -- Overwrite oltp_common execute_non_index_updates function  
    execute_non_index_updates = execute_non_index_updates_large
    
    function prepare_statements()
       if not sysbench.opt.skip_trx then
          prepare_begin()
          prepare_commit()
       end
    
       prepare_index_updates()
       prepare_non_index_updates()
       prepare_delete_inserts()
    end
    
    function event()
       if not sysbench.opt.skip_trx then
          begin()
       end
    
       execute_index_updates()
       execute_non_index_updates()
       execute_delete_inserts()
    
       if not sysbench.opt.skip_trx then
          commit()
       end
    end

    dm_hot_update_only.lua

    #!/usr/bin/env sysbench
    -- Copyright (C) 2006-2017 Alexey Kopytov <akopytov@gmail.com>
    
    -- This program is free software; you can redistribute it and/or modify
    -- it under the terms of the GNU General Public License as published by
    -- the Free Software Foundation; either version 2 of the License, or
    -- (at your option) any later version.
    
    -- This program is distributed in the hope that it will be useful,
    -- but WITHOUT ANY WARRANTY; without even the implied warranty of
    -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    -- GNU General Public License for more details.
    
    -- You should have received a copy of the GNU General Public License
    -- along with this program; if not, write to the Free Software
    -- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
    
    -- ----------------------------------------------------------------------
    -- Hot update benchmark for data migration
    -- ----------------------------------------------------------------------
    require("oltp_common")
    
    function create_hot_update_table(drv, con, table_num)
       local query
       if table_num < 3
       then
          query = string.format([[
             CREATE TABLE IF NOT EXISTS sbtest%d(
               id int not null auto_increment,
               k INTEGER DEFAULT '0' NOT NULL,
               primary key (id)
             )]], table_num)
                con:query(query)
          query = string.format([[
             CREATE PROCEDURE generate_hot_update_sbtest%d (IN id_val int(11), IN update_count int(11) )
             BEGIN
               DECLARE i int default 1;
               INSERT IGNORE INTO sbtest%d (id,k) values(id_val,id_val); 
               WHILE i<=update_count DO
                   UPDATE sbtest%d SET k=k+1 where id=id_val; 
                   SET i = i + 1;
               END WHILE;
             END]], table_num, table_num, table_num)
                con:query(query)
       else
          print(string.format("Ignore create table sbtest%d",table_num))
       end
    end
    
    -- Overwrite oltp_common create_table function  
    create_table = create_hot_update_table
    
    function prepare_statements()
    end
    
    local function get_table_num()
       return sysbench.rand.uniform(1, 2)
    end
    
    local function get_id()
       return sysbench.rand.default(1, 10)
    end
    
    function event()
       local table_id
       local query
       local id_val
    
       id_val = get_id()
    
       table_id = get_table_num()
       query = string.format("CALL generate_hot_update_sbtest%d(%d,10)",table_id, id_val)
       con:query(query)
    end
    

    dm_ddl_only.lua

    #!/usr/bin/env sysbench
    -- Copyright (C) 2006-2017 Alexey Kopytov <akopytov@gmail.com>
    
    -- This program is free software; you can redistribute it and/or modify
    -- it under the terms of the GNU General Public License as published by
    -- the Free Software Foundation; either version 2 of the License, or
    -- (at your option) any later version.
    
    -- This program is distributed in the hope that it will be useful,
    -- but WITHOUT ANY WARRANTY; without even the implied warranty of
    -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    -- GNU General Public License for more details.
    
    -- You should have received a copy of the GNU General Public License
    -- along with this program; if not, write to the Free Software
    -- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
    
    -- ----------------------------------------------------------------------
    -- DDL benchmark for data migration
    -- ----------------------------------------------------------------------
    require("oltp_common")
    
    function empty_create_table(drv, con, table_num)
       print(string.format("Ignore create table sbtest%d",table_num))
    end
    
    create_table = empty_create_table
    
    function prepare_statements()
    end
    
    local function get_table_num()
       return sysbench.rand.uniform(1, sysbench.opt.tables)
    end
    
    function event()
       local table_id
       local create_query
       local drop_query
    
       table_id = get_table_num()
       create_query = string.format([[
    CREATE TABLE IF NOT EXISTS sbtest%d(
      id int not null auto_increment,
      k INTEGER DEFAULT '0' NOT NULL,
      c CHAR(120) DEFAULT '' NOT NULL,
      pad CHAR(60) DEFAULT '' NOT NULL,
      primary key (id)
    )]],table_id)
       con:query(create_query)
    
       drop_query = string.format("DROP TABLE IF EXISTS sbtest%d",table_id)
       con:query(drop_query)
    end
    
  3. Copie os scripts Lua para o diretório de scripts do Sysbench /usr/local/share/sysbench/ na instância ECS.

    # Copy the script for the scenarios where large tables are used.
    cp dm_large_table_write_only.lua /usr/local/share/sysbench/
    # Copy the script for the hot data update scenario.
    cp dm_hot_update_only.lua /usr/local/share/sysbench/
    # Copy the script for the DDL synchronization scenario.
    cp dm_ddl_only.lua /usr/local/share/sysbench/

Instalar o BenchmarkSQL

# Install Apache Ant.
yum -y install ant

# Download the source code of BenchmarkSQL.
wget "https://github.com/jackysp/benchmarksql/archive/refs/heads/5.0-mysql-support-opt-2.1.zip" -O benchmarksql-5.0-mysql-support-opt-2.1.zip

# Decompress the source code.
unzip benchmarksql-5.0-mysql-support-opt-2.1.zip

# Build the source code.
cd benchmarksql-5.0-mysql-support-opt-2.1
ant

Métodos de teste

Visão geral

Os métodos a seguir testam o desempenho da sincronização de dados do DTS sob diferentes aspectos.

Ferramenta de teste

Modelo ou script de teste

Recursos testados

Sysbench

oltp_write_only

Sincronização de dados completa e incremental

dm_large_table_write_only

Sincronização de dados completa e incremental

dm_hot_update_only

Sincronização de dados incremental

dm_ddl_only

Sincronização de dados incremental

BenchmarkSQL

TPC-C

Sincronização de dados completa e incremental

Procedimento

oltp_write_only

  1. Prepare os dados básicos.

    Na instância ECS, use o Sysbench para criar 10 tabelas na instância do ApsaraDB RDS for MySQL de origem, com 10 milhões de linhas cada.

    Nota

    Execute o seguinte comando no diretório /usr/local/share/sysbench/:

    sysbench --db-driver=mysql \
    --mysql-host={HOST} \
    --mysql-port={PORT} \
    --mysql-user= \
    --mysql-password= \
    --mysql-db={DATABASE} \
    --threads=64 --table_size=10000000 --tables=10  oltp_write_only.lua \
    prepare

    Parâmetro

    Descrição

    Observações

    Referências

    --mysql-host

    O endpoint interno da instância do ApsaraDB RDS for MySQL.

    Substitua {HOST} pelo endpoint interno da instância do ApsaraDB RDS for MySQL.

    Manage instance endpoints and ports

    --mysql-port

    A porta interna da instância do ApsaraDB RDS for MySQL.

    Substitua {PORT} pelo número da porta interna da instância do ApsaraDB RDS for MySQL.

    --mysql-user

    O nome de usuário da conta do banco de dados.

    Certifique-se de que a conta tenha as permissões necessárias.

    Create an account

    --mysql-password

    A senha da conta do banco de dados.

    --mysql-db

    O banco de dados para o teste de estresse.

    Crie o banco de dados com antecedência e substitua {DATABASE} pelo seu nome.

    Manage databases

    --tables

    Número de tabelas.

    Defina como 10 neste exemplo.

    N/A

    --table_size

    Número de linhas por tabela.

    Defina como 10000000 neste exemplo.

  2. Crie uma tarefa de sincronização de dados do DTS.

    Selecione Schema Synchronization e Full Data Synchronization para o parâmetro Synchronization Types. Para mais informações, consulte One-way data synchronization between ApsaraDB RDS for MySQL instances.

  3. Aguarde a conclusão da sincronização completa de dados.

  4. Execute testes de estresse na sincronização de dados incremental.

    Use o modelo oltp_write_only na instância ECS para executar testes de estresse no banco de dados de origem e gerar logs binários.

    Nota

    A proporção das diferentes operações DML é INSERT:UPDATE:DELETE = 1:2:1.

    sysbench --db-driver=mysql \
    --mysql-host={HOST} \
    --mysql-port={PORT} \
    --mysql-user= \
    --mysql-password= \
    --mysql-db={DATABASE} \
    --threads=64 --table_size=1000000 --tables=10 --time=600 oltp_write_only.lua \
    run

    Parâmetro

    Descrição

    Observações

    --time

    Duração do teste de estresse em segundos.

    Defina como 600 neste exemplo.

    --threads

    Número de threads concorrentes.

    Defina como 64 neste exemplo.

  5. Na página Performance Monitoring da tarefa de sincronização de dados do DTS, visualize o desempenho da tarefa.

    Para mais informações, consulte Monitor task performance.

dm_large_table_write_only

  1. Prepare os dados básicos.

    Na instância ECS, use o Sysbench para criar 10 tabelas na instância do ApsaraDB RDS for MySQL de origem, com 10.000 linhas cada.

    Nota

    Execute o seguinte comando no diretório /usr/local/share/sysbench/:

    sysbench --db-driver=mysql \
    --mysql-host={HOST} \
    --mysql-port={PORT} \
    --mysql-user= \
    --mysql-password= \
    --mysql-db={DATABASE} \
    --threads=64 --table_size=10000 --tables=10 dm_large_table_write_only.lua \
    prepare

    Parâmetro

    Descrição

    Observações

    Referências

    --mysql-host

    O endpoint interno da instância do ApsaraDB RDS for MySQL.

    Substitua {HOST} pelo endpoint interno da instância do ApsaraDB RDS for MySQL.

    Manage instance endpoints and ports

    --mysql-port

    A porta interna da instância do ApsaraDB RDS for MySQL.

    Substitua {PORT} pelo número da porta interna da instância do ApsaraDB RDS for MySQL.

    --mysql-user

    O nome de usuário da conta do banco de dados.

    Certifique-se de que a conta tenha as permissões necessárias.

    Create an account

    --mysql-password

    A senha da conta do banco de dados.

    --mysql-db

    O banco de dados para o teste de estresse.

    Crie o banco de dados com antecedência e substitua {DATABASE} pelo seu nome.

    Manage databases

    --tables

    Número de tabelas.

    Defina como 10 neste exemplo.

    N/A

    --table_size

    Número de linhas por tabela.

    Defina como 10000 neste exemplo.

  2. Crie uma tarefa de sincronização de dados do DTS.

    Selecione Schema Synchronization e Full Data Synchronization para o parâmetro Synchronization Types. Para mais informações, consulte One-way data synchronization between ApsaraDB RDS for MySQL instances.

  3. Aguarde a conclusão da sincronização completa de dados.

  4. Execute testes de estresse na sincronização de dados incremental.

    Use o modelo dm_large_table_write_only na instância ECS para executar testes de estresse no banco de dados de origem e gerar logs binários.

    sysbench --db-driver=mysql \
    --mysql-host={HOST} \
    --mysql-port={PORT} \
    --mysql-user= \
    --mysql-password= \
    --mysql-db={DATABASE} \
    --threads=64 --table_size=10000 --tables=10 --time=600 dm_large_table_write_only.lua \
    run

    Parâmetro

    Descrição

    Observações

    --time

    Duração do teste de estresse em segundos.

    Defina como 600 neste exemplo.

    --threads

    Número de threads concorrentes.

    Defina como 64 neste exemplo.

  5. Na página Performance Monitoring da tarefa de sincronização de dados do DTS, visualize o desempenho da tarefa.

    Para mais informações, consulte Monitor task performance.

dm_hot_update_only

  1. Crie uma tarefa de sincronização de dados do DTS.

    Não selecione Full Data Synchronization para o parâmetro Synchronization Types. Se o banco de dados e as tabelas correspondentes não estiverem criados na instância do ApsaraDB RDS for MySQL de destino, selecione Schema Synchronization. Para mais informações, consulte One-way data synchronization between ApsaraDB RDS for MySQL instances.

  2. Inicialize os dados nas tabelas que serão submetidas a testes de estresse.

    sysbench --db-driver=mysql \
    --mysql-host={HOST} \
    --mysql-port={PORT} \
    --mysql-user= \
    --mysql-password= \
    --mysql-db={DATABASE} \
    --threads=64 --tables=2 dm_hot_update_only.lua \
    prepare

    Parâmetro

    Descrição

    Observações

    Referências

    --mysql-host

    O endpoint interno da instância do ApsaraDB RDS for MySQL.

    Substitua {HOST} pelo endpoint interno da instância do ApsaraDB RDS for MySQL.

    Manage instance endpoints and ports

    --mysql-port

    A porta interna da instância do ApsaraDB RDS for MySQL.

    Substitua {PORT} pelo número da porta interna da instância do ApsaraDB RDS for MySQL.

    --mysql-user

    O nome de usuário da conta do banco de dados.

    Certifique-se de que a conta tenha as permissões necessárias.

    Create an account

    --mysql-password

    A senha da conta do banco de dados.

    --mysql-db

    O banco de dados para o teste de estresse.

    Crie o banco de dados com antecedência e substitua {DATABASE} pelo seu nome.

    Manage databases

    --tables

    Número de tabelas.

    Defina como 2 neste exemplo.

    N/A

  3. Execute testes de estresse na sincronização de dados incremental.

    Use o modelo dm_hot_update_only na instância ECS para executar testes de estresse no banco de dados de origem e gerar logs binários.

    sysbench --db-driver=mysql \
    --mysql-host={HOST} \
    --mysql-port={PORT} \
    --mysql-user= \
    --mysql-password= \
    --mysql-db={DATABASE} \
    --threads=64 --tables=2 --time=600 dm_hot_update_only.lua \
    run

    Parâmetro

    Descrição

    Observações

    --time

    Duração do teste de estresse em segundos.

    Defina como 600 neste exemplo.

    --threads

    Número de threads concorrentes.

    Defina como 64 neste exemplo.

  4. Na página Performance Monitoring da tarefa de sincronização de dados do DTS, visualize o desempenho da tarefa.

    Para mais informações, consulte Monitor task performance.

dm_ddl_only

  1. Crie uma tarefa de sincronização de dados do DTS.

    Não selecione Full Data Synchronization para o parâmetro Synchronization Types. Se o banco de dados e as tabelas correspondentes não estiverem criados na instância do ApsaraDB RDS for MySQL de destino, selecione Schema Synchronization. Para mais informações, consulte One-way data synchronization between ApsaraDB RDS for MySQL instances.

  2. Execute testes de estresse na sincronização de dados incremental.

    Use o modelo dm_ddl_only na instância ECS para executar testes de estresse no banco de dados de origem e gerar logs binários.

    sysbench --db-driver=mysql \
    --mysql-host={HOST} \
    --mysql-port={PORT} \
    --mysql-user= \
    --mysql-password= \
    --mysql-db={DATABASE} \
    --threads=64 --tables=2 --time=600 dm_ddl_only.lua \
    run

    Parâmetro

    Descrição

    Observações

    Referências

    --mysql-host

    O endpoint interno da instância do ApsaraDB RDS for MySQL.

    Substitua {HOST} pelo endpoint interno da instância do ApsaraDB RDS for MySQL.

    Manage instance endpoints and ports

    --mysql-port

    A porta interna da instância do ApsaraDB RDS for MySQL.

    Substitua {PORT} pelo número da porta interna da instância do ApsaraDB RDS for MySQL.

    --mysql-user

    O nome de usuário da conta do banco de dados.

    Certifique-se de que a conta tenha as permissões necessárias.

    Create an account

    --mysql-password

    A senha da conta do banco de dados.

    --mysql-db

    O banco de dados para o teste de estresse.

    Crie o banco de dados com antecedência e substitua {DATABASE} pelo seu nome.

    Manage databases

    --threads

    Número de threads concorrentes.

    Defina como 64 neste exemplo.

    N/A

    --tables

    Número de tabelas.

    Defina como 2 neste exemplo.

    --time

    Duração do teste de estresse em segundos.

    Defina como 600. As operações DDL serão executadas durante 600 segundos.

  3. Na página Performance Monitoring da tarefa de sincronização de dados do DTS, visualize o desempenho da tarefa.

    Para mais informações, consulte Monitor task performance.

TPC-C

  1. Prepare os dados básicos.

    1. Acesse o diretório de trabalho do BenchmarkSQL na instância ECS.

      cd benchmarksql-5.0-mysql-support-opt-2.1/run/
    2. Configure a conexão da instância de origem em props.mysql.

      vim props.mysql

      Configuração de exemplo. Substitua {HOST}, {PORT}, {USER}, {PASSWORD} e {DATABASE} pelas informações da instância do ApsaraDB RDS for MySQL de origem.

      db=mysql
      driver=com.mysql.jdbc.Driver
      conn=jdbc:mysql://{HOST}:{PORT}/{DATABASE}?readOnlyPropagatesToServer=false&rewriteBatchedStatements=true&failOverReadOnly=false&connectTimeout=3000&allowMultiQueries=true&clobberStreamingResults=true&characterEncoding=utf8&netTimeoutForStreamingResults=0&autoReconnect=true
      user={USER}
      password={PASSWORD}
      
      warehouses=1000
      loadWorkers=100
      
      terminals=128
      //To run specified transactions per terminal- runMins must equal zero
      runTxnsPerTerminal=0
      //To run for specified minutes- runTxnsPerTerminal must equal zero
      runMins=10
      //Number of total transactions per minute
      limitTxnsPerMin=0
      
      //Set to true to run in 4.x compatible mode. Set to false to use the
      //entire configured database evenly.
      terminalWarehouseFixed=true
      
      //The following five values must add up to 100
      //The default percentages of 45, 43, 4, 4 & 4 match the TPC-C spec
      newOrderWeight=45
      paymentWeight=43
      orderStatusWeight=4
      deliveryWeight=4
      stockLevelWeight=4
      
      // Directory name to create for collecting detailed result data.
      // Comment this out to suppress.
      resultDirectory=my_result_%tY-%tm-%td_%tH%tM%tS
      
      // osCollectorScript=./misc/os_collector_linux.py
      // osCollectorInterval=1
      // osCollectorSSHAddr=user@dbhost
      // osCollectorDevices=net_eth0 blk_sda

      Parâmetro

      Descrição

      Observações

      conn

      Configurações de conexão da instância. Substitua {HOST}, {PORT} e {DATABASE}:

      • HOST: endpoint interno da instância do ApsaraDB RDS for MySQL.

      • PORT: porta interna da instância do ApsaraDB RDS for MySQL.

      • DATABASE: o banco de dados de teste na instância do ApsaraDB RDS for MySQL.

      Substitua {HOST}, {PORT} e {DATABASE} pelas informações correspondentes.

      user

      O nome de usuário da conta do banco de dados.

      Substitua {USER} pelas informações correspondentes.

      password

      A senha da conta do banco de dados.

      Substitua {PASSWORD} pelas informações correspondentes.

      runMins

      Duração do teste de estresse em minutos.

      Defina como 10 neste exemplo.

    3. Inicialize os dados de teste do TPC-C.

      ./runDatabaseBuild.sh props.mysql

      Esse comando cria 10 tabelas com aproximadamente 500 milhões de linhas no total.

  2. Crie uma tarefa de sincronização de dados do DTS.

    Selecione Schema Synchronization e Full Data Synchronization para o parâmetro Synchronization Types. Para mais informações, consulte One-way data synchronization between ApsaraDB RDS for MySQL instances.

  3. Aguarde a conclusão da sincronização completa de dados.

  4. Execute testes de estresse na sincronização de dados incremental.

    Use o modelo TPC-C na instância ECS para executar testes de estresse no banco de dados de origem e gerar logs binários.

    ./runBenchmark.sh props.mysql

    Parâmetro

    Descrição

    Observações

    --time

    Duração do teste de estresse em segundos.

    Defina como 600 neste exemplo.

    --threads

    Número de threads concorrentes.

    Defina como 64 neste exemplo.

  5. Na página Performance Monitoring da tarefa de sincronização de dados do DTS, visualize o desempenho da tarefa.

    Para mais informações, consulte Monitor task performance.

Resultados dos testes

Nota

Para verificar o desempenho máximo da sincronização incremental por tipo de instância, consulte Data synchronization performance data. O desempenho é medido em linhas por segundo (RPS).

oltp_write_only

Sincronização de dados completa

Tipo de instância

RPS (linhas/s)

BPS (MB/s)

Duração (s)

micro

17,95W

34,19

557

small

18,18W

34,63

550

medium

19,64W

37,42

509

large

19,96W

38,02

501

Sincronização de dados incremental

Tipo de instância

RPS (linhas/s)

BPS (KB/s)

Desempenho máximo atingido

micro

200

86

Sim

small

2000

982

Sim

medium

5000

2605

Sim

large

11000

5489

Sim

dm_large_table_write_only

Sincronização de dados completa

Tipo de instância

RPS (linhas/s)

BPS (MB/s)

Duração (s)

micro

469,48

35,09MB

213

small

480,77

35,94MB

208

medium

552,49

41,30MB

181

large

584,80

43,71

171

Sincronização de dados incremental

Tipo de instância

RPS (linhas/s)

BPS (KB/s)

Desempenho máximo atingido

micro

200

9086.3

Sim

small

683

31741.51

Não

medium

1033

56676.41

Não

large

1537

84344.32

Não

dm_hot_update_only

Nota

Por padrão, o parâmetro trans.hot.merge.enable está definido como false. Para mais informações sobre como modificar este parâmetro, consulte Modify instance parameters.

O parâmetro trans.hot.merge.enable está definido como false.

Sincronização de dados incremental

Tipo de instância

RPS (linhas/s)

Desempenho máximo atingido

micro

200

Sim

small

1200

Não

medium

1200

Não

large

1200

Não

O parâmetro trans.hot.merge.enable está definido como true.

Sincronização de dados incremental

Tipo de instância

RPS (linhas/s)

Desempenho máximo atingido

micro

200

Sim

small

2000

Sim

medium

5000

Sim

large

11000

Sim

dm_ddl_only

Sincronização de dados incremental

Tipo de instância

RPS (linhas/s)

Desempenho máximo atingido

micro

68

Não

small

68

Não

medium

68

Não

large

68

Não

TPC-C

Sincronização de dados completa

Tipo de instância

RPS (linhas/s)

BPS (MB/s)

Duração (s)

micro

12,04W

17,52

4143

small

12,09W

17,59

4127

medium

12,73W

18,52

3921

large

13,50W

19,64

3696

Sincronização de dados incremental

Tipo de instância

RPS (linhas/s)

BPS (KB/s)

Desempenho máximo atingido

micro

200

138

Sim

small

2000

1920

Sim

medium

5000

3847

Sim

large

11000

7542

Sim