使用 Docker 部署 canal 服务实现MySQL和ES实时同步

news2024/12/30 2:55:31

参考
ClientAdapter: Canal的Adapter配置项目
Sync ES:Canal的Adapter中ES同步的配置项
使用 Docker 部署 canal 服务
docker canal-server canal-adapter mysql
Canal(基于Docker同步mysql数据到elasticsearch)
Canal部署过程中的错误

0. 环境介绍

  • Canal 1.1.4
  • Canal Adapter 1.1.4
  • Kibana: 6.8.8
  • ElasticSearch: 6.4.3

由于Canal 1.1.4只能适配 ElasticSearch: 6.4.3,因此使用了上述的版本。
Kibana选择 6.8.8是因为他可以用中文?但我没有配置成功。此外Kibana的6.8可以和ES6.4结合。其他情况下需要版本一一对应

关于Kibana和ES的版本对应以及中文设置问题,可以参考

  • Kibana 汉化相关配置 i18n 及版本问题
  • Kibana将语言设置为中文
  • Elasticsearch和Kibana版本对应关系

1. 安装Kibana和Elasticsearch

参考我之前的博客Ubuntu服务器ELK部署与实践。注:不同的版本对应的配置方案也需要修改,我的修改有:

Kibana修改
原配置

server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://elasticsearch:9200"]
# 操作界面语言设置为中文
i18n.locale: "zh-CN"

现配置

server.port: 5601
server.host: "0.0.0.0"
server.basePath: "/kibana" # 这个是用来配置nginx访问用的
# server.host: "127.0.0.1"
# 注意看这里的参数变了
elasticsearch.url: "http://elasticsearch:9200"
# 操作界面语言设置为中文
# 6.4不支持
# i18n.locale:  "zh-CN"

此外,由于版本变更,相关的API也发生了变更,请多多留意
Create index API 7.8.0
Create index 6.4

数据来自Kaggle的新闻,因此按照数据字段名称,新建如下字段

PUT news_2
{
	"mappings": {
		"_doc": {
			"properties": {
				"id": {
					"type": "text",
					"index": true
				},
				"title": {
					"type": "text",
					"analyzer": "ik_max_word"
				},
				"_desc": {
					"type": "text",
					"analyzer": "ik_max_word"
				},
				"image": {
					"type": "text",
					"analyzer": "ik_max_word"
				},
				"url": {
					"type": "text",
					"analyzer": "ik_max_word"
				},
				"news_source": {
					"type": "text",
					"analyzer": "ik_max_word"
				},
				"_date": {
					"type": "date"
				}
			}
		}
	}
}

2. 安装Canal和Canal Adapter

Canal是用来做数据库slave的,他的原理就是读取数据库的日志文件,实现实时同步(相比logstash的cron表达式可以更加实时)。

2.1 修改数据库配置

2.1.1 修改配置

首先新建数据库的docker镜像

docker run -p 3306:3306 --name mysql \
-v /data/mysql/log:/var/log/mysql \
-v /data/mysql/data:/var/lib/mysql \
-v /data/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7

接下来去/data/mysql/conf路径下,新建my.cnf文件,输入以下内容

[mysqld]
#binlog setting
log-bin=mysql-bin  # 开启logbin
binlog-format=ROW  # binlog日志格式
server-id=1  # mysql主从备份serverId,canal中不能与此相同

docker restart重启mysql

2.1.2 验证mysql binlog配置

新建新闻表

CREATE SCHEMA MyTest;

use MyTest;

create table News
(
id INT(11),
title VARCHAR(2125),
desc VARCHAR(2125),
image VARCHAR(2125),
url VARCHAR(2125),
source VARCHAR(2125),
date Date
)DEFAULT CHARSET=utf8;

检查该新闻表的状态

mysql -u root -p  // mysql登录
>show databases;
>use MyTest;  // 开启数据库
>show variables like 'log_%';
>show variables like 'binlog_format';
>show master status;  // binlog日志文件 mysql-bin.000001
>reset master;  // 重置日志

以下截图来自https://blog.csdn.net/qq_32836247/article/details/116561732,展示了应有的配置结果
在这里插入图片描述

2.1.3 查看日志文件

cd /var/lib/mysql  // 进入日志文件目录
mysqlbinlog -vv mysql-bin.000001  // row格式查看日志

在这里插入图片描述

2.1.4 用JDBC代码插入数据库

这个就自己实现吧。不用全部插入,因为Adapter要基于新的日志和ES同步。

2.2 安装Canal Server

首先安装canal-server,复制配置文件到外面

# 启动docker
docker pull canal/canal-server:v1.1.4
docker run --name canal-server -id canal/canal-server:v1.1.4

# 复制配置文件
docker cp canal-server:/home/admin/canal-server/conf/ /data/canal_/canal
docker cp canal-server:/home/admin/canal-server/logs/ /data/canal_/canal

# 删除并重新启动
docker stop canal-server && docker rm canal-server

docker run --name canal -p 11111:11111 \
-v /data/canal_/canal/conf/example/instance.properties:/home/admin/canal-server/conf/example/instance.properties \
-v /data/canal_/canal/conf/canal.properties:/home/admin/canal-server/conf/canal.properties \
-v /data/canal_/canal/logs/:/home/admin/canal-server/logs/ \
--network mynetwork \ # 这个是我“让ELK在同一个docker网络下通过名字直接访问”博客中新建的网络,以后所有127.0.0.1都写成docker的name就可以
-d canal/canal-server:v1.1.4

修改Server配置文件example/instance.properties
在这里插入图片描述
注意,canal.properties中的destination要和后续的Canal Adapter保持一致
在这里插入图片描述

验证服务是否启动成功

docker exec -it [c_id]/bin/bash
cd canal-server/bin/
./start.sh  // 启动服务
cd canal-server/logs/example/
tail -100f example.log  // 查看日志

在这里插入图片描述

2.3 安装Canal Adapter

# 启动docker
docker pull slpcat/canal-adapter:v1.1.4
docker run --name canal-adapter -id canal/canal-adapter:v1.1.4

# 复制配置文件
docker cp canal-adapter:/opt/canal-adapter/conf /data/canal_/canal-dapter
docker cp canal-adapter:/opt/canal-adapter/logs /data/canal_/canal-dapter

# 删除并重新启动
docker stop canal-adapter && docker rm canal-server

docker run --name canal-adapte -p 8081:8081 \
-v /data/canal_/canal-dapter/conf:/opt/canal-adapter/conf \
-v /data/canal_/canal-dapter/logs:/opt/canal-adapter/logs \
--network mynetwork \
-d slpcat/canal-adapter:v1.1.4

修改两处配置文件

配置文件取消注释一定要自己手动删除#,不要用快捷键。否则会导致文件格式出问题

配置文件详解
ClientAdapter: Canal的Adapter配置项目 application.ym(application.yml)
Sync ES:Canal的Adapter中ES同步的配置项 (user.yml)

修改配置文件application.yml

在这里插入图片描述在这里插入图片描述
name logger就是在发生数据修改的时候,直接实时更新到log中,如下图在这里插入图片描述

修改完上述配置,可以看到name为es的canalAdapters被启动了。因此要去es文件夹下修改,注意以下字段的配置。目前只是能够运行起来,至于业务实际应用可能还有待验证。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/861233.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

dns的负载分配是什么

DNS 负载分配是使用 DNS 系统对传入的网络流量进行分配的一种技术。这可以是基于多种策略来分配的,从简单的轮询到更复杂的基于地理位置或服务器健康状况的分配。下面是 DNS 负载分配的几种常见形式: 轮询(Round Robin)&#xff1…

【LeetCode】102. 二叉树的层序遍历、107. 二叉树的层序遍历 II

作者:小卢 专栏:《Leetcode》 喜欢的话:世间因为少年的挺身而出,而更加瑰丽。 ——《人民日报》 102. 二叉树的层序遍历 102. 二叉树的层序遍历 给你二叉树的根节点 root ,返回其节…

详解双向带头循环链表

今天给大家分享的数据结构中的链表的双向带头循环链表结构!听到这个链表大家可能心中一颤,其实他就是个纸老虎,看着比较难搞,实际上非常简单易懂,创建该结构链表的大佬可谓是真的牛,因为该结构比起单链表要…

Java课题笔记~ HTTP协议(请求和响应)

Servlet最主要的作用就是处理客户端请求,并向客户端做出响应。为此,针对Servlet的每次请求,Web服务器在调用service()方法之前,都会创建两个对象 分别是HttpServletRequest和HttpServletResponse。 其中HttpServletRequest用于封…

8.10论文阅读

文章目录 The multimodal MRI brain tumor segmentation based on AD-Net摘要本文方法损失函数 实验结果 max-vit - unet:多轴注意力医学图像分割摘要本文方法实验结果 The multimodal MRI brain tumor segmentation based on AD-Net 摘要 基于磁共振成像(MRI)的多模态胶质瘤…

SpringBoot笔记:SpringBoot 集成 Dataway 多数据源配置(二)

文章目录 前言核心代码和配置yml 配置注入多数据源常用Spi实现swagger 配置自定义 Udf指定数据源进行查询 前言 之前简单介绍了一下 Dataway 使用,本文继续介绍一下它的多数据源配置和使用。 核心代码和配置 yml 配置 # springboot多环境配置 #端口,…

SpringBoot中间件使用之EventBus、Metric、CommandLineRunner

1、EventBus 使用EventBus 事件总线的方式可以实现消息的发布/订阅功能,EventBus是一个轻量级的消息服务组件,适用于Android和Java。 // 1.注册事件通过 EventBus.getDefault().register(); // 2.发布事件 EventBus.getDefault().post(“事件内容”); …

【HarmonyOS】Java如何引用外部jar包

【关键字】 Java、引用jar包​ 【写在前面】 使用API6和API7开发HarmonyOS应用时,因为应用中只能引用SDK中开放的功能接口,但是部分jdk自带的接口功能在SDK中并未封装,要想在工程中使用jdk开放的接口功能,需要将jdk中的jar包通过…

【华秋干货铺】电源PCB设计汇总

在《PCB设计丨电源设计的重要性》一文中,已经介绍了电源设计的总体要求,以及不同电路的相关布局布线等知识点,那么本篇内容,小编将以RK3588为例,为大家详细介绍其他支线电源的PCB设计。 电源PCB设计 VDD_CPU_BIG0/1 …

uniapp 格式化时间刚刚,几分钟前,几小时前,几天前…

效果如图: 根目录下新建utils文件夹,文件夹下新增js文件,文件内容: export const filters {dateTimeSub(data) {if (data undefined) {return;}// 传进来的data必须是日期格式,不能是时间戳//将字符串转换成时间格式…

63、64、65、66项目实战

erp项目启动: nohup java -jar lemon_erp.jar & 或 java -jar lemon_erp.jar 把node_exporter监控收集器启动: nohup ./node_exporter & 监控机器上: 启动 grafana 和 prometheus 启动grafana: systemctl restart grafana…

机器学习实战2-决策树算法

文章目录 决策树算法核心是要解决两个的关键问题sklearn中的决策树模型sklearn建模步骤分类树Criterionrandom_state && splitter剪枝参数max_depthmin_samples_leaf&&min_samples_splitmax_features&&min_impurity_decrease确认最优剪枝参数目标权重参…

谈谈Spring与字节码生成技术

Java程序员几乎都了解Spring。 它的IoC(依赖反转)和AOP(面向切面编程)功能非常强大、易用。而它背后的字节码生成技术(在运行时,根据需要修改和生成Java字节码的技术)就是一项重要的支撑技术。 …

spring之AOP简单介绍

1.AOP的概念 AOP,Aspect Oriented Programming,面向切面编程,是对面向对象编程OOP的升华。OOP是纵向对一个 事物的抽象,一个对象包括静态的属性信息,包括动态的方法信息等。而AOP是横向的对不同事物的抽象,…

云原生之深入解析Redis的原理分析与环境部署

一、Redis 简介 ① 什么是 Redis ? REmote DIctionary Server(Redis)是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可…

Linux —— 基础I/O(一)

目录 一,背景介绍 二,系统接口函数 open 打开或创建文件 close 关闭文件 read 读取文件 write 写入文件 三,文件描述符 结构体指针files 结构体指针files指向的表files_struct 文件结构体 一,背景介绍 狭义的文件存放在…

爆肝整理,接口测试-Fiddler对Jmeter请求抓包(详细实战)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 使用Fiddler结合J…

编写html页面让谷歌浏览器不弹出“翻译此页”的问题

文章目录 1.问题2.解决总结 1.问题 2.解决 如下图,将html的lang由en改为zh-CN(注意大小写) 总结 将html的lang由en改为zh-CN

基于PyTorch的图像识别

前言 图像识别是计算机视觉领域的一个重要方向,具有广泛的应用场景,如医学影像诊断、智能驾驶、安防监控等。在本项目中,我们将使用PyTorch来开发一个基于卷积神经网络的图像识别模型,用来识别图像中的物体。下面是要识别的四种物…

Java作业2

1.递归求解汉诺塔问题 拿三个为例子 先从A设法拿走两个盘子到B上,再拿一个盘子到C上,再从B上挪走一个到A,再挪下面的到C上 如果有N个盘子,我们也一样的步骤,先设法拿N-1个盘子到B,再拿最底部的盘子到C&a…