docker分布式部署pyspider

docker分布式部署pyspider

一、部署环境:

总共三台物理机、用户名都为docker 密码123456

主机1:ip为192.168.5.44;

                   部署postgres、redis、scheduler各1个

主机2:ip为192.168.5.45:

                   部署phantomjs组件(2个)、phantomjs-lb负载均衡服务一个、webui组件(4个)、                          webui-lb负载均衡服务一个、fetcher组件(1个)、fetcher-lb负载均衡服务一个、                     processor组件(2个)、result-worker组件(2个)

主机3:ip为192.168.5.43:

                   部署组件同主机2

docker需要用超级用户来操作, 因此我们先给docker添加权限之后,就可以一直用docker用户而不是root来操作了。

$ sudo groupadd docker           # 添加docker用户组

$ sudo gpasswd -a docker docker    # 把自己加到docker用户组中

$ sudo service docker restart       # 重启docker后台服务

$ exit                          # 注销,然后再登陆

(注:如果docker执行不了sudo命令则用root

打开/etc/sudoers文件加上"docker    ALL=(ALL)   ALL"即可 )

二、主机1的部署

1、安装docker:

我们安装的是docker社区版参照:

https://docs.docker-cn.com/engine/installation/linux/docker-ce/centos/#先决条件

2、安装pyspider组件:

1、#postgres数据库

         docker run --name postgres -v /data/postgres/:/var/lib/postgresql/data -d -p 5432:5432 -e      POSTGRES_PASSWORD="" postgres

用docker启动数据库的时候必须要映射到物理机的目录上,否则docker删除之后原来的数据将全部被删除。这里我将容器postgres的data目录挂载到物理机的/data/postgres/目录下。

2、#redis队列

         docker run --name redis -d --rm -p 6379:6379 redis

3、#调度器scheduler

       docker run --name scheduler -d -p 23333:23333 binux/pyspider \

         --taskdb "sqlalchemy+postgresql+taskdb://postgres@192.168.5.44:5432/taskdb" \

         --resultdb "sqlalchemy+postgresql+resultdb://postgres@192.168.5.44:5432/resultdb" \

         --projectdb "sqlalchemy+postgresql+projectdb://postgres@192.168.5.44:5432/projectdb" \

--message-queue "redis://192.168.5.44:6379" \

 scheduler --inqueue-limit 5000 --delete-time 43200

三、主机2的部署

1、#安装docker-compose:

主机2的部署我们用的是docker-compose的方式管理多个docker容器的。

首先下载docker-compose工具,用官方手册的命令如下会有问题,命令无法使用

curl -L https://github.com/docker/compose/releases/download/1.9.0/docker-compose-uname -s-uname -m > /usr/local/bin/docker-compose

 

所以最好选择从github上下载好https://github.com/docker/compose/releases

找对应的版本docker-compose-Linux-x86_64 7.67 MB

                 docker-compose-Windows-x86_64.exe 5.97 MB

然后重命名为docker-compose 拷贝到 /usr/local/bin/

修改为可执行的权限sudo chmod +x /usr/local/bin/docker-compose

可使用docker-compose --version测试安装是否成功。

2、配置docker-compose.yum文件:

内容如下:

phantomjs:

  image: 'binux/pyspider:latest'

  command: phantomjs

  cpu_shares: 512

  environment:

    - 'EXCLUDE_PORTS=5000,23333,24444'

  expose:

    - '25555'

  mem_limit: 512m

  restart: always

phantomjs-lb:

  image: 'dockercloud/haproxy:latest'

  links:

    - phantomjs

  restart: always

fetcher:

  image: 'binux/pyspider:latest'

  command: '--message-queue "redis://192.168.5.44:6379"

           --phantomjs-proxy "phantomjs:80" fetcher --xmlrpc'

  cpu_shares: 512

  environment:

    - 'EXCLUDE_PORTS=5000,25555,23333'

  links:

    - 'phantomjs-lb:phantomjs'

  ports:

    - '24444:24444'

  mem_limit: 128m

  restart: always

fetcher-lb:

  image: 'dockercloud/haproxy:latest'

  links:

    - fetcher

  restart: always

processor:

  image: 'binux/pyspider:latest'

  command: '--projectdb "sqlalchemy+postgresql+projectdb://postgres@192.168.5.44:5432/projectdb"

           --taskdb "sqlalchemy+postgresql+taskdb://postgres@192.168.5.44:5432/taskdb"

           --resultdb "sqlalchemy+postgresql+resultdb://postgres@192.168.5.44:5432/resultdb"

           --message-queue "redis://192.168.5.44:6379" processor'

  cpu_shares: 512

  mem_limit: 256m

  restart: always

result-worker:

  image: 'binux/pyspider:latest'

  command: '--taskdb "sqlalchemy+postgresql+taskdb://postgres@192.168.5.44:5432/taskdb" 

           --projectdb "sqlalchemy+postgresql+projectdb://postgres@192.168.5.44:5432/projectdb"

           --resultdb "sqlalchemy+postgresql+resultdb://postgres@192.168.5.44:5432/resultdb"

           --message-queue "redis://192.168.5.44:6379" result_worker'

  cpu_shares: 512

  mem_limit: 256m

  restart: always

webui:

  image: 'binux/pyspider:latest'

  command: '--taskdb "sqlalchemy+postgresql+taskdb://postgres@192.168.5.44:5432/taskdb"

           --projectdb "sqlalchemy+postgresql+projectdb://postgres@192.168.5.44:5432/projectdb"

           --resultdb "sqlalchemy+postgresql+resultdb://postgres@192.168.5.44:5432/resultdb"

           --message-queue "redis://192.168.5.44:6379" webui

           --max-rate 0.2 --max-burst 3

           --scheduler-rpc "http://192.168.5.44:23333/"

           --fetcher-rpc "http://192.168.5.43:24444/"'

  cpu_shares: 512

  environment:

    - 'EXCLUDE_PORTS=24444,25555,23333'

  links:

    - 'fetcher-lb:fetcher'

  mem_limit: 256m

  restart: always

webui-lb:

  image: 'dockercloud/haproxy:latest'

  links:

    - webui

  restart: always

nginx:

  image: 'nginx:latest'

  links:

    - 'webui-lb:HAPROXY'

  ports:

    - '0.0.0.0:80:80'

  volumes:

    - /home/nginx/nginx.conf:/etc/nginx/nginx.conf

    - /home/nginx/www:/home/nginx/www

    - /home/nginx/conf.d/:/etc/nginx/conf.d/

  restart: always

配置文件注意要点:

1、官方文档也没有指定fetcher端口,webui连接时直接用域名指向了fetcher,我们自己没有域名的时候,默认fetcher端口为24444,需要挂载出来用ip+端口的方式指定。

2、"//postgres@192.168.5.44:5432/" 这里的postgres为数据库用户名。

3、防火墙记得关闭。否则容器之间的link会出问题。

4、加--scheduler-rpc 这些参数必须跟在容器名称后面,不能弄返,否则启动容器会报不识别参数的错。

5、pyspider的存储用postgres时,必须提前将项目、任务及结果三个数据建好,其他的mysql和mongodb数据库不用建。

6、docker-compose.yum配置文件建立好了之后,在该文件所在目录下执行docker-compose up命令即可启动所有docker容器,但是由于我们此配置文件中用到了nginx做webui组件的负载均衡服务,因此需要配置nginx的访问规则。

3、配置nginx:

我们做nginx的配置时分为主配置文件nginx.conf和default.conf子配置文件(子配置文件在主配置文件中用include包含进去了)。当然可以不分开配合成一个文件也可以。

根据docker-compose.yum中nginx的volumes配置的内容,将主配置文件放在对应的目录下。此时注意到一个坑,挂载一般是挂载目录而nginx.conf是一个文件因此需要提前建立好。否则文件不存在的情况下,会自动创建一个叫nginx.com的目录到时候nginx的docker容器将启动不起来并报不能将目录挂载到文件的错误。

1、配置nginx.conf

user  root;

worker_processes  1;

error_log  /var/log/nginx/error.log warn;

pid        /var/run/nginx.pid;

events {

    worker_connections  1024;

}

http {

    include       /etc/nginx/mime.types;

    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                      '$status $body_bytes_sent "$http_referer" '

                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;

    #tcp_nopush     on;

    keepalive_timeout  65;

    autoindex  on;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;

    client_max_body_size 100M;

    client_header_buffer_size    128k;

    large_client_header_buffers  4  128k;

    upstream web_ui {

         server HAPROXY weight=1;

    }

}

2、配置default.conf

server {

    listen       80;

    server_name  localhost;

    #access_log  /var/log/nginx/log/host.access.log  main;

    location / {

            proxy_pass http://web_ui;

            proxy_redirect default;

            proxy_set_header Host $host;

            proxy_set_header X-Real-IP $remote_addr;

        }

    location /favicon.ico {

        root html;

    }

}

至此配置完成。在含有docker-compose.yum配置文件的目录下输入命令:docker-compose up 将启动所有的组件各一个。由于我们要按最初的设想启动多个组件因此,再输入命令:

docker-compose scale phantomjs=2 processor=2 webui=4

此时,可以在浏览器访问192.168.5.45 就可以进入webui组件的界面了。

三、主机3的部署

对于主机3的部署首先要按照同主机2完全一样的方式配置一遍,但是至此还没有完全完成分布式部署,因为这样的话,我们主机2是单主机的多个组件做了负载均衡,主机3也是单个主机的多个组件做了负载均衡,无法实现跨主机的负载均衡。

因此我们对主机3多进行一步配置,实现在浏览器访问192.168.5.43(即访问主机3的ip)时,负载均衡可以跨主机进行,也就是说根据nginx的权重,实现在主机2和3之间切换访问webui组件。下面我们具体看主机3的配置步骤

1、配置同主机2

省略不写

2、配置nginx.conf:

user  root;

worker_processes  1;

error_log  /var/log/nginx/error.log warn;

pid        /var/run/nginx.pid;

events {

    worker_connections  1024;

}

http {

    include       /etc/nginx/mime.types;

    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                      '$status $body_bytes_sent "$http_referer" '

                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;

    #tcp_nopush     on;

    keepalive_timeout  65;

    autoindex  on;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;

    client_max_body_size 100M;

    client_header_buffer_size    128k;

    large_client_header_buffers  4  128k;

    upstream web_ui {

         server HAPROXY weight=1;

         server 192.168.5.45 weight=1;

    }

}

与主机2不一样的地方即增加了高亮的这一行。增加此行就可以实现跨主机的负载均衡了。

posted @ 2017-11-15 17:57  风猴蓝魔  阅读(4)  评论(0)    收藏  举报