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

参考
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的版本对应以及中文设置问题,可以参考

0. 前置步骤

dokcer服务网络准备
参考让ELK在同一个docker网络下通过名字直接访问, 首先用docker设置一个网络,以后所有相关的容器都放到这里。

docker network create mynetwork

ES的内存准备
命令行输入

sysctl -w vm.max_map_count=262144

1. 安装Kibana和Elasticsearch

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

Kibana修改
原配置(7.8.0)

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

现配置(6.8.8)

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 slpcat/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-adapter

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文件夹下修改,注意以下字段的配置。目前只是能够运行起来,至于业务实际应用可能还有待验证。

在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是部署 Canal 和 RabbitMQ 的 Docker-Compose 文件: ```yaml version: '3' services: mysql: image: mysql:8.0.30 restart: always environment: MYSQL_ROOT_PASSWORD: <your_password> volumes: - ./mysql/conf:/etc/mysql - ./mysql/data:/var/lib/mysql ports: - "3306:3306" command: --default-authentication-plugin=mysql_native_password canal: image: canal/canal-server:1.1.5 restart: always environment: - canal.instance.mysql.slaveId=1234 - canal.instance.master.address=<mysql_host>:3306 - canal.instance.dbUsername=root - canal.instance.dbPassword=<your_password> - canal.instance.connectionCharset=UTF-8 - canal.instance.filter.regex=.*\\..* - canal.instance.tsdb.enable=true - canal.instance.gtidon=false - canal.instance.dump.filter=DruidDataSource ports: - "11111:11111" rabbitmq: image: rabbitmq:3.8-management-alpine restart: always environment: RABBITMQ_DEFAULT_USER: <your_username> RABBITMQ_DEFAULT_PASS: <your_password> ports: - "5672:5672" - "15672:15672" ``` 这里需要替换 `<your_password>`、`<mysql_host>`、`<your_username>` 和 `<your_password>` 为自己的 MySQL root 密码、MySQL 主机地址、RabbitMQ 用户名和密码。 接下来,你需要在 MySQL 中创建一个用户并授予相应权限,以便 Canal 可以访问并同步数据: ```sql CREATE USER 'canal'@'%' IDENTIFIED BY '<your_password>'; GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%'; FLUSH PRIVILEGES; ``` 最后,修改 Canal 配置文件,将数据同步到 RabbitMQ: ```yaml name: example rabbitmq: enabled: true host: localhost:5672 virtualHost: / username: <your_username> password: <your_password> exchange: canal-exchange exchangeType: fanout queue: canal-queue routingKey: canal-routing-key ``` 这里需要替换 `<your_username>` 和 `<your_password>` 为自己的 RabbitMQ 用户名和密码。 现在,你可以使用以下命令启动所有服务: ``` docker-compose up -d ``` Canal 将会自动同步 MySQL 数据到 RabbitMQ 中。你可以通过 RabbitMQ 管理界面查看同步的数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值