一、問題背景
最近項目遇到一個問題,服務器響應很慢,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 />\n"; } else { fwrite($fp, "test message !\n"); fclose($fp); }
然后運行一下這段代碼,可以在 /data1/tmp/testlog (上面指定的接收文件)日志中找到如下一條記錄,那么服務就正式搭好了。
今天暫時就寫到這里,未完待續!