笔者在实际工作中,有幸接触到海量的数据处理问题,对其进行处理是一项艰巨而复杂的任务。原因有以下几个方面: 一、数据量过大,数据中什么情况都可能存在。如果说有10条数据,那么大不了每条去逐一检查,人为处理,如果有上百条数据,也可以考虑,如果数据上到千万级别,甚至过亿,那不是手工能解决的了,必须通过工具或者程序进行处理,尤其海量的数据中,什么情况都可能存在,例如,数据中某处格式出了问题,尤其在程序处理时,前面还能正常处理,突然到了某个地方问题出现了,程序终止了。
二、软硬件要求高,系统资源占用率高。对海量的数据进行处理,除了好的方法,最重要的就是合理使用工具,合理分配系统资源。一般情况,如果处理的数据过TB级,小型机是要考虑的,普通的机子如果有好的方法可以考虑,不过也必须加大CPU和内存,就象面对着千军万马,光有勇气没有一兵一卒是很难取胜的。
三、要求很高的处理方法和技巧。这也是本文的写作目的所在,好的处理方法是一位工程师长期工作经验的积累,也是个人的经验的总结。没有通用的处理方法,但有通用的原理和规则。
那么处理海量数据有哪些经验和技巧呢,我把我所知道的罗列一下,以供大家参考:
现在的数据库工具厂家比较多,对海量数据的处理对所使用的数据库工具要求比较高,一般使用Oracle或者DB2,微软公司的SQL Server 2005性能也不错。另外在BI领域:数据库,数据仓库,多维数据库,数据挖掘等相关工具也要进行选择,象好的ETL工具和好的OLAP 工具都十分必要,例如Informatic,Eassbase等。笔者在实际数据分析项目中,对每天6000万条的日志数据进行处理,使用SQL Server 2000需要花费6小时,而使用SQL Server 2005则只需要花费3小时。
二、编写优良的程序代码
处理数据离不开优秀的程序代码,尤其在进行复杂数据处理时,必须使用程序。好的程序代码对数据的处理至关重要,这不仅仅是数据处理准确度的问题,更是数据处理效率的问题。良好的程序代码应该包含好的算法,包含好的处理流程,包含好的效率,包含好的异常处理机制等。
三、对海量数据进行分区操作
对海量数据进行分区操作十分必要,例如针对按年份存取的数据,我们可以按年进行分区,不同的数据库有不同的分区方式,不过处理机制大体相同。例如SQL Server的数据库分区是将不同的数据存于不同的文件组下,而不同的文件组存于不同的磁盘分区下,这样将数据分散开,减小磁盘I/O,减小了系统负荷,而且还可以将日志,索引等放于不同的分区下。
四、建立广泛的索引
对海量的数据处理,对大表建立索引是必行的,建立索引要考虑到具体情况,例如针对大表的分组、排序等字段,都要建立相应索引,一般还可以建立复合索引,对经常插入的表则建立索引时要小心,笔者在处理数据时,曾经在一个ETL流程中,当插入表时,首先删除索引,然后插入完毕,建立索引,并实施聚合操作,聚合完成后,再次插入前还是删除索引,所以索引要用到好的时机,索引的填充因子和聚集、非聚集索引都要考虑。
脂肪酸酰胺五、建立缓存机制
当数据量增加时,一般的处理工具都要考虑到缓存问题。缓存大小设置的好差也关系到数据处理的成败,例如,笔者在处理2亿条数据聚合操作时,缓存设置为100000条/Buffer,这对于这个级别的数据量是可行的。
六、加大虚拟内存
如果系统资源有限,内存提示不足,则可以靠增加虚拟内存来解决。笔者在实际项目中曾经遇到针对18亿条的数据进行处理,内存为1GB,1个P4 2.4G的CPU,对这么大的数据量进行聚合操作是有问题的,提示内存不足,那么采用了加大虚拟内存的方法来解决,在6块磁盘分区上分别建立了6个4096M
的磁盘分区,用于虚拟内存,这样虚拟的内存则增加为4096*6 + 1024 = 25600 M,解决了数据处理中的内存不足问题。
七、分批处理
海量数据处理难因为数据量大,那么解决海量数据处理难的问题其中一个技巧是减少数据量。可以对海量数据分批处理,然后处理后的数据再进行合并操作,这样逐个击破,有利于小数据量的处理,不至于面对大数据量带来的问题,不过这种方法也要因时因势进行,如果不允许拆分数据,还需要另想办法。不过一般的数据按天、按月、按年等存储的,都可以采用先分后合的方法,对数据进行分开处理。
八、使用临时表和中间表
数据量增加时,处理中要考虑提前汇总。这样做的目的是化整为零,大表变小表,分块处理完成后,再利用一定的规则进行合并,处理过程中的临时表的使用和中间结果的保存都非常重要,如果对于超海量的数据,大表处理不了,只能拆分为多个小表。如果处理过程中需要多步汇总操作,可按汇总步骤一步步来,不要一条语句完成,一口气吃掉一个胖子。
九、优化查询SQL语句
在对海量数据进行查询处理过程中,查询的SQL语句的性能对查询效率的影响是非常大的,编写高效优良的SQL脚本和存储过程是数据库工作人员的职责,也是检验数据库工作人员水平的一个标准,在对SQL语句的编写过程中,例如减少关联,少用或不用游标,设计好高效的数据库表结构等都十分必要。笔者在工作中试着对1亿行的数据使用游标,运行3个小时没有出结果,这是一定要改用程序处理了。
十、使用文本格式进行处理
对一般的数据处理可以使用数据库,如果对复杂的数据处理,必须借助程序,那么在程序操作数据库和程序操作文本之间选择,是一定要选择程序操作文本的,原因为:程序操作文本速度快;对文本进行处理不容易出错;文本的存储不受限制等。例如一般的海量的网络日志都是文本格式或者csv格式(文本格式),对它进行处理牵扯到数据清洗,是要利用程序进行处理的,而不建议导入数据库再做清洗。
十一、定制强大的清洗规则和出错处理机制
海量数据中存在着不一致性,极有可能出现某处的瑕疵。例如,同样的数据中的时间字段,有的可能为非标准的时间,出现的原因可能为应用程序的错误,系统的错误等,这是在进行数据处理时,必须制定强大的数据清洗规则和出错处理机制。
十二、建立视图或者物化视图
视图中的数据来源于基表,对海量数据的处理,可以将数据按一定的规则分散到各个基表中,查询或处理过程中可以基于视图进行,这样分散了磁盘I/O,正如10根绳子吊着一根柱子和一根吊着一根柱子的区别。
十三、避免使用32位机子(极端情况)
目前的计算机很多都是32位的,那么编写的程序对内存的需要便受限制,而很多的海量数据处理是必须大量消耗内存的,这便要求更好性能的机子,其中对位数的限制也十分重要。十四、考虑操作系统问题
海量数据处理过程中,除了对数据库,处理程序等要求比较高以外,对操作系统的要求也放到了重要的位置,一般是必须使用服务器的,而且对系统的安全性和稳定性等要求也比较高。尤其对操作系统自身的缓存机制,临时空间的处理等问题都需要综合考虑。
声音采集器十五、使用数据仓库和多维数据库存储
数据量加大是一定要考虑OLAP的,传统的报表可能5、6个小时出来结果,而基于Cube的查询可能只需要几分钟,因此处理海量数据的利器是OLAP多维分析,即建立数据仓库,建立多维数据集,基于
多维数据集进行报表展现和数据挖掘等。
十六、使用采样数据,进行数据挖掘
基于海量数据的数据挖掘正在逐步兴起,面对着超海量的数据,一般的挖掘软件或算法往往采用数据抽样的方式进行处理,这样的误差不会很高,大大提高了处理效率和处理的成功率。一般采样时要注意数据的完整性和,防止过大的偏差。笔者曾经对1亿2千万行的表数据进行采样,抽取出400万行,经测试软件测试处理的误差为千分之五,客户可以接受。
还有一些方法,需要在不同的情况和场合下运用,例如使用代理键等操作,这样的好处是加快了聚合时间,因为对数值型的聚合比对字符型的聚合快得多。类似的情况需要针对不同的需求进行处理。
海量数据是发展趋势,对数据分析和挖掘也越来越重要,从海量数据中提取有用信息重要而紧迫,这便要求处理要准确,精度要高,而且处理时间要短,得到有价值信息要快,所以,对海量数据的研究很有前途,也很值得进行广泛深入的研究。
开源平台的高并发集思考
绕线电阻目前碰到的高并发应用,需要高性能需求的主要是两个方面: 1、网络2、数据库
这两个方面的解决方式其实还是一致的:
1、充分接近单机的性能瓶颈,自我优化
2、单机搞不定的时候(数据传输瓶颈:单位时间内磁盘读写/网络数据包的收发cpu计算瓶颈),把负荷分担给多台机器,就是所谓的负载均衡
网络方面单机的处理:
1、底层包收发处理的模式变化(从select 模式到epoll / kevent)
2、应用模式的变化
2.1应用层包的构造方式
2.2 应用协议的实现
2.3 包的缓冲模式
2.4 单线程到多线程
网络负载均衡的几个办法:
1、代理模式:代理服务器只管收发包,收到包以后转给后面的应用服务器(服务器后可能还会有一堆堆的数据库服务器等等),并且把返回的结果再返回给请求端
2、虚拟代理ip:代理服务器收发包还负载太高,那就增加多台代理服务器,都来管包的转发。这些代理服务器可以用统一的虚拟ip,也可以单独的ip
3、p2p:一些广播的数据可以p2p的模式来减轻服务器的网络压力
数据库(指mysql)单机的处理:
1、数据库本身结构的设计优化(分表,分记录,目的在于保证每个表的记录数在可定的范围内)
2、sql语句的优化
3、master + slave模式
数据库集的处理:
1、master + slave模式(可有效地处理并发查询)
2、mysql cluster 模式(可有效地处理并发数据变化)
基本需求:
1、高可用性:将停止服务时间降低到最低甚至是不间断服务
2、可扩展性:随着访问的增加,系统具备良好的伸缩能力
3、可视性:系统、服务的状态处于一个实时的监控之下
4、高性能高可靠性:经过优化的体系结构及合理的备份策略
5、安全性:结构上的安全及主机的安全策略
基本思路
1、对于访问频繁,用户量大的对象(bbs,blog)采用某种合理的方式负载到多个服务器上。把数据库独立出来,准备2套mysql数据库,以实现主从复制,即减轻负载,又提高了可靠性。更近一步,使用mysql proxy技术,实现主从服务器的读写分离,大大提高这个系统的性能和负载能力。
2、数据库与外部网络隔离,只允许web服务器(bbs,blog等)通过私有地址方式访问。这样就提高了
数据库的安全性,同时也节省了宝贵的带宽。
3、部署监控系统,通过监控主机存活、服务、主机资源,实时把系统的健康状态置于可视状态,对系统的运营状态心中有数。
4、备份是想都不用想的事情,使用单独的服务器集中备份,是一个比较不错的主意。
技术实现
1、负载均衡。2台同样配置的linux服务器,内核支持lvs,配置keepalived工具,即可实现负载转发。一旦其后的真实服务器出现故障,keepalived会自动把故障机器从转发队列删除掉,等到故障修复,它又会自动把真实服务器的地址加入转发列表。由于lvs支持会话保持,因此对于bbs 这样的应用,一点也不用担心其登录丢失。
2、mysql主从复制。即保证数据的安全,又提高了访问性能。我们在前端的每个web服务器上加入mysql proxy这个工具,即可期待实现读写的自动分离,让写的操作发生在主数据库,让查询这类读操作发生在从数据库。
3、nagios是一个开源的,受广泛欢迎的监控平台。它可对主机的存活、系统资源(磁盘空间、负载等)、网络服务进行实时监控。一旦探测到故障,将自动发送邮件(短信)通知故障。
4、备份。包括web数据和数据库服务器的备份。对于web服务而言,GNU tar即可实现备份的一切愿望。简单的设置一下crontab 就可以让系统在我们做梦的时刻老老实实的帮我们备份了。但是,由于空间的限制,不可能一直备份下去,所以要做一个合适的策略,以不断的用新的备份去替换陈旧的备份数据;多少天合适?看磁盘容量吧。对于数据库,先mysqldump一下,再tar.完成这些工作后把备份文件传输到备份服务器集中。一个比较省事的方法是把备份服务器以NFS方式挂接到web服务器及数据库服务器。
5、web服务器。至少包括apache和mysql proxy这两个组件。Apache做bbs和blog的容器,以虚拟机方式把用户的请求转发到bbs目录或blog目录。
6、安全措施。包含两层安全,一层是主机本身,另一层是结构(mysql从外部网络隔离)。实践证明,iptables是一个非常值得信赖的防火墙工具。在实际应用中,采取先关门后开窗的策略,大大增强系统的安全性。
组件
一、硬件: 负载均衡2台(dell 1950),web服务器2-3台(dell1950),数据库2台(dell 2950),存储NAS(5T格式化后容量),备份4u服务器(带磁盘阵列5T容量),监控服务器1台(dell1850).
二、软件:操作系统centos 5(定制安装),负载均衡ipvsadm、keepalived,监控nagios,web 服务apache+php等,数据库mysql,数据库代理mysql proxy.
摘要:网站不得不面对大规模用户的并发访问,它涉及到网站系统中的各个方面。通过使用负载均衡技术来解决大规模并发访问;指出在高并发情况下网络、防火墙、数据库以及网页
编程等方面要注意的问题。强调做好网站的监控手段和应急预案,并给出相关的建议和实现方法。
关键词:发表论文秘籍网www.qikan120 并发访问;负载均衡
论文发表:www.qikan1201009-3044(2011)11-2553-02
How to Deal with Large-scale Concurrent Accesses to a Website
SANG Ping
(Anhui Education Examinations Authority, Hefei 230022, China)
Abstract: A website has to deal with large-scale concurrent accesses. It will be involved all the website’s systems. We resolved concurrent accesses by using load balancing. At the same time, iss
ues concerning network, firewall, database and web designs also be pointed out. Methods of monitors and emergency plans should be prepared in time. We table some proposals and implement methods.
Key words: concurrent access; load balancing
1 概述
当在门户网站上发布用户热切关心的新闻内容或查询信息时,广大用户会产生集中式的、爆发式的网站访问,如果在网站技术和管理上没有做好及时应对,大规模的并发访问就可能会导致整个网站系统的瘫痪,造成不良影响。网站管理者要及时预测到可能的高并发访问的到来,并提前做好准备工作,主动把握时机,不至于到时措手不及。
并发访问是对整个网站系统的考验,如何应对它,则是一项系统工程,要求网站管理者站在系统的高度来统筹管理。近几年,安徽省教育招生考试院网站针对高考分数网上发布期间的高并发量访问,取得丰富的工作经验,下面分别介绍是如何实现的。
地脚螺钉2 有保障的硬件设备
2.1 网络运营商的宽带接入
27gan首先,网站的链路接入上要有多个不同运营商的宽带接入,这样可以充分发挥不同运营商的作用。采用DNS解析的技术,实现电信宽带负责电信上网客户对网站的访问、联通宽带负责联通上网客户对网站的访问、教育网宽带负责教育网的客户对网站的访问,使不同运营商的客户对网站访问的速度达到最快。因为我省大部分互联网用户是通过电信上网的,所以采用两条电信的百兆宽带,它们承担了大部分的网站流量。这两条电信宽带互为备份,不仅平均负担了网站流量,还提高了网站系统的可靠性。
静压试验2.2 防火墙技术
为了适应高并发访问的要求,在高峰访问到来之前,应对防火墙的规则做调整:1)关闭各类网络攻击检测,以免防火墙的CPU计算量过大,导致由于防火墙的故障而造成网络阻塞。2)要根据议防火墙数据包流量的大小,对防火墙过滤规则的先后顺序进行调整,与流量大的数据包相关的防火墙过滤规则要调整靠前,这可大大减少CPU进行数据过滤的计算量,减轻CPU负载。3)等访问高峰期过后,还要将防火墙的规则恢复到原先正常的状态。
2.3 负载均衡设备及技术
负载均衡技术是解决集中并发访问的核心技术,负载均衡主要能够实现以下功能:1)多链路负载均衡:支持Inbound/Outbound双向链路负载均衡。
2)防火墙负载均衡:要求能够实现异构防火墙的双Active工作及负载均衡。
3)多站点负载均衡:支持站点主、备数据中心的建设,同时支持智能的DNS解析。
4)服务器负载均衡:完善的第四/七层交换功能,支持可定制的基于应用层的健康检查方式,支持会话保持方式。
5)多路连接复用:将多个用户的请求合成一个连接发送到服务器,减小应用服务器的