Skip to main content

Pywhio

官方 @ PywhiO. Python大数据, AI技术, 微服务, DRF+REACT前后端分离实践.

1 min read · March 9th 2020 (originally published at pywhio)

如何基于docker-swarm实现海量email的解析

阅读:-


如何基于docker-swarm实现海量email的解析

1.1 email案例的测试方案

接下来,我们将以一个具体的email解析的案例来详细说明一下如何透过CI,CD来实现海量的邮件解析。

1583677558306

以上是一个典型的ETL处理的过程,就是能把结构化的数据,和非机构化的数据,持久化到数据库和No-SQL数据库中。主要的call stack() 见下图所显示:

1583677583971

图 1 call stack() of email handle

我们考虑采用容器化的方案来处理相关的应用。

1.1.1 前置作业准备

  1. 在ip地址为192.168.223.132的测试机中准备本次测试的项目脚本,具体项目结构如下:

    1583677777147

文件说明:

  1. 在路径5.下面保存了待解析的邮件

  2. py文件为项目的代码

  3. requirement.txt,项目所需的依赖包,内容如下:

    1583677828035

    主要依赖的软件包列表,简单说明如下:

序号组件名称功能
1celery分布式计算引擎
2ElasticSearchNOSQL数据库
3komburabbitmq访问客户端
4pandas内存数据计算
5SQLALchemy数据库连接器
6psycopg2postgres-SQL连接器
7python-memcachedmemcached连接器
  1. dockerfile将项目打包成镜像的必须文件,内容如下:

    1583677852948

    5.docker-stack.yml 部署本次项目容器服务的必须文件,内容如下:

    1583677903782

从docker-stack.yml的配置中,我们可以发现:

192.168.223.132/library/parse_email:latest

这里标记了重要的信息:

  1. 192.168.223.132 是镜像仓库 harbor的地址

  2. library镜像仓库名

  3. parse_eamail镜像名

  4. latest版本号

    这里也彰显了使用dockerswarm这种方式进行开发部署的优势。

1.1.2 配置GIT免密登录

\2. 设置git的ssh免密登录

创建ssh免密登录的.ssh文件,一直按回车就行

ssh-keygen -t rsa -C “841574470@qq.com”

创建之后,切换到.ssh文件夹,拷贝公钥

1583677973446

在gitlab-> User Settings ->SSH Key中,将拷贝的公钥粘贴进去,点击Add Key

1583677989780

添加成功后的公钥:

1583678020783

1.1.3 创建一个gitlab-ce新项目

  1. 登录gitlab服务器http://192.168.223.134:80/,点击new project新建项目:

1583679700482

设置完毕后点击create project创建项目,项目成功创建之后:

1583679710079

1.1.4配置Gitlab Runner

为了实现项目的自动化管理,我们每新创建一个项目,就需要为这个项目配置一个对应的服务的gitlab-runner。这里因为runner是在项目中注册建立关系的,所以换一个项目就注册一次。

  1. 为本项目注册gitlab-runner,首先获取gitlab-ci的token和url,获取方式:

项目主页 -> Settings -> CI/CD -> Runners Expand

1583678078562

注册runner:

1583678091897

从前面的配置中我们知道gitlab-CE的地址为192.168.223.134:80,我们会针对本项目设定相关的runner,对应的地址为192.168.223.134:80\python\parse_email

1.1.5 配置CI/CD脚本

\4. 在项目首页添加. gitlab-ci.yml 文件,内容如下:

1583678143181

本项目的stages包含三个部分:build、deploy、check,具体内容如下:

build: 首先登陆私有镜像仓库harbor服务器,然后制作镜像,最后将制作的镜像推送到harbor仓库中

deploy:部署服务

check:查看服务部署情况

  1. 切换到项目目录parse_email,设置git的全局配置:

代码编写好了以后,需要将配置好的代码传送到服务器上去,这个过程是完全手动处理的,相关的操作需要手动处理。相关的概念模型见下图所显示:

1583678221393

git config —global user.name “python”

git config —global user.email 841574470@qq.com

初始化本地git仓库

git init

添加远程仓库

git remote add origin ssh://git@192.168.223.134:7003/python/parse_email.git

添加本地代码到暂存区

git add .

为本次提交添加备注信息

git commit -m “Initial commit”

将暂存区的代码推送到git服务器中

git push -u origin master

1583678240264

​ 图2 :手动上传代码的过程

以上是GIt传送代码的过程截图,当代码更新以后,就会自动的促发CI的自动化过程。

手动推送代码到git服务器触发ci自动化。

\6. 项目代码更新触发gitlab-ci

1583678306638

点击run pipeline查看pipeline

1583678322282

点击jobs可以查看每一步job执行的详细信息

build**:**

1583678333709

deploy**:**

1583678346352

check**:**

1583678360721

1.1.6 测试结果查看

\7. 测试结果核查

在本地查看gitlab-ci过程中runner制作的镜像:

1583678521227

在harbor仓库查看镜像的更新时间

1583678530682

查看容器的运行情况

执行python invoke_task.py**测试项目**,分别查看三个容器日志查看运行情况:

handle运行无异常

1583678546678

load_es运行无异常

1583678556247

loader_pg运行无异常

1583678568145

1.1.7 启动方式说明

当自动化过程完成以后,我们可以在容器外启动相关的命令执行:

执行python invoke_task.py**测试项目。**

1.runner执行ci自动流程的依赖脚本是 .gitlab-ci.yml这个脚本文件。

  1. 这个文件包含哪些脚本runner就会执行哪些脚本

  2. 在deploy部分的脚本说明如下:

从gitlab-ci.ymal**中可以看到如下的配置:**

deploy_job:

stage: deploy

script:

- docker stack deploy -c docker-stack.yml test

  1. docker stack deploy -c docker-stack.yml test

这条命令就是部署服务的。

对应的docker-stack.yml的启动要点:

1583678601400

这里的容器启动是通过celery启动的。

  1. .gitlab-ci.ym包含了这条命,ci过程就会自动部署这些服务

    6.执行命令python invoke_task.py测试项目,这个会向queue中传递消息。这个任务发起实质是就想queue中发送消息。

相关的invoke_task.py 简单说明如下:

chain(handle.s(‘5.’), group(load_es.s(index, doc_type), load_pg.s(table_name)))()

备注:这个案例中rabbitmq服务,在容器内部部署的。pg,es都是在容器内部署,不过此处不再赘述。

1.1.8GIT操作简介

在手动上传代码到Gitlab-CE环境中,需要掌握一些GIT的知识

1583678657769

主要的命令见下图所显示。

1583678669932

1.1.9 关键点总结

1.做好网络的dimension

2.做好手动上传代码的配置。GIT操作

3.网络镜像源的配置。方便下载各类python包

2.1 测试中的问题

2.1.1 关于在容器中使用pip出现的dns域名问题

  1. 在进行ci自动化部署时抛出以下错误:

1583678811190

  1. 推测可能是由于pip源的问题,给Dokerfile文件中的pip指令添加pip源:

RUN pip3 install -r requirements.txt -i http://pypi.mirrors.ustc.edu.cn/simple —trusted-host pypi.mirrors.ustc.edu.cn

  1. 添加pip源还是报错,查阅资料是DNS配置错误,修改域名服务器:

sudo vim /etc/resolv.conf

添加 nameserver 8.8.8.8

分享到微博

Previous

CICD Mini Project
Starter
MicroServ
Tutorials
Blog