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:
Instance ApsaraDB RDS for MySQL. Lihat Buat instance ApsaraDB RDS for MySQL. Panduan ini menggunakan instance MySQL 5.7.
Kluster Alibaba Cloud Elasticsearch. Lihat Buat kluster Alibaba Cloud Elasticsearch. Panduan ini menggunakan kluster Elasticsearch V6.7 (Edisi Kernel-enhanced).
Instance ECS yang menjalankan CentOS 7.6 (64-bit), digunakan untuk meng-host Canal server dan Canal adapter. Lihat Buat instance menggunakan wizard.
Ketiga sumber daya tersebut berada dalam virtual private cloud (VPC) yang sama.
Alamat IP instance ECS ditambahkan ke daftar putih alamat IP kluster Elasticsearch. Lihat Konfigurasi daftar putih alamat IP publik atau privat untuk kluster Elasticsearch.
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 Canal Versi Elasticsearch yang didukung 1.1.4 6.x 1.1.5 7.x 1.1.7 8.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.
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.Di panel navigasi kiri, klik Dev Tools.
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
Hubungkan ke instance ECS. Lihat Hubungkan ke instance Linux menggunakan password atau kunci.
Catatan Dalam contoh ini, digunakan pengguna biasa.Cari paket JDK yang tersedia:
sudo yum search java | grep -i --color JDKInstal JDK. Panduan ini menggunakan
java-1.8.0-openjdk-devel.x86_64:sudo yum install java-1.8.0-openjdk-devel.x86_64Konfigurasi variabel lingkungan:
Buka
~/.bash_profile:vim ~/.bash_profileTambahkan baris berikut. Ganti
JAVA_HOMEdengan jalur instalasi JDK aktual Anda. Jalankanfind / -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/binTekan Esc, ketik
:wquntuk menyimpan, lalu terapkan konfigurasi:source ~/.bash_profile
Verifikasi instalasi:
java -versionOutput 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
Unduh Canal server 1.1.4:
wget https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.deployer-1.1.4.tar.gzUntuk versi lain, lihat Rilis Canal.
Ekstrak paket:
tar -zxvf canal.deployer-1.1.4.tar.gzEdit
conf/example/instance.properties:Parameter Deskripsi Contoh 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:3306canal.instance.dbUsernameUsername database. Dapatkan dari halaman Accounts instance RDS. canal_usercanal.instance.dbPasswordPassword database. <your-password>vi conf/example/instance.propertiesAtur parameter berikut:

Tekan Esc, ketik
:wquntuk menyimpan.Jalankan Canal server dan verifikasi log:
./bin/startup.sh cat logs/canal/canal.log
Langkah 5: Instal dan mulai Canal adapter
Unduh Canal adapter 1.1.4:
wget https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.adapter-1.1.4.tar.gzEkstrak paket:
tar -zxvf canal.adapter-1.1.4.tar.gzEdit
conf/application.yml:Parameter Deskripsi Contoh canal.conf.canalServerHostAlamat Canal server. Gunakan nilai default. 127.0.0.1:11111canal.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=truecanal.conf.srcDataSources.defaultDS.usernameUsername database. Dapatkan dari halaman Accounts. canal_usercanal.conf.srcDataSources.defaultDS.passwordPassword database. <your-password>canal.conf.canalAdapters.groups.outerAdapters.hosts(di bawahname: es)Titik akhir internal dan port kluster Elasticsearch. Dapatkan dari halaman Basic Information kluster. es-cn-v64xxxxxxxxx3medp.elasticsearch.aliyuncs.com:9200canal.conf.canalAdapters.groups.outerAdapters.modeMode transport. Atur ke rest.restcanal.conf.canalAdapters.groups.outerAdapters.properties.security.authKredensial Elasticsearch dalam format <username>:<password>.elastic:es_passwordcanal.conf.canalAdapters.groups.outerAdapters.properties.cluster.nameID kluster Elasticsearch. Dapatkan dari halaman Basic Information. es-cn-v64xxxxxxxxx3medpvi conf/application.ymlAtur parameter berikut:

Tekan Esc, ketik
:wquntuk menyimpan.Edit file pemetaan bidang
conf/es/*.ymluntuk menentukan cara kolom MySQL dipetakan ke bidang Elasticsearch:Parameter Deskripsi Nilai yang digunakan dalam panduan ini esMapping._indexNama indeks Elasticsearch yang dibuat di Langkah 2. es_testesMapping._typeTipe indeks Elasticsearch. _docesMapping._idBidang ID dokumen. _idesMapping.sqlKueri SQL yang memilih kolom untuk disinkronkan. select t.id as _id, t.id, t.count, t.name, t.color from es_test t
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
Langkah 6: Verifikasi sinkronisasi
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
UPDATEatauDELETE.Masuk ke Konsol Kibana kluster Elasticsearch Anda. Lihat Masuk ke Konsol Kibana.
Di panel navigasi kiri, klik Dev Tools.
Pada tab Console, jalankan kueri berikut:
PentingCanal hanya menyinkronkan perubahan inkremental.
GET /es_test/_searchJika 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.
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.gzEkstrak paket:
tar -zxvf canal.adapter-1.1.5-SNAPSHOT.tar.gzSalin 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/pluginHapus file plugin asli:
rm -rf client-adapter.es7x-1.1.5-jar-with-dependencies.jarUbah 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:
Unduh konektor MySQL 8.0:
wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.29.zipEkstrak paket:
unzip mysql-connector-java-8.0.29.zipSalin JAR konektor ke direktori lib adapter:
mv mysql-connector-java-8.0.29/mysql-connector-java-8.0.29.jar lib/Atur izin yang diperlukan:
chmod 777 lib/mysql-connector-java-8.0.29.jar chmod +st lib/mysql-connector-java-8.0.29.jarHapus driver MySQL 5.x lama:
rm -rf lib/mysql-connector-java-5.1.40.jar