使用大数据的一些建议
2013-06-26 18:16
369 查看
1.总体结构
根据提供<<概要设计>>,按我的理解项目是属于一个数据分析决策系统,从各个子系统中提取数据,因为各个系统使用的数据库可能并不相同,可能使用orcale,sqlserver,mysql或其它数据库,而我们这边使用的是mysql数据库,这就需要一个接口把各个子系统的数据库与我们这边使用的mysql数据库对接起来。整体物理架构如下:2.数据的插入,存储
2.1具体要求
>1万条数据库记录/秒。2.2相关思路
按设计上面那些的需要达到每秒可以插入一万条左右的数据,我个人觉得无需要,理由----(数据的获取是由子系统完成的,所以由于大并发而产生大量的数据的插入操作应该是由子系统来承受的),当然我们这边也可以用技术去实现它。辟如通过负载均衡的方式。按我的思路,做一个中间程序专门通过数据库接口将第三方系统的数据提取出来,可以做成服务的方式,定时去扫描一次第三方系统的数据库,采用多线程的方式,同时扫描多个子系统的数据表,转化后同时将数据插到Mysql数据库,通过Mysql Proxy进行负载,按照每台机器每秒至少可以插入2500条数据,4组Mysql Server(主-主-主-主)通过多主的方式数据相互Replication基本上可以满足一秒10000条以上的数据插入。另外其它方面的优化:
1.将 innodb_flush_log_at_trx_commit 配置设定为0;按过往经验设定为0,插入速度会有很大提高。因为每一次事务提交或事务外的指令都需要把日志写入(flush)硬盘,这是很费时的。设置为0,速度会加快,但是对于数据安全性有一点影响。
2.在insert语句方面,用INSERT DELAYED解决MySQL堵塞问题,这样就不会产生堵塞的状况,这样的好处是提高插入的速度,客户端不需要等待太长时间,坏处是,不能返回自动递增的ID,以及系统崩溃时,MySQL还没有来得及插入数据的话,这些数据将会丢失.
3.在提取数据插入mysql时,可以将值组合起来,一次性插入多个值要比一次一条的效率高很多倍。
Eg:
insert into tb values (value1) 的效率要比 insert into tb values (value1),(value2),(value3)…..(valuen)低
3.数据的存储
3.1具体需求
数据是一个非常庞大的数据,要对几个子系统的数据进行汇总,而几个子系统要汇集好多终端的日志数据,热数据的总量亿级以上。3.2相关思路
3.2.1 分库分表分服务器热数据总量在一亿以上,用分库分表的方式,在表的记录达到一定的数量的时候对其进行横向拆分,例如:tb表,可以根据相关的规则将其拆分为tb_1,tb_2,tb_3,…..tb_n个表,还可将数据分布在不同的库上面,例如:库1(tb_1,tb_2);库2:(tb_1,tb_2,tb_3).不同的库可以放置不同的服务器组,如下图(当第一个服务器组)存储数据达到一定的程度的时候就可以开启第二个数据库服务器组。
这样数据采用分库,分表,并且分布式保存,这样可以减轻单表访问的压力,也可以减轻单台服务器带来的压力。
3.2.1 分区技术
另mysql5.1版本以上实现了一个新技术,可以实现分区.这是mysql5.1后出来的一个新技术,可以将一张单表分割成若干个部份然后可以保存在不同位置,分区就是一个表分割在不同的磁盘文件中。这样的话就可以不需要我们手动去一个个去分表了,以下是mysql官方对分区的一个说法:
分区的一些优点包括:
· 与单个磁盘或文件系统分区相比,可以存储更多的数据。
· 对于那些已经失去保存意义的数据,通常可以通过删除与那些数据有关的分区,很容易地删除那些数据。相反地,在某些情况下,添加新数据的过程又可以通过为那些新数据专门增加一个新的分区,来很方便地实现。
通常和分区有关的其他优点包括下面列出的这些。MySQL 分区中的这些功能目前还没有实现,但是在我们的优先级列表中,具有高的优先级;我们希望在5.1的生产版本中,能包括这些功能。
· 一些查询可以得到极大的优化,这主要是借助于满足一个给定WHERE 语句的数据可以只保存在一个或多个分区内,这样在查找时就不用查找其他剩余的分区。因为分区可以在创建了分区表后进行修改,所以在第一次配置分区方案时还不曾这么做时,可以重新组织数据,来提高那些常用查询的效率。
· 涉及到例如SUM() 和 COUNT()这样聚合函数的查询,可以很容易地进行并行处理。这种查询的一个简单例子如 “SELECT salesperson_id, COUNT(orders) as order_total FROM sales GROUP BY salesperson_id;”。通过“并行”, 这意味着该查询可以在每个分区上同时进行,最终结果只需通过总计所有分区得到的结果。
· 通过跨多个磁盘来分散数据查询,来获得更大的查询吞吐量。
分区的关键词就是partition,它分为Range, List, Hash, Key这几种分割方法,具体的使用方法可以参考mysql手册。
3.3其它
如果数据的数量过于庞大,可以采用nosql的方式存储数据,nosql可以存储海量的数据.也可以进行分布式存储,如比较常用的mongodb等。优点:易扩展;大数据量,高性能;灵活的数据模型
缺点:缺乏支持,出了差错将是差难性的。
4.数据的查询统计
4.1具体需求
数据是一个非常庞大的数据,要对这些很大的数据进行检索,统计.4.2相关思路
a.采用分库;分表;分服务器,在查询的时候,系统吞吐量比单台服务器大。b.对于数据特多的情况下,采用Coreseek中文全文检索/搜索软件, Coreseek 是一款中文全文检索/搜索软件,以GPLv2许可协议开源发布,基于Sphinx研发并独立发布,专攻中文搜索和信息处理领域,适用于行业/垂直搜索、论坛/站内搜索、数据库搜索、文档/文献检索、信息检索、数据挖掘等应用场景。如下图(Sphinx架构):
c.表结构的优化,索引优化,SQL语句的优化。
d.使用内存数据库Redis,Redis是一个key-value存储系统。和Memcached类似,与memcached一样,为了保证效率,数据都是缓存在内存中。但是比Memcache有优势的是,支持数据持久,支持主从同步.如国内大型门户新浪就大量使用Redis.如下图是摘自新浪的Redis+Mysql的架构图。
5.数据迁移
据看别人的数据迁移,就是用一个数据迁移系统将库中超过规定时间的数据移至数据仓库,不求性能有多高,但求数据迁移安全,有的就叫做愚公移山。相关文章推荐
- MySQL的一些其他插入数据的方式,顺便给大家脑补一点基本函数的使用
- C#字符串使用的一些小建议
- 用C#编程的一些建议(规范写法,使用技巧,少走弯路)ZZ
- 给师弟师妹们学习数据挖掘的一些建议
- 建议117:使用SSL确保通信中的数据安全
- Labview使用DAQ数据采集的一些注意问题
- 使用Json比用string返回数据更友好,也更面向对象一些
- 关于Hive中的复杂数据类型Array,Map,Structs的一些使用案例
- [C++]高效使用容器的一些建议
- 如何得到应用的context以使用这个context 得到应用的安装目录下的files目录,将一些数据存储在这里
- 使用手机本地sqlite数据库存一些类
- * java版HashMap,大数据量时效率很低,建议1000条数据以下使用
- 使用AO往MDB和SDE写数据的一些经验之谈
- 1 开发一个注重性能的JDBC应用程序不是一件容易的事. 当你的代码运行很慢的时候JDBC驱动程序并不会抛出异常告诉你。 本系列的性能提示将为改善JDBC应用程序的性能介绍一些基本的指导原则,这其中的原则已经被许多现有的JDBC应用程序编译运行并验证过。 这些指导原则包括: 正确的使用数据库MetaData方法 只获取需要的数据 选用最佳性能的功能 管理连
- 批量插入数据的一些小建议
- 对于Python装饰器使用的一些建议
- 使用Maven的一些小建议,希望你能喜欢
- 安卓开发SQlite使用执行SQL语句一些简单的处理——2.查询数据库的数据
- 基于Python使用Redis的一些想法和建议
- 对于Python的Django框架使用的一些实用建议