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、"http://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號