本人参与的项目是一个网络客户机安全监控系统的开发,客户机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但是我看了好多资料基本上都是关注在查询上,就是缓冲服务器数据,或者分散开数据。其实我要的是海量数据插入的性能改善!!!
●MySQL-Proxy:MySQL master/slave
这两个是用来缓解写的压力的●MySQL 5.1 partition
主要是删除数据方便其他两个没用过,不知道是否有奇效。
建议的优化方法:1、insert into values()...();试试这个语法。在客户端积攒一定的数据之后,将数据组合一下发到mysql上,插入速度会快上很多倍。
2、日志类的应用,应该很少有update和delete。修改一下参数,让MyISAM引擎并发插入,速度应该会有提升。
汗,刚才没注意,写错了。
●Memcached
●MySQL-Proxy:MySQL master/slave
这两个是用来缓解“读”的压力的
不过,本人觉得是值得因为这样数据的安装性也是会提高的。 1 若你实时性要求不高,可以使用“ MySQL 1 ”为主要的数据插入库, 每天定时将相关数据转移到“MySQL 2”库中。 MySQL 2 是为后台查询为主。
2 若你实时性高,可以考虑MySQL 1 和 MySQL 2 进行实时同步。
关闭autocmmit。
INSERT INTO yourtable VALUES (1,2), (5,5), ...; 减少客户端与服务器端的通信开销
将唯一键检查(uniqueness check )关闭,同样的关闭FOREIGN KEY 。
加大buffer pool,插入时减少磁盘 I/O
1 关闭AUTO Commit 是好事。
2 日志文件设置大点也没有坏处, 但日志缓冲设定大点问题比较大。当数据库运到灾难性损坏时候,掉失数据可能比较多;建议不使用。
3 关闭唯一行检查,会造成重复记录。MySQL 不能关闭啊,当CPU 运行很高的时候,经常发生插入重复记录;建议不使用。
4 关闭FOREIGN KEY是一个减低开销好办法。
5 加大buffer pool 是不错办法。
6 “INSERT INTO yourtable VALUES (1,2), (5,5), ...;” 批量插入的确可以减少不少系统开销。
1、用户的客户机程序,不是实时上报,缓存一天时间,都写在本地数据文件
每天由svr端发命令给客户机,指定要把哪些文件上报上来,不接收到命令的话,就不上报2、SVR端每天根据自己的负载情况,定时发请求到8000台机器中指定的机器,让它把它的数据上报上来
一台机器一天如果有操作的话,就一个文件,上报上来再批量插入的话,压力不大的
因为老板就给一台机器嘛,不能把主动权放在客户机的,让他随意上报,万一压力大的话,会把svr拖死的,由svr根据自己的忙闲程序发出指令来控制上报的话,更安全一些3、DB端,采用innodb吧,分库分表,比如:每20台机器一个库,每个库下400个表,每台机器只上报到一个表里4、其他的考虑:日志肯定也要分等级的
访问网站地址,打开和关闭的程序名,插拨USB设备的信息,建立和删除文件或文件夹
做好分析,上面的用户操作中哪些是领导更想了解的,哪些是量比较大的,哪些是意义不大的分级考虑,不重要的可以考虑合并到一起,尽量减少数据量P.S:要考虑好做好校验,免得日志被客户机本地删除了,可以把校验信息和数据文件分开写到不同的地方,上报时做校验
端口别屏蔽的话,也要做好监控等等
1、本地文件要加密,防止被篡改。。
2、本机端口被屏蔽的话,要探测出来并做好监控
3、本机文件被删除的话,要做好校验等等
2,表直接用myisam引擎,装mysql5.1 表分区。(分表不要建在同一块硬盘上,如果有条件的话,用用raid)
3,用load 的方式直接入库数据。(一个表中6个字段,5个索引,18分钟可以2.6亿条没问题,包生成索引)
4,扩内存。有条件扩到32G,优化sort,group by。
5,用myisampack来压缩数据库。能节约一半空间。索引不会被压缩。
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性能影响最大。
另外做index,可以先在别的机器上面新建一个空表,建好索引,然后把这个机器做备机,等数据复制得差不多了,然后切换应用的IP地址就可以了,应该不用停机很久。
18楼的办法可行,主要是表分区不好处理。8000台客户端的话,最好统一通过协议传到服务端,服务端缓存后在批量写入MySql。还应该对针对客户端对表进行Partition。 服务器的内存要大,此外一定要有多硬盘,将不同的表分区保存在不同的硬盘上。切忌的是:8000个客户端都直接连MySql写入数据。那必死无疑。
(上海滩拾贝) 等 级:
结帖率:0.00%
本人比较菜,我打算用mysql同步来做,不知道可行不?