Tous les produits
Search
Centre de documentation

Data Transmission Service:Livre blanc sur les performances de DTS

Dernière mise à jour :Oct 12, 2026

Benchmarks de performance pour la synchronisation unidirectionnelle des données avec DTS entre des instances ApsaraDB RDS for MySQL, couvrant la synchronisation complète, la synchronisation incrémentielle, les mises à jour à chaud et les opérations DDL.

Environnement de test

Bases de données source et de destination

Remarque

L'extension automatique du stockage est activée pour les instances ApsaraDB RDS for MySQL utilisées dans ce test.

Base de données

Région

Type

Version

Spécification

CPU

Mémoire

Base de données source

Chine (Hangzhou)

Instances ApsaraDB RDS for MySQL Standard exécutant l'édition Haute Disponibilité RDS

8.0

mysql.x4.xlarge.2c (dédié)

8

32 Go

Base de données de destination

Client

Remarque

Vous devez ajouter l'adresse IP de l'instance ECS utilisée comme client aux listes d'autorisation d'adresses IP des instances ApsaraDB RDS for MySQL. Pour plus d'informations, consultez la rubrique Configurer une liste d'autorisation d'adresses IP.

Type

Région

Type de réseau

Système d'exploitation

Spécification

vCPU

Mémoire

Adresse IP publique

Instance ECS

Chine (Hangzhou)

VPC

Remarque

L'instance ECS utilise le même VPC et le même vSwitch que les instances ApsaraDB RDS for MySQL.

CentOS 7.9 64 bits

ecs.c7,8xlarge (type optimisé pour le calcul c7)

32

64

Oui

Outils de test

Présentation

Outil

Version

Description

SysBench

1.0.20

Outil de benchmark modulaire et multithread destiné aux tests de performance des bases de données sur diverses plateformes.

BenchmarkSQL

5,0 (basé sur Java 8)

Outil open source de benchmark OLTP utilisé pour évaluer les performances des bases de données et effectuer des tests de charge.

Installation

Installer Sysbench

  1. Installez Sysbench sur l'instance 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. Préparez les scripts Lua : dm_large_table_write_only.lua (écritures sur tables volumineuses), dm_hot_update_only.lua (mises à jour de données fréquemment accédées) et dm_ddl_only.lua (synchronisation 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. Copiez les scripts Lua dans le répertoire des scripts Sysbench /usr/local/share/sysbench/ sur l'instance 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/

Installer 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éthodes de test

Présentation

Les méthodes suivantes évaluent les performances de synchronisation des données de DTS sous différents angles.

Outil de test

Modèle ou script de test

Fonctionnalités testées

Sysbench

oltp_write_only

Synchronisation complète et incrémentielle des données

dm_large_table_write_only

Synchronisation complète et incrémentielle des données

dm_hot_update_only

Synchronisation incrémentielle des données

dm_ddl_only

Synchronisation incrémentielle des données

BenchmarkSQL

TPC-C

Synchronisation complète et incrémentielle des données

Procédure

oltp_write_only

  1. Préparez les données de base.

    Sur l'instance ECS, utilisez Sysbench pour créer 10 tables dans l'instance source ApsaraDB RDS for MySQL avec 10 millions de lignes chacune.

    Remarque

    Exécutez la commande suivante dans le répertoire /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

    Paramètre

    Description

    Remarques

    Références

    --mysql-host

    Le point de terminaison interne de l'instance ApsaraDB RDS for MySQL.

    Remplacez {HOST} par le point de terminaison interne de l'instance ApsaraDB RDS for MySQL.

    Afficher et gérer les points de terminaison et les ports des instances

    --mysql-port

    Le port interne de l'instance ApsaraDB RDS for MySQL.

    Remplacez {PORT} par le numéro de port interne de l'instance ApsaraDB RDS for MySQL.

    --mysql-user

    Le nom d'utilisateur du compte de base de données.

    Assurez-vous que le compte dispose des autorisations requises.

    Créer un compte

    --mysql-password

    Le mot de passe du compte de base de données.

    --mysql-db

    La base de données à soumettre au test de charge.

    Créez la base de données au préalable et remplacez {DATABASE} par son nom.

    Gérer les bases de données

    --tables

    Nombre de tables.

    Défini sur 10 dans cet exemple.

    Sans objet

    --table_size

    Nombre de lignes par table.

    Défini sur 10000000 dans cet exemple.

  2. Créez une tâche de synchronisation des données DTS.

    Sélectionnez Schema Synchronization et Full Data Synchronization pour le paramètre Synchronization Types. Pour plus d'informations, consultez la rubrique Synchronisation unidirectionnelle des données entre instances ApsaraDB RDS for MySQL.

  3. Attendez que la synchronisation complète des données soit terminée.

  4. Effectuez un test de charge sur la synchronisation incrémentielle des données.

    Utilisez le modèle oltp_write_only sur l'instance ECS pour soumettre la base de données source à un test de charge et générer des journaux binaires.

    Remarque

    Répartition des différentes opérations 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

    Paramètre

    Description

    Remarques

    --time

    Durée du test de charge en secondes.

    Défini sur 600 dans cet exemple.

    --threads

    Nombre de threads simultanés.

    Défini sur 64 dans cet exemple.

  5. Sur la page Performance Monitoring de la tâche de synchronisation des données DTS, consultez les performances de la tâche.

    Pour plus d'informations, consultez la rubrique Surveiller les performances des tâches.

dm_large_table_write_only

  1. Préparez les données de base.

    Sur l'instance ECS, utilisez Sysbench pour créer 10 tables dans l'instance source ApsaraDB RDS for MySQL avec 10 000 lignes chacune.

    Remarque

    Exécutez la commande suivante dans le répertoire /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

    Paramètre

    Description

    Remarques

    Références

    --mysql-host

    Le point de terminaison interne de l'instance ApsaraDB RDS for MySQL.

    Remplacez {HOST} par le point de terminaison interne de l'instance ApsaraDB RDS for MySQL.

    Afficher et gérer les points de terminaison et les ports des instances

    --mysql-port

    Le port interne de l'instance ApsaraDB RDS for MySQL.

    Remplacez {PORT} par le numéro de port interne de l'instance ApsaraDB RDS for MySQL.

    --mysql-user

    Le nom d'utilisateur du compte de base de données.

    Assurez-vous que le compte dispose des autorisations requises.

    Créer un compte

    --mysql-password

    Le mot de passe du compte de base de données.

    --mysql-db

    La base de données à soumettre au test de charge.

    Créez la base de données au préalable et remplacez {DATABASE} par son nom.

    Gérer les bases de données

    --tables

    Nombre de tables.

    Défini sur 10 dans cet exemple.

    Sans objet

    --table_size

    Nombre de lignes par table.

    Défini sur 10000 dans cet exemple.

  2. Créez une tâche de synchronisation des données DTS.

    Sélectionnez Schema Synchronization et Full Data Synchronization pour le paramètre Synchronization Types. Pour plus d'informations, consultez la rubrique Synchronisation unidirectionnelle des données entre instances ApsaraDB RDS for MySQL.

  3. Attendez que la synchronisation complète des données soit terminée.

  4. Effectuez un test de charge sur la synchronisation incrémentielle des données.

    Utilisez le modèle dm_large_table_write_only sur l'instance ECS pour soumettre la base de données source à un test de charge et générer des journaux binaires.

    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

    Paramètre

    Description

    Remarques

    --time

    Durée du test de charge en secondes.

    Défini sur 600 dans cet exemple.

    --threads

    Nombre de threads simultanés.

    Défini sur 64 dans cet exemple.

  5. Sur la page Performance Monitoring de la tâche de synchronisation des données DTS, consultez les performances de la tâche.

    Pour plus d'informations, consultez la rubrique Surveiller les performances des tâches.

dm_hot_update_only

  1. Créez une tâche de synchronisation des données DTS.

    Ne sélectionnez pas Full Data Synchronization pour le paramètre Synchronization Types. Si la base de données et les tables correspondantes n'ont pas été créées dans l'instance ApsaraDB RDS for MySQL de destination, vous devez sélectionner Schema Synchronization. Pour plus d'informations, consultez la rubrique Synchronisation unidirectionnelle des données entre instances ApsaraDB RDS for MySQL.

  2. Initialisez les données dans les tables soumises au test de charge.

    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

    Paramètre

    Description

    Remarques

    Références

    --mysql-host

    Le point de terminaison interne de l'instance ApsaraDB RDS for MySQL.

    Remplacez {HOST} par le point de terminaison interne de l'instance ApsaraDB RDS for MySQL.

    Afficher et gérer les points de terminaison et les ports des instances

    --mysql-port

    Le port interne de l'instance ApsaraDB RDS for MySQL.

    Remplacez {PORT} par le numéro de port interne de l'instance ApsaraDB RDS for MySQL.

    --mysql-user

    Le nom d'utilisateur du compte de base de données.

    Assurez-vous que le compte dispose des autorisations requises.

    Créer un compte

    --mysql-password

    Le mot de passe du compte de base de données.

    --mysql-db

    La base de données à soumettre au test de charge.

    Créez la base de données au préalable et remplacez {DATABASE} par son nom.

    Gérer les bases de données

    --tables

    Nombre de tables.

    Défini sur 2 dans cet exemple.

    N/A

  3. Effectuez un test de charge sur la synchronisation incrémentielle des données.

    Utilisez le modèle dm_hot_update_only sur l'instance ECS pour soumettre la base de données source à un test de charge et générer des journaux binaires.

    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

    Paramètre

    Description

    Remarques

    --time

    Durée du test de charge en secondes.

    Défini sur 600 dans cet exemple.

    --threads

    Nombre de threads simultanés.

    Défini sur 64 dans cet exemple.

  4. Sur la page Performance Monitoring de la tâche de synchronisation des données DTS, consultez les performances de la tâche.

    Pour plus d'informations, consultez la rubrique Surveiller les performances des tâches.

dm_ddl_only

  1. Créez une tâche de synchronisation des données DTS.

    Ne sélectionnez pas Full Data Synchronization pour le paramètre Synchronization Types. Si la base de données et les tables correspondantes n'ont pas été créées dans l'instance ApsaraDB RDS for MySQL de destination, vous devez sélectionner Schema Synchronization. Pour plus d'informations, consultez la rubrique Synchronisation unidirectionnelle des données entre instances ApsaraDB RDS for MySQL.

  2. Effectuez un test de charge sur la synchronisation incrémentielle des données.

    Utilisez le modèle dm_ddl_only sur l'instance ECS pour soumettre la base de données source à un test de charge et générer des journaux binaires.

    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

    Paramètre

    Description

    Remarques

    Références

    --mysql-host

    Le point de terminaison interne de l'instance ApsaraDB RDS for MySQL.

    Remplacez {HOST} par le point de terminaison interne de l'instance ApsaraDB RDS for MySQL.

    Afficher et gérer les points de terminaison et les ports des instances

    --mysql-port

    Le port interne de l'instance ApsaraDB RDS for MySQL.

    Remplacez {PORT} par le numéro de port interne de l'instance ApsaraDB RDS for MySQL.

    --mysql-user

    Le nom d'utilisateur du compte de base de données.

    Assurez-vous que le compte dispose des autorisations requises.

    Créer un compte

    --mysql-password

    Le mot de passe du compte de base de données.

    --mysql-db

    La base de données à soumettre au test de charge.

    Créez la base de données au préalable et remplacez {DATABASE} par son nom.

    Gérer les bases de données

    --threads

    Nombre de threads simultanés.

    Défini sur 64 dans cet exemple.

    N/A

    --tables

    Nombre de tables.

    Défini sur 2 dans cet exemple.

    --time

    Durée du test de charge en secondes.

    Défini sur 600. Les opérations DDL s'exécutent pendant 600 secondes.

  3. Sur la page Performance Monitoring de la tâche de synchronisation des données DTS, consultez les performances de la tâche.

    Pour plus d'informations, consultez la rubrique Surveiller les performances des tâches.

TPC-C

  1. Préparez les données de base.

    1. Accédez au répertoire de travail de BenchmarkSQL dans l'instance ECS.

      cd benchmarksql-5.0-mysql-support-opt-2.1/run/
    2. Configurez la connexion à l'instance source dans props.mysql.

      vim props.mysql

      Exemple de configuration. Remplacez {HOST}, {PORT}, {USER}, {PASSWORD} et {DATABASE} par les informations de l'instance ApsaraDB RDS for MySQL source.

      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

      Paramètre

      Description

      Remarques

      conn

      Paramètres de connexion de l'instance. Remplacez {HOST}, {PORT} et {DATABASE} :

      • HOST : point de terminaison interne de l'instance ApsaraDB RDS for MySQL.

      • PORT : port interne de l'instance ApsaraDB RDS for MySQL.

      • DATABASE : base de données de test dans l'instance ApsaraDB RDS for MySQL.

      Remplacez {HOST}, {PORT} et {DATABASE} par les informations correspondantes.

      user

      Le nom d'utilisateur du compte de base de données.

      Remplacez {USER} par les informations correspondantes.

      password

      Le mot de passe du compte de base de données.

      Remplacez {PASSWORD} par les informations correspondantes.

      runMins

      Durée du test de charge en minutes.

      Défini sur 10 dans cet exemple.

    3. Initialisez les données de test TPC-C.

      ./runDatabaseBuild.sh props.mysql

      Crée 10 tables avec environ 500 millions de lignes au total.

  2. Créez une tâche de synchronisation des données DTS.

    Sélectionnez Schema Synchronization et Full Data Synchronization pour le paramètre Synchronization Types. Pour plus d'informations, consultez la rubrique Synchronisation unidirectionnelle des données entre instances ApsaraDB RDS for MySQL.

  3. Attendez que la synchronisation complète des données soit terminée.

  4. Effectuez un test de charge sur la synchronisation incrémentielle des données.

    Utilisez le modèle TPC-C sur l'instance ECS pour soumettre la base de données source à un test de charge et générer des journaux binaires.

    ./runBenchmark.sh props.mysql

    Paramètre

    Description

    Remarques

    --time

    Durée du test de charge en secondes.

    Défini sur 600 dans cet exemple.

    --threads

    Nombre de threads simultanés.

    Défini sur 64 dans cet exemple.

  5. Sur la page Performance Monitoring de la tâche de synchronisation des données DTS, consultez les performances de la tâche.

    Pour plus d'informations, consultez la rubrique Surveiller les performances des tâches.

Résultats des tests

Remarque

Pour connaître les performances maximales de synchronisation incrémentale par type d'instance, consultez la rubrique Données de performance de la synchronisation des données. Les performances sont mesurées en lignes par seconde (RPS).

oltp_write_only

Synchronisation complète des données

Type d'instance

RPS (lignes/s)

BPS (Mo/s)

Durée (s)

micro

17,95 W

34,19

557

small

18,18 W

34,63

550

medium

19,64 W

37,42

509

large

19,96 W

38,02

501

Synchronisation incrémentale des données

Type d'instance

RPS (lignes/s)

BPS (Ko/s)

Performance maximale atteinte ou non

micro

200

86

Oui

small

2 000

982

Oui

medium

5 000

2 605

Oui

large

11 000

5 489

Oui

dm_large_table_write_only

Synchronisation complète des données

Type d'instance

RPS (lignes/s)

BPS (Mo/s)

Durée (s)

micro

469,48

35,09 Mo

213

small

480,77

35,94 Mo

208

medium

552,49

41,30 Mo

181

large

584,80

43,71

171

Synchronisation incrémentale des données

Type d'instance

RPS (lignes/s)

BPS (Ko/s)

Performance maximale atteinte ou non

micro

200

9 086,3

Oui

small

683

31 741,51

Non

medium

1 033

56 676,41

Non

large

1 537

84 344,32

Non

dm_hot_update_only

Remarque

Par défaut, le paramètre trans.hot.merge.enable est défini sur false. Pour plus d'informations sur la modification de ce paramètre, consultez la rubrique Modifier les paramètres de l'instance.

Le paramètre trans.hot.merge.enable est défini sur false.

Synchronisation incrémentale des données

Type d'instance

RPS (lignes/s)

Performance maximale atteinte ou non

micro

200

Oui

small

1 200

Non

medium

1 200

Non

large

1 200

Non

Le paramètre trans.hot.merge.enable est défini sur true.

Synchronisation incrémentale des données

Type d'instance

RPS (lignes/s)

Performance maximale atteinte ou non

micro

200

Oui

small

2 000

Oui

medium

5 000

Oui

large

11 000

Oui

dm_ddl_only

Synchronisation incrémentale des données

Type d'instance

RPS (lignes/s)

Performance maximale atteinte ou non

micro

68

Non

small

68

Non

medium

68

Non

large

68

Non

TPC-C

Synchronisation complète des données

Type d'instance

RPS (lignes/s)

BPS (Mo/s)

Durée (s)

micro

12,04 W

17,52

4 143

small

12,09 W

17,59

4 127

medium

12,73 W

18,52

3 921

large

13,50 W

19,64

3 696

Synchronisation incrémentale des données

Type d'instance

RPS (lignes/s)

BPS (Ko/s)

Performance maximale atteinte ou non

micro

200

138

Oui

small

2 000

1 920

Oui

medium

5 000

3 847

Oui

large

11 000

7 542

Oui