canal 同步mysql binlog 日志到 elasticsearch7

目录

一、安装 canal 和 elastic

1、mysql数据库赋予可读binlog 权限

2、在服务器创建 canal 用户并新建相应目录

3、下载canal-1.1.5 和 elasticsearch-7.16.0

4、修改deployer配置

4.1 配置修改如下:

4.2 启动deployer

5. 修改adapter 配置

5.1 配置修改如下 

5.2 增加同步到es的表结构数据(此处的字段需要与es中mapping能对应上)

5.3 启动adapter

6、安装es

6.1 服务器配置,设置vm.max_map_count。

6.2 修改elastic 配置文件 elasticsearch.yml

6.3 启动es

6.4、es索引基本操作

6.5、使用canal同步数据到es前,需要先在es中增加mapping结构映射

6.6、为了保证数据的同步,最好加上手动同步和定时校验的机制。


      日常开发过程中,我们有80%的时间都是使用查询操作,把所有的压力都放在mysql slave上也会存在访问瓶颈,所以我们选用elasticsearch 来查询数据,如何保证es和mysql之间的数据同步呢。

        普通的做法是在程序中将 mysql 发生变化的数据 进行监听,将有发生变化的数据 增加到es中。这种做法可取,并且利用模型监听的方式 也可以实现和业务代码分离。

        第二种做法是使用阿里自研的canal,canal是模拟mysql slave 来拉取mysql的binglog 日志,解析出日志中的sql 变更同步到es中。

一、安装 canal 和 elastic

1、mysql数据库赋予可读binlog 权限

 grant REPLICATION CLIENT  on *.* to canal@"172.31.%" IDENTIFIED BY "canal";
 grant REPLICATION SLAVE  on *.* to canal@"172.31.%" IDENTIFIED BY "canal";

2、在服务器创建 canal 用户并新建相应目录

groupadd canal
useradd -g canal canal
mkdir -p /data/canal/
cd /data/canal/
mkdir canal.deployer-1.1.5
mkdir canal.adapter-1.1.5
mkdir canal.adapter-1.1.5-SNAPSHOT
chown -R canal.canal /data/canal/
su canal

3、下载canal-1.1.5 和 elasticsearch-7.16.0

简介:

canal.deployer-1.1.5.tar.gz对应的是canal的server端,负责订阅并解析Mysql-Binlog

canal.adapter-1.1.5.tar.gz对应的是适配器,负责将server的binlog转换并发送给对应的应用

canal.admin-1.1.5.tar.gz一个可视化webui可以不安装

额外需要下载v1.1.5-alpha-2快照版本的canal.adapter-1.1.5.tar.gz(release1.1.5版本的jar包有bug,无法insert数据到es)

wget https://github.com/alibaba/canal/releases/download/canal-1.1.5/canal.deployer-1.1.5.tar.gz
wget https://github.com/alibaba/canal/releases/download/canal-1.1.5/canal.adapter-1.1.5.tar.gz
wget https://github.com/alibaba/canal/releases/download/canal-1.1.5-alpha-2/canal.adapter-1.1.5-SNAPSHOT.tar.gz
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.16.0-linux-x86_64.tar.gz
tar zxf canal.deployer-1.1.5.tar.gz -C /data/canal/canal.deployer-1.1.5/
tar zxf canal.adapter-1.1.5.tar.gz -C /data/canal/canal.adapter-1.1.5/
tar zxf canal.adapter-1.1.5-SNAPSHOT.tar.gz -C /data/canal/canal.adapter-1.1.5-SNAPSHOT/
tar zxf elasticsearch-7.16.0-linux-x86_64.tar.gz -C /data/canal/
cd /data/canal/canal.adapter-1.1.5-SNAPSHOT/plugin/
mv client-adapter.es7x-1.1.5-SNAPSHOT-jar-with-dependencies.jar client-adapter.es7x-1.1.5-jar-with-dependencies.jar
cp client-adapter.es7x-1.1.5-jar-with-dependencies.jar /data/canal/canal.adapter-1.1.5/plugin/

4、修改deployer配置

cd /data/canal/canal.deployer-1.1.5/conf/example/
cp instance.properties instance.properties.bak
vim instance.properties

4.1 配置修改如下:

#position info
#mysql数据库地址
canal.instance.master.address=127.0.0.1:3306

#username/password mysql 数据库账号和密码
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal

#table regex
#canal.instance.filter.regex=.\..
#配置需要同步binlog日志的数据库和表
canal.instance.filter.regex=库1\\.order.*,库2\\.log.*,库3\\.user.*

#table black regex
canal.instance.filter.black.regex=mysql\.slave_.*

指定全库全表: .*\\..*

指定库全表 canal.instance.filter.regex. 库名..* test\..*

单表 库名.表名 test.user

多规则组合使用

库名1..*,库名2.表名1,库名3.表名2 (逗号分隔)

test\..*,test2.user1,test3.user2 (逗号分隔)

4.2 启动deployer

cd /data/canal/canal.deployer-1.1.5/
sh bin/startup.sh && tail -f logs/example/meta.log

5. 修改adapter 配置

cd /data/canal/canal.adapter-1.1.5/conf
cp application.yml application.yml.bak
vim application.yml

5.1 配置修改如下 

#配置mysql数据

srcDataSources:

  defaultDS:

  url: jdbc:mysql://127.0.0.1:3306/user?useUnicode=true

  username: canal

  password: canal

- name: es7

  key: eskey #es全量更新时的key

  hosts: 127.0.0.1:9300 # 127.0.0.1:9200 for rest mode #estcp

  properties:

   mode: transport #transport # or rest

 # security.auth: test:123456 # only used for rest mode

    #es集群名称

   cluster.name: elasticsearch

5.2 增加同步到es的表结构数据(此处的字段需要与es中mapping能对应上)

dataSourceKey: defaultDS

outerAdapterKey: eskey

destination: example

groupId: g1

esMapping:

_index: 索引名称

_type: order

_id: _id

upsert: true

#relations:

# dc_order:

# name: order

sql: "SELECT o.id AS _id,o.user_id,o.product_id,o.product_name,o.updated_at FROM order o"

etlCondition: "where o.updated_at>={}"

commitBatch: 3000

5.3 启动adapter

cd /data/canal/canal.adapter-1.1.5/
sh bin/startup.sh

6、安装es

6.1 服务器配置,设置vm.max_map_count。

echo "vm.max_map_count=262144" >> /etc/sysctl.conf
sysctl -p

6.2 修改elastic 配置文件 elasticsearch.yml

不同服务器的es集群配置

(master) 节点增加如下配置

node.name: node-1
cluster.initial_master_nodes: ["node-1"]
network.host: 0.0.0.0
network.publish_host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300
#如果新增服务器,在seed_hosts中增加ip
discovery.seed_hosts: ["171.26.132.2", "171.26.132.5"]
#禁止外网下载坐标
ingest.geoip.downloader.enabled: false

(slave) 节点增加如下配置

node.name: node-2
#cluster.initial_master_nodes: ["node-2"]
network.host: 0.0.0.0
network.publish_host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300
#如果新增服务器,在seed_hosts中增加ip
discovery.seed_hosts: ["171.26.132.2", "171.26.132.5"]
ingest.geoip.downloader.enabled: false

同一台服务器启动多个es实例配置

(master) 配置

node.name: node-1
cluster.initial_master_nodes: ["node-1"]
network.host: 0.0.0.0
network.publish_host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300
discovery.seed_hosts: ["127.0.0.1", "127.0.0.1"]

(slave) 配置

node.name: node-2
#cluster.initial_master_nodes: ["node-1"]
network.host: 0.0.0.0
network.publish_host: 0.0.0.0
#http.port: 9200
#transport.tcp.port: 9300
discovery.seed_hosts: ["127.0.0.1", "127.0.0.1"]

es 设置密码(内网可以不设置) 设置es密码

6.3 启动es

cd /data/canal/elasticsearch-7.16.0/
#加参数 -d 表示守护模式
./bin/elasticsearch -d

6.4、es索引基本操作

Order初始化: curl --request POST --url http://localhost:8081/etl/es7/eskey/order.yml --form 'params=0' #eskey 为canal.adapter-1.1.5/application.yml 中canalAdapters: 下的 key:
查看全部索引: curl http://127.0.0.1:9200/_cat/indices
删除索引: curl -X DELETE http://127.0.0.1:9200/索引?pretty
查询映射: curl -X GET http://127.0.0.1:9200/索引/_mapping?pretty
查询索引数据量:curl http://127.0.0.1:9200/_count?pretty
查询单个id:curl http://127.0.0.1:9200/索引/type/_search?pretty -X GET -H 'Content-Type:application/json' -d '{"query":{"match":{"_id":"16528875759937320"}}}'

6.5、使用canal同步数据到es前,需要先在es中增加mapping结构映射

        映射的结构可以与数据表一致, 也可以只是部分字段。

curl -X PUT http://127.0.0.1:9200/索引名称?include_type_name=true -H 'Content-Type:application/json' -d '{"mappings":{"类型名称":{"properties":{"id":{"type":"long"},","user_id":{"type":"long"},"user_name":{"type":"keyword"},"order_no":{"type":"keyword"},"product_id":{"type":"integer"},"order_status":{"type":"integer"},"status":{"type":"integer"},"created_at":{"type":"integer"},"updated_at":{"type":"integer"},"created_by":{"type":"keyword"},"updated_by":{"type":"keyword"}}}}}'

6.6、为了保证数据的同步,最好加上手动同步和定时校验的机制。

6.6.1 每隔2分钟增量同步前15分钟的数据

curl --request POST --url http://localhost:8081/etl/es7/eskey/order.yml --form "params=0"

6.6.2 定时校验机制

每隔一段时间,将数据库和es的数据全量对比,找出es中缺失的数据并重新添加进去。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值