apache + heartbeat + coda + awstats

火星人 @ 2014-03-04 , reply:0


apache + heartbeat + coda + awstats

期間 感謝wysilly的無私幫助  謝謝

聲明:以下實現受限於我實際中具體硬體及具體需求  僅供參考 網上apache install文章很多 本文不在贅述 本人水平尚淺 歡迎指出文中不當或錯誤之處

機器有限(3台機器)  架構如下    3台伺服器均是 centos4.4   2.6.9  硬碟40G
node1 eth0 10.0.0.1        eth1 192.168.1.1
node2 eth0 10.0.0.2        eth1 192.168.1.2
node3                      eth0 192.168.1.3
node1/2 eth1 為對內IP  eth0為對外IP  虛擬出的IP為10.0.0.3

                                                    Internet
                                                          |
                          -----------------------------------------------------
LDirector/RealServer(node1)                     LinuxDirector/RealServer(node2)
                          |                                                                 |
                           -----------------------------------------------------
                                                          |
                                          Coda Server(node3)


負載均衡的部分按照http://www.ultramonkey.org/3/topologies/sl-ha-lb-eg.html
1>在node1 和 node2 上安裝
rpm -ivhhttp://dev.centos.org/centos/4/t ... el4.centos.i386.rpm
yum install net-snmp-libs
rpm -ivhhttp://dev.centos.org/centos/4/t ... el4.centos.i386.rpm
yum install gnutls
rpm -ivhhttp://dev.centos.org/centos/4/t ... el4.centos.i386.rpm
yum install perl-Crypt-SSLeay
yum install perl-HTML-Parser
yum install perl-LDAP
yum install perl-Net-DNS
yum install perl-libwww-perl
yum install perl-Net-IMAP-Simple-SSL
yum install perl-Net-IMAP-Simple
yum install perl-MailTools
rpm -ivhhttp://ftp.riken.go.jp/pub/Linux ... 2.el4.rf.noarch.rpm
rpm -ivhhttp://ftp.riken.go.jp/pub/Linux ... 1.rh9.rf.noarch.rpm
rpm -ivhhttp://dev.centos.org/centos/4/t ... el4.centos.i386.rpm
rpm -ivh http://mirror.centos.org/centos/ ... adm-1.24-6.i386.rpm
rpm -ivhhttp://dev.centos.org/centos/4/t ... el4.centos.i386.rpm
yum install arptables_jf
yum install libnet

2>node1 和 node2 上均如此配置
##### /etc/ha.d/ldirectord ###########
node1  ldirectord::ldirectord.cf  LVSSyncDaemonSwap::master  IPaddr2::10.0.0.3/24/eth0/10.0.0.255

##### /etc/ha.d/ldirectord.cf##########
checktimeout=3
checkinterval=1
#fallback=127.0.0.1:80
autoreload=yes
logfile="/var/log/ldirectord.log"
#logfile="local0"
emailalert="**@**.com"
emailalertfreq=7200
#emailalertstatus=all
quiescent=yes

# Sample for an http virtual service
virtual=10.0.0.3:80
            real=10.0.0.1:80 gate
            real=10.0.0.2:80 gate
            fallback=127.0.0.1:80
            service=http
            request="test.html"
            receive="hello"
###注意: 設http主目錄在/var/www/html 則需建立文件 /var/www/html/test.html 文件內容為hello
            #virtualhost=www.***.com
            scheduler=rr
            #persistent=600
            #netmask=255.255.255.255
            protocol=tcp
            checktype=negotiate
            checkport=80

######## /ect/ha.d/ha.cf #########
keepalive 2
deadtime 30
warntime 10
initdead 120
udpport 694
ucast Internal_IP_Address
auto_failback on
node  node1
node  node2

#########/etc/sysconfig/network-scripts/ifcfg-lo:0#######
DEVICE=lo:0
IPADDR=10.0.0.1
NETMASK=255.255.255.255
NETWORK=10.0.0.255
BROADCAST=10.0.0.255
ONBOOT=yes
NAME=loopback
#################################################################

3>啟動 (node1 與 node2 均如此啟動)
/etc/init.d/heartbeat stop
service ldirectord stop
/etc/ha.d/resource.d/LVSSyncDaemonSwap master stop
/etc/init.d/arptables_jf stop
/usr/sbin/arptables-noarp-addr 10.0.0.1 start
/etc/init.d/arptables_jf save
/etc/init.d/arptables_jf start
/etc/init.d/heartbeat/start
ifup lo

4>注意
ip addr sh     檢查IP分配是否正確
ipvsadm -L -n  檢查服務情況
/etc/ha.d/resource.d/LVSSyncyncDaemonSwap masterstatus   檢查均衡情況,正確應該是node1 master上為on, node2 Slave上為off
特別注意認真閱讀文檔!!!
Note that a netmask of 255.255.255.255 on the lo:0interface indicates that this interface will only accept traffic 192.168.6.240.
heartbeat啟動后4個小時左右   所有訪問都連接到一台機器上   如果這台機器死掉   外部訪問中斷;    IPVSADM顯示 靜止的數據
猜測是連接internets與server之間路由器的問題  ARP超時  此欄位表示當非活動時,ARP項在清洗之前保留於緩存中的時間長度。ARP超時的默認值為4個小時,如上面例子所示,可以通過使用ARP timeout命令調整 ARP緩存項在緩存中的時間長度。此命令格式如:
arp timeout seconds應該是路由器保存vip的 mac 4個小時,后,再發arp包,vip的server不回應,導致該路由器找尋不到vip,導致不能訪問     解決辦法暫時是吧active ldirectord/real server上不執行arptables_jf 等配置語句  但是在stand-by ldirectord/real server上執行
測試的時候 不能同時ping active ldirectord/real server的 eth0 和 eth0:0 你會發現兩個丟包都很厲害  只ping eth0:0 測試無丟包即可。

#####################
coda分散式文件系統分為伺服器和客戶端,伺服器又分為SCM(SystemControl Machine) server和non-SCM server,SCM伺服器負責與其它伺服器同步,SCM伺服器只有一個,而non-SCM伺服器可以有多個。
客戶端在與伺服器建立連接之後會在本地生成一個新的文件系統/coda,這個文件系統下的所有文件是與伺服器上的一個用戶數據目錄保持同步的,伺服器上的用戶數據目錄是在安裝伺服器軟體時指定專門用來存放用戶數據的,即在客戶端的/coda目錄下保存的所有文件,實際上都是伺服器上的一個備份,只要伺服器上的文件發生了變化,則/coda目錄下的文件也會發生相應的變化,這就是說,只要有一個客戶端操作了/coda下的某個文件,則所有客戶端/coda下的對應文件就都要發生變化,同時伺服器之間也要保持同步。

coda server :  node3
coda client :  node1   node2


配置 coda server    先重裝系統 規劃分區如下所示(rvm log / data可以以文件形式存在,但會導致客戶端讀取速度非常之慢 參考: http://www.coda.cs.cmu.edu/doc/html/manual/c1140.html )
swap              512 M
/boot              256 M
/var                5G
/                     7G
/vice               500 M
/vicepa           19G
RVMlog           15M
RVMData         600 M
接下來就是安裝,相關軟體下載地址:http://gd.tuwien.ac.at/utils/fs/coda/linux/FedoraCore5/
ftp://194.199.20.114/linux/fedor ... ent/i386/os/Fedora/
rpm -ivh
lwp-devel-2.3-1.i386.rpm lwp-2.3-1.i386.rpm rvm-devel-1.14-1.i386.rpmrvm-1.14-1.i386.rpm rvm-tools-1.14-1.i386.rpm rpc2-devel-2.5-1.i386.rpmcompat-libstdc++-33-3.2.3-47.3.i386.rpm coda-server-6.1.2-1.i386.rpm
各自系統不同 所需依賴軟體包要靠自己一一查找 本文不在贅述

運行vice-setup
Welcome to the Coda Server Setup script!

Setting up config files for a coda server.
Do you want the file /etc/coda/server.conf created? yes
What is the root directory for your coda server(s)? /vice
Setting up /vice.

Directories under /vice are set up.

Is this the master server, aka the SCM machine? (y/n)y(第一次安裝是scm的)
Setting up tokens for authentication.
The following token must be identical on all servers.
Enter a random token for update authentication :helloword
The following token must be identical on all servers.
Enter a random token for auth2 authentication :helloword
The following token must be identical on all servers.
Enter a random token for volutil authentication : helloword
tokens done!


Setting up the file list for update client
Filelist for update ready.
/etc/services already has new services registered!Good.
/etc/services ready for Coda
Now installing files specific to the SCM...

Setting up servers file.
Enter an id for the SCM server. (hostname distfs)
The serverid is a unique number between 0 and 255.
You should avoid 0, 127, and 255.
serverid: 1(1即為hosts中的第一個記錄)
done!

Initializing the VSGDB to contain the SCM as E0000100
/vice/db/VSGDB set up
Setting up ROOTVOLUME file
Enter the name of the rootvolume (< 32 chars) :codaroot

Setting up users and groups for Coda
You need to give me a uid (not 0) and username (notroot)
for a Coda System:Administrator member on this server,
(sort of a Coda super user)

Enter the uid of this user: 666
Enter the username of this user: codaroot

Going to rebuild the protection databases
moving /vice/db/prot_users.db to/vice/db/prot_users.db.old
moving /vice/db/prot_index.db to /vice/db/prot_index.db.old
An initial administrative user codaroot (id 666)
with Coda password changeme now exists.(默認的用戶和口令)

A server needs a small log disk partition, preferablyon a disk by
itself. It also needs a metadata partition of approx4% of your filespace.
For trial purposes you may give ordinary files insteadof raw
partitions. Keep all size small if you do this.
Production servers will want partitions for speed.

---------------------------
WARNING: you are going to play with your partitionsnow.
verify all answers you give.
---------------------------

WARNING: these choices are not easy to change once youare up and running.
Are you ready to set up RVM? yes
What is your log partition?/vice/logs/log_disk_file.log(在安裝前建好的日誌目錄)
The log size must be smaller than you logpartition.
We
recommend not more than 30M log size, and 2M is a goodchoice.
What is your log size? (enter as e.g. '2M') 15M

What is your data partition (or file)?/vice/logs/data_disk_file.log
The data size must be approx 4% of you server filespace.
We
have templates for servers of approx: 500M, 1G, 2.2G,3.3G, 8G
(you can store less, but not more on such servers).
The corresponding data sizes are
22M, 44M, 90M, 130M, 315M.
Pick one of the defaults, otherwise I will bail out
What is the size of you data partition (or file)
: 500M

-----------------------------

WARNING: DATA and LOG partitions are about to bewiped.

log area:/usr/coda/logs/log_disk_file.log, size 15M.

data area:/usr/coda/logs/data_disk_file.log, size 500M.
Proceed, and wipe out old data? y
LOG file has been initialized!

Rdsinit will initialize data and log.
This takes a while.
rvm_initialize succeeded.
Going to initialize data file to zero, could takeawhile.
done.
rds_zap_heap completed successfully.
rvm_terminate succeeded.
RVM setup is done!

Your server directories will hold the files (notdirectories).
You can currently only have one directory per diskpartition.

Where shall we store your file data ? /vicepa
Shall I set up a vicetab entry for /vicepa (y/n) y
Select the maximum number of files for the server.
: 16M

Server directory /vicepa is set up!


Congratulations: your configuration is ready...and now
to get going do the following:

start theauth2 server as: auth2

startrpc2portmap as: rpc2portmap

startupdatesrv as: updatesrv

startupdateclnt as:
updateclnt -h gtest

start thefileserver: startserver &

wait until theserver is up: tail -f /vice/srv/SrvLog

create yourroot volume: createvol_rep codaroot E0000100 /vicepa

setup aclient: venus-setup gtest 20000

start venus:venus

enjoy Coda.

for moreinformation see http://www.coda.cs.cmu.edu.


安裝配置 coda client 相關軟體下載地址http://linux.web.psi.ch/dist/scientific/43/kernel/all/?C=S;O=A
ftp://194.199.20.114/linux/fedor ... ent/i386/os/Fedora/
rpm -ivh lwp-devel-2.3-1.i386.rpm lwp-2.3-1.i386.rpm rvm-devel-1.14-1.i386.rpmrvm-1.14-1.i386.rpm rvm-tools-1.14-1.i386.rpm rpc2-devel-2.5-1.i386.rpm rpc2-2.5-1.i386.rpm compat-libstdc++-33-3.2.3-47.3.i386.rpm coda-client-6.1.2-1.i386.rpm kernel-module-coda-2.6.9-42.0.10.ELsmp-6.4-1.sl4.psi.i686.rpm

insmod  /lib/modules/2.6.9***.ELsmp/kernel/fs/coda/coda.ko
vutil shutdown
umount /coda
venus-setup coda-server-name 200000
venus -maxworkers 100 &
clog codaroot
password: changeme
cfs wr

需要注意的幾個設置
*設置連接方式
  cfs wr
*設置客戶端處理訪問/coda的venus併發線程數
venus-maxworkers 100
*設置客戶端的緩存200MB
venus-setupCoda_Server 200000
*無法認證 出現Invalid login (RPC2_NOBINDING(F))錯誤
檢查codaserver上的iptables設置
*在客戶端上執行 cfs lv /coda/*** 或者 cfs la /coda/*** 顯示 disconnected或 connection time out, 表示該客戶端由於網路錯誤或文件衝突而導致和伺服器連接斷開 暫時解決辦法(注意 是暫時解決辦法) 重新連接客戶端  建立檢測腳本 當coda客戶端呈斷開狀態時 自動連接 加入定時執行即可  crontab -e
*/5 * * * */ chkcoda.sh

#####chikcoda.sh##########
#!/bin/bash
result=`cfs lv /coda/***/ |grep Connection|awk '{print$4}'`
case $result in
    Connected)
           exit 0
           ;;
    Disconnected)
           /test.sh
           exit 0
            ;;
     WriteDisconnected)
           cfs wr
esac

#######test.sh (先 yum install expect)########
#!/usr/bin/expect
spawn cfs purgeml /coda/***
expect "]"
exec sleep 1
send "y\r"
expect eof
exit



################
暫時實現的是在 10.0.0.1 和 10.0.0.2 上分別安裝   分別查看結果    兩台機器可以日誌合併進而分析  

AWStats是在Sourceforge上發展很快的一個基於Perl的WEB日誌分析工具。相對於另外一個非常優秀的開放源代碼的日誌分析工具Webalizer,AWStats的優勢在於:

   1. 界面友好:可以根據瀏覽器直接調用相應語言界面(有簡體中文版)
      參考輸出樣例:http://www.chedong.com/cgi-bin/awstats/awstats.pl?config=chedong
   2. 基於Perl:並且很好的解決了跨平台問題,系統本身可以運行在GNU/Linux上或Windows上(安裝了ActivePerl后);分析的日誌直接支持Apache格式 (combined)和IIS格式(需要修改)。Webalizer雖然也有Windows平台版,但目前已經缺乏 維護;
      AWStats完全可以實現用一套系統完成對自身站點不同WEB伺服器:GNU/Linux/Apache和Windows/IIS伺服器的統一統計。
   3. 效率比較高:AWStats輸出統計項目比Webalizer豐富了很多,速度仍可以達到Webalizer的1/3左右,對於一個日訪問量 百萬級的站點,這個速度都是足夠的;
   4. 配置/定製方便:系統提供了足夠靈活但預設也很合理的配置規則,需要修改的預設配置不超過3,4項就可以開始運行,而且修改和擴展的插件還是 比較多的;
   5. AWStats的設計者是面向精確的"Human visits"設計的,因此很多搜索引擎的機器人訪問都被過濾掉了,因此有可能比其他日誌統計工具統計的數字要低,來自公司內部的訪問也可以通過IP過濾 設置過濾掉。
   6. 提供了很多擴展的參數統計功能:使用ExtraXXXX系列配置生成針對具體應用的參數分析會對產品分析非常有用。

更多與其他工具:Webalizer, analog的比較請參考:
http://awstats.sourceforge.net/#COMPARISON


環境 centos4.4
1>安裝所有的軟體包
  wget http://www.awstats.cn/files/awstats-6.6.tar.gz
  rpm -ivh http://dag.wieers.com/rpm/packag ... 2-1.el4.rf.i386.rpm
  rpm -ivh http://www.silfreed.net/download ... .6.2-1.el4.i386.rpm
  yum install GeoIP Geo-IP
  rpm -ivh http://mirrors.ircam.fr/pub/dag/ ... 2.el4.rf.noarch.rpm

2>安裝
  tar -zxvf awstats-6.6.tar.gz
  mv awstats-6.6 /var/www/html/awstats

3>配置http log
  更改httpd的log方式
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    SetEnvIf Request_URI \.gif$ gif-image
    SetEnvIf Request_URI \.GIF$ gif-image
    SetEnvIf Request_URI \.jpg$ gif-image
    SetEnvIf Request_URI \.JPG$ gif-image
    SetEnvIf Request_URI \.png$ gif-image
    SetEnvIf Request_URI \.swf$ gif-image
    SetEnvIf Request_URI \.SWF$ gif-image
    SetEnvIf Request_URI \.css$ gif-image
    SetEnvIf Request_URI \.CSS$ gif-image
    SetEnvIf Request_URI \.js$ gif-image
    SetEnvIf Request_URI \.JS$ gif-image
    SetEnvIf Request_URI \.ico$ gif-image
    SetEnvIf Remote_Addr "10\.0\.0\.1" gif-image
    SetEnvIf Remote_Addr "10\.0\.0\.2" gif-image
    ErrorLog "|/usr/sbin/cronolog /var/log/httpd/hehehe.%Y-%m-%d-error_log"
    CustomLog "|/usr/sbin/cronolog /var/log/httpd/hehehe.%Y-%m-%d-access_log" combined env=!gif-image
  ###屏蔽掉1和2的http log,因為兩個IP做heartbeat,產生大量垃圾log

4>配置awstats
  perl /var/log/www/html/awstats/tools/awstats_configure.pl
  ###默認生成的配置文件放在/etc/awstats/下
  mkdir /etc/awstats/data
  ###建立data目錄放置一些必要的數據文件

5>更新GeoIP庫 每月定期下載更新
  wget http://www.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
  wget http://www.maxmind.com/download/geoip/database/GeoIP.dat.gz
  gunzip GeoLiteCity.dat.gz
  gunzip GeoIP.dat.gz
  mv GeoLiteCity.dat /etc/awstats/data/  
  mv GeoIP.dat /etc/awstats/data/  
  chmod 777 /etc/awstats/data/Geo*

6>編輯/etc/awstats/awstats.www.hehehe.com.conf文件
  *設置httpd logfiule的位置
     LogFile="/var/log/httpd/hehehe.%YYYY-4-%MM-2-%DD-2-access_log"
  *設置要分析的服務日誌類型 w表示為web日誌
     LogType=W
  *設置日誌格式 1表示採用 NCSA apache combined/ELF/XLF log format
     LogFormat=1
  *設置要分析的域名
     SiteDomain="www.hehehe.com"
     HostAliases="hehehe.com www.hehehe.com 127.0.0.1 localhost"
  *設置awstats的資料庫存放目錄
     DirData="/etc/awstats/data"
  *設置DirCgi
     DirCgi="/var/www/html/awstats/wwwroot/cgi-bin"
     DirIcons="/var/www/html/awstats/wwwroot/icon"
  *設置通過瀏覽器刷新頁面
     AllowToUpdateStatsFromBrowser=1
  *設置使用IP與地理名解析
     LoadPlugin="geoip GEOIP_STANDARD /etc/awstats/data/GeoIP.dat"
     LoadPlugin="geoip_city_maxmind GEOIP_STANDARD /etc/awstats/data/GeoLiteCity.dat"


7>修改許可權
  chmod -R 755 /var/www/html/awstats /etc/awstas/data
  chmod 777 /var/www/html/awstats/wwwroot/cgi-bin/*.pl

8>創建awstats初始化資料庫並建立awstats初始化靜態統計頁面
  perl awstats.pl -config=www.hehehe.com -update -lang=cn
  perl awstats.pl -config=www.hehehe.com -output -staticlinks -lang=cn>awstats.hehehe.html

9>設置定時更新日誌統計
  crontab -e
  */5 * * * * /var/www/html/awstats/wwwroot/cgi-bin/awstats.pl -config=www.hehehe.com -update -lang=cn > /dev/null

10>啟動apache並查看結果
  /usr/local/apache/bin/apachectl start
  http://*.*.*.*/awstata/awstats.pl?config=www.hehehe.com

參考:
http://blog.csdn.net/ronaldchan2 ... /03/10/1526054.aspx
http://www.chedong.com/tech/awstats.html

[ 本帖最後由 agg230 於 2007-10-18 11:30 編輯 ]
《解決方案》

自:http://bbs.chinaunix.net/viewthread.php?tid=869554
分散式文件系統
http://www.trucy.org/blog/fanghong/archives/000874.html

參考資料:
http://wiki.apache.org/nutch/NutchDistributedFileSystem
http://labs.google.com/papers/gfs-sosp2003.pdf
2005-03-22 18:45:21
Nutch分散式文件系統
  NDFS:在一系列機器上存儲龐大的面向流的文件,包含多機的存儲冗餘和負載均衡。
  文件以塊為單位存儲在NDFS的離散機器上,提供一個傳統的input/output流介面用於文件讀寫。塊的查找以及數據在網路上傳輸等細節由 NDFS自動完成,對用戶是透明的。而且NDFS能很好地處理用於存儲的機器序列,能方便地添加和刪除一台機器。當某台機器不可用時,NDFS自動的保證文件的可用性。只要網上的機器序列能提供足夠的存儲空間,就要保證NDFS文件系統的正常運。
  NDFS是建立在普通磁碟上的,不需要RAID控制器或者其它的磁碟陣列解決方案。
語法
1). 文件只能寫一次,寫完之後,就變成只讀了(但是可以被刪除)
2). 文件是面向流的,只能在文件末尾加位元組流,而且只能讀寫指針只能遞增。
3). 文件沒有存儲訪問的控制
所以,所有對NDFS的訪問都是通過驗證的客戶代碼。沒有提供API供其它程序訪問。因此Nutch就是NDFS的模擬用戶。
3.系統設計

NDFS包含兩種類型的機器:NameNodes和DataNodes: NameNodes維護名字空間;而DataNodes存儲數據塊。NDFS中包含一個NamdNode,而包含任意多的DataNodes,每個 DataNodes都配置與唯一的NameNode通信。
1)NameNode: 負責存儲整個名字空間和文件系統的布局。是一個關鍵點,不能down掉。但是做的工作不多,因此不是一個負載的瓶頸。
維護一張保存在磁碟上的表: filename-0->BlockID_A,BlockID_B...BlockID_X,etc.;filename就是一字元串,BolockID是唯一的標識符。每個filename有任意個blocks。
2)DataNode:負責存儲數據。一個塊應該在多個DataNode中有備份;而一個DataNode對於一個塊最多只包含一個備份。
維護一張表:BlockID_X->array of bytes..
3)合作:DataNode在啟動后,就主動與NameNode通信,將本地的Block信息告知NameNode。NameNode據此可以構造一顆樹,描述如何找到NDFS中的Blocks。這顆樹是實時更新的。DataNode會定期發送信息給NameNode,以證明自己的存在,當 NameNode收不到該信息時,就會認為DataNode已經down了。
4)文件的讀寫過程:例如Client要讀取foo.txt,則有以下過程。
a.Client通過網路聯繫NameNode,提交filename:"foo.txt"
b.Client收到從NameNode來的回復,包含:組成"foo.txt"的文件塊和每個塊存在的DataNode序列。
c.Client依次讀取每個文件塊。對於一個文件塊,Client從它的DataNode序列中得到合適的DataNode,
然後發送請求給DataNode,由DataNode將數據傳輸給Client
4.系統的可用性
NDFS的可用性取決於Blocks的冗餘度,即應該在多少個DataNode保持同一Block的備份。對於有條件的話可以設置3個備份和2個最低備份 (DESIRED_REPLICATION and MIN_REPLICATION constants in fs.FSNamesystem)。當一個塊的低於MIN_REPLICATION,NameNode就會指導DataNode做新的備份。
5.net.nutch.fs包的一些文件介紹
1)NDFS.java:包含兩個main函數,一個是關於NameNode的,一個是關於DataNode的
2)FSNamesystem.java:維護名字空間,包含了NameNode的功能,比如如何尋找Blocks,可用的DataNode序列
3)FSDirectory.java:被FSNamesystem調用,用於維護名字空間的狀態。記錄NameNode的所有狀態和變化,當NameNode崩潰時,可以根據這個日誌來恢復。
4)FSDataset.java: 用於DataNode,維護Block序列等
5)Block.java and DatanodeInfo: 用於維護Block信息
6)FSResults.java and FSParam.java: 用於在網路上傳送參數等
7)FSConstants.java:包含一些常數,用於參數調整等。
NDFSClient.java:用於讀寫數據
9)TestClient.java:包含一個main函數,提供一些命令用於對NDFS的存取訪問

6.簡單的例子
1)創建NameNode:
Machine A:java net.nutch.fs.NDFS$NameNode 9000 namedir
2)創建DataNode:
Machine B:java net.nutch.fs.NDFS$DataNode datadir1 machineB 8000 machineA:9000
Machine C:java net.nutch.fs.NDFS$DataNode datadir2 machineC 8000 machineA:9000
運行1,2步后,則得到了一個NDFS,包含一個NameNode和兩個DataNode。(可以在同一台機器的不同目錄下安裝NDFS)

3)client端的文件訪問:
創建文件:java net.nutch.fs.TestClient machineA:9000 CREATE foo.txt
讀取文件:java net.nutch.fs.TestClient machineA:9000 GET foo.txt
重命名文件:java net.nutch.fs.TestClient machineA:9000 RENAME foo.txt bar.txt
再讀取文件:java net.nutch.fs.TestClient machineA:9000 GET bar.txt
刪除文件:java net.nutch.fs.TestClient machineA:9000 DELETE bar.txt
========================
coda分散式文件系統
簡介
coda分散式文件系統是由卡耐基·梅隆大學開發的一個實驗中的分散式文件系統。Coda在移動計算處理上具有很多別的系統沒有的先進的特性,很多的開發者為此做出了很大的貢獻。他具有以下特性:
* 離線狀態下移動客戶端仍可操作
o 保持離線狀態客戶端的數據一致性
o 帶寬自適應
* 錯誤恢復
o 伺服器之間的讀寫複製
o 解決伺服器之間的衝突
o 處理伺服器之間的網路故障
o 處理斷開的客戶端
* 性能和可靠性
o 客戶端可高性能、持久的保存文件、目錄以及屬性。
o 回寫式緩存
* 安全性
o Kerberos方式身份驗證
o 訪問控制列表
* 對共享的完美詮釋
* 可以免費獲取源代碼
http://www.coda.cs.cmu.edu/ljpaper/coda.jpg
Fig 1: Coda 的標誌 (原圖例作者:Gaich Muramatsu)
你可能會對某些專業術語感到困惑,下面我們先把可能遇到的術語加以介紹。
分散式文件系統
一個分佈的文件系統將文件存儲在一個或更多的叫做伺服器的計算機上,並且可以讓客戶機像訪問普通文件一樣訪問。使用文件伺服器有很多的好處。文件可以儘可能廣泛的被能訪問伺服器的計算機使用,在同一個地點存儲並且共享某文件比把這個文件分散到許多客戶機上單獨存儲要好。對於保證信息的安全而作的備份處理相對更加容易,因為只有存儲文件的伺服器需要做備份。伺服器可以提供很大的存儲空間,如果每個客戶端都單獨準備一個這樣大的空間的成本會很大,顯然是不現實的。當某一部分人需要共享文檔的時候,分散式文件系統的有效性就體現出來了。更進一步的說,共享應用軟體也是一個很好的選擇。共享之後系統的管理將會變得相對簡單。
設計一個好的分散式文件系統需要處理很多的問題。由於網路本身的瓶頸和伺服器的超負荷工作,在網路中傳送大量的文件通常是效率很低並且有延遲。數據的安全性也是另外的一個需要特別注意的方面,我們必須確認訪問數據的客戶端確實是經過我們認證的,並且數據在傳送過程中沒有泄漏。另外還有兩個和故障處理有關的方面。通常情況下客戶端相對網路連接來說出故障的可能性更小。網路的故障會造成客戶端不再使用的假象。同樣,伺服器的故障會令人更加不悅,因為它會造成所有的客戶端無法訪問急需的信息。Coda作為一個分散式文件系統的研究原型將會一一處理上面提到的問題。
http://www.coda.cs.cmu.edu/ljpaper/security.jpg
Fig. 2 伺服器的安全控制 (原圖例作者: Gaich Muramatsu)
Coda 最初是在Mach 2.6上實現的,並且最近已經移植到了Linux、NetBSD、FreeBSD。 Michael Callahan 已經將coda的一部分移植到了Windows 95上,我們正在研究將Coda移植到Windows NT上的可行性。現在我們主要在為coda向不同系統移植做努力。同時我們加入了一部分的新特性(例如:回寫緩存、基本存儲單元)並且重新編寫了coda 代碼的一部分。很多使用者通過互聯網給我們發送了大量有用的回饋信息。在未來,coda很可能會成為一個受到大家歡迎的、廣泛使用的、可免費獲取的分散式文件系統。
Coda客戶端
假設我們在一個Linux工作站上運行coda客戶端,輸入mount后我們將會看到一種類型為"coda"的文件系統被掛在 /coda 。這個目錄下就是伺服器向客戶端提供的文件,所有的客戶端看到的都是相同的文件名、相同的空間。客戶端連接的是"coda",並不是連接到了某個單獨的伺服器,這一切都是對客戶不可見的。這與掛載單獨一個伺服器上的網路文件系統是有很大的區別的。常見的Windows下的文件系統(Novell和微軟的 CIFS)以及Macintosh使用的Appleshare 文件系統都是按照單一的捲來掛載。當然,全局共享空間並不是coda發明的。Coda的前身-Andrew文件系統(AFS)首先提出了存儲所有的文件在 /afs 。類似的,OSF中的DFS/DCE分散式文件系統也是將所有的文件掛載在同一個目錄下。微軟新開發的分散式文件系統(DFS)支持所有的伺服器共享同樣的一個文件樹,就像是unix下auto-mount守護進程和yellow pages的組合。為什麼說單一的掛載點更好?這主要是因為所有的客戶端可以被相同的配置,所有的用戶永遠都是看到相同的文件樹。對於客戶端數量非常多的情況下,使用相同的配置是很重要的一點。假設使用NFS,客戶端需要更新伺服器的列表並且在/etc/fstab中存入相應的掛載點。使用coda的話,客戶端只需要知道coda的根目錄是在/coda。當添加新的伺服器或者添加新的共享目錄時客戶端會從/coda的目錄樹中自動獲得信息。
了能理解在伺服器連接在網路上的時候coda如何運作,我們首先分析一個簡單的文件操作。假設我們通過輸入"cat /coda/tmp/foo"來顯示一個coda文件的內容。首先,cat程序將要進行一些和文件有關的系統調用。系統調用是程序要求內核進行某種服務的操作。比如,當打開文件的時候,內核首先會去找i結點然後返回一個指向該文件的句柄給調用的程序。i結點中保存了可以讓內核獲取的如何調用文件的信息。文件句柄是為需要的程序準備的。外部的調用進入系統內核的虛擬文件系統(VFS),他發現調用的是在/coda下面的一個文件后就通過內核中coda文件系統的模塊來處理。Coda是最低的最基本的文件系統模塊,他保存最近的從虛擬文件系統中得到的回復,將請求送到Coda緩存管理系統。這個緩存管理系統被命名為Venus。Venus首先檢查客戶端磁碟緩存中是否有tmp/foo,如果緩存沒有命中,她將會連接伺服器以便獲取tmp/foo。當文件定位后,Venus將向內核報告,並且最終從系統調用返回到應用程序。下圖就是剛才提到的過程的圖示。
http://www.coda.cs.cmu.edu/ljpaper/kernel-venus.jpg
Fig 3. Client/Venus/Vice
這張圖表展示的就是應用程序通過系統調用來要求內核提供相應服務的過程。內核將請求送到Venus, Venus讀取設備文件/dev/cfs0來獲知請求。Venus通過讀取cache、發送請求到伺服器,或者按照離線模式來處理這些請求。離線模式是指無法連接到存放該文件的伺服器的情況。一般情況是指使用沒有和原有網路連接的筆記本,或者網路連接出現了問題才會進入離線模式。當伺服器出現問題的時候也會進入離線模式。
當內核第一次將外部請求送到Venus的時候,Venus將通過遠程程序調用(RPC)方式從伺服器端下載整個文件,然後將文件作為一個文件容器存放在緩存中(目前是/usr/coda/venus.cache/)。從這時起,文件就作為了一個本地的普通文件,所有的讀寫操作都不會涉及到 Venus,只會涉及到本地文件系統(比如在Linux下可能是ext2文件系統)。Coda的讀寫操作的速度是由本地文件系統響應操作的速度決定的。如果文件再一次被打開,文件不會從伺服器中再次傳送,而是使用本地保存的那一份。目錄文件(需要注意的是目錄也只是一個文件而已)以及屬性(比如屬主、許可權、大小)都會被Venus暫存。Venus允許本地緩存中有需要的文件的時候不連接伺服器對文件進行操作。當文件被修改並且關閉后, Venus將向伺服器發送一個修改之後的新文件。其他的修改文件系統的行為,比如建立目錄、刪除文件或目錄、建立或刪除連接(或符號連接)同樣也會向伺服器發送。
我們可以發現coda的緩存系統保存了客戶需要的所有的信息,並且只在需要更新文件系統的時候才與伺服器進行聯繫。研究表明,對文件的只讀操作要比修改操作多很多。因此我們主要研究的是如何減少客戶和伺服器之間的通信。主動緩存已經在AFS和DFS上實現,但是大多數的其他的系統沒有做這樣的工作。在下面我們會看到coda如何保持文件的一致性,但首先我們先來講將如何支持離線操作。
通過緩存來處理離線操作
coda 對離線操作處理的支持實際上使它變成了一個可以自動適應網路故障的文件系統。在80年代,卡耐基·梅隆大學的校園裡使用AFS來連接約1000個客戶端。在這樣大的規模下,網路和伺服器的故障幾乎是每天都會出現的。當大量的移動客戶(比如筆記本)出現后,coda這樣支持網路暫時失效的分散式文件系統被及時的發明出來了。
在前面的一段中,我們已經講到coda緩存所有的訪問需要的信息。當做出對文件系統的更新后,需要有消息傳送到伺服器端。在通常的有網路連接的模式下,這樣的更新消息是同步傳送給伺服器的,也就是說當客戶端作了更新的時候伺服器端同時也作更新。如果伺服器暫時不可用,或者伺服器和客戶端之間的網路連接出現了故障,這種更新操作會報告一個超時錯誤並且會失敗。在網路連接失效的情況下,有些操作是不可能完成的。比如試圖從伺服器上獲取本地緩存中沒有的文件。在這樣的情況下,必須向調用的程序報告錯誤。然而,大多數的超時錯誤可以按照下面提到的辦法處理。
為了支持離線操作或者暫時的網路故障,Venus不會向用戶報告更新超時錯誤。Venus會發現伺服器出現了暫時不可用的問題,並且把這些更新在客戶端暫時作記錄。在離線狀態下,所有的更新都被記錄在客戶端修改日誌(CML, client modification log)中。這個日誌會經常地被寫入到磁碟中。當coda切換到離線模式的時候,用戶不會發覺任何的區別。當與伺服器重新建立連接后,Venus將重建 CML。他將向伺服器重新提交文件系統的更改,以便讓伺服器端的文件也保持最新。CML是經過優化處理的。他會自動取消類似建立一個文件然後又刪除這樣的操作。
除上面提到的幾點,另外還有兩個與離線操作有關的問題。第一,離線操作是一個臨時儲存文件的概念。當緩存沒有命中並且Venus無法連接到伺服器時,它需要儘可能的使關鍵文件保持最新,這就需要他不斷的去要求伺服器發送來最新的文件。這些關鍵文件就存放在用戶的臨時儲存資料庫中(這個資料庫通過跟蹤用戶的訪問自動建立)。我們把更新臨時儲存文件的工作叫做"hoard walk"。在實際操作中,我們的筆記本儲存了大量的系統軟體,比如X11視窗系統的二進位文件和庫,或者Wabi以及Microsoft Office。這些文件都像本地文件一樣,儲存的應用程序可以很好的運行。
http://www.coda.cs.cmu.edu/ljpaper/cache.jpg
Fig 4: 臨時文件被"粘"在緩存中 (原圖作者: Gaich Muramatsu)
第二個問題是在恢復連接之後重新處理修改過的文件時會遇到的。假如有多個客戶端對同一個文件作了修改,並且都傳送到了伺服器,那麼就會出現衝突。我們把這樣的衝突叫做局部/全局衝突(local/global)或者叫做客戶端/伺服器衝突(client/server)。這樣的衝突有時候可以通過專門的解決方法來自動修復(比如一個客戶端向日曆文件中寫入周一的安排另一個客戶端插入了一個周三的安排。這樣的情況就是可以解決的衝突)。當然,有些時候衝突是不能自動解決的,這就需要受人工的干預來進行處理。
假設我們在一個周五帶著裝滿了源代碼的筆記本離開了辦公室去出差。在處理完堆積如山的工作之後,隔周的周一(也就是10天後)我們回到了辦公室。當筆記本重新連接后,系統就會自動更新這些代碼。這就是我們說所的移動辦公。
http://www.coda.cs.cmu.edu/ljpaper/failure.jpg
Fig. 5 錯誤恢復的方法
卷,伺服器,伺服器間的複製
大多數的網路文件系統是在伺服器上的一個可以被遠程調用的本地文件結構。這種可以被遠程客戶端掛載的文件系統,在windows上稱作網路共享 (network share),在unix上稱作網路文件系統(network file system)。大多數這樣的系統都是遠程掛載一個已經在分佈的伺服器上的掛載好的卷。這樣的系統關心的是伺服器的分區、目錄以及相應的共享。Coda和 AFS文件系統從本質上與這些是不一樣的。
Coda伺服器上的文件並不是存放在通常的文件系統上的。對於這些文件的組織如下所示。Coda 伺服器以及工作站的分區作為對文件伺服器可用的部分。這些分區將存放按照卷的方式來管理的文件。每一個卷帶有一個和文件系統一樣的目錄結構,也就是說一個卷的根目錄以及根目錄下的目錄樹。相對於分區來說,卷要小,但是相對於單一個目錄或者單一的文件的邏輯單位來說,卷要大。舉例來說,某個用戶的home目錄可能就是一個單獨的coda卷,coda相關的資源就存放在這個卷裡面。通常情況下一個單獨的伺服器可能包含數百個卷,每個卷的平均大小可能是10兆。從系統管理員的角度來看,卷是一個易於管理的很靈活的普通的文件數據。
Coda將卷、目錄、訪問控制列表以及文件的屬性保存在一個raw分區中。通過一種基於日誌的可恢復的虛擬內存系統 (log based recoverable virtual memory package, RVM)來實現快速並且確保一致性的訪問。只有文件的數據保存在伺服器的分區上。通過RVM可以實現對事務的支持,也就是說當伺服器崩潰后,不用花費太多的力氣就可以恢復整個系統。
卷帶有一個名稱和他自己的編號,卷可以被掛載到/coda下的任何一個位置。比如要使一個叫做u.braam的卷掛載到 /coda/usr/braam,只需要執行"cfs makemount u.bramm /coda/usr/braam"。Coda不允許掛載點是一個已經存在的目錄。他會把建立一個新的目錄作為掛載的過程之一。這樣做避免了將unix文件系統掛載到已經存在的目錄下。這個操作和Macintosh以及Windows的網路驅動器及共享很類似。但是最明顯的區別是掛載點對於客戶端是不可見的。他看起來只是一個/coda下的很普通的目錄。系統中有一個單獨的卷具有作為根卷的許可權,這個卷在啟動的時候就被掛載。
Coda通過三組32位的整數來標示一個文件。這組整數被稱為Fid。Fid包含卷編號(VolumeID)、V結點編號(VnodeID)以及一個全局唯一標識符 (Uniquifier)。通過卷編號來確定文件存儲的卷。V結點編號就是文件的i結點編號。全局唯一標識符來是為保持文件一致性處理準備的。Fid在 Coda伺服器集群中是唯一的。
在coda伺服器之間是有讀寫複製的。也就是說一組伺服器向客戶端發送文件數據,對文件的更新也會在這組伺服器中執行。這樣做的好處是提高了數據的可用性,假如一個伺服器出現了問題,其他的伺服器會自動接替,客戶端不會受到任何影響。卷可以存放在一組伺服器中,我們把這樣的一組伺服器叫做VSG (Volume Storage Group)。
這些複製的卷的卷編號也是被複制的。複製后的卷編號將本地的卷結合在一起成為VSG。
VSG是一個保存複製后卷的伺服器列表。
每個伺服器的本地卷定義了一個分區和本地的卷編號來保存文件和元數據。
當Venus 要訪問伺服器上的對象,他首先需要找到卷信息以便確定保存該文件的卷。這個卷信息包含伺服器列表和存放該文件的伺服器上的卷編號。在VSG中的伺服器之間關於文件的通信是讀一次寫多次的操作,即讀取VSG中某一個伺服器上的文件然後向所有的可用的VSG成員傳播更新的消息。我們把可用的VSG成員叫做 AVSG(Available VSG members)。Coda可以使用多點傳送RPC來向很多伺服器提交更新操作,這樣做不會對整體的性能有太大的影響。
前面講到的必須首先獲得卷信息有時候會給人帶來誤解。一旦獲取卷信息之後,接下來的文件訪問因為路徑遍歷的減少而受益。這是因為卷的根相對通常的掛載了很大的目錄來說要近很多。(譯者註:前文中提到每個卷都有自己根以及目錄樹,而卷可能會掛載在很深的目錄中。直接從相應卷的根來找文件顯然要比從 /coda找文件要快。)
伺服器之間的複製就像是離線操作一樣有兩點需要介紹:決定是否複製以及如何修復錯誤。某些在VSG中的伺服器可能因為伺服器或者網路的故障和其他的伺服器隔離開了。在這樣的情況下AVSG保存的對象一定會比VSG少。更新無法傳遞到所有的伺服器上,只能傳送到AVSG,從而會導致全局(伺服器與伺服器之間)衝突。
http://www.coda.cs.cmu.edu/ljpaper/avsg.jpg
Fig 6: AVSG vs. VSG (原圖例作者: Gaich Muramatsu)
在獲取某個對象或者某個對象的屬性之前,Venus首先從所有可用的伺服器上獲取該對象的版本戳。如果她發現某些伺服器沒有這個文件的最新版,她就會啟動一個處理進程來自動解決不一致的情況。如果無法解決,就需要用戶手動來進行修復。這個進程由客戶端發起,然後完全由伺服器來執行。
服務期間的複製和解決不一致的情況看起來是不可思議的操作。我們的伺服器經常出現磁碟故障。為了修復伺服器所需做的工作只是替換新的磁碟然後告訴coda:去解決他吧。系統會自動向磁碟寫入從別的伺服器上獲取的最新的數據。
Coda的應用
Coda 一直在卡耐基·梅隆大學使用。約有數十個客戶端使用它來做coda的開發工作,並且它作為一個完全的可以離線使用文件系統來運行特定的應用程序。下面的兩點可以說明coda的特性非常的成功。我們購買了一些Wabi以及相關的一些Windows軟體的授權。Wabi可以讓用戶執行微軟的 Powerpoint。我們把Wabi、Windows 3.1還有微軟的Office程序存放在Coda上,並且與客戶端進行共享。當然客戶端的存放自己參數的.ini文件是每個用戶單獨使用的,大多數的庫和應用程序是共享的。通過臨時暫存的文件我們仍然可以在離線的筆記本上進行展示。這種操作在會議上是經常遇到的。
我們已經使用這個系統很多年了,從來沒有發生過丟失用戶數據的現象。有些時候伺服器上的磁碟報廢了,但當所有的卷都被複制后,我們將一個空的磁碟放入到伺服器中並且讓保持一致性的系統來自動更新數據。所需要做的工作實際上只是在放入新磁碟后在受到影響的目錄樹下運行"ls -lR"。伺服器會發現缺少的文件,負責保持一致性的進程會將文件從正常的伺服器上傳送到新修復好的伺服器。
有很多的應用程序都會因為Coda而受益。
FTP 的鏡像站點可以是一個Coda客戶端。我們用擁有眾多鏡像站點的ftp.redhat.com來做一個例子。每個鏡像站點都是使用一個Perl腳本來遍歷 Redhat的目錄樹以便知道是否有任何更新並且獲取更新的文件,不論在鏡像上是否需要這樣。假如Redhat使用coda來作為他們的ftp空間,鏡像站點相當於coda客戶端,只是Redhat自己有寫入的許可權。當Redhat更新文件的時候,Coda伺服器會自動告知鏡像站點有文件改變了。當某人試圖從鏡像站點下載更新過的文件的時候,鏡像站點才會從伺服器上下載最新的文件。
WWW伺服器也可以作為coda客戶端。很多ISP因為 WWW伺服器短缺而很頭痛。對於單一的http伺服器來說,訪問量實在是太大了。已經證明使用NFS來共享文件會造成效率上面的問題,手動的在某幾個特定的伺服器之間複製文件是經常需要做的操作。Coda可以解決這樣的問題。每個伺服器作為一個coda客戶端,將數據保存在自己的緩存中。訪問的速度是由本地磁碟的速度來決定的。ISP可以離線來更改他們網頁的信息,我們也為移動客戶端做了一個很好用的應用程序。
網路計算機可以通過使用coda作為緩存來大大的提高性能。當伺服器可用的時候,網路計算機會自動去更新。大多數的操作是沒有網路流量的,即使重新啟動。
我們現在要做的工作主要是提高Coda的質量。Coda的輪廓已經通過研究大體勾劃出來了。回寫式緩存將加入到Coda中以便能更高速的運轉。離線操作是一種很特殊的回寫緩存操作。我們正在利用離線操作的代碼來實現在線時的回寫緩存。Kerberos的支持已經加入。網路協議對Coda的支持使這個很容易做到。我們希望在未來能做到讓Coda客戶端同時連接多個Coda伺服器集群,並且把Coda移植到儘可能多的操作系統上。
獲取Coda
Coda可以通過 ftp.coda.cs.cmu.edu 來下載。 在這個伺服器上你可以找到為 Linux 準備的 RPM 包以及 tar 打包的源代碼。 Linux 2.2及以後的內核可以支持 Coda。 在我們的 www 站點 www.coda.cs.cmu.edu 上你可以找到更多的資源,比如郵件列表、手冊以及研究論文等等。

[ 本帖最後由 agg230 於 2007-8-15 15:26 編輯 ]
《解決方案》

感謝樓主分享!

不知道 coda 是否能夠實現由 多台計算機 提供 磁碟空間, 組成 一個 大的共享文件系統...
《解決方案》

xiexie
有空研究一下
《解決方案》

自:http://www.chedong.com/tech/rotate_merge_log.html
建議直接點鏈接查看  界面比下面引用的看著舒服
多伺服器的日誌合併統計——apache日誌的cronolog輪循
作者:車東 發表於:2003-04-12 11:04 最後更新於:2007-04-13 22:04
版權聲明:可以任意轉載,轉載時請務必以超鏈接形式標明文章原始出處和作者信息及本聲明。
http://www.chedong.com/tech/rotate_merge_log.html
內容摘要:你完全不必耐心地看完下面的所有內容,因為結論無非以下2點:
1 用 cronolog 乾淨,安全地輪循apache「日」志
2 用 sort -m 合併排序多個日誌

根據個人的使用經歷:
1 先介紹apache日誌的合併方法;
2 然後根據由此引出的問題說明日誌輪循的必要性和解決方法,介紹如何通過cronolog對apache日誌進行輪循;
中間有很多在設計日誌合併過程中一些相關工具的使用技巧和一些嘗試的失敗經歷……
我相信解決以上問題的路徑不止這一條途徑,以下方案肯定不是最簡便或者說成本最低的,希望能和大家有更多的交流。


多伺服器日誌合併統計的必要性

越來越多大型的WEB服務使用DNS輪循來實現負載均衡:使用多個同樣角色的伺服器做前台的WEB服務,這大大方便了服務的分佈規劃和擴展性,但多個伺服器的分佈使得日誌的分析統計也變得有些麻煩。如果使用webalizer等日誌分析工具對每台機器分別做日誌統計:
1 會對數據的匯總帶來很多麻煩,比如:統計的總訪問量需要將SERVER1 SERVER2...上指定月份的數字相加。
2 會大大影響統計結果中唯一訪客數unique visits,唯一站點數unique sites的等指標的統計,因為這幾個指標並非幾台機器的代數相加。

統一日誌統計所帶來的好處是顯而易見的,但如何把所有機器的統計合併到一個統計結果里呢?
首先也許會想:多個伺服器能不能將日誌記錄到同一個遠程文件里呢?我們不考慮使用遠程文件系統記錄日誌的問題,因為帶來的麻煩遠比你獲得的方便多的多……
因此,要統計的多個伺服器的日誌還是:分別記錄=>並通過一定方式定期同步到後台=>合併=>後用日誌分析工具來進行分析。

首先,要說明為什麼要合併日誌:因為webalizer沒有將同一天的多個日誌合併的功能
先後運行
webalizer log1
webalizer log2
webalizer log3
這樣最後的結果是:只有log3的結果。

能不能將log1<<log2<<log3簡單疊加呢?
因為一個日誌的分析工具不是將日誌一次全部讀取後進行分析,而且流式的讀取日誌並按一定時間間隔,保存階段性的統計結果。因此時間跨度過大(比如2條日誌間隔超過5分鐘),一些日誌統計工具的演算法就會將前面的結果「忘掉」。因此, log1<<log2<<log3直接文件連接的統計結果還是:只有log3的統計結果。

多台服務日誌合併問題:把多個日誌中的記錄按時間排序后合併成一個文件

典型的多個日誌文件的時間欄位是這樣的:
log1 log2 log3
00:15:00 00:14:00 00:11:00
00:16:00 00:15:00 00:12:00
00:17:00 00:18:00 00:13:00
00:18:00 00:19:00 00:14:00
14:18:00 11:19:00 10:14:00
15:18:00 17:19:00 11:14:00
23:18:00 23:19:00 23:14:00

日誌合併必須是按時間將多個日誌的交叉合併。合併后的日誌應該是:
00:15:00 來自log1
00:15:00 來自log2
00:16:00 來自log1
00:17:00 來自log3
00:18:00 來自log2
00:19:00 來自log1
....

如何合併多個日誌文件?
下面以標準的clf格式日誌(apache)為例:
apche的日誌格式是這樣的:
%h %l %u %t \"%r\" %>s %b
具體的例子:
111.222.111.222 - - "GET /index.html HTTP/1.1" 200 419

最簡單的想法是將日誌一一讀出來,然後按日誌中的時間欄位排序
cat log1 log2 log3 |sort -k 4 -t " "
註釋:
-t " ": 日誌欄位分割符號是空格
-k 4: 按第4個欄位排序,也就是: 這個欄位
-o log_all: 輸出到log_all這個文件中

但這樣的效率比較低,要知道。如果一個服務已經需要使用負載均衡,其服務的單機日誌條數往往都超過了千萬級,大小在幾百M,這樣要同時對多個幾百M的日誌進行排序,機器的負載可想而之……
其實有一個優化的途徑,要知道:即使單個日誌本身已經是一個「已經按照時間排好序「的文件了,而sort對於這種文件的排序合併提供了一個優化合併演算法:使用 -m merge合併選項,
因此:合併這樣格式的3個日誌文件log1 log2 log3並輸出到log_all中比較好方法是:
sort -m -t " " -k 4 -o log_all log1 log2 log3
註釋:
-m: 使用 merge優化演算法

注意:合併后的日誌輸出最好壓縮以後再發給webalizer處理
有的系統能處理2G的文件,有的不能。有的程序能處理大於2G的文件,有的不能。盡量避免大於2G的文件,除非確認所有參與處理的程序和操作系統都能處理這樣的文件。所以輸出后的文件如果大於2G,最好將日誌gzip后再發給webalizer處理:大於2G的文件分析過程中文件系統出錯的可能性比較大,並且gzip后也能大大降低分析期間的I/O操作。

日誌的按時間排序合併就是這樣實現的。

日誌的輪循機制

讓我們關心一下數據源問題:webalizer其實是一個按月統計的工具,支持增量統計:因此對於大型的服務,我可以按天將apache的日誌合併後送給 webalizer統計。WEB日誌是如何按天(比如每天子夜00:00:00)截斷呢?
如果你每天使用crontab:每天0點準時將日誌備份成access_log_yesterday
mv /path/to/apache/log/access_log /path/to/apache/log/access_log_yesterday
的話:你還需要:馬上運行一下:apache restart 否則:apache會因為的日誌文件句柄丟失不知道將日誌記錄到哪裡去了。這樣歸檔每天子夜重啟apache服務會受到影響。
比較簡便不影響服務的方法是:先複製,后清空
cp /path/to/apache/log/access_log /path/to/apache/log/access_log_yesterday
echo >/path/to/apache/log/access_log

嚴肅的分析員會這樣做發現一個問題:
但cp不可能嚴格保證嚴格的0點截斷。加入複製過程用了6秒,截斷的access_log_yesterday日誌中會出現複製過程到00:00:06期間的日誌。對於單個日誌統計這些每天多出來幾百行日誌是沒有問題的。但對於多個日誌在跨月的1天會有一個合併的排序問題:





要知道[01/Apr/2002:00:00:00 這個欄位是不可以進行「跨天排序」的。因為日期中使用了dd/mm/yyyy,月份還是英文名,如果按照字母排序,很有可能是這樣的結果:排序導致了日誌的錯誤













這些跨天過程中的非正常數據對於webalizer等分析工具來說簡直就好像是吃了一個臭蟲一樣,運行的結果是:它可能會把前一個月所有的數據都丟失!因此這樣的數據會有很多風險出現在處理上月最後一天的數據的過程中。

問題的解決有幾個思路:
1 事後處理:
。所以一個事後的處理的方法是:用grep命令在每月第1天將日誌跨月的日誌去掉,比如:
grep -v "01/Apr" access_log_04_01 > access_log_new

修改SORT后的日誌:所有跨天的數據去掉。也許對日誌的事後處理是一個途徑,雖然sort命令中有對日期排序的特殊選項 -M(注意是:大寫M),可以讓指定欄位按照英文月份排序而非字母順序,但對於apache日誌來說,用SORT命令切分出月份欄位很麻煩。(我嘗試過用 "/"做分割符,並且使用「月份」 「年:時間」這兩個欄位排序)。雖然用一些PERL的腳本肯定可以實現,但最終我還是放棄了。這不符合系統管理員的設計原則:通用性。並且你需要一直問自己:有沒有更簡單的方法呢?
還有就是將日誌格式改成用TIMESTAMP(象SQUID的日誌就沒有這個問題,它的日誌本身就是使用TIMESTAMP做時間時間戳的),但我無法保證所有的日誌工具都能識別你在日期這個欄位使用了特別的格式。

2 優化數據源:
最好的辦法還是優化數據源。將數據源保證按天輪循,同一天的日誌中的數據都在同一天內。這樣以後你無論使用什麼工具(商業的,免費的)來分析日誌,都不會因為日誌複雜的預處理機制受到影響。

首先可能會想到的是控制截取日誌的時間:比如嚴格從0點開始截取日誌,但在子夜前1分鐘還是后一分鐘開始截取是沒有區別的,你仍然無法控制一個日誌中有跨 2天記錄的問題,而且你也無法預測日誌歸檔過程使用的時間。
因此必須要好好考慮一下使用日誌輪循工具的問題,這些日誌輪循工具要符合:
1 不中斷WEB服務:不能停apache=>移動日誌=>重啟apache
2 保證同一天日誌能夠按天輪循:每天一個日誌00:00:00-23:59:59
3 不受apache重啟的影響:如果apache每次重啟都會生成一個新的日誌是不符合要求的
4 安裝配置簡單

首先考慮了apache/bin目錄下自帶的一個輪循工具:rotatelogs 這個工具基本是用來按時間或按大小控制日誌的,無法控制何時截斷和如何按天歸檔。
然後考慮logrotate後台服務:logrotate是一個專門對各種系統日誌(syslogd,mail)進行輪循的後台服務,比如SYSTEM LOG,但其配置比較複雜,放棄,實際上它也是對相應服務進程發出一個-HUP重啟命令來實現日誌的截斷歸檔的。

在apache的FAQ中,推薦了經過近2年發展已經比較成熟的一個工具cronolog:安裝很簡單:configure=>make=> make install

他的一個配置的例子會讓你了解它有多麼適合日誌按天輪循:對httpd.conf做一個很小的修改就能實現:
TransferLog "|/usr/sbin/cronolog /web/logs/%Y/%m/%d/access.log"
ErrorLog "|/usr/sbin/cronolog /web/logs/%Y/%m/%d/errors.log"

然後:日誌將寫入
/web/logs/2002/12/31/access.log
/web/logs/2002/12/31/errors.log
午夜過後:日誌將寫入
/web/logs/2003/01/01/access.log
/web/logs/2003/01/01/errors.log
而2003 2003/01 和 2003/01/01 如果不存在的話,將自動創建

所以,只要你不在0點調整系統時間之類的話,日誌應該是完全按天存放的(00:00:00-23:59:59),後面日誌分析中: [31/Mar/2002:15:44:59這個欄位就和日期無關了,只和時間有關。

測試:考慮到系統硬碟容量,決定按星期輪循日誌
apache配置中加入:
#%w weekday
TransferLog "|/usr/sbin/cronolog /path/to/apache/logs/%w/access_log"

重啟apache后,除了原來的CustomLog /path/to/apche/logs/access_log繼續增長外,系統log目錄下新建立了 3/目錄(測試是在周3),過了一會兒,我忽然發現2個日誌的增長速度居然不一樣!
分別tail了2個日誌才發現:
我設置CustomLog使用的是combined格式,就是包含(擴展信息的),而TransferLog使用的是預設日誌格式,看了apache的手冊才知道,TransferLog是用配置文件中離它自己最近的一個格式作為日誌格式的。我的httpd.conf里寫的是:
LogFormat ..... combined
LogFormat ... common
...
CustomLog ... combined
TransferLog ...

所以TrasferLog日誌用的是預設格式,手冊里說要讓TRANSFER日誌使用指定的格式需要:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
TransferLog "|/usr/local/sbin/cronolog /path/to/apache/logs/%w/access_log"

重啟,OK,日誌格式一樣了。
這樣的設置結果其實是同時在logs目錄下分別記錄2個日誌access_log和%w/access_log,能不能只記錄%w/下的日誌那?
查apache手冊,更簡單的方法:直接讓CustomLog輸出到cronolog歸檔日誌,並且還能指定格式。
CustomLog "|/usr/local/sbin/cronolog /path/to/apache/logs/%w/access_log" combined

最後是一個日誌同步的問題。

任務:每天凌晨找到前1天的日誌,另存一個文件準備發送到伺服器上。
比如我要保留前1周的日誌:每天複製前1天的日誌到指定目錄,等待日誌伺服器來抓取:
/bin/cp -f /path/to/apache/logs/`date -v-1d +%w`/access_log /path/for/backup/logs/access_log_yesterday

在FREEBSD上使用以下命令
date -v-1d +%w
註釋:
-v-1d: 前1天,而在GNU/Linux上這個選項應該是date -d yesterday
+%w: weekday,由於使用的都是標準時間函數庫,所有工具中的WEEKDAY定義都是一樣的 0-6 => 周日-周六

注意:
寫到CRONTAB里的時候"%"前面需要加一個"\"轉義:每天0點5分進行一次日誌歸檔,
另外一個問題就是在cront中需要用:rm -f {} ; 而不是rm -f {}\;
5 0 * * * /bin/cp /path/to/logs/`date -v-1d +\%w`/access_log /path/to/for_sync/logs/access_yesterday
37 10 * * * /usr/bin/find /home/apache/logs/ -name access_log -mtime +1 -exec /bin/rm -f {} ;

首次開始cronolog日誌統計是周3,一周以後日誌又將輪循回3/access_log
但這次日誌是追加到3/access_log還是重新創建一個文件呢?>>access_log or >access_log?
我測試的結果是日誌將被追加:





肯定是不希望每次日誌還帶著上周的數據的並重複統計一次的(雖然對結果沒影響),而且這樣%w/下的日誌不是也越來越多了嗎?
解決方法1 把每天的cp改成mv
解決方法2 每天複製完成後:刪除6天以前的access_log日誌
find /path/to/apache/logs -name access_log -mtime +6 -exec rm -f {}\;
多保留幾天的日誌還是有必要的:萬一日誌分析伺服器壞了一天呢?

以下是把apache安裝在/home/apache下每天統計的一個腳本文件:
#!/bin/sh

#backup old log
/bin/cp -f /home/apache/logs/`date -d yesterday +%w`/access_log /home/apache/logs/access_log_yesterday

#remove old log
/usr/bin/find /home/apache/logs -name access_log -mtime +6 -exec rm -f {}\;

#analysis with webalizer
/usr/local/sbin/webalizer

總結:
1 用 cronolog 乾淨,安全地輪循日誌
2 用 sort -m 排序合併多個日誌


參考資料:

日誌分析統計工具:
http://directory.google.com/Top/Computers/Software/Internet/Site_Management/Log_Analysis/

Apche的日誌設置:
http://httpd.apache.org/docs/mod/mod_log_config.html

Apache的日誌輪循:
http://httpd.apache.org/docs/misc/FAQ.html#rotate

Cronolog
http://www.cronolog.org

Webalizer
http://www.mrunix.net/webalizer/
Webalzer的Windows版
http://www.medasys-lille.com/webalizer/

AWStats的使用簡介
http://www.chedong.com/tech/awstats.html



[ 本帖最後由 agg230 於 2007-8-17 12:35 編輯 ]
《解決方案》

學習學習,看起來很難呀!




[火星人 via ] apache + heartbeat + coda + awstats已經有190次圍觀

http://www.coctec.com/docs/service/show-post-8090.html