GlusterFS学习手记01-初步了解及简单的配置应用[原创]

对于分布式存储已经被越来越多的公司所应用,对于这方面的学习自然不能忽略,之前就也看过相关的内容,像红帽的GFS,google的googlefs,开源的现在也越来越多,像Fastdfs,ZFS,Lustre,Hadoop,GlusterFS。

大概的也都接触了一下,Fastdfs号称小巧,速度快占用资源小,但据我了解他是提供api来进行操作的,而目前我还是希望可以像NFS一样,直接mount来使用,并且提供高的可用性,和文件的容错功能,一路扫下来,瞄准了glusterfs。

Glusterfs是一个具有可以扩展到几个PB数量级的集群文件系统。它可以把多个不同类型的存储块通过Infiniband RDMA或者TCP/IP汇聚成一个大的并行网络文件系统。

http://www.gluster.org/可以了解到更多并可以下载到最新的安装包,glusterfs使用了fuse,fuse可以到http://fuse.sourceforge.net/进行下载

首先是fuse的安装

./configure –enable-dependency-tracking –enable-kernel-module –enable-lib –enable-util
make
make install

如果没有什么错误,就是安装完毕了,接下来是glusterfs的安装

tar zxvf glusterfs-2.0.0rc1.tar.gz
./configure
make
make install

如果没有报错就是安装完毕了
然后执行ldconfig
执行完毕后执行
glusterfs –version 可以看到

glusterfs 2.0.0rc1 built on Feb 10 2009 11:39:40
Repository revision: glusterfs–mainline–3.0–patch-844
Copyright (c) 2006, 2007, 2008 Z RESEARCH Inc. <http://www.zresearch.com/>
GlusterFS comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of GlusterFS under the terms of the GNU General Public License.

说明glusterfs已经正确安装完毕了

下面来做个简单的配置,类似NFS的配置

环境:vmware6.0 模拟两个linux,ip分别Server:192.168.211.128 client:192.168.211.129,软件都已经安装完毕

server端的配置

先建立需要share的文件夹
make -p /home/dir1
chmod 1777 /home/dir1
然后建立配置文件
vi /etc/glusterfs/server.vol

### file: server-volume.vol.sample

#####################################
### GlusterFS Server Volume File ##
#####################################

#### CONFIG FILE RULES:
### "#" is comment character.
### – Config file is case sensitive
### – Options within a volume block can be in any order.
### – Spaces or tabs are used as delimitter within a line.
### – Multiple values to options will be : delimitted.
### – Each option should end within a line.
### – Missing or commented fields will assume default values.
### – Blank/commented lines are allowed.
### – Sub-volumes should already be defined above before referring.

### Export volume "brick" with the contents of "/home/export" directory.
volume brick
type storage/posix # POSIX FS translator
option directory /home/dir1 # Export this directory
end-volume

### Add network serving capability to above brick.
volume server
type protocol/server
option transport-type tcp/server
option bind-address 192.168.211.128 # Default is to listen on all interfaces
option listen-port 6996 # Default is 6996
subvolumes brick
option auth.addr.brick.allow * # Allow access to "brick" volume
end-volume

client端的配置

modprobe -i fuse
vi /etc/glusterfs/client.vol

### file: client-volume.vol.sample

#####################################
### GlusterFS Client Volume File ##
#####################################

#### CONFIG FILE RULES:
### "#" is comment character.
### – Config file is case sensitive
### – Options within a volume block can be in any order.
### – Spaces or tabs are used as delimitter within a line.
### – Each option should end within a line.
### – Missing or commented fields will assume default values.
### – Blank/commented lines are allowed.
### – Sub-volumes should already be defined above before referring.

### Add client feature and attach to remote subvolume
volume client0
type protocol/client
option transport-type tcp/client
option remote-host 192.168.211.128 # IP address of the remote brick
option remote-port 6996 # default server port is 6996
option remote-subvolume brick # name of the remote volume
end-volume

这样两台机器就都配置完毕了

首先在server上启动服务

gulsterfsd -f /etc/glusterfs/server.vol

[root@contos5-1-1 etc]# ps ax|grep -v grep |grep gluster
2028 ? Ssl 0:00 glusterfsd -f ./server.vol

看到这个证明服务器端就启动了

接下来是client端的启动

glusterfs -l /tmp/glustfs.log -f /etc/glusterfs/client.vol /mnt/

[root@contos5-1-4 glusterfs]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 7.1G 2.5G 4.3G 37% /
/dev/sda1 190M 11M 170M 7% /boot
tmpfs 125M 0 125M 0% /dev/shm
glusterfs 7.1G 2.9G 3.9G 43% /mnt

看到这个了,就说明client端mount正常,如果没有请查看/tmp/glusterfs.log文件

到此,一个简单的1存储1客户端的配置就完成了,这篇文章仅仅是个开始,glusterfs还有很多的功能,我也会在以后的时间进行深入的研究,希望有相同兴趣的朋友一起讨论

lvs+HA+squid搭建稳定上网服务[原创]

今天有人在群里喊谁做过lvs+squid,正好以前做过一个,我就把过程整理下来,供大家参考。首先看看拓扑图如下
说下我写这篇文章所用的测试环境,vmvare6.0,模拟两个linux,用的是centos5.1
squid-1(192.168.211.128)
squid-2(192.168.211.130)
Vip(192.168.211.135)
实现方式lvs-dr
1,lvs配置部分
安装lvs所需要的软件

yum -y install heartbeat

yum y install heartbeatldirectord

yum -y install heartbeat-devel

yum y install ipvsadm

配置Ldirector
vi /etc/ha.d/ldirectord.cf设置如下内容,两台机器文件内容相同

# Global Directives

checktimeout=3

checkinterval=1

autoreload=yes

logfile=“/var/log/ldirectord.log”

logfile=“local0”

#emailalert=“admin@x.y.z”

#emailalertfreq=3600

#emailalertstatus=all

quiescent=yes

# Sample for an http virtual service

virtual=192.168.211.135:3128

real=192.168.211.128:3128 gate

real=192.168.211.130:3128 gate

scheduler=rr

#persistent=600

#netmask=255.255.255.255

protocol=tcp

checktype=negotiate

checkport=3128

配置heartbeat

vi /etc/ha.d/ha.cf

debugfile /var/log/ha-debug

logfile /var/log/ha-log

logfacility local0

keepalive 2

deadtime 30

warntime 10

initdead 120

udpport 694

ucast eth0 192.168.211.130 #另外一台这里要设置成另外的ip

auto_failback on

node contos5-1-1 #通过uanme -n得到

node contos5-1-2

ping_group group1 192.168.211.128 192.168.211.130

respawn hacluster /usr/lib/heartbeat/ipfail

这里之所以使用ucast而不用bcast是因为,如果同网段你还有另外的一套lvs的话,bcast广播也会发到这套lvs里,虽说应用上不会给另外一套lvs带来影响,但日志里会出现很多错误

cp /usr/share/doc/heartbeat-2.1.3/authkeys /etc/ha.d/

vi /etc/ha.d/authkeys,将如下两行的注释去掉

# crc adds no security , except from packet corruption.

# Use only on physically secure networks.

#

auth 1

1 crc

#2 sha1

#3 md5

chomd 600 /etc/ha.d/authkeys

vi /etc/ha.d/haresources文件,加入

contos5-1-1 closelo 192.168.211.135 ldirectord::ldirectord.cf startlo

在/etc/ha.d/resource.d下建立closelo脚本,内容如下

#!/bin/sh

VIP=192.168.211.135

case “$1” in

start)

# close lo:0 interface

echo $“Close lo:0 interface”

/sbin/route del -host $VIP dev lo:0

/sbin/ifconfig lo:0 down

echo “0” > /proc/sys/net/ipv4/conf/all/arp_announce

echo “0” > /proc/sys/net/ipv4/conf/all/arp_ignore

echo “0” > /proc/sys/net/ipv4/conf/lo/arp_announce

echo “0” > /proc/sys/net/ipv4/conf/lo/arp_ignore

;;

stop)

# start lo:0 interface

echo $“Start lo:0 interface”

/sbin/ifconfig lo:0 $VIP/32 broadcast $VIP up

/sbin/route add -host $VIP dev lo:0

echo “2” > /proc/sys/net/ipv4/conf/all/arp_announce

echo “1” > /proc/sys/net/ipv4/conf/all/arp_ignore

echo “2” > /proc/sys/net/ipv4/conf/lo/arp_announce

echo “1” > /proc/sys/net/ipv4/conf/lo/arp_ignore

;;

*)

echo $“Usage: $0 (start|stop)”

exit 1

;;

esac

/etc/ha.d/resource.d下建立startlo脚本

# ! /bin/sh

VIP=192.168.211.135

case “$1” in

stop)

# close lo:0 interface

echo $“Close lo:0 interface”

/sbin/route del host $VIP dev lo:0

/sbin/ifconfig lo:0 down

echo “0” > /proc/sys/net/ipv4/conf/all/arp_announce

echo “0” > /proc/sys/net/ipv4/conf/all/arp_ignore

echo “0” > /proc/sys/net/ipv4/conf/lo/arp_announce

echo “0” > /proc/sys/net/ipv4/conf/lo/arp_ignore

; ;

start)

# start lo:0 interface

echo $“Start lo:0 interface”

/sbin/ifconfig lo:0 $VIP/32 broadcast $VIP up

/sbin/route add host $VIP dev lo:0

echo “2” > /proc/sys/net/ipv4/conf/all/arp_announce

echo “1” > /proc/sys/net/ipv4/conf/all/arp_ignore

echo “2” > /proc/sys/net/ipv4/conf/lo/arp_announce

echo “1” > /proc/sys/net/ipv4/conf/lo/arp_ignore

; ;

* )

echo $“Usage: $0 (start|stop)”

exit 1

; ;

esac

到此,lvs部分就全部完成了,接下来说squid的设置,具体配置我就不写了,网上这方面的文章很多,我仅仅完成一个可以做正向代理的出来

squid我使用的是3.0stable8
./configure –prefix=/usr/local/squid
make && make install
完成安装后,配置文件内容如下

visible_hostname 2

acl manager proto cache_object

acl localhost src 127.0.0.1/32

acl to_localhost dst 127.0.0.0/8

acl localnet src 10.0.0.0/8 # RFC1918 possible internal network

acl localnet src 172.16.0.0/12 # RFC1918 possible internal network

acl localnet src 192.168.0.0/16 # RFC1918 possible internal network

acl SSL_ports port 443

acl Safe_ports port 80 # http

acl Safe_ports port 21 # ftp

acl Safe_ports port 443 # https

acl Safe_ports port 70 # gopher

acl Safe_ports port 210 # wais

acl Safe_ports port 1025-65535 # unregistered ports

acl Safe_ports port 280 # http-mgmt

acl Safe_ports port 488 # gss-http

acl Safe_ports port 591 # filemaker

acl Safe_ports port 777 # multiling http

acl CONNECT method CONNECT

acl purge method PURGE

http_access allow manager localhost

http_access deny manager

http_access deny !Safe_ports

http_access deny CONNECT !SSL_ports

http_access allow purge localhost

http_access allow localnet

http_access deny all

icp_access allow localnet

icp_access deny all

htcp_access allow localnet

htcp_access deny all

#always_direct allow all

#http_port 80 accel vhost vport

http_port 3128

hierarchy_stoplist cgi-bin ?

access_log /usr/local/squid/var/logs/access.log squid

cache_dir ufs /usr/local/squid/cache 10 2 4

refresh_pattern ^ftp: 1440 20% 10080

refresh_pattern ^gopher: 1440 0% 1440

refresh_pattern (cgi-bin|?) 0 0% 0

refresh_pattern . 0 20% 4320

cache_effective_user squid

cache_effective_group squid

然后启动squid,接下来就可以测试了,到此一个可用的而且强健的双机squid就完成了(除非两台机器同时挂掉)

注:每次启动heartbeat前,请先执行 /etc/ha.d/resource.d/closelo脚本,使得lo:o网卡启动,不然这套配置将不起作用了,我目前还没有找到更好的解决办法

如对以上配置有何不明了的还请提出共同讨论

squid3.0泛域名的实现[原创]

squid的安装配置我就不详细介绍了,网上相关的文章很多,我主要来说说我是如何实现用squid3.0实现泛域名的,我使用的是squid 3.0stable9版本
安装配置好squid后在squid的中添加如下几行

http_port 80 transparent或者http_port 80 accel vhost vport

cache_peer 192.168.0.10 parent 80 0 no-query originserver name=web
cache_peer_domain web .abc.com

然后保存退出

之后重启squid,接下来就可以用ie进行测试了

squid中cache_peer的sibling用法[原创]

提高squid命中率和使用效率是每个系统管理员都希望的一件事,毕竟在现有资源中榨干每一份的资源是必须滴,使用nginx的按url做定向投递,自然能提高squid的命中和效率,但毕竟公司目前没有这个条件,这个自然没法子实施,我就想到了另外的一个方法,就是今天的主角,cache_peer中的sibling。

先说说我的思路

如果有5台squid,每台的缓存空间是10G,估计每台能缓存静态文件110W个,如果前端放置f5或其他负载均衡设备,把所有请求的url都采用轮询的方式投递给squid,那最终每台squid上缓存住的静态文件几乎都是相同的,对于一个中小型的网站来说110W量的静态文件已经几乎是所有的静态文件了,但对于以在线漫画,或者图片为服务的网站来讲,静态文件将远远不止这个数量。

如果能让每台squid上缓存的都是独立的静态文件,那这组服务器所能缓存的文件将是原来能力的5倍,当然,前面提到了nginx的按url做定向投递可以解决这个问题,但这不是我要说的重点,其实用squid自己的堆叠就可以实现了,即cache_peer里的sibling

sibling是通过icq向同伴squid发送请求,一旦在同伴squid中发现了缓存命中,则由这个缓存命中返回给客户端,如果没有发现则到parent的squid去拿或者到realserver去拿

有了这个概念那就是说如果http://www.aaa.ccc/a.jpg发送过来了,如果a上没有,就会到b上找,如果有就反给客户端,如果没有会再去c上找如果最后都没有由a到后端parent或者realserver上取

下面看一个例子,我用vmware模拟了两个linux,上面分别跑了一个squid,

a上的配置,a的ip:192.168.220.128

icp_port 3130

icp_access allow all

cache_peer 61.152.242.1 parent 80 0 no -query originserver name=www2
cache_peer_domain www2 www.tgbus.com

b上的配置,b的ip:192.168.220.130

icp_port 3130

icp_access allow all

cache_peer 192.168.220.128 sibling 80 3130 proxy -only name=cache
cache_peer 61.152.242.1 parent 80 0 no -query originserver name=www2
cache_peer_domain cache www.tgbus.com
cache_peer_domain www2 www.tgbus.com

测试

修改本机本机hosts,先把www.tgbus.com指向到192.168.220.128上访问一遍,让220.128上有一份静态的缓存
然后把www.tgbus.com指向到192.168.220.130上,然后访问,可以看下两台机器上的日志
a的

1233463229.874 0 192.168.220.130 UDP_MISS/000 42 ICP_QUERY http: / /www.tgbus.com/ - NONE / - -
1233463231.555 0 192.168.220.130 UDP_HIT/000 51 ICP_QUERY http: / /www.tgbus.com/style.css - NONE / - -
1233463231.557 0 192.168.220.130 TCP_IMS_HIT/304 210 GET http: / /www.tgbus.com/style.css - NONE / - text /css
1233463231.596 0 192.168.220.130 UDP_MISS/000 67 ICP_QUERY http: / /www.tgbus.com/index/domain/Images/3.jpg - NONE / - -
1233463231.602 0 192.168.220.130 UDP_HIT/000 59 ICP_QUERY http: / /www.tgbus.com/images/v3/lqs.jpg - NONE / - -
1233463231.603 0 192.168.220.130 UDP_MISS/000 67 ICP_QUERY http: / /www.tgbus.com/index/domain/Images/4.jpg - NONE / - -
1233463231.605 0 192.168.220.130 TCP_IMS_HIT/304 212 GET http: / /www.tgbus.com/images/v3/lqs.jpg - NONE / - image/jpeg
1233463231.609 0 192.168.220.130 UDP_HIT/000 67 ICP_QUERY http: / /www.tgbus.com/index/tvgame/images/1.jpg - NONE / - -
1233463231.612 0 192.168.220.130 TCP_IMS_HIT/304 212 GET http: / /www.tgbus.com/index/tvgame/images/1.jpg - NONE / - image/jpeg
1233463231.615 0 192.168.220.130 UDP_HIT/000 67 ICP_QUERY http: / /www.tgbus.com/index/tvgame/images/2.jpg - NONE / - -
1233463231.618 0 192.168.220.130 TCP_IMS_HIT/304 212 GET http: / /www.tgbus.com/index/tvgame/images/2.jpg - NONE / - image/jpeg
1233463231.619 0 192.168.220.130 UDP_HIT/000 67 ICP_QUERY http: / /www.tgbus.com/index/tvgame/images/4.jpg - NONE / - -
1233463231.619 0 192.168.220.130 UDP_HIT/000 58 ICP_QUERY http: / /www.tgbus.com/images/v3/mc.jpg - NONE / - -
1233463231.623 1 192.168.220.130 TCP_IMS_HIT/304 212 GET http: / /www.tgbus.com/index/tvgame/images/4.jpg - NONE / - image/jpeg
1233463231.623 1 192.168.220.130 TCP_IMS_HIT/304 212 GET http: / /www.tgbus.com/images/v3/mc.jpg - NONE / - image/jpeg

b的

1233490583.540 269 192.168.220.1 TCP_MISS/200 57811 GET http: / /www.tgbus.com/ - FIRST_UP_PARENT/www2 text /html
1233490585.753 3 192.168.220.1 TCP_MISS/304 271 GET http: / /www.tgbus.com/style.css - SIBLING_HIT/cache text /css
1233490585.845 5 192.168.220.1 TCP_MISS/304 273 GET http: / /www.tgbus.com/images/v3/lqs.jpg - SIBLING_HIT/cache image/jpeg
1233490585.857 5 192.168.220.1 TCP_MISS/304 273 GET http: / /www.tgbus.com/index/tvgame/images/1.jpg - SIBLING_HIT/cache image/jpeg
1233490585.862 4 192.168.220.1 TCP_MISS/304 273 GET http: / /www.tgbus.com/index/tvgame/images/2.jpg - SIBLING_HIT/cache image/jpeg
1233490585.868 5 192.168.220.1 TCP_MISS/304 273 GET http: / /www.tgbus.com/index/tvgame/images/4.jpg - SIBLING_HIT/cache image/jpeg
1233490585.868 5 192.168.220.1 TCP_MISS/304 273 GET http: / /www.tgbus.com/images/v3/mc.jpg - SIBLING_HIT/cache image/jpeg
1233490585.871 4 192.168.220.1 TCP_MISS/304 273 GET http: / /www.tgbus.com/index/tvgame/images/3.jpg - SIBLING_HIT/cache image/jpeg
1233490585.873 3 192.168.220.1 TCP_MISS/304 273 GET http: / /www.tgbus.com/index/tvgame/images/5.jpg - SIBLING_HIT/cache image/jpeg
1233490585.885 4 192.168.220.1 TCP_MISS/304 272 GET http: / /www.tgbus.com/Images/v3/hot.gif - SIBLING_HIT/cache image/gif
1233490585.907 3 192.168.220.1 TCP_MISS/304 272 GET http: / /www.tgbus.com/Images/v3/tvgame.gif - SIBLING_HIT/cache image/gif
1233490585.943 3 192.168.220.1 TCP_MISS/304 272 GET http: / /www.tgbus.com/Images/v3/league.gif - SIBLING_HIT/cache image/gif
1233490586.382 555 192.168.220.1 TCP_MISS/304 292 GET http: / /www.tgbus.com/index/domain/Images/3.jpg - FIRST_UP_PARENT/www2 -
1233490586.477 11 192.168.220.1 TCP_MISS/304 273 GET http: / /www.tgbus.com/index/comic/images/manhua01.jpg - SIBLING_HIT/cache image/jpeg
1233490586.479 11 192.168.220.1 TCP_MISS/304 273 GET http: / /www.tgbus.com/index/comic/images/manhua02.jpg - SIBLING_HIT/cache image/jpeg
1233490586.479 11 192.168.220.1 TCP_MISS/304 273 GET http: / /www.tgbus.com/index/comic/images/manhua03.jpg - SIBLING_HIT/cache image/jpeg

由上面可以看到,在b上tcp_miss的大部分在a上都是sibling_hit的,这样说来,我的想法还是成立的,可以达到提高squid命中与效率,增大缓存容量的作用

使用nginx的url_hash提高squid的使用率[原创]

上次我说了使用squid自己的堆叠机制实现提高squid使用率的方法,这次再来说说和nginx搭配使用提高多台squid的使用率,目标当然是使用有限的squid服务器,缓存住更多的静态文件。

首先进到nginx的目录
执行patch -p0 < /path/to/upstream/hash/directory/nginx.patch

然后在安装的时候加上
–add-module=path/to/upstream/hash/directory

我的测试环境vmvare 模拟3个linux
ip分别:nginx 192.168.211.130
squid01 192.168.211.128
squid02 192.168.211.129
测试网站我反向代理www.tgbus.com

这样nginx上编译完成需要配置,内容如下

http {

upstream www.tgbus.com {
server 192.168.211.128;
server 192.168.211.129;
hash $request_uri;
}
server {
listen 80;
server_name www.tgbus.com;
location / {
proxy_pass http: / /bbs.tgbus.com;
}
}
}

然后启动nginx

两个squid就配置成标准的反向代理就可以了,主要配置如下

cache_peer 61.152.242.1 parent 80 0 no -digest no -query originserver name=www
cache_peer_domain www www.tgbus.com

然后启动squid

修改自己电脑的hosts,把www.tgbus.com的ip指向到nginx那台虚拟机的ip上,接下来就可以测试了
打开两台squid的日志,用tail -f的方式,然后访问www.tgbus.com,可以看到两边的日志的内容是不一样的,从其中一台squid的日志中找一条静态文件的url,通过ie 打开,可以发现,这个url的访问只投到同一台squid上,如此实现了,squid缓存的内容不同,从而增加了squid的缓存容量
当然,如果中间只使用一台nginx,自然这台会成为单点而造成隐患,所以可是使用heartbeat做成双机,增加系统的可靠性。

(更新版)通过脚本人为有选择性的更新squid的cache

squid 缓存文件的格式是DBase 3 data file,使用cat命令虽然也是可以看到里面的内容的,但格式混乱,如果想取出我们需要的东西,相对来说比较的麻烦,linux下有个stings命令,这条命令可以显示可打印的文本,这样,对cache文件进行stings的话,就可以把文本的部分显示出来了,而且每条记录是一行,这样一来,让我想到了以前我在张宴那个脚本基础上进行修改后的脚本就又可以进行第二次的改良了,下面我就把改良的内容写出如下
 
先看下原始cache文件的内容
再看看用stings转换后的内容

脚本文件名:clear_squid_cache.sh

注意:请赋予clear_squid_cache.sh可执行权限(命令:chmod +x ./clear_squid_cache.sh)。请确保脚本所在目录可写。

设置:
  squidcache_path= 表示squid缓存目录的路径
  squidclient_path= 表示squidclient程序所在的路径,默认为squid安装目录下的bin/squidclient
用法:
  1、清除所有Flash缓存(扩展名.swf):
  ./clear_squid_cache.sh swf

  2、清除URL中包含sina.com.cn的所有缓存:
  ./clear_squid_cache.sh sina.com.cn

  3、清除文件名为/images/的所有缓存:
  ./clear_squid_cache.sh /images/

如果对于频繁更新的gif或者什么,可以在crontab中添加对应的命令行
0 * * * * /usr/local/bin/clear_squid_cache.sh gif &
这样就会每隔一个小时进行一次刷新操作了,很是方便
如果需要让图片更新人员自行刷新的话,就可以找相应的人员开发web页面,进行对脚本的调用就可以了
 

注:以上cache内容摘取自squid3.0,2.x版本是否可以使用还请各位验证,总之3.0使用这个脚本后,准确率已经基本能达到100%了,对于以前有了很大程度的提高

原始脚本请参考张宴blog

mysql-proxy安装[原创]

最近在学mysql-proxy,今天先把安装过程写出来

mysql-proxy需要lua和mysql的支持
lua的下载可以去http://www.lua.org/ftp/
mysql的下载就去www.mysql.com就行
首先是lua的安装
32位的

tar zxvf lua-5.1.4.tar.gz
cd lua-5.1.4
make linux
make install

64位系统的

tar zxvf lua-5.1.4.tar.gz
cd lua-5.1.4
vi Makefile
INSTALL_TOP= /usr
INSTALL_BIN= $(INSTALL_TOP)/bin
INSTALL_INC= $(INSTALL_TOP)/include
INSTALL_LIB= $(INSTALL_TOP)/lib64
INSTALL_MAN= $(INSTALL_TOP)/man/man1

INSTALL_LMOD= $(INSTALL_TOP)/share/lua/$V

INSTALL_CMOD= $(INSTALL_TOP)/lib64/lua/$V

保存退出

make linux
make install

安装好lua后,接下来安装mysql-proxy

tar zxvf mysql-proxy-0.6.1.tar.gz
cd mysql-proxy-0.6.1

64位系统执行

export LUA_LIBS="-L/usr/lib64/lua/5.1/ -llua -lm"
export LUA_CFLAGS=" "

32位系统执行

export LUA_LIBS="-L/usr/local/lib/lua/5.1/ -llua -lm"
export LUA_CFLAGS=" "

接下执行

./configure --with-mysql=/pathto/yourmysqldir/bin/mysql_config LDFLAGS="-ldl"
make
make install

如果没有报错基本就是安装成功,如果过程中报相应的错误,请安装相应的缺失文件即可了

安装到此就结束了,继续去学习了。有问题再讨论吧

cfengine学习笔记03[原创]

终于到最后一篇了,也就是cfengine最便捷的所在了,让你只通过一台机器管理你想要管理的任意一个或多个服务器,是不是很神奇,请往下看

前两篇已经把基本的配置都写好且配置好了,这里我仅仅捡关键的写了,cfservd.conf,update.conf及供维护服务器端使用的cfagent.conf文件参考上篇文章,这片文章中我们仅仅需要配置cfrun.hosts文件
内容如下

#
# This is the host list for cfrun
#
# Only these hosts will be contacted by remote connection
#

domain=b.c #设置域
access=root #设置需要访问的用户

192.168.220.130 #维护主机的ip,每个写一行

这样一切准备就绪后,就可以执行/var/cfengine/bin/cfrun -v了,显示结果如下


Domain name = b.c

GNU Cfengine server daemon –

2.2.8

Free Software Foundation 1994-

Donated by Mark Burgess, Oslo University College, Norway

————————————————————————

Host name is: conversion.localhost

Operating System Type is linux

Operating System Release is 2.6.18-8.el5xen

Architecture = i686

Using internal soft-class linux for host linux

The time is now Wed Oct 15 21:53:51 2008

————————————————————————

Additional hard class defined as: 32_bit

Additional hard class defined as: linux_2_6_18_8_el5xen

Additional hard class defined as: linux_i686

Additional hard class defined as: linux_i686_2_6_18_8_el5xen

Additional hard class defined as: linux_i686_2_6_18_8_el5xen__1_SMP_Thu_Mar_15_21_02_53_EDT_2007

GNU autoconf class from compile time: compiled_on_linux_gnu

Address given by nameserver: 127.0.0.1

Checking integrity of the state database

Checking integrity of the module directory

Checking integrity of the input data for RPC

Checking integrity of the output data for RPC

Checking integrity of the PKI directory

Making sure that locks are private…

Loaded /var/cfengine/ppkeys/localhost.priv

Loaded /var/cfengine/ppkeys/localhost.pub

Looking for a source of entropy in /var/cfengine/randseed

cfrun(0): .......... [ Hailing 192.168.220.130 ] ..........
Connecting to server 192.168.220.130 to port 0 with options
Loaded /var/cfengine/ppkeys/root-192.168.220.130.pub
Connect to 192.168.220.130 = 192.168.220.130 on port 5308
Loaded /var/cfengine/ppkeys/root-192.168.220.130.pub

...............................................................
cfrun:conversion.localhost: Strong authentication of server=192.168.220.130connection confirmed
192.168.220.130 replies..

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

cfengine:test:
Executing script /usr/bin/rsync -r no@192.168.220.129::software/upload/ /tmp/test/...(timeout=0,uid=-1,gid=-1)
cfengine:aoyun-web-2: Finished script /usr/bin/rsync -r no@192.168.220.1129::software/upload/ /tmp/test/
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Connection with 192.168.220.130 completed

以上是执行的全过程,我做了一个rsync的操作,这样如果要是需要很多台server同时手动rsync操作或其他操作的话,就可以使用这个了


总之cfengine还是很强大的,cfagent.conf配置文件中有需要参数可以调整,还希望大家在实际使用当中仔细学习了。

cfengine学习笔记02[原创]

书接上回,上次介绍的只是单独使用cfagent程序来完成任务,今天说下cfservd和cfagent配合使用的方法,应用环境和上次的一样,

先在A上的/var/cfengine目录下建立master/inputs文件夹
目录结构如下

/var/cfengine/
|-inputs #用于放置相应的配置文件
|-outputs #程序执行后的输出,通常里面没内容
|-bin #cfengine可执行文件放置的位置

|-master/

|-inputs #用户存放客户机需要的cfagent.conf文件

上面红色的是这次新建立的


在A上放入的master/inputs文件下放入cfagent.conf文件内容如下


##################################################
#
# cfagent.conf
#
# This is a simple file for getting started with
# cfengine. It is harmless. If you get cfengine
# running with this file, you can build on it.
#
##################################################

###
#
# BEGIN cfagent.conf (Only hard classes in this file )
#
###

control:

actionsequence = ( shellcommands ) #定义要执行的动作,此处是执行一个shell命令

domain = ( test.com ) #定义域名

timezone = ( MET ) #定义时区

######################################################################
shellcommands: #需要执行的shell命令

"/bin/touch /tmp/2" #在/tmp目录下建立2这个文件
######################################################################

###
#
# END cfagent.conf
#
###

然后在A的/var/cfengine/inputs文件夹下建立cfservd.conf,内容如下

#########################################################
#
# This is a cfd config file
#
# The access control here follows after any tcpd
# control in /etc/hosts.allow and /etc/hosts.deny
#
#########################################################

#
# Could import cf.groups here and use a structure like
# in cfengine.conf, cf.main, cf.groups
#

control:

domain = ( b.c ) #设置域名
cfrunCommand = ( "/var/cfengine/bin/cfagent" ) #设置cfrun命令执行的命令路径

any::

IfElapsed = ( 1 ) #一个anti-spamming参数,防止client端频繁的请求解析input的文件
ExpireAfeter = ( 15 ) #设置过期时间
MaxConnections = ( 10 ) #设置最大的连接数
MultipleConnections = ( true ) #是否允许多个client端连接
AllowConnectionsFrom = ( 192.168.220 ) #允许从哪里连接,可以是网段,可以是域名
AllMultipleConnectionsFrom = ( 192.168.220 )
TrustKeysFrom = ( 192.168.220 ) #括弧中的主机会自动被信任
LogAllConnections = ( true )

#########################################################

admit: # or grant: #授权哪些机器可以访问什么目录及文件

/var/cfengine/bin/cfagent 192.168.220.*
/var/cfengine/master/inputs 192.168.220.*

现在就可以在A上启动server端了,启动命令

/var/cfengine/bin/cfservd

接下来是B上的工作,cfagent就不需要了,等下会自动从A上把需要的cfagent.conf传过来的

首先在B上建立和A同样的cfservd.conf文件,同时启动服务端,用于两台机器之间的通信用,然后在/var/cfengine/inputs文件夹中建立update.conf文件,内容如下

#######################################################
#
# cf.update - for b.c
#
#######################################################

###
#
# BEGIN cf.update
#
###

#######################################################################
#
# This script distributes the configuration, a simple file so that,
# if there are syntax errors in the main config, we can still
# distribute a correct configuration to the machines afterwards, even
# though the main config won't parse. It is read and run just before the
# main configuration is parsed.
#
#######################################################################

control:

actionsequence = ( copy processes tidy ) # Keep this simple and constant
#设置要执行的动作
domain = ( b.c ) # Needed for remote copy #设置域名

#
# Which host/dir is the master for configuration roll-outs?
#

policyhost = ( 192.168.220.128 ) #主策略服务器,这里可以是A的ip或A的域名
master_cfinput = ( /var/cfengine/master/inputs )
#定义主文件放置位置,也就是cfagent.conf等需要传到client端的配置文件及shell文件放置的位置
AddInstallable = ( new_cfenvd new_cfservd )

#
# Some convenient variables
#

workdir = ( /var/cfengine ) #定义工作目录

cf_install_dir = ( /usr/local/sbin )

###################################################################
#
# Spread the load, make sure the servers get done first though
#
###################################################################

!AllBinaryServers::

SplayTime = ( 1 )

############################################################################

#
# Make sure there is a local copy of the configuration and
# the most important binaries in case we have no connectivity
# e.g. for mobile stations or during DOS attacks
#

copy: #定义copy的动作,从服务端的master_cfinput目录下把文件拷贝到local的inputs文件夹下

$(master_cfinput) dest=$(workdir)/inputs
r=inf
mode=700
type=binary
exclude=*.lst
exclude=*~
exclude=#*
server=$(policyhost)
trustkey=true

!quetzalcoatal::

$(cf_install_dir)/cfagent dest=$(workdir)/bin/cfagent
mode=755
backup=false
type=checksum

$(cf_install_dir)/cfservd dest=$(workdir)/bin/cfservd
mode=755
backup=false
type=checksum
define=new_cfservd

$(cf_install_dir)/cfexecd dest=$(workdir)/bin/cfexecd
mode=755
backup=false
type=checksum

$(cf_install_dir)/cfenvd dest=$(workdir)/bin/cfenvd
mode=755
backup=false
type=checksum
define=new_cfenvd

#####################################################################

tidy:

#
# Cfexecd stores output in this directory.
# Make sure we don't build up files and choke on our own words!
#

$(workdir)/outputs pattern=* age=7

#####################################################################

processes:

new_cfservd::

"cfservd" signal=term restart /var/cfengine/bin/cfservd

new_cfenvd::

"cfenvd" signal=kill restart "/var/cfengine/bin/cfenvd -H"

###
#
# END cf.update
#
##

到这里,update.conf文件也准备完毕了,接下来就是执行了

到现在为止,inputs下还没有cfagetn.conf文件,现在执行

/var/cfengine/bin/cfagent #前提cfagent文件已经copy到/var/cfengine/bin下
或者
/usr/local/sbin/cfagent

不过建议使用cfagent -v执行,这样就能看到执行时的信息了,当一切都完成时,如果正常,可以看到在/var/cfengine/inputs下多了cfagent.conf文件,并且在/tmp下建立了cfagent.conf中定义的2这个文件

排错:
关于排错方面,建议在A上即服务器端使用cfservd -d2来启动,这样执行的时候,服务器端就会把执行的信息显示在屏幕上,从而方便查错。
关于这个的应用,我是这样看的,可以在所有client上定义crontab,每天执行,当shellcommands需要变更时,在服务器端更新master/inputs下的cfagent.conf文件,这样client端再执行就会把新的脚本下载下来了。

cfengine学习笔记01[原创]

cfengine看了有几天了,试验也做了不少了,基本上可以说是入门了,这是一个集中管理的软件,内容分发性质的软件,可以单机使用,也可以多机使用

Cfengine 是一个令人恐怖的系统管理工具。它可自动对联网的计算机进行配置和维护,适用于所有基于UNIX或类UNIX的操作系统,并且它可以通过UNIX兼容的环境/库Cygwin 在较新版本的Windows操作系统中运行。

Cfengine目的是使简单的管理的任务自动化,使困难的任务变得较容易。它的目标是使系统从任何状态收敛到一种理想状态。依照它的作者 Mark Burgess 所说,cfengine 总是使您的系统更接近于您所定义的配置; 它决不会使系统变得更糟。

以上是cfengine网站对此软件的说明,接下来我们就开始吧

环境:vmvare模拟两个linux,hostname分别是linux01(192.168.220.128)和linux02(192.168.220.130)
http://www.cfengine.org下载cfengine的程序,目前稳定版最新的是2.2.8,
安装超级傻瓜,就三步
./configure
make
make install
执行文件被安装到了/usr/local/sbin目录下,都是cf开头的
配置文件模板被放在了/usr/local/share/cfengine目录下
接下来在/var下建立cfening文件夹,及相应的文件夹,目录结构如下

/var/cfengine/
| -inputs #用于放置相应的配置文件
| -outputs #程序执行后的输出,通常里面没内容
| -bin
#cfengine可执行文件放置的位置

文件夹建好后,就把cfengine的应用程序拷贝到bin文件夹下,当然做软连接也是可行的

cp /usr/local /sbin/cf * /var/cfengine/bin/

拷贝三个配置文件到inputs文件夹

cp /usr/local /share/cfengine/cfagent.conf.example /var/cfengine/cfagent.conf
cp /usr/local /share/cfengine/cfservd.conf.example /var/cfengine/cfservd.conf
cp /usr/local /share/cfengine/update.conf.example /var/cfengine/update.conf

先来说下几个应用程序的作用

cfagent 一个独立运行的程序(关键程序)
An autonomous configuration agent (required) .
cfservd cfengine的服务端
A file server and remote activation service (optional) .
cfexecd 计划任务和报告服务(可以替代crontab的东东)
A scheduling and report service (recommended) .
cfenvd
An anomaly detection service (strongly recommended) .
cfrun 远程控制的程序
A way of activating cfagent remotely (use this as you need to) .
cfshow
A way of examining the contents of helper databases (helper) .
cfenvgraph
Ancillary tool for cfenvd (helper) .
cfkey 生成key的程序,只需运行一次就可以了
Key generation tool (run once on every host) .

编辑inputs下的cfagent.conf文件内容如下

##################################################
#
# cfagent.conf
#
# This is a simple file for getting started with
# cfengine. It is harmless. If you get cfengine
# running with this file, you can build on it.
#
##################################################

###
#
# BEGIN cfagent.conf (Only hard classes in this file )
#
###

control:

actionsequence = ( shellcommands ) #定义要执行的动作,此处是执行一个shell命令

domain = ( test.com ) #定义域名

timezone = ( MET ) #定义时区

######################################################################
shellcommands: #需要执行的shell命令

"/bin/touch /tmp/2" #在/tmp目录下建立2这个文件
######################################################################

###
#
# END cfagent.conf
#
###

动作类型包含以下几种,这里举例只使用了shellcommands

groups, control, copy, homeservers, binservers, mailserver, mountables,import, broadcast, resolve, defaultroute, directories, miscmounts,files, ignore, tidy, required, links, disable, shellcommands,strategies,editfiles, processes

保存退出后,执行/var/cfengine/bin/cfagent -v,然后可以看到如下结果

********************************************************************* Main Tree Sched: shellcommands pass 1 @ Mon Sep 22 19:33:57 2008 ********************************************************************* cfengine:linux01: Executing script /bin/touch /tmp/2…(timeout=0,uid=-1,gid=-1) (Setting umask to 77) cfengine:linux01: Finished script /bin/touch /tmp/2 Performance(Exec(/bin/touch /tmp/2)): time=0.0187 secs, av=0.0187 +/- 0.0316 ———————————————————————

你可以在看到/tmp下有刚刚touch好的2文件,如此一个简单的cfengine就做好了,这样如果你需要删除什么目录下的文件,或者拷贝,再或者你自己的脚本,就都可以添加到cfagent.conf文件中,然后通过crontab定义cfagent的定期执行


参考文章: