张斌 杨彦松 廖雨寒
睿哲科技股份有限公司
一、背景
随着互联网的高速发展,网络上的数据量呈现爆发式的增长。单节点运行的爬虫系统,在性能等各方面都无法满足现有的业务需求。因此网络爬虫基于多节点的分布式协同运行方案成为解决爬虫性能瓶颈的不二之选。而作为分布式系统的存储中间件,key-value数据库(redis和pika)在数据结构的支持,高吞吐的性能,接口的易用性等方面都是不错的选择。
二、Redis和Pika
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value高性能存储系统。它支持存储多种类型的value,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)等。这些数据类型都支持push/pop、add/remove、取交集、并集、差集及更丰富的操作,而且这些操作都是原子性的。与传统的内存数据库一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Pika是一个开源的可持久化的大容量类redis存储系统。兼容redis的string、hash、list、zset、set等绝大部分的数据接口,不用修改代码即可平滑从redis迁移到pika。主要解决redis由于存储数据量巨大而导致内存不足的内存容量瓶颈,并且可以像redis一样,通过slaveof命令进行主从备份,支持全同步和部分同步,pika还可以用在twemproxy或者codis中来实现静态数据分片
本文针对两种存储系统,在分布式爬虫系统中的应用,进行对比,以供参考。
三、两种数据库对比
1)Redis:高性能的key-value存储解决方案。
优势:
1.高性能:作为内存数据库,redis拥有超高的吞吐性能;
2.多样化的数据存储结构:redis支持string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)等;
劣势:
1.大数据量存储承载能力有限,存储成本高;
2.单线程运行方式易阻塞,相对比较脆弱。
2)Pika:利用磁盘存储来解决redis的内存容量瓶颈。
优势:
1.使用Redis协议,兼容redis绝大多数命令,为两种数据库共存提供基础;
2.使用磁盘存储,解决redis大数据量存储瓶颈;
3.使用多线程模式,相对比较健壮。
劣势:
1.受磁盘限制,整体性能相对较差,吞吐量是瓶颈,当吞吐量过高时会出现数据丢失的情况;
2.缺少成熟的集群多节点扩展方案;
3.不支持分库,对于多业务逻辑分类的场景不太友好。
四、分布式爬虫系统
目前爬虫系统进行页面抓取的主要流程:调度器(Scheduler)接收到request并放入队列进行排序、去重、转发等操作,下载器(Downloader)从队列获取到待下载的request,从网络获取到页面数据后,提供给爬虫(spider)进行分析处理。爬虫从数据中提取新的request给调度器,同时将结构化数据(item)交给数据管道(item pipeline)进行存储分发等操作。具体流程参考scrapy框架结构图如下:
要实现分布式爬虫,首先需对调度器进行修改,用网络存储中间件替换本地队列,通过网络存储中间件对request进行多节点分发,同时还需要用中间件存储request指纹从而实现去重。
五、键值型数据库在分布式爬虫系统中的应用
要实现上述功能改造,redis这类的高性能key-value数据库就目前来说是最佳的适用方案。首先redis的高性能能够保证大量节点进行request的读取,同时redis支持多种数据结构及其接口,能够很方便的实现各种队列的业务逻辑。其中可以用list实现FifoQueue和LifoQueue,用zset实现PriorityQueue,用set实现RFPDupeFilter。同时还可以使用list或者pub/sub来实现多任务调度和分发,不需要再另外引入kafka、MQ这类的消息队列来做多任务管理,从而减小整个爬虫系统的架构体积;虽然redis能充分满足整个爬虫系统的分布式需求,可是在某些场景下,redis会出现瓶颈;其中存储容量则是最主要的瓶颈。
在爬取过程中,一个request序列化之后大约占用1KB左右的存储空间,1GB内存则只能处理大约100万个request。因为访问控制之类的原因,爬取一个拥有千万级页面的网站,redis就需要大约10GB左右的内存。一台64G内存的服务器也仅仅只能支持5-7个大型爬取任务的同时执行。
因此引入pika这种以磁盘为主要存储的类redis数据库。pika在保留了redis多样化数据结构的同时,极大的扩展了数据存储容量,从而解决request的容量瓶颈。
可是pika的无集群模式,同样对pika的性能产生很大的制约。在不使用SSD硬盘的情况下,只是单独使用pika会出现大量的慢查询,导致部分数据丢失的情况。因为没有集群模式来实现多实例负载均衡,所以pika的性能扩展成本将比redis高不少。
最终在多任务分布式爬虫系统中,需要用redis和pika两种中间件来支持整个爬虫系统的运行。其中redis负责request指纹和任务调度之类高吞吐量的业务,pika则负责request分发这种需要高存储容量的业务。
六、结束语
以上对Redis和Pika两种key-value存储方案在分布式爬虫系统中的应用做了描述,这两种方案在实际生产环境中相辅相成,互相配合,才能支撑起一个功能健壮,性能强大的成熟的多任务分布式爬虫系统。
审核编辑:符乾江
全部0条评论
快来发表一下你的评论吧 !