Canal+KafkaでMySQLとRedis間のデータ同期を実現 (1)
序文
多くのビジネス状況では、クエリの最適化のためにシステムにRedis キャッシュを追加します。
データベースのデータが更新された場合は、redis を同期的に更新するコードをビジネス コードに記述する必要があります。
この種のデータ同期コードをビジネス コードと混合するのは洗練されていません。これらのデータ同期コードを抽出して独立したモジュールを形成できますか? 答えは「はい」です。
アーキテクチャ図
Canal は、スレーブのふりをして mysql binlog をサブスクライブしてデータ同期を実現するミドルウェアです。
canal を使用する最も簡単な方法は、tcp モードで使用することです。
実際、canal は MQ への直接送信をサポートしており、最新バージョンでは現在、Kafka、RocketMQ、RabbitMQ の 3 つの主流 MQ をサポートしています。Canal の RabbitMQ モードには現在特定のバグがあるため、一般的には Kafka または RocketMQ が使用されます。
ここでは、Redis と MySQL の間のデータ同期を実現するために Kafka が使用されています。アーキテクチャ図は次のとおりです。
アーキテクチャ図を通じて、使用するコンポーネント (MySQL、Canal、Kafka、ZooKeeper、Redis) が明確にわかります。
カフカをビルドする
まず、公式 Web サイトからインストール パッケージをダウンロードします。
解凍して /config/server.properties 構成ファイルを開き、ログ ディレクトリを変更します。
まず ZooKeeper を起動します。私はバージョン 3.6.1 を使用しています。
次に、Kafka を起動し、Kafka の bin ディレクトリで cmd を開き、次のコマンドを入力します。
kafka-server-start.bat ../../config/server.properties
Kafka 関連の構成情報が ZooKeeper に登録されていることがわかります。
次に、canal によって送信されたデータを受信するキューを作成し、次のコマンドを使用します。
kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic canaltopic
作成されたキューの名前は ですcanaltopic
。
Cannal サーバーの構成
canal公式 Web サイトから関連するインストール パッケージをダウンロードします。
canal.deployer-1.1.4/conf ディレクトリで canal.properties 構成ファイルを見つけます。
# tcp, kafka, RocketMQ 这里选择kafka模式
canal.serverMode = kafka
# 解析器的线程数,打开此配置,不打开则会出现阻塞或者不进行解析的情况
canal.instance.parser.parallelThreadSize = 16
# 配置MQ的服务地址,这里配置的是kafka对应的地址和端口
canal.mq.servers = 127.0.0.1:9092
# 配置instance,在conf目录下要有example同名的目录,可以配置多个
canal.destinations = example
次に、インスタンスを構成し、/conf/example/instance.properties 構成ファイルを見つけます。
## mysql serverId , v1.0.26+ will autoGen(自动生成,不需配置)
# canal.instance.mysql.slaveId=0
# position info
canal.instance.master.address=127.0.0.1:3306
# 在Mysql执行 SHOW MASTER STATUS;查看当前数据库的binlog
canal.instance.master.journal.name=mysql-bin.000006
canal.instance.master.position=4596
# 账号密码
canal.instance.dbUsername=canal
canal.instance.dbPassword=Canal@****
canal.instance.connectionCharset = UTF-8
#MQ队列名称
canal.mq.topic=canaltopic
#单队列模式的分区下标
canal.mq.partition=0
設定が完了したら、canal を開始できます。
テスト
この時点で、kafka のコンシューマー ウィンドウを開いて、kafka がメッセージを受信するかどうかをテストできます。
次のコマンドを使用して消費量を監視します。
kafka-console-consumer.bat --bootstrap-server 127.0.0.1:9092 --from-beginning --topic canaltopic
ここでは win10 システムの cmd コマンドラインを使用していますが、win10 システムのデフォルトのエンコーディングは GBK ですが、Canal Server は UTF-8 エンコーディングであるため、コンソールに文字化けが表示されます。
cmd コマンド ラインを実行する前に、UTF-8 エンコーディングに切り替えるだけです。コマンド ライン chcp 65001 を使用します。
次に、コマンドを実行して kafka コンシューマーを開くと、コードが文字化けしなくなります。
次のステップでは、Redis を起動し、データを Redis に同期するだけです。
Redis クライアントのカプセル化
環境がセットアップされたら、コードを書くことができます。
まず、Kafka と Redis の Maven 依存関係を紹介します。
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
次の設定を application.yml ファイルに追加します。
spring:
redis:
host: 127.0.0.1
port: 6379
database: 0
password: 123456
Redis を操作するためのツール クラスをカプセル化します。
@Component
public class RedisClient {
/**
* 获取redis模版
*/
@Resource
private StringRedisTemplate stringRedisTemplate;
/**
* 设置redis的key-value
*/
public void setString(String key, String value) {
setString(key, value, null);
}
/**
* 设置redis的key-value,带过期时间
*/
public void setString(String key, String value, Long timeOut) {
stringRedisTemplate.opsForValue().set(key, value);
if (timeOut != null) {
stringRedisTemplate.expire(key, timeOut, TimeUnit.SECONDS);
}
}
/**
* 获取redis中key对应的值
*/
public String getString(String key) {
return stringRedisTemplate.opsForValue().get(key);
}
/**
* 删除redis中key对应的值
*/
public Boolean deleteKey(String key) {
return stringRedisTemplate.delete(key);
}
}
OpenAI、ChatGPTを全ユーザーに無料公開 音声 プログラマーがETC残高を改ざんし年間260万元以上を横領 Spring Boot 3.2.0が正式リリース Google従業員が退社後の偉い人を批判 に深く関与Flutter プロジェクトと策定された HTML 関連標準 Microsoft Copilot Web AI が 12 月 1 日に正式にリリースされ、中国 Microsoft のオープンソース ターミナル チャットをサポート Rust Web フレームワーク Rocket が v0.5 をリリース: 非同期、SSE、WebSocket などを サポートRedis は、純粋な C 言語コードを使用して Telegram Bot フレームワークを実装します 。オープンソース プロジェクトのメンテナーであれば、「この種の応答にどこまで耐えることができますか?」という問題に遭遇します。 PHP 8.3 GAこの記事は、複数の記事を公開するブログOpenWriteによって公開されています。