Canal+KafkaでMySQLとRedis間のデータ同期を実現 (1)

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);
    }
}

この記事は、複数の記事を公開するブログOpenWriteによって公開されています。

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
{{名前}}
{{名前}}

おすすめ

転載: my.oschina.net/u/5587102/blog/10146002