2006-11-27

集群系统配置之NFS

1. 共享的目录及其目的

Linux 下共享分区是用NFS的方式,主节点将/usr/local 和 /home分区共享给所有的从节点。/usr/local分区共享主要是因为这样可以在自行安装软件的时候只需安装一份拷贝而在所有节点机上均可用。/home分区共享可以使得用户在每一台节点机上都有统一的操作界面及用户主目录。

2. 主节点设置

确保所有节点机上的nfslock portmap netfs服务已经打开,另外主节点机上的nfs服务已经打开。主节点机上的/etc/exports文件内容如下:

/usr/local node*.sim973.gfkd.mtn(rw,sync,no_root_squash)
/home node*.sim973.gfkd.mtn(rw,sync,no_root_squash)

3. 从节点设置
从节点设置成自动mount,在/etc/fstab中加入如下几句:

master:/home /home nfs soft,bg
master:/usr/local /usr/local nfs soft,bg

在应用的过程中发现一点小问题,尽管能保证主节点机比从节点早开机但是从节点好象总不能正常挂载nfs分区。所以开机后要检查一下是否nfs分区已经挂载上了,如果没有的话需要手动mount上(执行cexec mount -a 即可)。

2006-11-21

集群管理工具之C3 的配置与使用

C3 即 Cluster Command Control ,是一组集群用的python脚本程序,其官方网站 http://www.csm.ornl.gov/torc/C3/ 。可以直接下载gz包也可以下载rpm包。这一组脚本程序均是通过ssh访问集群中的节点机,为在集群系统上运行程序及交换文件提供了方便。当然你也可以自行编制这样的脚本,我就编过一个类似cexec的脚本,但是后来发现C3的脚本要比我自己的脚本强大得多,而且有更好的适应性。

1. 安装

C3 rpm方式安装到/opt/c3-4目录下,所以要将 /opt/c3-4加到你的PATH环境变量中,将/opt/c3-4/man加到MANPATH环境变量中。安装并设置完环境变量后进行如下操作:

手动建立这个文件 /etc/c3.conf ,这个文件用于定义集群节点,内容如下:

cluster local {
master.example.com
node02.example.com
}
有几点说明:

(1) 大括号里的第一行是 head 节点,可以在从节点上执行 cexec 等命令,但是 head 节点上必须已经安装了 c3。

(2) 第一行必须写在 head 节点上运行 hostname 输出的主机名,而不能写 IP 或是其它有效主机名。比如我的 hostname 输出的是 master.sim973.gfkd.mtn, 但是c3.conf却是这样写的:

cluster local {
master
node02
}
这样执行就会有问题。读了一下cexec的代码发现,如果 head 节点定义和 hostname 的输出不一致会解释为远程集群,其调用的方式有些区别。如果为本地集群的话则 head 节点上不执行,除非指定了 --head 则只执行 head 节点。如果为远程集群的话,执行的过程是这样的:在 head 节点的 tmp 目录下建了一个新的conf文件,用ssh来调用 head 节点上的 cexec ,conf 文件为刚指定的这个conf文件,执行的时候根据这个文件的内容又把这个集群判断为远程集群,再重复这个调用过程。所以如果 head 节点不指定为hostname的输出,则会陷入死循环调用。

(3) cexec等命令如果不加任何选项不在head节点上执行。

(4) cexec默认是用ssh的方式执行其它节点上的命令,如果想用rsh则自行设定C3_RSH环境变量,不论用哪种方式必须保证在head节点ssh或rsh运行其它节点的命令无须输入密码。ssh需要设定一下authorized_keys2,rsh需要设定一下.rhosts文件,推荐用ssh,详细设置见我的文章。

2. cexec

cexec的作用是在所有集群节点上运行一条命令,缺省情况下cexec在运行命令时并不在 head 节点上运行,除非你在调用cexec时使用了 --head 参数,其它命令同理。

cexec ls
cexec --head ls

cexec -f ./c3.conf ls
C系列的脚本程序均在运行时均可以用-f参数指定单独的c3.conf文件,如:

cexec -f ~/c3.conf ls
3. cget

cget的作用是在运算节点上拷贝文件到本地:
[lxq@lxq temp]$ cget -f ~/c3.conf mbox
[lxq@lxq temp]$ ls
mbox_local_10.129.4.19 mbox_local_10.129.4.23

4. cpush

cpush的作用是将文件推到所有节点上:

[lxq@lxq temp]$ touch aaa.tmp
[lxq@lxq temp]$ ls
aaa.tmp mbox_local_10.129.4.19 mbox_local_10.129.4.23
[lxq@lxq temp]$ cpush -f ~/c3.conf aaa.tmp $HOME
building file list ... done
aaa.tmp wrote 103 bytes read 36 bytes 13.24 bytes/sec
total size is 0 speedup is 0.00
building file list ... done aaa.tmp
wrote 103 bytes read 36 bytes 13.24 bytes/sec total size is 0 speedup is 0.00
[lxq@lxq temp]$ ssh 10.129.4.23 ls
Sent
Trash
aaa.tmp
mbox
这里只是举几个例子,更详细的命令及用法可以参见其manual。

2006-11-19

巧用logrotate实现多份备份

有这样的需求:定期备份CVS仓库中的数据,最好能保留多份备份。开始的时候我是用python编写了一段脚本实现了个功能,将执行备份任务的这个脚本程序用crontab每天调用一次,这个脚本很长但是还不完善。后来看一些关于滚动日志方面的东西,到一个可以利用logrotate机制进行滚动备份的方法。

logrote是用来滚动系统日志的,因为很多软件的日志都是只增不减的,服务器长时间的日志将会浪费大量的磁盘空间(我的apache的日志达到过几G量级),但是系统如果出问题的话还要从日志中分析原因,所以系统还必须存有一段时间的日志。logrote的功能是自动将原有的日志文件 aaa.log命名为aaa.log.n(n=1,2,...),实现了日志的滚动,设置好相应的参数便可以实现只保存一段时间的日志(比如4个月)。

应用logrotate的这种机制也可以用来滚动备份其他的东西,假设想要备份的源为/src/sim,备份到/usr/sim_bak/sim_cvs_reposity.tar,具体如下:

在/etc/logrotate.d目录下加一个这样的文件,文件内容如下:

/usr/sim_bak/sim_cvs_reposity.tar {
   daily
   postrotate
      /bin/tar -cf /usr/sim_bak/sim_cvs_reposity.tar /src/sim
   endscript
   nocompress
}


daily的意思是每天执行一次;postrotate... endscript之间的部分是当滚动完后要执行的操作;nocompress表示无须压缩,如果想要压缩可以写成compress。

系统缺省设置保存4份备份,这样便实现了每天备份cvs reposity,并且一直保有4份备份。

TIPS: UNIX系统管理真是一门艺术

集群管理工具-ssh无须密码登录任意主机

本人用redhat el做过一个16节点的高性能运算集群,有过一些管理及开发经验,准备陆续发一些自己的集群系统管理与开发的经验,有讲得不对的地方还希望有经验的人士能指出。

言规正传,ssh是集群管理的基础,确保每台节点的openssh-server已经安装并自动启动。sshd在一台主机上第一次启动的时候会生成一对密钥,对外界的ssh登录连接此主机须提供公钥给客户端,此后网络上传送的数据全是用这个公钥加密过的密文,而这个公钥加密过的数据也只有这台主机可以解密,别的机子即使能截获到数据包也无法得到数据包的内容,所以ssh、scp要比传统的telnet、rcp、rsh等要安全得多。

1. 设定系统ssh_known_hosts

此文件在/etc/ssh下面,内容可以由ssh-keyscan生成,生成此文件的目的是对任意用户用ssh登录任意节点时不用总询问确认的问题。为了产生此文件必须先用ssh-keyscan去产生一个ssh-hosts文件(文件名任意),ssh-hosts每一行包括一台主机,先写主机的IP地址后写与这个IP地址关联的名字(包括IP地址在内),如下所示:

192.168.0.17 master,192.168.0.17
192.168.0.2 node02,192.168.0.2
192.168.0.3 node03,192.168.0.3
192.168.0.4 node04,192.168.0.4

写完这个文件后运行如下命令:

ssh-keyscan -t rsa,dsa,rsa1 -f ssh-hosts >/etc/ssh/ssh_known_hosts

2. 设定让管理员用户从主节点无须密码登录任意主机

因为管理员用户进行一些日常管理与维护,无须密码登录其余节点机还是有必要的。须要做的操作是生成一个密钥对,将私钥放在主节点机上,将公钥放在其余的节点机上。具体操作如下(以下操作对普通用户也适合):

ssh-keygen -t rsa

运行此命令后会在$HOME/.ssh目录生成两个文件,id_rsa和id_rsa.pub,分别是生成的私钥和公钥。将公钥拷贝到其余节点机的$HOME/.ssh/下并命名为authorized_keys2即可。可能其余节点机上没有.ssh目录,如果没有则先自行建一个.ssh目录。

ssh node02 mkdir .ssh
cat ~/.ssh/id_rsa.pub | ssh node02 "cat >>.ssh/authorized_keys2"
ssh node02 chmod 600 ~/.ssh/authorized_keys2

对所有的从节点(node03 node04...)均运行上述命令,便可以实现从主节点登录任意节点无须输入密码。