canal とは何ですか#
canal は、水路 / パイプ / 水路という意味で、主な用途は MySQL データベースの増分ログの解析に基づいて、増分データのサブスクリプションと消費を提供します。
通常、canal は MySQL データベースのデータを同期または監視するために使用されます。たとえば、データをデータベースに入れた後、ES に同期します。
canal は MySQL のスレーブとして自己を偽装し、マスターから送信されたバイナリログを解析および処理します。
canal の設定#
canal を使用する前に、ローカルの MySQL サービスを設定してバイナリログを有効にする必要があります。
Windows では、MySQL のインストールディレクトリにある my.ini
ファイルを見つけて、次の設定を [mysqld]
の下に追加します。
#binlogファイル名
log-bin=mysql-bin
#rowモードを選択
binlog_format=ROW
#mysqlインスタンスID、canalのslaveIdと重複してはいけない
server_id=1
Linux では、次のように直接変更します。
vim /etc/my.cnf
[mysqld]
log-bin=mysql-bin # binlogを有効にする
binlog-format=ROW # ROWモードを選択
server_id=1 # MySQL replactionの設定が必要で、CanalのslaveIdと重複しないようにする
設定が完了したら、MySQL サービスを再起動します。
以下のコマンドを使用して正常に有効になったかどうかを確認します。
show variables like 'log_bin';
次に、公式リポジトリから最新バージョンをダウンロードして展開します。
conf
フォルダー内の canal.properties
を編集します(デフォルトのままでも問題ありません)。
重要なのは、次の設定です。
# 指定インターフェース
canal.port = 11111
# 指定インスタンス
canal.destinations = example
# モードを指定します。デフォルトはtcpで、他にkafka、rocketMQ、rabbitMQ、pulsarMQなどがあります。
canal.serverMode = tcp
# rabbitmqを指定します。設定しない場合はデフォルトのtcpを使用できます。
rabbitmq.host =
rabbitmq.virtual.host =
rabbitmq.exchange =
rabbitmq.username =
rabbitmq.password =
rabbitmq.deliveryMode =
次に、example
(上記のインスタンス設定に対応)の instance.properties
を編集します。
# ホストアドレス
canal.instance.master.address=127.0.0.1:3306
# ホストに接続するためのユーザー名とパスワード
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
# 接続時のエンコーディングを指定します
canal.instance.connectionCharset = UTF-8
# 監視するデータベースとテーブルを指定します。この設定はtestデータベースのすべてのテーブルを監視することを意味します。
canal.instance.filter.regex=test..*
設定が完了したら、bin
ディレクトリで startup.bat
を使用して canal を起動します。
これで起動が成功したことを意味します。
Spring Boot の設定#
Spring Boot で canal を使用するには、次の方法があります。
- 公式の依存関係を使用する
- サードパーティの依存関係を使用する
リポジトリ | バージョン | 利点と欠点 |
---|---|---|
https://github.com/alibaba/canal | 公式 | 設定が簡単で実装が困難 |
https://github.com/NormanGyllenhaal/canal-client | サードパーティ | 簡単で使いやすいが、更新が停止しており、バグがある |
https://github.com/behappy-project/behappy-canal | サードパーティ | 上記の改訂版で、継続的な更新がありますが、JDK 17 + のみをサポートしています |
https://github.com/xizixuejie/canal-spring | サードパーティ | 簡単で使いやすく、継続的な更新があります |
最後のものをおすすめします。
Maven に依存関係を追加します。
<dependency>
<groupId>io.github.xizixuejie</groupId>
<artifactId>canal-spring-boot-starter</artifactId>
<version>0.0.5</version>
</dependency>
設定ファイルで登録します。
# canalサーバーアドレス
canal.server=127.0.0.1:11111
# canalのクラスター名は、canalのインストール時に設定した名前と一致する必要があります
canal.destination=example
# 設定されていない場合はデフォルトのtcpモードが使用されますが、設定しないとリスンできない可能性があるため、推奨されます
canal.server-mode=tcp
設定が完了したら、起動クラスに次のコードを追加します。
@EnableCanalListener(basePackages = "com.jkkj.config.canal")
リスナーを有効にし、リスナーの設定パスを指定します。
次に、リスナーを設定します。
@CanalListener(schemaName = "test", tableName = "testTable")
public class TestListener implements EntryListener<TestEntity> {
private static final Logger log = LoggerFactory.getLogger(TestListener.class);
@Override
public void insert(TestEntity testEntity) {
log.info("insert={}", testEntity);
}
@Override
public void update(TestEntity before, TestEntity after) {
log.info("update before={}", before);
log.info("update after={}", after);
}
@Override
public void delete(TestEntity testEntity) {
log.info("delete={}", testEntity);
}
}
@CanalListener
を使用してデータベース名とテーブル名を指定できます。
@CanalListener(schemaName = "test", tableName = "testTable")
または、指定しない場合は、 Entity
オブジェクトに基づいてリスンするため、エンティティクラスで指定する必要があります。
@TableName(value = "inspection_result_home")
この MyBatis Plus のアノテーションを使用して、エンティティクラス名から自動的にテーブル名を変換します。
拡張#
使用中に、エンティティクラスのフィールドが以下のような場合にエラーが発生することがわかりました。
これは、変換プロセスでパーサーが指定されていないためです。
私が提案したこの Issuesを参照するか、作者の修正を待つことができます(作者は修正済みです)。
Docker のインストール#
Linux で Docker を使用してインストールする場合は、次の手順に従います。
- イメージをダウンロードします。
docker pull canal/canal-server:v1.1.5
- 最初に起動します。
docker run -p 11111:11111 --name canal -d canal/canal-server:v1.1.5
- 設定ファイルをコピーします。
# 設定ファイルをコピーします
docker cp canal:/home/admin/canal-server/conf/example/instance.properties /home/docker/canal/conf
docker cp canal:/home/admin/canal-server/conf/canal.properties /home/docker/canal/conf
前の部分はコンテナ内のアドレスで、後の /home/jk/docker/canal/conf
はホストマシンのアドレスです。
4. 設定ファイルを編集します。
主に編集するのは instance.properties
の次の部分です。
# ホストアドレス
canal.instance.master.address=127.0.0.1:3306
127.0.0.1
はコンテナのアドレスを指します。MySQL がホストマシンにインストールされている場合は、ホストマシンのデータベースアドレスを指定する必要があります。ifconfig
コマンドを使用して docker0 を確認すると、ホストマシンのアドレスが表示されます。
- イメージを再起動します。
docker stop canal
docker rm canal
docker run -p 11111:11111 --name canal \
-v /home/jk/docker/canal/conf/instance.properties:/home/admin/canal-server/conf/example/instance.properties \
-v /home/jk/docker/canal/conf/canal.properties:/home/admin/canal-server/conf/canal.properties \
-d canal/canal-server:v1.1.5
最新バージョンの canal イメージを使用しない理由については、このリンクを参照してください。