Docker安装部署MySQL+Canal+Kafka+Camus+HIVE数据实时同步

因为公司业务需求要将mysql的数据实时同步到hive中,在网上找到一套可用的方案,即MySQL+Canal+Kafka+Camus+HIVE的数据流通方式,因为是首次搭建,所以暂时使用伪分布式的搭建方案。


一、安装docker

安装docker的教程网上一搜一大把,请参考:

centos下docker安装教程


二、docker安装MySQL

安装教程网上也有很多,请参考:

docker安装MySQL

1. 开启 Binlog 写入功能

安装完成后,要配置MySQL,开启binlog的写入功能,配置 binlog-format 为 ROW 模式,my.cnf 中配置如下:

vim /etc/my.cnf

[mysqld]
log-bin=mysql-bin # 开启 binlog
binlog-format=ROW # 选择 ROW 模式
server_id=1 # 配置 MySQL replaction 需要定义,不能和 canal 的 slaveId 重复

#重启MySQL数据库
service mysql restart

2. 创建并授权canal用户

授权 canal 连接 MySQL账号具有作为 MySQL slave的权限,如果已有账户可直接 grant

CREATE USER canal IDENTIFIED BY 'canal'; 

GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;

#一定要刷新权限
FLUSH PRIVILEGES;


三、docker安装zookeeper

安装kafka的前置条件是安装zookeeper,
DockerHub中搜索到官方镜像直接拉取

docker pull zookeeper

然后执行

docker run -d --name=zookeeper -p 2181:2181 --privileged=true --restart always -v /etc/localtime:/etc/localtime zookeeper

开放2181端口,因为是单机模式的,暂不需要做其他配置


四、docker安装kafka
1. 安装kafka

DockerHub中搜索到stars最多的一个kafka镜像是:wurstmeister/kafka,拉取镜像

docker pull wurstmeister/kafka

然后执行

docker run  -d --restart=always --privileged=true --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=192.168.0.188:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://124.xx.xx.xxx:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -v /etc/localtime:/etc/localtime  -t wurstmeister/kafka 

参数说明:

  • -e KAFKA_BROKER_ID=0 在kafka集群中,每个kafka都有一个BROKER_ID来区分自己
  • -e KAFKA_ZOOKEEPER_CONNECT=192.168.0.188:2181 配置zookeeper管理kafka的路径192.168.0.188:2181,内网通讯IP
  • -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://124.xx.xx.xxx:9092 把kafka的地址端口注册给zookeeper
  • -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 配置kafka的监听端口
  • -v /etc/localtime:/etc/localtime 容器时间同步虚拟机的时间
2. 验证kafka是否可用

进入docker容器

docker exec -it kafka /bin/bash

本窗口作为消息生产者,输入

kafka-console-producer.sh --broker-list 192.168.0.188:9092 --topic test

再打开一个窗口作为消息的消费者,输入

kafka-console-consumer.sh --bootstrap-server 192.168.0.188:9092 --topic test --from-beginning

注意,此处的IP为自己服务器的IP,不要照搬!

在生产者窗口输入消息,消费者窗口收到相同的消息即为成功


五、docker安装canal
1. 拉取镜像

DockerHub中搜索到官方镜像直接拉取

docker pull canal/canal-server
2. 构建容器
docker run -d --restart=always --name canal -p 11111:11111 -v /etc/localtime:/etc/localtime canal/canal-server
3. 进入容器
docker exec -it canal /bin/bash
4. 编辑配置文件

有两个配置文件,此处只列出需要修改的部分

(1).修改instance配置文件
vi /home/admin/canal-server/conf/example/instance.properties 

修改部分配置

# mysql主库的连接地址
canal.instance.master.address=xxx.xxx.x.xxx:3306
#  mysql主库的账号密码编码方式
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
canal.instance.connectionCharset = UTF-8
# 需要监听的表
canal.instance.filter.regex=orders\\..*,users\\..*,goods\\..*
# topic的生成方式
canal.mq.topic=otherMsg
# 需要根据表名自动在kafka上生成的topic名称
canal.mq.dynamicTopic=users\\.user_detail;orders\\.order_detail

canal.instance.filter.regex
监控哪些表的正则配置:

多个正则之间以逗号(,)分隔,转义符需要双斜杠(\\)

常见例子:

  • 所有表:.* or .*\\…*
  • canal schema下所有表: canal\\…*
  • canal下的以canal打头的表:canal\\.canal.*
  • canal schema下的一张表:canal.test1
  • 多个规则组合使用:canal\\…*,mysql.test1,mysql.test2 (逗号分隔)

注意:此过滤条件只针对row模式的数据有效(mixed/statement因为不解析sql,所以无法准确提取tableName进行过滤)

canal.mq.topic配置的是不符合canal.instance.filter.regex条件的binlog消息要推送到的topic,如果不配置此项,canal会有循环报错信息但不影响使用

canal.mq.dynamicTopic配置规则:

  • 表达式如果只有库名则匹配库名的数据都会发送到对应名称topic;例如库名为examp2,则自动生成的topic名为examp2
  • 如果是库名.表名则匹配的数据会发送到以’库名_表名’为名称的topic;例如exmaple3.\\mytest,则自动生成的topic名为exmaple3_mytest
  • 如要指定topic名称,则可以配置:以topic名 ‘:’ 正则规则作为配置, 多个topic配置之间以 ';'隔开, message会发送到所有符合
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值