Docker部署Datax-web
网上有采用Docker部署Datax-web的很多教程,采用的是linshellfeng/datax_web:3.0.1的镜像,部署简单快捷,但是在使用中发现创建任务以及执行都有问题,没有深究原因。而在宿主机器上直接部署Datax-web又出现无法访问的问题(具体原因是我的java版本太高了,跟datax-web不兼容)。于是决定采用基于下载的编译后的datax-web.tar.gz做出docker镜像,然后使用Docker compose部署。
先说下我这边背景情况:已经采用docker compose方式部署好了mysql,并且创建了datax_web数据库,并将datax-web项目对应的sql加载运行,初始化好datax_web数据库。已经将datax部署在了宿主服务器上,目录如下:/opt/datax。运行了命令,确认了datax已经成功部署。命令:python /opt/datax/bin/datax.py /opt/datax/job/job.json 。我的python版本是 3.9.13。
先从网上下载datax-web-2.1.2.tar.gz安装包,将其拷贝到部署Docker的目标服务器目录下。这边假设放在目录/home/docker/datax-web目录下,并在目录下创建Dockerfile文件,并配置。
Dockerfile配置如下:
FROM openjdk:8-jdk-alpine
#安装必要工具:bash、tar,以及 GNU grep(支持 -P)
RUN apk add --no-cache bash tar grep python3 py3-pip \
&& ln -sf python3 /usr/bin/python \
&& ln -sf pip3 /usr/bin/pip
#创建应用目录
RUN mkdir -p /opt/datax-web
#复制本地DataX-Web安装包到镜像
COPY datax-web-2.1.2.tar.gz /tmp/datax-web.tar.gz
WORKDIR /opt/datax-web
#解压并安装DataX-Web
RUN tar -zxvf /tmp/datax-web.tar.gz -C /opt/datax-web --strip-components=1 \
&& rm /tmp/datax-web.tar.gz \
&& chmod +x /opt/datax-web/bin/*.sh \
&& echo "Y" | ./bin/install.sh --force
#暴露端口
EXPOSE 9527 9999
#启动并保持容器运行
CMD ["/bin/sh", "-c", "/opt/datax-web/bin/start-all.sh && tail -f /dev/null"]
执行命令,从Dockerfile创建镜像:
docker build -f Dockerfile -t datax-web:latest .
注意最后的点号,不要漏了。
执行完命令,如果没有报错,那么一个datax-web的本地镜像就创建好了,可以通过命令查看到创建的镜像:
docker images | grep datax-web
编辑docker-compose.yml文件,加入下面关于datax-web 的配置信息:
datax-web-self:
image: datax-web:latest
container_name: datax-web-self
ports:
- "8888:9527"
#- "19999:9999"
environment:
- JAVA_HOME=/usr/lib/jvm/java-1.8-openjdk
- TZ=Asia/Shanghai
#数据库连接配置 - 根据您的MySQL容器配置调整
- spring.datasource.url=jdbc:mysql://mysql:3306/datax_web?useUnicode=true&characterEncoding=UTF-8&useSSL=false
- spring.datasource.username=用户名
- spring.datasource.password=密码
volumes:
#挂载宿主机上的DataX目录
- /opt/datax:/opt/datax
#挂载日志和配置文件
- ./datax-docker/datax-web/logs:/opt/datax-web/logs
- ./datax-docker/datax-web/conf:/opt/datax-web/conf
networks:
- datax-network
depends_on:
- mysql
#我的mysql配置,主要是新增了networks,跟datax-web保持一致。
mysql:
image: mysql:8.0
container_name: mysql
environment:
- MYSQL_ROOT_PASSWORD:密码
ports:
- "3306:3306"
volumes:
- /data/mysql:/var/lib/mysql
restart: unless-stopped
networks:
- datax-network
#对应网络配置
networks:
datax-network:
driver: bridge
配置好后,先把mysql关闭:
Docker compose down mysql
然后启动datax-web(因为设置了depends_on:- mysql,会自动先启动mysql):
docker compose up datax-web-self
执行命令查看日志,看是否有错误:
docker logs datax-web-self
如果没有问题,那么就可以访问datax-web了。
网址:http://你的宿主服务器ip:8888/index.html
这边端口是8888,因为上面配置的是 "8888:9527",映射到了datax-web的9527端口。
至此,通过自建datax-web镜像,并通过docker compose部署的datax-web就成功搭建完成了!
下面大概描述下同步数据过程,着重说下Mongodb驱动过时的问题导致Mongodb连接失败的解决方法。
在datax-web页面里,我们可以创建数据源(源数据库和目标数据库),新建执行器(也就是对应的datax),见下图。
然后点击任务管理菜单,在展开的子菜单中,点击“DataX任务模板”,先创建一个任务模板,后面创建同步任务会用到:
再点击任务管理菜单下的“任务构建”子菜单,创建同步任务:
构建reader
构建writer
字段映射
构建任务
构建任务步骤,先点击“1.构建”,生成任务json,然后点击“2.选择模板”,选择之前创建的任务模板。最后点击下一步,一个同步任务就创建好了。
点击上面的任务管理,你将会看到你创建的同步任务:
至此,你就可以操作执行你创建的同步任务了。更多细节,需要后面自己仔细研究。
Mongodb连接问题
下面着重讲解下我遇到的Mongodb连接问题。
因为datax-web以及datax用到的mongo-java-driver驱动都是老旧的,而我的Mongodb版本是6.x的,在创建Mongodb数据源时,点击“测试连接”是不通过的。经过研究发现,需要升级Mongodb的驱动到mongo-java-driver-3.12.13.jar就能解决问题。
原本以为需要下载datax-web以及datax项目的源码,修改配置信息,重新编译替换之前的项目或者相关部件。后来发现,只要把原来部署的datax-web和datax里面对应的驱动文件替换掉就能解决问题。
先替换datax-web里的Mongodb驱动。
首先下载mongo-java-driver-3.12.13.jar驱动文件,然后上传到目标服务器。
执行命令,将服务器上的驱动文件拷贝到datax-web容器(这里容器名称为:datax-web-self):
docker cp /你的存放路径/mongo-java-driver-3.12.13.jar datax-web-self:/opt/datax-web/modules/datax-admin/lib
然后将容器中的原驱动改名:
登入容器:docker exec -it datax-web-self /bin/bash
进入容器中目录:cd /opt/datax-web/modules/datax-admin/lib
修改原来驱动名称:mv mongo-java-driver-3.4.2.jar mongo-java-driver-3.4.2.jar.bakup
效果图如下:
然后重启datax-web,后面再用datax-web新建mongodb数据源以及创建Mongodb相关的迁移任务用的就是mongo-java-driver-3.12.13.jar驱动了。
重启datax-web步骤:
容器中,进到目录: cd /opt/datax-web/bin
先执行停止datax-web脚本:./stop-all.sh
再执行开始脚本:./start-all.sh
完成以上操作,再登入datax-web页面,新建Mongodb数据源,就可以通过测试了。
同样的,后面需要把datax的老旧驱动也换掉。我这边的目录是:
/opt/datax/plugin/reader/mongodbreader/libs
writer对应的目录:/opt/datax/plugin/writer/mongodbwriter/libs
完成这些操作后,后面执行同步任务,仍然遇到问题!是生成的Mongodb相关json的连接信息有问题。
构建的json大概是下面这样的:
而我的Mongodb数据源是配置了用户名密码的
也就是说,datax-web并没有把配置的Mongodb数据源的信息正确配置到任务json中去!试了很多方法,都未能解决问题,大概报错如下:
后来查看datax-web相关源码后,做了如下配置修改,才让datax正确执行任务。
配置如下:
{
"job": {
"setting": {
"speed": {
"channel": 3
},
"errorLimit": {
"record": 0,
"percentage": 0.02
}
},
"content": [
{
"reader": {
"name": "mongodbreader",
"parameter": {
"dbName": "数据库名称",
"username": "用户名",
"password": "密码",
"authDb": "admin",
"address": ["你的mongDb服务器ip:端口"],
"collectionName": "迁移到集合名",
"column": [
{
"name": "colum1",
"type": "String"
},
{
"name": "colum2",
"type": "String"
},
{
"name": "colum3",
"type": "String"
}
]
}
},
……
说明:设置好"username"、"password"、"authDb"三个值,尤其是authDb,一定要设置。address一定要是数组类型[“ip:port”]。还有speed下面类似"byte": 1048576 这个要去掉,不然执行会报错。(注:datax-web将用户名和密码做了一层加密,可能需要你把用户名和密码转成加密后的字符才能正确执行)。
这样,Mongodb连接报认证错误的问题就解决了!
我将生成的json拷贝到宿主机器datax目录里面的job下(命名:mongoToClickHouse.json),执行下面命令
python /opt/datax/bin/datax.py ./mongoToClickHouse.json
执行结果:
最终问题解决,大功告成!
如有错误或问题,请留言。