因为公司业务需求要将mysql的数据实时同步到hive中,在网上找到一套可用的方案,即MySQL+Canal+Kafka+Camus+HIVE的数据流通方式,因为是首次搭建,所以暂时使用伪分布式的搭建方案。
一、安装docker
安装docker的教程网上一搜一大把,请参考:
二、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会发送到所有符合