对于 Scrapy 处理 Ajax 处理方式当然是同家兄弟 Splash 比较靠谱! 但是 Splash 有个很坑爹的毛病就是负载承受相对较小·· 一不留神就 GG 了·········· 然后也就没有然后了~~! 所以准备给 Splash 做一个负载均衡;后端放一大堆的 Splash 这样总不会 GG 了吧。 就算其中一个 GG 了还有其它的可替代不是? 废话不多少开整·· 环境是基于: CentOS 7.3 Docker 17.06.2-ce Splash 3.0 HAproxy 1.7.9 (CentOS 大家可以将 yum 切换为阿里云的 yum 源 Docker 同理)
注意以下只需要在你需要运行 splash 的机器上安装即可
阿里 Docker 源:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
sudo yum install -y yum-utils device-mapper-persistent-data lvm2 sudo yum-config-manager sudo yum makecache fast sudo yum -y install docker-ce sudo service docker start
安装 Docker 加速器:
1
curl -sSL https: //get .daocloud.io/daotools/set_mirror.sh | sh -s http://8050 f360.m .daocloud.io
重启 Docker:
1
systemctl restart docker
这样可以极快的速度拉取镜像。 获取 splash 最新的 docker 镜像:
1
docker pull scrapinghub/splash:master
关闭所有机器防火墙 firewalld(网络安全的环境关闭,不安全的环境请放行端口,自行百度):
1 2 3
systemctl disable firewalld systemctl stop firewalld
创建 Splash 配置文件目录:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
# 存放过滤规则文件的目录 [root@ localhost ~]# mkdir filters # 存放JavaScript文件目录 [root@ localhost ~]# mkdir js-profiles # 存放lua模块的目录 [root@ localhost ~]# mkdir lua_modules # 存放代理文件的目录 [root@ localhost ~]# mkdir proxy-profiles # 创建完成如下: [root@ localhost ~]# pwd /root [root@ localhost ~]# ll total 4 drwxr-xr-x. 2 root root 25 Sep 26 03 :00 filters drwxr-xr-x. 2 root root 6 Sep 25 21 :08 js-profiles drwxr-xr-x. 2 root root 6 Sep 25 21 :08 lua_modules drwxr-xr-x. 2 root root 32 Sep 25 21 :08 proxy-profiles [root@ localhost ~]#
启动 Splash:
1
docker run -d -p 8050 :8050 --memory=5.0 G --restart=always --name splash -v /root/ proxy-profiles: /etc/ splash/proxy-profiles -v / root/js-profiles:/ etc/splash/ js-profiles -v /root/ lua_modules: /etc/ splash/lua_modules -v / root/filters:/ etc/splash/ filters scrapinghub/splash: master --maxrss 4500
docker run 启动一个容器 -d 后台启动 -p 8050:8050 将容器的 8050 端口和物理机的 8050 端口绑定(可以从 8050 端口访问容器服务应用) —memory=5.0G 容器最大使用内存为 5.0GB,超出这个限制会被主进程杀死(使用 free -mg 查看并酌情设置你的内存使用) —restart=always 容器退出后无条件重启(满了 5GB 被杀死,然后重启 释放内存) —name splash 容器的名字叫 splash(可以忽略) -v ** 三个-v 参数是将宿主机的目录挂载进容器,便于容器能够直接访问挂载目录中的内容 scrapinghub/splash:master 用于启动容器的镜像 —maxrss 4500 Splash 最大内存使用为 4500MB
查看容器是否启动:
1 2 3 4
[root@ localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1 b34f7933095 scrapinghub/splash:master "python3 /app/bin/..." 4 hours ago Up 4 hours 5023 /tcp, 0.0 .0 .0 :8050 ->8050 /tcp splash[root@ localhost ~]#
访问 Splash 是否正常工作:
请注意:以上操作只需要在你需要运行 splash 的机器上安装即可
安装 HAproxy 实现负载均衡:
安装 zlib-devel(HAproxy 使用 gzip 功能):
1
yum install zlib-devel -y
安装 HAproxy:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
# 个人喜好 源码放在这个目录 [root@localhost examples]# cd /usr/local/src/ # 安装wget [root@localhost src]#yum install wget -y # 下载HAproxy安装包 [root@localhost src]# wget http://www.haproxy.org/download/1.7/src/haproxy-1.7.9.tar.gz # 解压 [root@localhost src]# tar -zxvf haproxy-1.7.9.tar.gz # 进入目录 [root@localhost src]# cd haproxy-1.7.9 # 编译 [root@localhost src]# make TARGET=linux2628 PREFIX=/usr/local/haproxy-1.7.9 USE_ZLIB=yes # 安装 [root@localhost src]# make install # 拷贝启动文件到目录 [root@localhost src]# cp /usr/local/sbin/haproxy /usr/sbin/ # 测试版本 [root@localhost src]# haproxy -v # 拷贝启动文件到启动目录 [root@localhost src]# cp examples/haproxy.init /etc/init.d/haproxy # 赋予可执行权限 [root@localhost src]# chmod 755 /etc/init.d/haproxy # 创建配置文件目录 [root@localhost src]# mkdir /etc/haproxy # 创建数据目录 [root@localhost src]# mkdir /var/lib/haproxy # 创建运行文件目录 [root@localhost src]# mkdir /var/run/haproxy # 设置日志 [root@localhost src]# vim /etc/rsyslog.conf # 第15行 $ModLoad imudp #打开注释 # 第16行 $UDPServerRun 514 #打开注释 # 第74行 local3.* /var/log/haproxy.log #local3的路径 # 创建日志文件 [root@localhost src]# touch /var/log/haproxy.log # 设置权限 [root@localhost src]# chown -R haproxy.haproxy /var/log/haproxy.log # 启动日志服务 [root@localhost src]# systemctl restart rsyslog.service
配置 HAproxy Conf:
1
[root@localhost src]# vim /etc/haproxy/haproxy.cfg
写入以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
global maxconn 512 stats socket /tmp/haproxy userlist users user user insecure-password userpass defaults log global mode http option abortonclose compression type text/html text/plain application/json timeout connect 3600s timeout client 3600s timeout server 3600s listen stats bind *:8036 mode http stats enable stats hide-version stats show-legends stats show-desc Splash Cluster stats uri / stats refresh 10s stats realm Haproxy\ Statistics stats auth admin:adminpass frontend http-in bind *:8050 default_backend splash-cluster backend splash-cluster option httpchk GET / balance leastconn retries 2 option redispatch server splash-0 10.10.1.41:8050 check maxconn 5 inter 2s fall 10 observe layer4 server splash-1 10.10.1.42:8050 check maxconn 5 inter 2s fall 10 observe layer4 server splash-2 10.10.1.32:8050 check maxconn 5 inter 2s fall 10 observe layer4 backend splash-misc balance roundrobin server splash-0 10.10.1.41:8050 check fall 15 server splash-1 10.10.1.42:8050 check fall 15 server splash-2 10.10.1.32:8050 check fall 15
启动 HAproxy:
1 2 3 4 5 6 7 8
# 启动HAproxy [root@localhost src]# /etc/init.d/haproxy start Restarting haproxy (via systemctl): [ OK ] # 如果出现错误则使用: [root@localhost examples]# systemctl status haproxy.service # 查看报错
查看 HAproxy 状态: 用户名和密码为: admin adminpass
查看 HAproxy 负载是否生效:
完美!!!收工!! 注意:HAproxy 这台服务器没有安装 Splash 服务,是负载到其余安装有 Splash 的服务器上提供的服务器哦!