All Products
Search
Document Center

Elasticsearch:Gunakan Canal untuk menyinkronkan data MySQL ke Alibaba Cloud Elasticsearch

Last Updated:Mar 26, 2026

Canal adalah alat open source dari Alibaba Group yang mengurai log biner MySQL dan mengalirkan perubahan inkremental ke konsumen downstream. Panduan ini menjelaskan cara men-deploy Canal server dan Canal adapter pada instance Elastic Compute Service (ECS) untuk menyinkronkan data inkremental dari ApsaraDB RDS for MySQL ke kluster Alibaba Cloud Elasticsearch secara real time.

Cara kerja

Canal bertindak sebagai node sekunder dari instance ApsaraDB RDS for MySQL Anda dan berlangganan log binernya. Saat baris data dimasukkan, diperbarui, atau dihapus di MySQL, Canal menangkap setiap event perubahan tersebut dan menuliskannya ke Elasticsearch melalui RESTful API.

Prasyarat

Sebelum memulai, pastikan Anda telah memiliki:

Batasan

  • Canal hanya menyinkronkan data inkremental — ekspor tabel penuh tidak didukung.

  • Canal adapter tidak dapat terhubung ke kluster Elasticsearch melalui HTTPS.

  • Nama bidang dan tipe data dalam pemetaan indeks Elasticsearch harus persis sesuai dengan kolom tabel MySQL yang bersangkutan.

  • Versi Java Development Kit (JDK) harus 1.8.0 atau lebih baru.

  • Kompatibilitas versi Canal dan Elasticsearch:

    Catatan Canal 1.1.4 tidak dapat digunakan untuk menyinkronkan data ke kluster Elasticsearch V7.X. Gunakan Canal 1.1.5 untuk kluster Elasticsearch V7.x, dan Canal 1.1.7 untuk kluster Elasticsearch V8.x. Panduan ini menggunakan Canal 1.1.4 dengan kluster Elasticsearch V6.7.
    Versi CanalVersi Elasticsearch yang didukung
    1.1.46.x
    1.1.57.x
    1.1.78.x

Langkah 1: Siapkan sumber data MySQL

Masuk ke Konsol ApsaraDB RDS dan buat database serta tabel. Panduan ini menggunakan skema tabel berikut:

CREATE TABLE `es_test` (
    `id`    bigint(32) NOT NULL,
    `name`  text NOT NULL,
    `count` text NOT NULL,
    `color` text NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8;

Untuk instruksi umum, lihat Alur kerja umum penggunaan ApsaraDB RDS for MySQL.

Langkah 2: Buat indeks Elasticsearch dengan pemetaan

Nama bidang dan tipe data dalam pemetaan indeks harus persis sesuai dengan tabel MySQL.

  1. Masuk ke Konsol Kibana kluster Elasticsearch Anda. Lihat Masuk ke Konsol Kibana.

    Catatan Panduan ini menggunakan Elasticsearch V6.7.0. Operasi mungkin berbeda pada versi lain.
  2. Di panel navigasi kiri, klik Dev Tools.

  3. Pada tab Console, jalankan perintah berikut untuk membuat indeks es_test:

    PUT es_test?include_type_name=true
    {
      "settings": {
        "index": {
          "number_of_shards": "5",
          "number_of_replicas": "1"
        }
      },
      "mappings": {
        "_doc": {
          "properties": {
            "count": {
              "type": "text"
            },
            "id": {
              "type": "integer"
            },
            "name": {
              "type": "text",
              "analyzer": "ik_smart"
            },
            "color": {
              "type": "text"
            }
          }
        }
      }
    }

    Tanggapan sukses akan tampak seperti:

    {
      "acknowledged": true,
      "shards_acknowledged": true,
      "index": "es_test"
    }

Langkah 3: Instal JDK

  1. Hubungkan ke instance ECS. Lihat Hubungkan ke instance Linux menggunakan password atau kunci.

    Catatan Dalam contoh ini, digunakan pengguna biasa.
  2. Cari paket JDK yang tersedia:

    sudo yum search java | grep -i --color JDK
  3. Instal JDK. Panduan ini menggunakan java-1.8.0-openjdk-devel.x86_64:

    sudo yum install java-1.8.0-openjdk-devel.x86_64
  4. Konfigurasi variabel lingkungan:

    1. Buka ~/.bash_profile:

      vim ~/.bash_profile
    2. Tambahkan baris berikut. Ganti JAVA_HOME dengan jalur instalasi JDK aktual Anda. Jalankan find / -name 'java' untuk menemukannya.

      export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.362.b08-1.el7_9.x86_64
      export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
      export PATH=$PATH:$JAVA_HOME/bin
    3. Tekan Esc, ketik :wq untuk menyimpan, lalu terapkan konfigurasi:

      source ~/.bash_profile
  5. Verifikasi instalasi:

    java -version

    Output yang diharapkan:

    openjdk version "1.8.0_362"
    OpenJDK Runtime Environment (build 1.8.0_362-b08)
    OpenJDK 64-Bit Server VM (build 25.362-b08, mixed mode)

Langkah 4: Instal dan mulai Canal server

Catatan Paket Canal harus diunduh dari GitHub. Pastikan instance ECS memiliki akses internet.
  1. Unduh Canal server 1.1.4:

    wget https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.deployer-1.1.4.tar.gz

    Untuk versi lain, lihat Rilis Canal.

  2. Ekstrak paket:

    tar -zxvf canal.deployer-1.1.4.tar.gz
  3. Edit conf/example/instance.properties:

    ParameterDeskripsiContoh
    canal.instance.master.addressTitik akhir internal dan port instance ApsaraDB RDS for MySQL. Dapatkan informasi ini dari halaman Basic Information instance RDS.rm-bp1u1xxxxxxxxx6ph.mysql.rds.aliyuncs.com:3306
    canal.instance.dbUsernameUsername database. Dapatkan dari halaman Accounts instance RDS.canal_user
    canal.instance.dbPasswordPassword database.<your-password>
    vi conf/example/instance.properties

    Atur parameter berikut:

    修改conf/example/instance.properties文件

  4. Tekan Esc, ketik :wq untuk menyimpan.

  5. Jalankan Canal server dan verifikasi log:

    ./bin/startup.sh
    cat logs/canal/canal.log

    启动canal-server

Langkah 5: Instal dan mulai Canal adapter

  1. Unduh Canal adapter 1.1.4:

    wget https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.adapter-1.1.4.tar.gz
  2. Ekstrak paket:

    tar -zxvf canal.adapter-1.1.4.tar.gz
  3. Edit conf/application.yml:

    ParameterDeskripsiContoh
    canal.conf.canalServerHostAlamat Canal server. Gunakan nilai default.127.0.0.1:11111
    canal.conf.srcDataSources.defaultDS.urlURL koneksi JDBC instance ApsaraDB RDS for MySQL. Gunakan format jdbc:mysql://<endpoint>:<port>/<database>?useUnicode=true. Dapatkan endpoint dan port dari halaman Basic Information.jdbc:mysql://rm-bp1xxxxxxxxxnd6ph.mysql.rds.aliyuncs.com:3306/elasticsearch?useUnicode=true
    canal.conf.srcDataSources.defaultDS.usernameUsername database. Dapatkan dari halaman Accounts.canal_user
    canal.conf.srcDataSources.defaultDS.passwordPassword database.<your-password>
    canal.conf.canalAdapters.groups.outerAdapters.hosts (di bawah name: es)Titik akhir internal dan port kluster Elasticsearch. Dapatkan dari halaman Basic Information kluster.es-cn-v64xxxxxxxxx3medp.elasticsearch.aliyuncs.com:9200
    canal.conf.canalAdapters.groups.outerAdapters.modeMode transport. Atur ke rest.rest
    canal.conf.canalAdapters.groups.outerAdapters.properties.security.authKredensial Elasticsearch dalam format <username>:<password>.elastic:es_password
    canal.conf.canalAdapters.groups.outerAdapters.properties.cluster.nameID kluster Elasticsearch. Dapatkan dari halaman Basic Information.es-cn-v64xxxxxxxxx3medp
    vi conf/application.yml

    Atur parameter berikut:

    image..png

  4. Tekan Esc, ketik :wq untuk menyimpan.

  5. Edit file pemetaan bidang conf/es/*.yml untuk menentukan cara kolom MySQL dipetakan ke bidang Elasticsearch:

    ParameterDeskripsiNilai yang digunakan dalam panduan ini
    esMapping._indexNama indeks Elasticsearch yang dibuat di Langkah 2.es_test
    esMapping._typeTipe indeks Elasticsearch._doc
    esMapping._idBidang ID dokumen._id
    esMapping.sqlKueri SQL yang memilih kolom untuk disinkronkan.select t.id as _id, t.id, t.count, t.name, t.color from es_test t

    修改conf/es/*.yml文件

  6. Jalankan Canal adapter dan verifikasi log:

    Catatan Canal adapter 1.1.4 menyertakan driver MySQL versi 5.1.40. Jika instance ApsaraDB RDS Anda menjalankan MySQL 8.x, adapter gagal dijalankan. Lihat Ganti driver MySQL untuk MySQL 8.x di bagian Pemecahan Masalah.
    ./bin/startup.sh
    cat logs/adapter/adapter.log

    Canal-adapter服务日志

Langkah 6: Verifikasi sinkronisasi

  1. Di database ApsaraDB RDS for MySQL, masukkan satu baris ke tabel es_test:

    INSERT INTO `ES`.`es_test` (`count`, `id`, `name`, `color`)
    VALUES ('11', 2, 'canal_test2', 'red');

    Anda juga dapat menguji dengan pernyataan UPDATE atau DELETE.

  2. Masuk ke Konsol Kibana kluster Elasticsearch Anda. Lihat Masuk ke Konsol Kibana.

  3. Di panel navigasi kiri, klik Dev Tools.

  4. Pada tab Console, jalankan kueri berikut:

    Penting

    Canal hanya menyinkronkan perubahan inkremental.

    GET /es_test/_search

    Jika sinkronisasi berfungsi, tanggapan mencakup baris yang Anda masukkan:

    数据同步成功结果

Pemecahan Masalah

Pada contoh berikut, digunakan pengguna root.

ClassCastException saat menjalankan Canal adapter 1.1.5

Error:

java.lang.RuntimeException: java.lang.RuntimeException: java.lang.ClassCastException:
com.alibaba.druid.pool.DruidDataSource cannot be cast to
com.alibaba.druid.pool.DruidDataSource
at com.alibaba.otter.canal.client.adapter.es7x.ES7xAdapter.init(ES7xAdapter.java:54)
~[client-adapter.es7x-1.1.5-jar-with-dependencies.jar:na]

Ganti client-adapter.es7x-1.1.5-jar-with-dependencies.jar di direktori canal.adapter-1.1.5\plugin dengan versi dari rilis canal-1.1.5-alpha-2. Untuk latar belakangnya, lihat Isu Canal #3534.

  1. Unduh adapter canal-1.1.5-alpha-2:

    wget https://github.com/alibaba/canal/releases/download/canal-1.1.5-alpha-2/canal.adapter-1.1.5-SNAPSHOT.tar.gz
  2. Ekstrak paket:

    tar -zxvf canal.adapter-1.1.5-SNAPSHOT.tar.gz
  3. Salin file plugin yang telah diperbaiki ke direktori plugin adapter:

    Catatan Jalur sumber dapat berbeda tergantung lokasi ekstraksi paket.
    cp canal.adapter-1.1.5-SNAPSHOT/plugin/client-adapter.es7x-1.1.5-SNAPSHOT-jar-with-dependencies.jar canal/canal.adapter/plugin
  4. Hapus file plugin asli:

    rm -rf client-adapter.es7x-1.1.5-jar-with-dependencies.jar
  5. Ubah nama file baru agar sesuai dengan nama file yang diharapkan:

    mv client-adapter.es7x-1.1.5-SNAPSHOT-jar-with-dependencies.jar client-adapter.es7x-1.1.5-jar-with-dependencies.jar

Ganti driver MySQL untuk MySQL 8.x

Canal adapter 1.1.4 menyertakan driver MySQL versi 5.1.40, yang tidak kompatibel dengan MySQL 8.x. Jika Anda melihat error Unknown system variable 'query_cache_size' saat menjalankan adapter, ganti drivernya dengan konektor MySQL 8.0:

  1. Unduh konektor MySQL 8.0:

    wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.29.zip
  2. Ekstrak paket:

    unzip mysql-connector-java-8.0.29.zip
  3. Salin JAR konektor ke direktori lib adapter:

    mv mysql-connector-java-8.0.29/mysql-connector-java-8.0.29.jar lib/
  4. Atur izin yang diperlukan:

    chmod 777 lib/mysql-connector-java-8.0.29.jar
    chmod +st lib/mysql-connector-java-8.0.29.jar
  5. Hapus driver MySQL 5.x lama:

    rm -rf lib/mysql-connector-java-5.1.40.jar

Langkah selanjutnya

Referensi