低成本服务器搭建千万级数据采集系统

有这样一个采集系统的需求,达成指标: 需要采集30万关键词的数据 、微博必须在一个小时采集到、覆盖四大微博(新浪微博、腾讯微博、网易微博、搜狐微博)。为了节约客户成本,硬件为普通服务器:E5200 双核 2.5G cpu, 4 G DDR3 1333内存,硬盘 500G SATA 7200转硬盘。数据库为mysql。在这样的条件下我们能否实现这个系统目标?当然如果有更好的硬件不是这个文章阐述的内容。现通过采集、存储来说明一下如何实现:

一、采集,目标是在一个小时内把30万关键词对应的数据从四大微博采集下来,能够使用的机器配置就是上面配置的普通服务器。采集服务器对硬盘没有太多要求,属于cpu密集型运算,需耗费一些内存。评估下来硬件资源不是瓶颈,看下获取数据的接口有什么问题?

  • 1、通过各大微博的搜索api。就比如新浪微博API针对一个服务器IP的请求次数,普通权限限制是一个小时1w次,最高权限合作授权一个小时4w次。使用应用时还需要有足够的用户,单用户每个应用每小时访问1000次,最高权限4w次需要40个用户使用你的应用。达到30w关键词,至少需要8个应用,如果每个关键词需要访问3页,总共需要24个合作权限的应用。实际操作我们是不可能为这个项目做到开发24个合作权限的应用,所以这个方式不是很合适。新浪微博API限制参考链接

  • 2、通过各大微博的最新微博收集数据,微博刚推出的时候,各大微博都有微博广场,可以把最新的微博都收集下来,然后通过分词,如果出现了30万关键词中的一个就留下,其他就丢弃掉。不过现在除了腾讯微博和搜狐微博有微博广场类似的功能,新浪微博和网易微博已经没有这项功能了。另按照新浪微博之前公布的数据,注册用户已经超过5亿,每小时超过1亿条微博,如果全量采集对数据存储是个大的考验,也需要大量的系统资源,实际采集了一亿条,也许就1000w条有用,浪费了9000w条数据的资源。

  • 3、通过各大微博的网页搜索,可见即可抓的方式,结合反监控系统模块模拟人的正常行为操作,搜索30万关键词数据,使资源最大化利用。为了保证在一个小时采集到,需要采用分布式多线程模式抓取,并发采集。并发的时候不能从同一个ip或者同一个ip网段出去,保证对方不会监测到我们的爬虫。

我们最后采用了第三种方式,目前运行状况为通过30w关键词搜索得到的所有微博加在一起总量1000多w条每天,新浪和腾讯最多,新浪微博略胜一筹。使用了6台普通PC服务器,就算一台机器7000元,总共4万元硬件设备解决采集硬件问题。整体部署图为:

海量采集系统部署图

二、存储,采集下来的数据如何处理?首先存储采集数据是个密集写的操作,普通硬盘是否能够支持,mysql数据库软件能否支持,未来量突然增加如何应对?再就是评估存储空间,每天增量这么多需要耗费大量的存储资源,如何存放并且易扩展。

  • 1、如何存储。正常来说我们上面配置的服务器,mysql使用myisam引擎一张表最多20w,使用innodb引擎最多400w,如果超过这个数量,查询更新速度奇慢。这里我们采用一个比较取巧的做法,使用mysql的innodb存储引擎做了一层缓存库,这个缓存库有两个缓存表,每个表只存储少于300w的数据,有一张表多于300w的数据就切换到另一张表插入直到超过300w再切换回去。切换成功后,把多于300w数据的表truncate掉,记得一定要没有数据插入的时候再truncate,防止数据丢失。这里一定要用truncate,不能使用delete,因为delete需要查询,要用到索引读写,并且delete还会写数据库log耗费磁盘IO,存储空间也没有释放。truncate和drop是操作数据库删除数据比较好的做法。由于有两个表作为数据插入表,使用数据库表的自增id并不太合适,需要一个高速的唯一自增Id服务器提供生成分布式ID。另数据库完全可以关闭写事务日志 ,提高性能,因为抓取的数据当时丢失再启动抓取就可以了, 这样数据库可以保持在一个比较高性能的情况完成插入操作。抓取缓存表结果如图:

    抓取缓存表结构图

  • 2、存储空间。插入后的数据需要保存下来,不能在超过300w后被truncate掉了。我们需要有个程序在达到300万时被truncate掉之前把数据同步走,存放到另外一个库上(我们叫做结果库,结果库也是使用innodb引擎)。不过我们每天采集的数据1000多万,按天递增,mysql一张表一天就撑爆了,我们这个表不是写操作密集型,所以结果库可以存储多点数据,设定上限500w,但是500万还是存不下1000万数据。我们需要对mysql最终结果分库分表。将数据先按照时间分机器分库,再按照数据源分表,比如201301通过hash计算的数据存放在一个机器,201302通过hash计算在另一个机器。到了机器后再按照天或者半天分表,比如表名为 weibo_2013020101 、weibo_2013020112。weibo_2013020101表示2月1日上午一个表,weibo_2013020112表示2月1日下午一个表。光这样分了还是不够,1000w/2=500w,经不起压力扩展。我们还需要把表再拆分,比如weibo_2013020101 拆成 weibo_2013020101_1(新浪微博)、weibo_2013020101_2(腾讯微博)、weibo_2013020101_3(网易微博)、weibo_2013020101_4(搜狐微博)。这样一张表平均就存放 500w/4 = 125w 条数据,远远小于500w上限,还可以应对未来突发的增长。再从存储空间来算,就算一条微博数据为1k,一天 1000w*1k=10G,硬盘500G最多存放50天的数据,所以我们规划机器的时候可以挂接多一点硬盘,或者增加机器。结果库分表如图:

    分库分表结构图

按照这样的架构,我们使用开源免费软件、低成本服务器搭建的千万级数据采集系统在生产运转良好。

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 2
    评论
<p style="font-size:14px;"> <span style="font-size:small;">随着国内IT事业的兴起,越来越多的小伙伴也投身到了开发这个相对高薪的行业来。很多同学进入的方式都是零基础通过培训或者看视频自学,在工作一两年后,发现由于自己的基础太薄弱,想进一步提高自己的能力变得非常 困难。</span> </p> <p style="font-size:14px;"> <span style="font-size:small;">现在市面上的视频教程,主要有一下两类:第一类是纯理论的,比如框架、算法、虚拟机等;另一类是Demo级别的项目,如各大培训机构的项目课程。从业这么多年,学习了大量的视频教程,也跟很多毕业三年左右的程序员做过交流,但一直没发现一套特别好的教程,能让小伙伴们从零基础一直到高级进阶,持续得到学习。在工作中,他们也反馈,视频教程各种高大上的技术堆砌,而在实际开发中呢,大部分技术都没有用到,就算是用,也完全不是像教程中那么用的。在面试中,你跟夸夸其谈十分钟,面试官一句,请问你在项目中是怎么用这个技术的,在使用的时候有什么问题?遇到这样的问题,大部分同学们都直接熄火,完全不知所措,为啥呢,因为他在项目中根本没有用过这个技术,只是看了文档、视频,只是跟着教程做了Demo。而技术跟业务如何结合,这应该是大部分同学在工作中最薄弱的环节。甚至,有些同学会唯技术论,面对公司的业务,会去抱怨公司用的技术不新,认为业务不重要。但我要纠正的是,技术的出现本来就是为业务服务的,离开业务谈技术那就是耍流氓。</span> </p> <p style="font-size:14px;"> <span style="font-size:small;">早在两年前,我就萌生了这样的想法,既然国内的环境造成了面试修地球,上班拧螺丝的情况,那么我能不能结合我自己做的真实项目,脱敏后给大家分享出来,让各位同学能有一个真实的项目环境去边学边提高,所以,也就有了《从0开始用Java做"智慧农业物联网"》课程的诞生。</span> </p> <p style="font-size:14px;"> <span style="font-size:small;">学习本课程的基本要求:有Java基础,学习过Spring,SpringMVC,Mybatis框架,做过简单项目以上的同学均可学习。但并不代表,本课程就是个入门教程,对于有开发经验的同学们,物联网这个行业是个朝阳产业,也可以说是未来十年发展的蓝海。那我相信,有实体经济支撑的行业绝不会像互联网行业有那样大的泡沫,也绝不会让你工作的没有安全感。对于有志于从事物联网相关工作的同学,对于想从各方面提升自己的各位同学们来说,本课程也非常的适合你们去学习。</span> </p> <p style="font-size:14px;"> <span style="font-size:small;">我从12年就开始接触物联网项目,做过智慧猪场、智慧农场、猪联网、云医疗等相关项目,也做过互联网行业,兜兜转转一圈下来,自认为还是积累了很多的经验和教训,那我都会在我课程中对这样的知识有所分享。</span> </p> <p style="font-size:14px;"> <span style="font-size:small;">同时,在这个课程中,我既是产品,又是设计,还是开发,还是运维,也是客户,我会从一个项目的全生命周期给大家进行介绍,并且都有相关的落地方案。这样,同学们的眼光就会有所延展,不会仅仅局限在开发这一亩三分地上。</span> </p> <p style="font-size:14px;"> <span style="font-size:small;">本课程的亮点:我只能说,亮点很多,很多。。。</span> </p> <p style="font-size:14px;"> <span style="font-size:small;">核心如下:产品经理眼中的产品、数据库设计、如何把一个需求变成代码、如何跟物联网设备交互、如何上线一个项目、在需求变更后如何做到不跟产品撕逼。。。</span> </p> <p style="font-size:14px;"> <span style="font-size:small;">看到了吧,我不会只让你知道那些高大上的技术点,我向你们学会的是如何做一个完美的产品!</span> </p> <p style="font-size:14px;"> <span style="font-size:small;">在这个课程中,你会看到太多太多跟其他教程不同的地方,你看到的不是Demo级别的案例,你看到的绝对是一个工业级别的实现方案。我也希望通过这个课程,同学们能进一步升华自己的视界,你所站的高度,你看问题的不同角度,将决定未来你成长的上限。</span> </p> <p style="font-size:14px;"> <span style="font-size:small;">对于本课程的成长忠告:本课程的录制会持续很长时间,是的,你没看错,是很长时间,目前我的预期,起码是在年底之前不会结束,为什么要这样安排,因为我想要分享的内容实在太多,我也不想对课程进行拆分,也不想草草结束,所以,你所能得到的收获一定会足够大,他没有终点。。。</span> </p> <p style="font-size:14px;"> <span style="font-size:small;">最终达到的效果:在业务中学技术点,通过技术点让业务变得更优美!</span> </p>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 2

打赏作者

Towan

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值