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.gz
Linuxサーバーにアップロードし、指定のディレクトリに解凍します/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.yml
MySQL のテーブルと 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