一、问题背景
最近项目遇到一个问题,服务器响应很慢,team中的两个有经验的工程师找了一台服务器分析了一下,发现问题出在磁盘写入过于频繁。这里大概介绍一下背景,我们的服务器上面主要是跑各种PHP接口,每个接口都有独立的日志,由于磁盘只有一个磁头(这显然谁都知道,ORZ...),而日志又是独立的,即一次请求过来就需要写一次日志,由于日志保存的位置不同,也就是一次请求磁头就需要移动一个位置,机械硬盘大家懂得,这样显然就会导致了日志写入的速度很慢,从而拖慢了服务器的响应时间。
二、解决思路
显然问题就出在日志的频繁写入上,试想如果能有一个专门的日志服务来接收日志,而不是每次都直接往硬盘中写入。在此基础上再加入一些缓存机制,写日志的问题肯定会好很多。OK,问题的思路有了,但是如何来搭这套服务呢?有没有一些直接可用的解决方案呢?显然是有的,毕竟我肯定不是第一个遇到这个问题的人。team中的老司机们说 rsyslog 应该能够满足这个要求,而且团队目前也有在用这个服务,可以了解一下。
三、解决问题的步骤
1、什么是rsyslog,它能干什么:
上面说到了 rsyslog 这个工具, rsyslog 是什么呢?简单说 rsyslog 其实是一个集中日志服务器,它可以支持 tcp、udp或者本地文件等当时的输入,然后支持把日志写入到 本地、数据库等等,如下图所示:
什么?要再具体的说下,请参考官网: http://www.rsyslog.com/
2、如何安装 rsyslog
centos下安装rsyslog灰常简单,如你所见:
$ yum install rsyslog
3、配置 rsyslog,官网有配置的向导,链接: http://www.rsyslog.com/rsyslog-configuration-builder/,这个做得非常人性化。上面说到 rsyslog 可以支持 TCP、UDP等方式的接收日志,这里不妨先用TCP的方式测试一下,然后把日志写到本地一个tmp 目录。生成的配置如下,然后把这个配置放到 /etc/rsyslog.conf 下面。
# 加载tcp模块
module(load="imtcp")
# tcp方式接收日志,端口号为 514
input(type="imtcp" port="514")
# 接收日志后,写入到本地/data1/tmp/testlog 中 action(type="omfile" File="/data1/tmp/testlog")
怎么样,看上去是不是非常简洁,是的,就是这么简单!
4、启动rsyslog服务,这一步也灰常简单,如下:
$ service rsyslog start
然后你可以用 ps 命令看下服务是否启动了,如下:
$ ps -aux | grep rsyslog
如果看到类似下图所示的情况,那么服务就起来了:
5、测试一下服务
写一个简单的php代码,如下:
<?php $errno = ''; $errstr = ''; $fp = stream_socket_client("tcp://xx.xx.xx.xx:514", $errno, $errstr, 30); // 这里需要替换成你的ip地址或者域名 if (!$fp) { echo "$errstr ($errno)<br /> "; } else { fwrite($fp, "test message ! "); fclose($fp); }
然后运行一下这段代码,可以在 /data1/tmp/testlog (上面指定的接收文件)日志中找到如下一条记录,那么服务就正式搭好了。
今天暂时就写到这里,未完待续!