Canal+Elasticsearch+Kibana实时同步数据

Canal+elasticsearch实时同步数据

canal

canal主要用途是对MySQL数据库增量日志进行解析,提供增量数据的订阅和消费,简单说就是可以对MySQL的增量数据进行实时同步,支持同步到MySQL、Elasticsearch、HBase等数据存储中去。

1.canal工作原理

canal会模拟MySQL主库和从库的交互协议,从而伪装成MySQL的从库,然后向MySQL主库发送dump协议,MySQL主库收到dump请求会向canal推送binlog,canal通过解析binlog将数据同步到其他存储中去。

在这里插入图片描述

canal使用

接下来我们来学习下canal的使用,以MySQL实时同步数据到Elasticsearch为例。

2.组件下载

  • 首先我们需要下载canal的各个组件canal-servercanal-adaptercanal-admin,下载地址:https://github.com/alibaba/canal/releases

在这里插入图片描述

  • canal的各个组件的用途各不相同,下面分别介绍下:

    • canal-server(canal-deploy):可以直接监听MySQL的binlog,把自己伪装成MySQL的从库,只负责接收数据,并不做处理。
    • canal-adapter:相当于canal的客户端,会从canal-server中获取数据,然后对数据进行同步,可以同步到MySQL、Elasticsearch和HBase等存储中去。
    • canal-admin:为canal提供整体配置管理、节点运维等面向运维的功能,提供相对友好的WebUI操作界面,方便更多用户快速和安全的操作。

    由于不同版本的MySQL、Elasticsearch和canal会有兼容性问题,所以我们先对其使用版本做个约定。

应用端口版本
MySQL33065.7.24
Elasticsearch92007.13.2
Kibanba56017.13.2
canal-server111111.1.6-SNAPSHOT
canal-adapter80811.1.6-SNAPSHOT
canal-admin80891.1.6-SNAPSHOT
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101 
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql  
## 开启二进制日志功能
log-bin=mall-mysql-bin  
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M  
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=row  
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062  
  • 配置完成后需要重新启动MySQL,重启成功后通过如下命令查看binlog是否启用;
show variables like '%log_bin%'
+---------------------------------+-------------------------------------+
| Variable_name                   | Value                               |
+---------------------------------+-------------------------------------+
| log_bin                         | ON                                  |
| log_bin_basename                | /var/lib/mysql/mall-mysql-bin       |
| log_bin_index                   | /var/lib/mysql/mall-mysql-bin.index |
| log_bin_trust_function_creators | OFF                                 |
| log_bin_use_v1_row_events       | OFF                                 |
| sql_log_bin                     | ON                                  |
+---------------------------------+-------------------------------------+
show variables like 'binlog_format%';  
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW   |
+---------------+-------+
  • 接下来需要创建一个拥有从库权限的账号,用于订阅binlog,这里创建的账号为canal:canal
CREATE USER canal IDENTIFIED BY 'canal';  
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;
  • 创建好测试用的数据库canal-test,之后创建一张商品表product,建表语句如下。
CREATE TABLE `product`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `sub_title` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `price` decimal(10, 2) NULL DEFAULT NULL,
  `pic` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

3.canal-deployer使用

  • 将我们下载好的压缩包canal.deployer-1.1.6-SNAPSHOT.tar.gz上传到Linux服务器,然后解压到指定目录/mydata/canal-server,可使用如下命令解压;
tar -zxvf canal.deployer-1.1.6-SNAPSHOT.tar.gz
  • 解压完成后目录结构如下;
├── bin
│   ├── restart.sh
│   ├── startup.bat
│   ├── startup.sh
│   └── stop.sh
├── conf
│   ├── canal_local.properties
│   ├── canal.properties
│   └── example
│       └── instance.properties
├── lib
├── logs
│   ├── canal
│   │   └── canal.log
│   └── example
│       ├── example.log
│       └── example.log
└── plugin
  • 修改配置文件conf/example/instance.properties,按如下配置即可,主要是修改数据库相关配置;
# 需要同步数据的MySQL地址
canal.instance.master.address=116.205.224.23:3306
canal.instance.master.journal.name=
canal.instance.master.position=
canal.instance.master.timestamp=
canal.instance.master.gtid=
# 用于同步数据的数据库账号
canal.instance.dbUsername=canal
# 用于同步数据的数据库密码
canal.instance.dbPassword=canal
# 数据库连接编码
canal.instance.connectionCharset = UTF-8
# 需要订阅binlog的表过滤正则表达式
canal.instance.filter.regex=.*\\..*
  • 使用startup.sh脚本启动canal-server服务;
sh bin/startup.sh
  • 启动成功后可使用如下命令查看服务日志信息;
tail -f logs/canal/canal.log
2022-08-31 15:53:13.789 [main] INFO  com.alibaba.otter.canal.deployer.CanalLauncher - ## set default uncaught exception handler
2022-08-31 15:53:13.804 [main] INFO  com.alibaba.otter.canal.deployer.CanalLauncher - ## load canal configurations
2022-08-31 15:53:13.819 [main] INFO  com.alibaba.otter.canal.deployer.CanalStarter - ## start the canal server.
2022-08-31 15:53:13.867 [main] INFO  com.alibaba.otter.canal.deployer.CanalController - ## start the canal server[172.20.0.1(172.20.0.1):11111]
2022-08-31 15:53:15.588 [main] INFO  com.alibaba.otter.canal.deployer.CanalStarter - ## the canal server is running now ......

  • 如果想要停止canal-server服务可以使用如下命令。
sh bin/stop.sh

4.canal-adapter使用

  • 将我们下载好的压缩包canal.adapter-1.1.6-SNAPSHOT.tar.gz上传到Linux服务器,然后解压到指定目录/mydata/canal-adpter,解压完成后目录结构如下;
├── bin
│   ├── adapter.pid
│   ├── restart.sh
│   ├── startup.bat
│   ├── startup.sh
│   └── stop.sh
├── conf
│   ├── application.yml
│   ├── es6
│   ├── es7
│   │   ├── biz_order.yml
│   │   ├── customer.yml
│   │   └── product.yml
│   ├── hbase
│   ├── kudu
│   ├── logback.xml
│   ├── META-INF
│   │   └── spring.factories
│   └── rdb
├── lib
├── logs
│   └── adapter
│       └── adapter.log
└── plugin
  • 修改配置文件conf/application.yml,按如下配置即可,主要是修改canal-server配置、数据源配置和客户端适配器配置;
canal.conf:
  mode: tcp # 客户端的模式,可选tcp kafka rocketMQ
  flatMessage: true # 扁平message开关, 是否以json字符串形式投递数据, 仅在kafka/rocketMQ模式下有效
  zookeeperHosts:    # 对应集群模式下的zk地址
  syncBatchSize: 1000 # 每次同步的批数量
  retries: 0 # 重试次数, -1为无限重试
  timeout: # 同步超时时间, 单位毫秒
  accessKey:
  secretKey:
  consumerProperties:
    # canal tcp consumer
    canal.tcp.server.host: 127.0.0.1:11111 #设置canal-server的地址
    canal.tcp.zookeeper.hosts:
    canal.tcp.batch.size: 500
    canal.tcp.username:
    canal.tcp.password:

  srcDataSources: # 源数据库配置
    defaultDS:
      url: jdbc:mysql://116.205.224.23:3306/canal-test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false
      username: canal
      password: canal
  canalAdapters: # 适配器列表
  - instance: example # canal实例名或者MQ topic名
    groups: # 分组列表
    - groupId: g1 # 分组id, 如果是MQ模式将用到该值
      outerAdapters:
      - name: logger # 日志打印适配器
      - name: es7 # ES同步适配器
        hosts: http://116.205.224.23:9200 # ES连接地址
        properties:
          mode: rest # 模式可选transport(9300) 或者 rest(9200)
          # security.auth: test:123456 #  only used for rest mode
          cluster.name: elasticsearch # ES集群名称
  • 添加配置文件canal-adapter/conf/es7/product.yml,用于配置MySQL中的表与Elasticsearch中索引的映射关系;
dataSourceKey: defaultDS # 源数据源的key, 对应上面配置的srcDataSources中的值
destination: example  # canal的instance或者MQ的topic
groupId: g1 # 对应MQ模式下的groupId, 只会同步对应groupId的数据
esMapping:
  _index: canal_product # es 的索引名称
  _id: _id  # es 的_id, 如果不配置该项必须配置下面的pk项_id则会由es自动分配
  sql: "SELECT
        	p.id AS _id,
        	p.title,
        	p.sub_title,
        	p.price,
        	p.pic
        FROM
        	product p"        # sql映射
  etlCondition: "where a.c_time>={}"   #etl的条件参数
  commitBatch: 3000   # 提交批大小
  • 使用startup.sh脚本启动canal-adapter服务;
sh bin/startup.sh
  • 启动成功后可使用如下命令查看服务日志信息;
tail -f logs/adapter/adapter.log

在这里插入图片描述

5.数据演示

  • 在kibana创建索引
PUT canal_product
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text"
      },
      "sub_title": {
        "type": "text"
      },
      "pic": {
        "type": "text"
      },
      "price": {
        "type": "double"
      }
    }
  }
}

在这里插入图片描述

  • 创建完成后可以查看下索引的结构;

    GET canal_product/_mapping
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0oDfV5dA-1665367244967)(Canal+elasticsearch%E5%AE%9E%E6%97%B6%E5%90%8C%E6%AD%A5%E6%95%B0%E6%8D%AE.assets/image-20220901145904199.png)]

    在canal-test数据库下插入语句

    INSERT INTO product ( id, title, sub_title, price, pic ) VALUES ( 5, '小米8', ' 全面屏游戏智能手机 6GB+64GB', 1999.00, NULL );
    
  • 创建成功后,在Elasticsearch中搜索下,发现数据已经同步了;

    GET canal_product/_search
    

在这里插入图片描述

  • 再使用如下SQL对数据进行修改;

    UPDATE product SET title='小米20' WHERE id=5
    

在这里插入图片描述

发现已经同步更改

  • 再使用如下SQL对数据进行删除操作;

    DELETE FROM product WHERE id=5
    

删除也同步删除。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dPbpCm86-1665367244968)(Canal+elasticsearch%E5%AE%9E%E6%97%B6%E5%90%8C%E6%AD%A5%E6%95%B0%E6%8D%AE.assets/image-20220901150635275.png)]

6.canal-admin使用(可以选择性安装)

  • 将我们下载好的压缩包canal.admin-1.1.6-SNAPSHOT.tar.gz上传到Linux服务器,然后解压到指定目录/mydata/canal-admin,解压完成后目录结构如下;
├── bin
│   ├── restart.sh
│   ├── startup.bat
│   ├── startup.sh
│   └── stop.sh
├── conf
│   ├── application.yml
│   ├── canal_manager.sql
│   ├── canal-template.properties
│   ├── instance-template.properties
│   ├── logback.xml
│   └── public
│       ├── avatar.gif
│       ├── index.html
│       ├── logo.png
│       └── static
├── lib
└── logs
  • 创建canal-admin需要使用的数据库canal_manager,创建SQL脚本为/mydata/canal-admin/conf/canal_manager.sql,会创建如下表;

在这里插入图片描述

  • 修改配置文件conf/application.yml,按如下配置即可,主要是修改数据源配置和canal-admin的管理账号配置,注意需要用一个有读写权限的数据库账号,比如管理账号root:root

    server:
      port: 8089
    spring:
      jackson:
        date-format: yyyy-MM-dd HH:mm:ss
        time-zone: GMT+8
    
    spring.datasource:
      address: 127.0.0.1:3306
      database: canal_manager
      username: root
      password: root
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://${spring.datasource.address}/${spring.datasource.database}?useUnicode=true&characterEncoding=UTF-8&useSSL=false
      hikari:
        maximum-pool-size: 30
        minimum-idle: 1
    
    canal:
      adminUser: admin
      adminPasswd: admin
    
  • 接下来对之前搭建的canal-serverconf/canal_local.properties文件进行配置,主要是修改canal-admin的配置,修改完成后使用sh bin/startup.sh local重启canal-server

# register ip
canal.register.ip =

# canal admin config
canal.admin.manager = 127.0.0.1:8089
canal.admin.port = 11110
canal.admin.user = admin
canal.admin.passwd = 4ACFE3202A5FF5CF467898FC58AAB1D615029441
# admin auto register
canal.admin.register.auto = true
canal.admin.register.cluster = 
  • 使用startup.sh脚本启动canal-admin服务;
sh bin/startup.sh

账号 admin 密码 123456

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-obQAFXhL-1665367244969)(Canal+elasticsearch%E5%AE%9E%E6%97%B6%E5%90%8C%E6%AD%A5%E6%95%B0%E6%8D%AE.assets/image-20220901153053876.png)]

  • 登录成功后即可使用Web界面操作canal-server。

7.kibana使用

7.1如何创建索引

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sELZqJSo-1665367244969)(Canal+elasticsearch%E5%AE%9E%E6%97%B6%E5%90%8C%E6%AD%A5%E6%95%B0%E6%8D%AE.assets/image-20220902093218739.png)]

## [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gwNkr4Dw-1665367244969)(Canal+elasticsearch%E5%AE%9E%E6%97%B6%E5%90%8C%E6%AD%A5%E6%95%B0%E6%8D%AE.assets/image-20220902093250117.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eu2JunzZ-1665367244970)(Canal+elasticsearch%E5%AE%9E%E6%97%B6%E5%90%8C%E6%AD%A5%E6%95%B0%E6%8D%AE.assets/image-20220902093403255.png)]

7.2kibana启用安全

1.修改 elasticsearch.yml ,打开配置

#增加配置,打开security
xpack.security.enabled: true

2.初始化各个角色密码

先进入容器

docker exec -it hjt-elasticsearch /bin/bash

执行

bin/elasticsearch-setup-passwords interactive

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xGUKGEmW-1665367244970)(Canal+elasticsearch%E5%AE%9E%E6%97%B6%E5%90%8C%E6%AD%A5%E6%95%B0%E6%8D%AE.assets/image-20220902110255307.png)]

注意:这里我密码设置为 970628hjt.

3.配置kibana
编辑config/kibana.yml
elasticsearch.username: “elastic”
elasticsearch.password: “970628hjt.”

重启kibana和elasticsearch

 docker restart hjt-elasticsearch

 docker restart hjt-kibana

下面两个登录界面账号密码都是这个

账号:elastic

密码:970628hjt.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ytwSOjI0-1665367244970)(Canal+elasticsearch%E5%AE%9E%E6%97%B6%E5%90%8C%E6%AD%A5%E6%95%B0%E6%8D%AE.assets/image-20220902111102876.png)]

在这里插入图片描述

注意:nacos中的配置要对应加下账号密码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PB121foc-1665367244971)(Canal+elasticsearch%E5%AE%9E%E6%97%B6%E5%90%8C%E6%AD%A5%E6%95%B0%E6%8D%AE.assets/image-20220902111939022.png)]

搭建过程问题汇总

问题1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cdZNBRt8-1665367244971)(Canal+elasticsearch%E5%AE%9E%E6%97%B6%E5%90%8C%E6%AD%A5%E6%95%B0%E6%8D%AE.assets/image-20220901094520786.png)]

解决方案:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-igdYU1S4-1665367244971)(Canal+elasticsearch%E5%AE%9E%E6%97%B6%E5%90%8C%E6%AD%A5%E6%95%B0%E6%8D%AE.assets/image-20220901142931315.png)]

名字要改为 es7

问题2

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZaHi6qpS-1665367244971)(Canal+elasticsearch%E5%AE%9E%E6%97%B6%E5%90%8C%E6%AD%A5%E6%95%B0%E6%8D%AE.assets/image-20220901143032311.png)]

解决方案:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DvYDTD3a-1665367244972)(Canal+elasticsearch%E5%AE%9E%E6%97%B6%E5%90%8C%E6%AD%A5%E6%95%B0%E6%8D%AE.assets/image-20220901143106258.png)]

索引地址加上 http://

个人搭建项目代码地址:
https://github.com/hongjiatao/spring-boot-anyDemo

欢迎收藏点赞三连。谢谢!有问题可以留言博主会24小时内无偿回复。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有点东西且很多

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值