目次
1. まず、binlog が有効になっているかどうかを確認します
2. binlog を有効にして、mysql サービスを再起動します。
2. canal に MySQL へのリンクを許可する アカウントには、MySQL スレーブとして機能する権限があります。
1. canal をダウンロードし、リリース ページにアクセスし、ダウンロードする必要なパッケージを選択します。例としてバージョン 1.0.17 を取り上げます。
2. conf\example フォルダー内の instance.properties 構成ファイルを変更します。
3. Canal サービスを開始します (Windows では Bat、Linux では sh)
4. リスナーを作成する (Redis/jvm キャッシュ同期)
1. binlog ログを有効にする
1. まず、binlog が有効になっているかどうかを確認します
「%log_bin%」のような変数を表示します。
OFFの場合、命令ビットがONになります。
2. binlog を有効にして、mysqlサービスを再起動します。
「マイコンピュータ」を右クリック - 「管理」 - 「サービス」 - 「MYSQL」 - 「プロパティ」
これが私の.iniアドレスです
[mysqld] の下に追加します
log-bin= mysqlbinlog
binlog-format=ROW
構成後、 mysql サービスを再起動する必要があります
ステータスの表示
「%log_bin%」のような変数を表示します。
正常に開きました
2. canal に MySQL へのリンクを許可する アカウントには、MySQL スレーブとして機能する権限があります。
CREATE USER canal IDENTIFIED BY 'canal';
*.* の SELECT、レプリケーション スレーブ、レプリケーション クライアントを 'canal'@'%' に許可します。
-- *.* のすべての権限を 'canal'@'%' に付与します。
フラッシュ特権;
3. canal をダウンロードして設定する
1. canal をダウンロードし、 リリース ページにアクセスし、ダウンロードする必要なパッケージを選択します。例としてバージョン 1.0.17 を取り上げます。
または、私のファイルを使用します: Alibaba Cloud ディスク共有
減圧後
2. conf\example フォルダー内の instance.properties 構成ファイルを変更します。
最終的な設定ファイル
#################################################
## mysql serverId 、v1.0.26 以降は自動生成されます
# canal.instance.mysql.slaveId=0
# gtid の使用を有効にする true/false
canal.instance.gtidon=false
# 位置情報
canal.instance.master.address=127.0.0.1:3306
canal.instance.master.journal.name=
canal.instance.master.position=
canal.instance.master.timestamp=
canal.instance.master.gtid=
# rds oss バイナリログ
canal.instance.rds.accesskey=
canal.instance.rds.secretkey=
canal.instance.rds.instanceId=
# テーブルのメタ TSDB 情報
canal.instance.tsdb.enable=true
#canal.instance.tsdb.url=jdbc:mysql://127.0.0.1:3306/canal_tsdb
#canal.instance.tsdb.dbUsername=canal
#canal.instance.tsdb.dbPassword=canal
#canal.instance.standby.address =
#canal.instance.standby.journal.name =
#canal.instance.standby.position =
#canal.instance.standby.timestamp =
#canal.instance.standby.gtid=
# ユーザー名パスワード
canal.instance.dbユーザー名=root
canal.instance.dbPassword=msir1234
canal.instance.connectionCharset = UTF-8
# druid を有効にする データベースのパスワードを復号化する
canal.instance.enableDruid=false
#canal.instance.pwdPublicKey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALK4BUxdDltRRE5/zXpVEVPUgunvscYFtEip3pmLlhrWpacX7y7GCMo2/JM6LeHmiiNdH1FWgGCpUfircSwlWKUCAwEAAQ==
# テーブル正規表現
canal.instance.filter.regex=.*\\..*
# テーブルブラック正規表現
canal.instance.filter.black.regex=mysql\\.slave_.*
# テーブルフィールドフィルター(形式: スキーマ1.テーブル名1:フィールド1/フィールド2,スキーマ2.テーブル名2:フィールド1/フィールド2)
#canal.instance.filter.field=test1.t_product:id/件名/キーワード,test2.t_company:id/名前/連絡先/ch
# テーブルフィールドブラックフィルター(形式: スキーマ1.テーブル名1:フィールド1/フィールド2,スキーマ2.テーブル名2:フィールド1/フィールド2)
#canal.instance.filter.black.field=test1.t_product:subject/product_image,test2.t_company:id/name/contact/ch
# mq 構成
canal.mq.topic=例
# スキーマまたはテーブル正規表現による動的トピックルート
#canal.mq.dynamicTopic=mytest1.user,topic2:mytest2\\..*,.*\\..*
canal.mq.partition=0
# ハッシュパーティション構成
#canal.mq.enableDynamicQueuePartition=false
#canal.mq.partitionsNum=3
#canal.mq.dynamicTopicPartitionNum=test.*:4,mycanal:6
#canal.mq.partitionHash=test.table:id^name,.*\\..*
#################################################
3. Canal サービスを開始します (Windows では Bat、Linux では sh)
「startup.bat」をクリックして開始します
ログlogs\canal\canal.logを確認し、起動に成功すると以下のようになります。
4.運河届出原則に基づく
解釈:
- 製品サービスによる製品の変更が完了すると、コードの侵入は一切なく、ビジネスは直接終了します。
- Canal は MySQL データベース内の変更を監視し、変更が検出されるとすぐにキャッシュ サービスに通知します。
- キャッシュ サービスは運河通知を受信し、キャッシュを更新します。
5. プロジェクトの統合
1.pom依存性
GitHub 上のサードパーティのオープンソース canal-starter クライアントを使用します。アドレス: https://github.com/NormanGyllenhaal/canal-client
<依存関係>
<groupId>top.javatool</groupId>
<artifactId>canal-spring-boot-starter</artifactId>
<version>1.2.1-RELEASE</version>
</dependency>
2. 依存関係を記述する
canal:
宛先: サンプル
サーバー: localhost:11111 #canal の IP アドレスとポート
3.Itemエンティティクラスを変更する
Canal が canal-client にプッシュするのは、変更されたデータ行 (行) であり、導入した canal-client は、行データを Item エンティティ クラスにカプセル化するのに役立ちます。このプロセスでは、データベースとエンティティの間のマッピング関係を知る必要があります。JPA アノテーションを使用する必要があります。
@Id、@Column、その他の注釈を使用して、Item フィールドとデータベース テーブル フィールドの間のマッピングを完了します。
データベース名と異なる場合は、@Column を使用する必要があることに注意してください。
package com.springboot3.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Id;
/**
*
* @TableName course
*/
@TableName(value ="course")
@Data
public class Course implements Serializable {
/**
*
*/
@Id
@TableId
private String id;
/**
*
*/
private String name;
/**
*
*/
@Column(name = "teacher_id")
private String teacherId;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
4. リスナーを作成する (Redis/jvm キャッシュ同期)
Canal メッセージをリッスンするインターフェイスを実装してEntryHandler<T>
リスナーを作成します。次の 2 つの点に注意してください。
- 実装クラスでは
@CanalTable("course")
監視するテーブル情報を指定します。 - EntryHandler のジェネリック型は、テーブルに対応するエンティティ クラスです。
package com.springboot3.handler;
import com.springboot3.domain.Course;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import top.javatool.canal.client.annotation.CanalTable;
import top.javatool.canal.client.handler.EntryHandler;
@CanalTable(value = "Course")
@Component
@Slf4j
public class CourseHandler implements EntryHandler<Course> {
@Autowired
private RedisTemplate redisTemplate;
@Override
public void insert(Course course) {
log.info("insert message {}", course);
redisTemplate.opsForValue().set(course.getId(),course);
}
@Override
public void update(Course before, Course after) {
log.info("update before {} ", before);
log.info("update after {}", after);
redisTemplate.opsForValue().set(after.getId(),after);
}
@Override
public void delete(Course course) {
log.info("delete {}", course);
redisTemplate.delete(course.getId());
}
}
6. テスト
1. データベーステーブルデータとRedisデータ
データベース:
レディス:
2. データを追加する
データ物理を追加する
コンソールには以下が表示されます。
Redis データベース:
3. データを変更する
物理を化学に変える
コンソールには以下が表示されます。
Redis データベース:
4. データの削除
化学の科目を削除
コンソールデータ
Redis データベースのデータ: