本人参与的项目是一个网络客户机安全监控系统的开发,客户机8000台,监控客户机所有行为,如:访问网站地址,打开和关闭的程序名,插拨USB设备的信息,建立和删除文件或文件夹等等信息。这些信息都需要通过服务器端运行的程序监控,把8000台客户端所有操作行为记录下来。实时用c++插入到mysql数据库。同时用php程序的web界面访问这个数据库,还要读数据库生成csv。就几个大表,设计的巨简单。几乎日志信息都保存到一个表了。这样可以想象客户端实时的信息会有很多的。服务器cpu直线上升,php访问数据库也需要2-3分钟。请问大家有没有好的解决方案可以解决这个问题。当然表结构可以拆开的,还可以加索引,这个我也知道的。如果不考虑这个方面,其他方面有没有好的方法。比如如下这些:●Memcached●MySQL-Proxy:MySQL master/slave●MySQL cluster●HSCALE:●MySQL 5.1 partition但是我看了好多资料基本上都是关注在查询上,就是缓冲服务器数据,或者分散开数据。其实我要的是海量数据插入的性能改善!!!

解决方案 »

  1.   

    对表的更新会导致“锁”的问题,具体可以查询有关事务方面的教程,我建议最好根据查询需求的要求重新设计数据库结构。cluster 先不要考虑。
      

  2.   

    ●Memcached 
    ●MySQL-Proxy:MySQL master/slave 
    这两个是用来缓解写的压力的●MySQL 5.1 partition
    主要是删除数据方便其他两个没用过,不知道是否有奇效。
    建议的优化方法:1、insert into values()...();试试这个语法。在客户端积攒一定的数据之后,将数据组合一下发到mysql上,插入速度会快上很多倍。
    2、日志类的应用,应该很少有update和delete。修改一下参数,让MyISAM引擎并发插入,速度应该会有提升。
      

  3.   


    汗,刚才没注意,写错了。
    ●Memcached 
    ●MySQL-Proxy:MySQL master/slave 
    这两个是用来缓解“读”的压力的
      

  4.   

    楼主 按你意思主要是想实现读写分离,你可以参考下面建议不过成本会比较高。
    不过,本人觉得是值得因为这样数据的安装性也是会提高的。 1 若你实时性要求不高,可以使用“ MySQL 1 ”为主要的数据插入库, 每天定时将相关数据转移到“MySQL 2”库中。 MySQL 2 是为后台查询为主。 
    2 若你实时性高,可以考虑MySQL 1 和 MySQL 2 进行实时同步。
      

  5.   

    我们老板说只给一台服务器,用C++疯狂写,php还有读,还有生成CSV。郁闷ing
      

  6.   

    楼主 能否不是使用 PHP 来生成呢? 考虑下c++ 生成相关 CSV,这样可以检查 PHP 进行读数据库的压力。
      

  7.   

    日志文件设大点。日志缓存也大点。用以减少日志的磁盘操作。
    关闭autocmmit。
    INSERT INTO yourtable VALUES (1,2), (5,5), ...; 减少客户端与服务器端的通信开销
    将唯一键检查(uniqueness check )关闭,同样的关闭FOREIGN KEY 。
    加大buffer pool,插入时减少磁盘 I/O 
      

  8.   


    1 关闭AUTO Commit 是好事。
    2 日志文件设置大点也没有坏处, 但日志缓冲设定大点问题比较大。当数据库运到灾难性损坏时候,掉失数据可能比较多;建议不使用。
    3 关闭唯一行检查,会造成重复记录。MySQL 不能关闭啊,当CPU 运行很高的时候,经常发生插入重复记录;建议不使用。
    4 关闭FOREIGN KEY是一个减低开销好办法。
    5 加大buffer pool 是不错办法。
    6 “INSERT INTO yourtable VALUES (1,2), (5,5), ...;” 批量插入的确可以减少不少系统开销。
      

  9.   

    最近我也遇到过这样的问题,我们项目的要求应该比你们的高,现在能处理10000/s的插入量,问题是不能实时查询,因为有锁表的问题,我们也采用了很多方案,比如:replication,partion,效果都不是很理想,也考虑过按小时分表去掉index的办法,去掉index会严重影响查询的效率,所有我们只能等表装满后再加上index(4000万的表,对其中的十列做index起码要5个小时),也会造成5个小时的延期。不知道大家有什么其它好的优化方案,谢谢!
      

  10.   

    8000台机器实时上报的话,不太好控制,建议这样处理
    1、用户的客户机程序,不是实时上报,缓存一天时间,都写在本地数据文件
       每天由svr端发命令给客户机,指定要把哪些文件上报上来,不接收到命令的话,就不上报2、SVR端每天根据自己的负载情况,定时发请求到8000台机器中指定的机器,让它把它的数据上报上来
       一台机器一天如果有操作的话,就一个文件,上报上来再批量插入的话,压力不大的
       因为老板就给一台机器嘛,不能把主动权放在客户机的,让他随意上报,万一压力大的话,会把svr拖死的,由svr根据自己的忙闲程序发出指令来控制上报的话,更安全一些3、DB端,采用innodb吧,分库分表,比如:每20台机器一个库,每个库下400个表,每台机器只上报到一个表里4、其他的考虑:日志肯定也要分等级的
    访问网站地址,打开和关闭的程序名,插拨USB设备的信息,建立和删除文件或文件夹
    做好分析,上面的用户操作中哪些是领导更想了解的,哪些是量比较大的,哪些是意义不大的分级考虑,不重要的可以考虑合并到一起,尽量减少数据量P.S:要考虑好做好校验,免得日志被客户机本地删除了,可以把校验信息和数据文件分开写到不同的地方,上报时做校验
    端口别屏蔽的话,也要做好监控等等
      

  11.   

    当然了,还可以继续做延伸扩展的。。svr机在发命令让客户端机上报数据以后,可以指定哪些数据文件在客户机保存多久,比如保存一个月,一个月后,上报数据后,删除一个月前的日志万一哪天svr机上的资料丢了,也很容易让客户机把一个月内的再上报一次这种设计思路会解决压力问题的,但是要把安全性提高一点。。
    1、本地文件要加密,防止被篡改。。
    2、本机端口被屏蔽的话,要探测出来并做好监控
    3、本机文件被删除的话,要做好校验等等
      

  12.   

    1,c++ 记日志,并上传日志。
    2,表直接用myisam引擎,装mysql5.1 表分区。(分表不要建在同一块硬盘上,如果有条件的话,用用raid)
    3,用load 的方式直接入库数据。(一个表中6个字段,5个索引,18分钟可以2.6亿条没问题,包生成索引)
    4,扩内存。有条件扩到32G,优化sort,group by。
    5,用myisampack来压缩数据库。能节约一半空间。索引不会被压缩。
      

  13.   

    1、推荐使用InnoDB。
    2、关闭外键约束。
    3、采用多值插入“INSERT INTO yourtable VALUES (1,2), (5,5), ...;”
    4、加大buffer pool 是不错办法。相关优化配置:
    6、 推荐InnoDB的配置(1G内存情况,主要运行mysql服务器):
    innodb_buffer_pool_size = 600M
    innodb_additional_mem_pool_size = 64M
    # Set .._log_file_size to 25 % of buffer pool size
    innodb_log_file_size = 256M
    #innodb_log_buffer_size = 8M
    innodb_flush_log_at_trx_commit = 1
    #innodb_lock_wait_timeout = 50
    innodb_file_per_table
    其中innodb_flush_log_at_trx_commit和innodb_file_per_table对I/O性能影响最大。
      

  14.   

    另外,采用延迟插入也可以加快速度,INSERT DELAYED语句加快速度。
      

  15.   

    要求10000/s的速度,单机的MYSQL肯定处理不过来的,最好根据某个主键分机器吧
    另外做index,可以先在别的机器上面新建一个空表,建好索引,然后把这个机器做备机,等数据复制得差不多了,然后切换应用的IP地址就可以了,应该不用停机很久。
      

  16.   

    厉害啊,这么高压的数据插入量。同时还要读取,佩服佩服。
    18楼的办法可行,主要是表分区不好处理。8000台客户端的话,最好统一通过协议传到服务端,服务端缓存后在批量写入MySql。还应该对针对客户端对表进行Partition。 服务器的内存要大,此外一定要有多硬盘,将不同的表分区保存在不同的硬盘上。切忌的是:8000个客户端都直接连MySql写入数据。那必死无疑。
      

  17.   

    进来学习下 MySql ,看来MySql在海量数据处理方面还是不如Oracle啊,更不用说db2了。
      

  18.   

    只有疯狂的插入操作,没有DELETE和UPDATE操作,那么建议用MYISAM引擎,它可以提供很快的插入。
      

  19.   

    还是使用MyISAM引擎比较好,插入速度快。查询也不慢。
      

  20.   

    hxcfindjob
     
    (上海滩拾贝) 等 级: 
    结帖率:0.00% 
      

  21.   

    结帖率:0.00% 过客~~~晕了,我现在做的正是这个也是监控系统
    本人比较菜,我打算用mysql同步来做,不知道可行不?
      

  22.   

    软件的作用是有限的,硬件不够,你没法解决的。如果这个问题你交给oracle或者ibm,他会根据你的需求,给你一个硬件清单和费用的数额。你的这个项目,几乎可以肯定需要分布式硬件架构,也就是多台服务器。