Todos os produtos
Search
Central de documentação

Data Transmission Service:White paper de desempenho do DTS

Última atualização: Jun 27, 2026

Benchmarks de desempenho para sincronização unidirecional de dados do DTS entre instâncias ApsaraDB RDS for MySQL, abrangendo sincronização completa, sincronização incremental, atualizações frequentes (hot updates) 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 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 padrão ApsaraDB RDS for MySQL executando o ApsaraDB RDS High-availability Edition

8.0

mysql.x4.xlarge.2c (dedicado)

8

32 GB

Banco de dados de destino

Cliente

Nota

Adicione o endereço IP da instância ECS que será usada como cliente às listas de permissões de endereços IP das instâncias ApsaraDB RDS for MySQL. Para mais informações, consulte Configurar uma lista de permissões de endereços IP.

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 utiliza a mesma VPC e vSwitch das instâncias 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

Ferramenta modular e multithread de benchmark para testes de desempenho de banco de dados em diversas plataformas.

BenchmarkSQL

5.0 (baseado em Java 8)

Ferramenta open source de benchmark OLTP para avaliação de desempenho e testes de estresse em bancos de dados.

Instalação

Instale 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 (escrita em tabelas grandes), dm_hot_update_only.lua (atualização de dados frequentes) 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/

Instale 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 perspectivas.

Ferramenta de teste

Modelo ou script de teste

Recursos testados

Sysbench

oltp_write_only

Sincronização completa e incremental de dados

dm_large_table_write_only

Sincronização completa e incremental de dados

dm_hot_update_only

Sincronização incremental de dados

dm_ddl_only

Sincronização incremental de dados

BenchmarkSQL

TPC-C

Sincronização completa e incremental de dados

Procedimento

oltp_write_only

  1. Prepare os dados básicos.

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

    Nota

    Execute o comando a seguir 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 ApsaraDB RDS for MySQL.

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

    Visualize e gerencie endpoints e portas de instâncias

    --mysql-port

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

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

    --mysql-user

    Nome de usuário da conta do banco de dados.

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

    Crie uma conta

    --mysql-password

    Senha da conta do banco de dados.

    --mysql-db

    Banco de dados alvo do teste de estresse.

    Crie o banco de dados antecipadamente e substitua {DATABASE} pelo nome correspondente.

    Gerenciar bancos de dados

    --tables

    Quantidade de tabelas.

    Definido como 10 neste exemplo.

    N/A

    --table_size

    Número de linhas por tabela.

    Definido como 10000000 neste exemplo.

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

    Selecione Schema Synchronization e Full Data Synchronization no parâmetro Synchronization Types. Para mais informações, consulte RDS for MySQL: Sincronização unidirecional de dados.

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

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

    Utilize o modelo oltp_write_only na instância ECS para submeter o banco de dados de origem a testes de estresse e gerar logs binários.

    Nota

    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.

    Definido como 600 neste exemplo.

    --threads

    Quantidade de threads simultâneas.

    Definido 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 Monitorar o desempenho da tarefa.

dm_large_table_write_only

  1. Prepare os dados básicos.

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

    Nota

    Execute o comando a seguir 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 ApsaraDB RDS for MySQL.

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

    Visualize e gerencie endpoints e portas de instâncias

    --mysql-port

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

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

    --mysql-user

    Nome de usuário da conta do banco de dados.

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

    Crie uma conta

    --mysql-password

    Senha da conta do banco de dados.

    --mysql-db

    Banco de dados alvo do teste de estresse.

    Crie o banco de dados antecipadamente e substitua {DATABASE} pelo nome correspondente.

    Gerenciar bancos de dados

    --tables

    Quantidade de tabelas.

    Definido como 10 neste exemplo.

    N/A

    --table_size

    Número de linhas por tabela.

    Definido como 10000 neste exemplo.

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

    Selecione Schema Synchronization e Full Data Synchronization no parâmetro Synchronization Types. Para mais informações, consulte RDS for MySQL: Sincronização unidirecional de dados.

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

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

    Utilize o modelo dm_large_table_write_only na instância ECS para submeter o banco de dados de origem a testes de estresse 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.

    Definido como 600 neste exemplo.

    --threads

    Quantidade de threads simultâneas.

    Definido 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 Monitorar o desempenho da tarefa.

dm_hot_update_only

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

    Não selecione Full Data Synchronization no parâmetro Synchronization Types. Caso o banco de dados e as tabelas correspondentes não tenham sido criados na instância ApsaraDB RDS for MySQL de destino, selecione Schema Synchronization. Para mais informações, consulte RDS for MySQL: Sincronização unidirecional de dados.

  2. Inicialize os dados nas tabelas que serão submetidas ao teste 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 ApsaraDB RDS for MySQL.

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

    Visualize e gerencie endpoints e portas de instâncias

    --mysql-port

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

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

    --mysql-user

    Nome de usuário da conta do banco de dados.

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

    Crie uma conta

    --mysql-password

    Senha da conta do banco de dados.

    --mysql-db

    Banco de dados alvo do teste de estresse.

    Crie o banco de dados antecipadamente e substitua {DATABASE} pelo nome correspondente.

    Gerenciar bancos de dados

    --tables

    Quantidade de tabelas.

    Definido como 2 neste exemplo.

    N/A

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

    Utilize o modelo dm_hot_update_only na instância ECS para submeter o banco de dados de origem a testes de estresse 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.

    Definido como 600 neste exemplo.

    --threads

    Quantidade de threads simultâneas.

    Definido 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 Monitorar o desempenho da tarefa.

dm_ddl_only

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

    Não selecione Full Data Synchronization no parâmetro Synchronization Types. Caso o banco de dados e as tabelas correspondentes não tenham sido criados na instância ApsaraDB RDS for MySQL de destino, selecione Schema Synchronization. Para mais informações, consulte RDS for MySQL: Sincronização unidirecional de dados.

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

    Utilize o modelo dm_ddl_only na instância ECS para submeter o banco de dados de origem a testes de estresse 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 ApsaraDB RDS for MySQL.

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

    Visualize e gerencie endpoints e portas de instâncias

    --mysql-port

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

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

    --mysql-user

    Nome de usuário da conta do banco de dados.

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

    Crie uma conta

    --mysql-password

    Senha da conta do banco de dados.

    --mysql-db

    Banco de dados alvo do teste de estresse.

    Crie o banco de dados antecipadamente e substitua {DATABASE} pelo nome correspondente.

    Gerenciar bancos de dados

    --threads

    Quantidade de threads simultâneas.

    Definido como 64 neste exemplo.

    N/A

    --tables

    Quantidade de tabelas.

    Definido como 2 neste exemplo.

    --time

    Duração do teste de estresse em segundos.

    Definido como 600. As operações DDL sã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 Monitorar o desempenho da tarefa.

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 no arquivo props.mysql.

      vim props.mysql

      Exemplo de configuração. Substitua {HOST}, {PORT}, {USER}, {PASSWORD} e {DATABASE} pelas informações da instância 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 ApsaraDB RDS for MySQL.

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

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

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

      user

      Nome de usuário da conta do banco de dados.

      Substitua {USER} pela informação correspondente.

      password

      Senha da conta do banco de dados.

      Substitua {PASSWORD} pela informação correspondente.

      runMins

      Duração do teste de estresse em minutos.

      Definido como 10 neste exemplo.

    3. Inicialize os dados de teste TPC-C.

      ./runDatabaseBuild.sh props.mysql

      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 no parâmetro Synchronization Types. Para mais informações, consulte RDS for MySQL: Sincronização unidirecional de dados.

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

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

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

    ./runBenchmark.sh props.mysql

    Parâmetro

    Descrição

    Observações

    --time

    Duração do teste de estresse em segundos.

    Definido como 600 neste exemplo.

    --threads

    Quantidade de threads simultâneas.

    Definido 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 Monitorar o desempenho da tarefa.

Resultados dos testes

Nota

Para obter o desempenho máximo de sincronização incremental por tipo de instância, consulte Dados de desempenho de sincronização. O desempenho é medido em linhas por segundo (RPS).

oltp_write_only

Sincronização completa de dados

Tipo de instância

RPS (linha/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 incremental de dados

Tipo de instância

RPS (linha/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 completa de dados

Tipo de instância

RPS (linha/s)

BPS (MB/s)

Duração (s)

micro

469,48

35,09 MB

213

small

480,77

35,94 MB

208

medium

552,49

41,30 MB

181

large

584,80

43,71

171

Sincronização incremental de dados

Tipo de instância

RPS (linha/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 modifique esse parâmetro, consulte Modifique parâmetros da instância.

Parâmetro trans.hot.merge.enable definido como false.

Sincronização incremental de dados

Tipo de instância

RPS (linha/s)

Desempenho máximo atingido

micro

200

Sim

small

1200

Não

medium

1200

Não

large

1200

Não

Parâmetro trans.hot.merge.enable definido como true.

Sincronização incremental de dados

Tipo de instância

RPS (linha/s)

Desempenho máximo atingido

micro

200

Sim

small

2000

Sim

medium

5000

Sim

large

11000

Sim

dm_ddl_only

Sincronização incremental de dados

Tipo de instância

RPS (linha/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 completa de dados

Tipo de instância

RPS (linha/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 incremental de dados

Tipo de instância

RPS (linha/s)

BPS (KB/s)

Desempenho máximo atingido

micro

200

138

Sim

small

2000

1920

Sim

medium

5000

3847

Sim

large

11000

7542

Sim