最近在做数据仓库相关的项目,需要对各业务系统异构数据进行统一归集,不同业务系统以及相同异构系统不同功能模块用到的数据存储方式不尽相同,其中有一些功能模块采用的数据存储方式为Mongodb,为了能够实时对Mongodb发生变更的数据进行归集,通过调研发现阿里的开源系统MongoShake可以实现该需求,整个环境通过docker搭建,本文将整个搭建过程进行记录,方便有需求的朋友使用。
处理流程
环境准备
环境 | 服务器 | 说明 |
---|---|---|
宿主机 | 172.21.48.1 | |
Zookeeper | 172.17.0.2 | Kafka的Broker由Zookeeper进行管理,所以需先安装Zookeeper环境 |
Kafka | 172.17.0.3 | |
Kafka-Manager | 172.17.0.4 | Kafka的web端管理界面 |
Mongodb | 172.21.48.1 | windows宿主机进行搭建,大家也可通过docker进行搭建 |
MongoShake | 172.17.0.5 | 使用Centos进行Mongoshake的安装 |
安装步骤
为了方便测试,本文中docker网络采用默认网络,宿主机可以和容器进行通信,大家在实际环境中可自定义网络进行网络隔离,保证系统安全。
安装Zookeeper
docker run -d --name zookeeper-mongo -p 2181:2181 wurstmeister/zookeeper
安装完成后在宿主机可通过telnet 172.21.48.1 2181
进行测试
安装Kafka
docker run -d --name kafka-mongo -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=172.21.48.1:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://172.21.48.1:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 wurstmeister/kafka
参数说明
参数 | 说明 |
---|---|
KAFKA_BROKER_ID | 每个Kafka都有一个Broker_Id来进行区分 |
KAFKA_ZOOKEEPER_CONNECT | Zookeeper管理Kafka的路径 |
KAFKA_ADVERTISED_LISTENERS | 把Kafka地址注册给Zookeeper |
KAFKA_LISTENERS | Kafka的监听端口配置 |
安装完成后在宿主机可通过telnet 172.21.48.1 9092进行测试
安装Kafka-Manager
docker run -d --name kafka-manager -p 9000:9000 -e ZK_HOSTS=172.21.48.1:2181 -e KAFKA_BROKERS=172.21.48.1:9092 sheepkiller/kafka-manager
参数 | 说明 |
---|---|
ZK_HOSTS | Zookeeper地址,如果是集群配置集群地址 |
KAFKA_BROKERS | Kafka地址,如果是集群配置集群地址 |
安装完成后在宿主机可通过访问http://localhost:9000并添加Cluster进行测试,成功界面如下图:
安装Mongodb
Mongodb安装在宿主机上,可参考windows安装mongodb,安装成功后请设置管理员账户名密码。
注意:Mongodb的绑定地址设置为0.0.0.0
MongoShake运行依赖与Mongodb的oplog,oplog相当于mysql的binlog,极大方便了Mongodb副本集各节点的数据同步。本文为单机版Mongodb,需手动开启oplog,开启方式如下:
添加副本集配置
修改mongod.cfg
文件,增加如下配置后重启服务:
replication:
oplogSizeMB: 50
replSetName: rs
# 初始化副本集
use admin
# 权限验证
db.auth("账户名","密码")
rs.initiate({ _id: "rs", members: [{_id:0,host:"127.0.0.1:27017"}]})
登录Mongodb数据库可以查看到oplog.rs的Collection。
安装MongoShake
安装Centos容器
docker run -itd --name centos-mongo centos:7 /bin/bash
# 进入容器cli界面安装wget(下载MongoShake用)
yum install wget -y
下载MongoShake
# 切换到/home目录
cd /home
# 下载文件
wget https://github.com/alibaba/MongoShake/releases/download/release-v2.6.4-20210414/mongo-shake-v2.6.4_2.tar.gz
# 解压文件
tar -xvzf mongo-shake-v2.6.4_2.tar.gz
# 重命名文件夹
mv mongo-shake-v2.6.4 mongo-shake
配置MongoShake
# 切换到mongo-shake目录
cd mongo-shake
# 修改collector.conf文件
vi collector.conf
配置参数大部分默认就好,修改项如下:
mongo_urls = mongodb://username:[email protected]:27017
tunnel = kafka
tunnel.address = [email protected]:9092 #test为kafka的topic
tunnel.message = json
启动MongoShake
./collector.linux -conf=collector.conf
如果没报错,那么正常是启动成功了
验证
进入mongodb,在数据库中删除一条数据,然后打开Kafka-Manager的管理页面,看是否有名为test的topic,有的话说明启动成功。
从Kafka消费数据
以python为例,消费代码如下:
import sys
from pykafka import KafkaClient
import logging
logging.basicConfig(stream=sys.stdout, level=logging.NOTSET)
logging.info('程序启动...........')
client = KafkaClient(zookeeper_hosts="192.168.3.20:2181")
logging.info(client.topics)
topic = client.topics['test']
consumer = topic.get_simple_consumer(consumer_group="test",
reset_offset_on_start=True)
for message in consumer:
if message is not None:
logging.info(message.value)
启动程序,然后对MongoDB的数据库进行数据变更,如果顺利,控制台应该会打印出变更的数据内容,如下图:
至此,整个环境就搭建成功了,希望对大家有帮助,谢谢!