Memcache与MySQL并肩作战
1.基础
memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护统一的巨大的hash表,它能够用来存储Session,当系统需要是从内存中读取,从而大大提高读取速度。OSSIM 4.1以后的所有系统中,采用了Memcached这个高性能的内存对象缓存系统,用于动态Web应用,为PHP提供缓存,这里主要对OSSIM各个数据库读写进行缓存,以减轻MySQL数据库的负载,配置文件读者参考/usr/share/ossim/include/ossim_db.inc、/usr/share/ossim/include/php-ids.ini。用这种方式也是OSSIM的缓存方案之一。读者或许会产生疑问,MySQL本身既有table_cache、query_cache机制,我们用以下命令在数据库中查看:
mysql> show variables like '%query_cache%';
+------------------------------+----------+
| Variable_name | Value |
+------------------------------+----------+
| have_query_cache | YES |
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 16777216 |
| query_cache_strip_comments | OFF |
| query_cache_type | ON |
| query_cache_wlock_invalidate | OFF |
+------------------------------+----------+
7 rows in set (0.00 sec)
在查询经常变化、表内容经常变化的场景中(OSSIM的存储、查询就是这样一种状态)这个样一个简单的缓存系统根本无法达到有效缓解数据库压力的目的。这就好比在Apache中提供的mod_disk_cache和mod_mem_cache无法真正为Web Server提供缓存,那么在Sensor中就不会有memcache服务,后面还需要Squid等缓存工具。
memcache通过在内存中缓存数据和对象来减少读取数据库的次数,所以为OSSIM系统提供更大的内存,有助于发挥memcache的作用,从而提高整体性能。另外为了能够可视化的观察缓存效果,大家可以使用phpMemcachedAdmin工具来查看,图1、图2、图3是其监控效果。
2. 配置memcached:
/etc/default/memcached /*控制开启*/
/etc/memcached.conf /*配置memcached参数*/
Ossim调用memcache,端口11211的配置文件/usr/share/ossim/www/forensics/includes/base_db.inc.php
/usr/share/php/adodb/adodb.inc.php
/usr/share/php/adodb/adodb-memcache.lib.inc.php
关于memcached.conf重要参数的解释:
Memcached在启动时需要设定哪些关键参数以及这些参数的作用。
1)-p Memcached的TCP监听端口,缺省配置为11211;
2)logfile /var/log/memcached.log 输出日志文件的位置
3)-s Memcached监听的UNIX套接字路径;
4)-l 监听的服务器IP地址,OSSIM Server中为127.0.0.1,代表只能本机访问,也就是只给OSSIM Server 中的Mysql做缓存。
5)-d 为Memcached服务器启动守护进程; OSSIM下启动命令为“/usr/bin/memcached -m 128 -p 11211 -u nobody -l 127.0.0.1”
6)-r 最大core文件大小;
7)-u 运行Memcached的用户,OSSIM中为nobody; 除了核心和重要进程以外,不易用root用户启动进程,因为不同用户启动进程可以起到隔离作用,
比如:
apache服务采用www-data用户启动,ossec-logcollector进程采用ossec用户启动,mysql进程以mysql用户启动,redis服务以redis用户启动,rabbitmq进程以rabbitmq用户启动。
每个用户分配的权限我们可以在/etc/passwd中查看UID
8)-m 分配给Memcached使用的最大内存数量,单位是MB,OSSIM 中默认为 128,可以修改之512;
9)-c 最大并发连数,缺省配置为1024;
10)-v –vv –vvv 设定服务器端打印的消息的详细程度,其中-v仅打印错误和警告信息,-vv在-v的基础上还会打印客户端的命令和相应,-vvv在-vv的基础上还会打印内存状态转换信息;
11)-n 最小的chunk大小,缺省配置为48个字节;
12)-t Memcached服务器使用的线程数,缺省配置为4个;
13)-L 尝试使用大内存页;
14)-R 每个事件的最大请求数,缺省配置为20个;
3. 查看memcache状态
下面我们采用telnet命令测试memcache工作状态,首先输入以下命令:
#telnet 127.0.0.1 11211
看看有什么发现?
下面你还可以接着输入以下命令:
stats items
stats detail
version
如果你想退出,^C,不行,^Z也不行。
试试quit吧。
注意,Ossim Server默认没有telnet需要自己安装,后面的”11211”代表memcache通选端口。
然后,直接输入“stats”命令就可以得到当前memcache状态。如表1所示。
表1 memcache状态信息
如果需要将缓存重置到干净状态则输入“flush_all”命令。
4.使用memcache存储Session
Apache服务器的PHP Session都给Memcached ,这样无论把 IP连接分给哪个Web服务器都不会有问题,配置方法很简单,就在PHP的配置文件内增加一条语句就可以了,不过前提需要装好memcache模块用memcache 来存储 session 在读写速度上会比 files 时快很多,而且在多个服务器需要共用 session 时会比较方便,将这些服务器都配置成使用同一组 memcached 服务器就可以,减少了额外的工作量。缺点是 session 数据都保存在 memory 中,持久化方面有所欠缺,但对 session 数据来说也不是很大的问题。
注意,在OSSIM系统中采用memcache的目的是提高访问速度,减小MySQL数据库的压力。通过修改/etc/default/memcached配置文件中ENABLE_MEMCACHED=yes/no控制其开关。