Liunx の下で Canal を介して MySQL データを Elasticsearch に同期する

Liunx の下で Canal を介して MySQL データを Elasticsearch に同期する

1. 運河の背景情報

Canal は Github のオープン ソース ETL (Extract Transform Load) ソフトウェアです。

ここに画像の説明を挿入

水路/パイプ/溝に変換されるcanalは、主に MySQL データベースに基づいて増分ログを分析し、増分データのサブスクリプションと消費を提供するために使用されます。

現在の canal は 5.1.x 、 5.5.x 、 5.6.x 、 5.7.x 、 8.0.x を含むソース MySQL バージョンをサポートしています

ここに画像の説明を挿入

MySQL マスターはデータの変更をバイナリ ログ (バイナリ ログ、レコードはバイナリ ログ イベントと呼ばれ、show binlog イベントで表示できます) に書き込みます。 MySQL スレーブはマスター
のバイナリ ログ イベントをそのリレー ログ (リレー ログ) にコピーします。
スレーブはリレー ログでイベントをリプレイし、データの変更を自身のデータに反映します

運河のしくみ:

1.1 canal はMySQL スレーブの対話プロトコルをシミュレートし、MySQL スレーブのふりをして、ダンプ プロトコルを MySQL マスターに送信します。 1.2 MySQL マスターはダンプ要求を受信し、バイナリ ログを
スレーブ (つまり、canal) にプッシュし始めます。
元はバイトストリーム)

二、mysql関連の設定

1. canal は MySQL の binlog にサブスクライブすることでデータ同期を実現するため、MySQL の binlog 書き込み機能を有効にして ROW モードに設定する必要がありますbinlog-format.私の設定ファイルは /etc/my.cnf ですが、これを次のように変更します: Canal

[mysqld]
log-bin=mall-mysql-bin  #开启二进制日志功能 或者 log_bin=on #开启bin-log日志
binlog_format=row  #设置使用的二进制日志格式(mixed,statement,row)
server_id=101  #设置server_id,同一局域网中需要唯一 , 注意server_id不要和canal的slaveId重复

binlog-ignore-db=mysql    #指定不需要同步的数据库名称
binlog_cache_size=1M  #设置二进制日志使用内存大小(事务)
expire_logs-days=7  #二进制日志过程清理时间。默认为0,表示不自动清理
slave_skip_errors=1062  #跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断  #如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
symbolic-links = 0: #符号连接,如果设置为1,则mysql数据库和表里的数据支持储存在datadir目录之外的路径下,默认都是0(较新版本的mysql下默认是1)
pid-file=/usr/local/mysql/data/mysql.pid
log-error=/usr/local/mysql/data/mysql.log
socket=/var/lib/mysql/mysql.sock
datadir=/usr/local/mysql/data
log-bin=/usr/local/mysql/data/mysql-bin    #设置logbin日志存放目录

2. 構成が完了したら、MySQL を再起動する必要があります。再起動が成功したら、次のコマンドを使用して binlog が有効になっているかどうかを確認します。

SHOW VARIABLES LIKE '%log_bin%';

ここに画像の説明を挿入

3.MySQLのbinlogモードを再度確認する

SHOW VARIABLES LIKE 'binlog_format';

ここに画像の説明を挿入

4. 次に、binlog をサブスクライブするスレーブ ライブラリのアクセス許可を持つアカウントを作成する必要があります。ここで作成するアカウントは、canal:canal

GREAT USER canal IDENTIFIED BY 'canal';

5. canal ユーザー権限を付与する

GRANT SELECT, INSERT,REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;

6. ライブラリを作成し、テーブルを作成する

create database elasticsearch;
CREATE TABLE `es_test` (
  `id` int NOT NULL AUTO_INCREMENT,
  `count` text,
  `name` text,
  `color` text,
  PRIMARY KEY (`id`)
) 

3. canalのダウンロードと利用

1. MySQL、Elasticsearch、canal のバージョンが異なると互換性の問題が発生するため、この記事に含まれるコンポーネントのバージョンを以下に紹介します。

コンポーネント ポート バージョン
弾性検索 9200 7.13.2 openjdk11 での使用
きばな 5601 7.13.2 openjdk11 での使用
mysql 3306 8.0.20 と openjdk11 の組み合わせ
運河管理者 8089 1.16 openjdk11 での使用
運河サーバー 11111 1.16 openjdk11 での使用
カナルアダプター 8081 1.16 openjdk11 での使用

2. canal の各コンポーネントをダウンロードcanal-server, canal-adapter,canal-adminダウンロードアドレス: https://github.com/alibaba/canal/releases

3. 水路の各構成要素の機能紹介

canal-server (canal-deploy): MySQL の binlog を直接監視し、MySQL スレーブ ライブラリに偽装し、データを処理せずに受信のみを担当します。

canal-adapter: canal クライアントに相当します。canal-server からデータを取得し、データを同期します。データは、MySQL、Elasticsearch、HBase などのストレージに同期できます。

canal-admin: 全体的な構成管理やノードの O&M などの O&M 指向の機能を canal に提供し、比較的使いやすい WebUI 操作インターフェイスを提供して、より多くのユーザーが迅速かつ安全に操作できるようにします。
4. canal-serverの利用

ダウンロードした圧縮パッケージを Linux サーバーにアップロードしcanal.deployer-1.1.6-SNAPSHOT.tar.gz、指定したディレクトリに解凍します/home/server。次のコマンドを使用して解凍できます。

tar xvzf canal.deployer-1.1.5-SNAPSHOT.tar.gz -C /home/server/

canal-server の作業ディレクトリは以下の通り

ここに画像の説明を挿入

conf/example/instance.properties ファイルを変更します。主に次の点に注意してください。

canal.instance.master.address=127.0.0.1:3306     #mysql主数据库地址
# username/password
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
canal.instance.connectionCharset = UTF-8
canal.instance.filter.regex=.*\\..*    #需要订阅binlog的表过滤正则表达式

canal-server を起動してログを表示する

./bin/startup.sh  或者: sh bin/startup.sh
cat logs/canal/canal.log 或者:tail -f logs/example/example.log

ここに画像の説明を挿入

5.カナルアダプターの使用

ダウンロードした圧縮パッケージをcanal.adapter-1.1.5-SNAPSHOT.tar.gzLinuxサーバーにアップロードし、指定のディレクトリに解凍します/home/adpter. 解凍後のディレクトリ構成は以下のとおりです.

ここに画像の説明を挿入

構成ファイル conf/application.yml を次のように変更します。主に canal-server 構成、データ ソース構成、およびクライアント アダプタ構成を変更するために、不要な構成をコメントできます。

ここに画像の説明を挿入

#同步的数据库
  srcDataSources:
    defaultDS:
      url: jdbc:mysql://192.**.**.**:3306/elasticsearch?useUnicode=true&useSSL=true&allowMultiQueries=true&verifyServerCertificate=false&serverTimezone=Asia/Shanghai
      username: canal
      password: canal
  canalAdapters:   # 适配器列表
  - instance: example  #与canal-server中canal.properties的实例名相同
    groups:
    - groupId: g1  #与下面适配器对应
      outerAdapters:
      - name: es7  #es配置,这里使用9200通信 也就是rest模式
        key: es7Key   #对应es的适配器key
        hosts: http://192.**.**.**:9200  # hosts使用的是es的9200端口
        properties:
          mode: rest # or rest
          security.auth: usernama:password
          cluster.name: elasticsearch  #es的集群名称

構成ファイルを追加して、canal-adapter/conf/es7/es_test.ymlMySQL のテーブルと Elasticsearch のインデックス間のマッピング関係を構成します

dataSourceKey: defaultDS
outerAdapterKey: es7Key     # 对应application.yml中es配置的key
destination: example #和上面配置文件对应
groupId: g1 #和配置文件对应
esMapping:
  _index: es_test   #es索引名称
  _id: id   # 需要同步到Elasticsearch实例的文档的id,可自定义。本文使用_id, 如果不配置该项必须配置下面的pk项_id则会由es自动分配
#  relations:
#    customer_order:
#      name: customer
  sql: "select es.id, es.count, es.name,es.color from es_test es" #SQL语句,用来查询需要同步到Elasticsearch中的字段               
#  etlCondition: "where a.c_time>={}"  #etl的条件参数
  commitBatch: 200   # 批量提交的大小

Canal-adapter サービスを起動してログを確認する

./bin/startup.sh   或者: sh bin/startup.sh
cat logs/adapter/adapter.log  或者:tail -f logs/adapter/adapter.log

4. データ同期のデモンストレーション

以上の一連の手順で、基本的にcanalのデータ同期機能が使えるようになったので、以下にデータ同期機能をデモしてみます。

まず、MySQL の製品テーブルに対応する Elasticsearch でインデックスを作成し、次のコマンドを使用して Kibana の Dev Tools で直接作成する必要があります。

インデックスを作成:

PUT es_test
{
  "settings": {
    "index": {
      "number_of_shards": "3",    #主分片数,默认为1,索引分片对ES的查询性能有很大的影响,在应用环境,应该选择适合的分片大小。
      "number_of_replicas": "0"   #设置默认索引副本个数,默认为1个副本。此处的1个副本是指index.number_of_shards的一个完全拷贝;如果有5个主分片1个副本分片,即总分片数为10。
    }
  }
}
注意:可以在线修改副本分片数 number_of_replicas ,但主分片数 number_of_shards 不可以在线改

上記のデータベース フィールド タイプはテキストであるため、マッパーを定義します。

PUT es_test/_doc/_mapping
{
        "properties": {
          "color": {
            "type": "keyword"
          },
          "count": {
            "type": "keyword"
          },
          "name": {
            "type": "keyword"
          }
        }
}

正常に作成されました:

ここに画像の説明を挿入

作成後のインデックス構造を表示します。

ここに画像の説明を挿入

mysql データベースにデータを挿入します。

INSERT INTO `elasticsearch`.`es_test` (`id`, `count`, `name`, `color`) VALUES (1, '99', '不知好歹', '黑色');

Elasticsearch で kibana を検索したところ、データが同期されていることがわかりました

GET es_test/_search

ここに画像の説明を挿入

5. カナルアダプターのよくある起動エラー

java.nio.ByteBuffer.clear()Ljava/nio/ByteBuffer;

解決策: canal1.1.6 は jdk1.6 に対応し、バージョンは対応していません

missing authentication credentials for REST request  401

5. カナルアダプターのよくある起動エラー

java.nio.ByteBuffer.clear()Ljava/nio/ByteBuffer;

解決策: canal1.1.6 は jdk1.6 に対応し、バージョンは対応していません

missing authentication credentials for REST request  401

ソリューション: /home/adpter/conf/application.yml 認証情報を追加: security.auth

おすすめ

転載: blog.csdn.net/lljddddd/article/details/127863611