qinfengge

qinfengge

醉后不知天在水,满船清梦压星河
github
email
telegram

使用canalデータベースの監視

canal とは何ですか#

canal は、水路 / パイプ / 水路という意味で、主な用途は MySQL データベースの増分ログの解析に基づいて、増分データのサブスクリプションと消費を提供します。

通常、canal は MySQL データベースのデータを同期または監視するために使用されます。たとえば、データをデータベースに入れた後、ES に同期します。
canal は MySQL のスレーブとして自己を偽装し、マスターから送信されたバイナリログを解析および処理します。

image

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';

image

次に、公式リポジトリから最新バージョンをダウンロードして展開します。
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 を起動します。

image
これで起動が成功したことを意味します。

Spring Boot の設定#

Spring Boot で canal を使用するには、次の方法があります。

  1. 公式の依存関係を使用する
  2. サードパーティの依存関係を使用する
リポジトリバージョン利点と欠点
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 のアノテーションを使用して、エンティティクラス名から自動的にテーブル名を変換します。

拡張#

使用中に、エンティティクラスのフィールドが以下のような場合にエラーが発生することがわかりました。

image

これは、変換プロセスでパーサーが指定されていないためです。
私が提案したこの Issuesを参照するか、作者の修正を待つことができます(作者は修正済みです)。

Docker のインストール#

Linux で Docker を使用してインストールする場合は、次の手順に従います。

  1. イメージをダウンロードします。
docker pull canal/canal-server:v1.1.5
  1. 最初に起動します。
docker run -p 11111:11111 --name canal -d canal/canal-server:v1.1.5
  1. 設定ファイルをコピーします。
# 設定ファイルをコピーします
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 を確認すると、ホストマシンのアドレスが表示されます。

image

  1. イメージを再起動します。
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 イメージを使用しない理由については、このリンクを参照してください。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。