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不一样的地方即增加了高亮的这一行。增加此行就可以实现跨主机的负载均衡了。

浙公网安备 33010602011771号