免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7913 | 回复: 5
打印 上一主题 下一主题

apache + heartbeat + coda + awstats [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-08-15 15:12 |只看该作者 |倒序浏览
期间 感谢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] yes
What is the root directory for your coda server(s)?[/vice] /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/no] 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)
[22M, 44M, 90M, 130M, 200M, 315M]: 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/n] 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]? /vicepa
Shall I set up a vicetab entry for /vicepa (y/n) y
Select the maximum number of files for the server.
[256K, 1M, 2M, 16M]: 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 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-08-15 15:21 |只看该作者
自: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 访问控制列表
* 对共享的完美诠释
* 可以免费获取源代码

Fig 1: Coda 的标志 (原图例作者:Gaich Muramatsu)
你可能会对某些专业术语感到困惑,下面我们先把可能遇到的术语加以介绍。
分布式文件系统
一个分布的文件系统将文件存储在一个或更多的叫做服务器的计算机上,并且可以让客户机像访问普通文件一样访问。使用文件服务器有很多的好处。文件可以尽可能广泛的被能访问服务器的计算机使用,在同一个地点存储并且共享某文件比把这个文件分散到许多客户机上单独存储要好。对于保证信息的安全而作的备份处理相对更加容易,因为只有存储文件的服务器需要做备份。服务器可以提供很大的存储空间,如果每个客户端都单独准备一个这样大的空间的成本会很大,显然是不现实的。当某一部分人需要共享文档的时候,分布式文件系统的有效性就体现出来了。更进一步的说,共享应用软件也是一个很好的选择。共享之后系统的管理将会变得相对简单。
设计一个好的分布式文件系统需要处理很多的问题。由于网络本身的瓶颈和服务器的超负荷工作,在网络中传送大量的文件通常是效率很低并且有延迟。数据的安全性也是另外的一个需要特别注意的方面,我们必须确认访问数据的客户端确实是经过我们认证的,并且数据在传送过程中没有泄漏。另外还有两个和故障处理有关的方面。通常情况下客户端相对网络连接来说出故障的可能性更小。网络的故障会造成客户端不再使用的假象。同样,服务器的故障会令人更加不悦,因为它会造成所有的客户端无法访问急需的信息。Coda作为一个分布式文件系统的研究原型将会一一处理上面提到的问题。

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将向内核报告,并且最终从系统调用返回到应用程序。下图就是刚才提到的过程的图示。

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。这些文件都像本地文件一样,储存的应用程序可以很好的运行。

Fig 4: 临时文件被"粘"在缓存中 (原图作者: Gaich Muramatsu)
第二个问题是在恢复连接之后重新处理修改过的文件时会遇到的。假如有多个客户端对同一个文件作了修改,并且都传送到了服务器,那么就会出现冲突。我们把这样的冲突叫做局部/全局冲突(local/global)或者叫做客户端/服务器冲突(client/server)。这样的冲突有时候可以通过专门的解决方法来自动修复(比如一个客户端向日历文件中写入周一的安排另一个客户端插入了一个周三的安排。这样的情况就是可以解决的冲突)。当然,有些时候冲突是不能自动解决的,这就需要受人工的干预来进行处理。
假设我们在一个周五带着装满了源代码的笔记本离开了办公室去出差。在处理完堆积如山的工作之后,隔周的周一(也就是10天后)我们回到了办公室。当笔记本重新连接后,系统就会自动更新这些代码。这就是我们说所的移动办公。

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,从而会导致全局(服务器与服务器之间)冲突。

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 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2007-08-16 02:57 |只看该作者
感谢楼主分享!

不知道 coda 是否能够实现由 多台计算机 提供 磁盘空间, 组成 一个 大的共享文件系统...

论坛徽章:
0
4 [报告]
发表于 2007-08-16 17:28 |只看该作者
xiexie
有空研究一下

论坛徽章:
0
5 [报告]
发表于 2007-08-17 12:34 |只看该作者
自: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 - - [03/Apr/2002:10:30:17 +0800] "GET /index.html HTTP/1.1" 200 419

最简单的想法是将日志一一读出来,然后按日志中的时间字段排序
cat log1 log2 log3 |sort -k 4 -t " "
注释:
-t " ": 日志字段分割符号是空格
-k 4: 按第4个字段排序,也就是:[03/Apr/2002:10:30:17 +0800] 这个字段
-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天会有一个合并的排序问题:
[31/Mar/2002:59:59:59 +0800]
[31/Mar/2002:23:59:59 +0800]
[01/Apr/2002:00:00:00 +0800]
[01/Apr/2002:00:00:00 +0800]

要知道[01/Apr/2002:00:00:00 这个字段是不可以进行“跨天排序”的。因为日期中使用了dd/mm/yyyy,月份还是英文名,如果按照字母排序,很有可能是这样的结果:排序导致了日志的错误
[01/Apr/2002:00:00:00 +0800]
[01/Apr/2002:00:00:00 +0800]
[01/Apr/2002:00:00:00 +0800]
[01/Apr/2002:00:00:00 +0800]
[01/Apr/2002:00:00:00 +0800]
[01/Apr/2002:00:00:00 +0800]
[01/Apr/2002:00:00:00 +0800]
[31/Mar/2002:59:59:59 +0800]
[31/Mar/2002:59:59:59 +0800]
[31/Mar/2002:23:59:59 +0800]
[31/Mar/2002:59:59:59 +0800]
[31/Mar/2002:23:59:59 +0800]

这些跨天过程中的非正常数据对于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?
我测试的结果是日志将被追加:
[01/Apr/2002:23:59:59 +0800]
[01/Apr/2002:23:59:59 +0800]
[08/Apr/2002:00:00:00 +0800]
[08/Apr/2002:00:00:00 +0800]

肯定是不希望每次日志还带着上周的数据的并重复统计一次的(虽然对结果没影响),而且这样%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/ ... ement/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 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2007-08-23 13:40 |只看该作者
学习学习,看起来很难呀!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP