Ceph是一个比较新的分布式文件系统,由USSC的存储小组完成,是一个基于OSD(对象存储设备)的网络文件系统;相关文章发表在OSDI'06,MSST03,04等上.最近又Ceph文件系统的客户端部分已经进入了Linux Kernel 2.6.34里.
最近花了些时间用VMWare虚拟机搭了一个Ceph.现把搭建的过程,以及其间遇到并解决的问题写在这里.
Ceph主要分为4个部分,客户端/monitor/mds/osd
客户端向外export出一个POSIX文件系统接口,共应用程序调用,并连接monitor/mds/osd,进行元数据及数据交互;最原始的客户端使用Fuse来实现的,现在写到内核里面了,需要编译一个ceph.ko内核模块才能使用.
monitor:管理整个集群,对客户端export出一个网络文件系统,客户端可以通过mount –t ceph monitor_ip:/ mount_point,来挂在ceph文件系统.根据官方的说法,3个monitor可以保证集群的可靠性.对应一个daemon程序,cmon
mds: 元数据服务器,Ceph里可以有多个MDS,组成元数据服务器集群,就会涉及到Ceph中动态目录分割,来进行负载均衡.对应的daemon: cmds
osd: osd模拟器,将本地文件系统封装一层对外提供对象存储的接口.这里本地的文件系统可以是ext2,ext3,但ceph认为这些文件系统并不能适应osd特殊的访问模式;它们之前自己实现了ebofs;而现在ceph转用btrfs(google btrfs吧). osd端对应的daemon: cosd.
ceph支持成百上千甚至更多的节点,那种情况下,4个模块最好分布在不同的机器上;也可以都全部部署在同一台机器上.
在我的测试环境中,使用4台虚拟机来搭建,1个客户端,monitor/mds在一个节点上;另外两个节点各作一个osd.
具体的配置如下:
HOSTNAME | IP_Addr | ROLE |
ceph_client | 192.168.233.180 | Ceph Client |
ceph_mds | 192.168.233.182 | Monitor & MDS |
ceph_osd | 192.168.233.181 | OSD |
ceph_osd1 | 192.168.233.183 | OSD |
Ceph还要求对四个节点做些操作
1.修改各自的hostname,并能够通过hostname来互相访问(见附录1)
2.能够ssh互相访问而不输入密码(具体的方法见附录2);
客户端主要需要ceph.ko这个模块;方式有两种:一种In-tree,一种out-tree;前者在下载最新的linux内核,修改编译选项,编译;后者下载ceph的客户端源码,在内核外编译.
第一种方法:
$git clone git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client.git $cd ceph-client $make menuconfig #搜索ceph,可以发现有两个关于ceph的选项,选上就好.编译内核的方法这里就不在赘述,直接上命令了 $make && make modules && make modules_install && make install && reboot |
第二种方法:
#下载源代码 $ git clone git://ceph.newdream.net/git/ceph-client-standalone.git $ git branch master-backport origin/master-backport $ git checkout master-backport #编译 $ make or make KERNELDIR=/usr/src/… #前者表示用于当前在用内核,后者其它路径 # 编译成功后会产生ceph.ko $ make install $ modprobe ceph or inmod ceph.ko |
其它节点的代码都是用户态的,在ceph官网上下载较新的代码(目前最新的版本是0.20.1).常规的办法编译即可.
除客户端外,其它的节点都需一个配置文件,并需要是完全一样的.
这个文件位于/etc/ceph下面,如果在./configure时没有修改prefix的话,应该是在/usr/local/etc/ceph下.
[root@ceph_mds ceph]# cat ceph.conf ; If a 'host' is defined for a daemon, the start/stop script will ; global ; monitors ; some minimal logging (just message traffic) to aid debugging [mon0] ; mds [mds.alpha] ; osd ; Ideally, make this a separate disk or partition. A few GB [osd0] [osd1] ; access control [mount /] |
该文件同样位于刚才ceph.conf所在目录里面,用来把ceph.conf文件复制到集群里面的各个节点上.
[root@ceph_mds ceph]# cat fetch_config ## fetch ceph.conf from some remote location and save it to $conf. ## ## from a locally accessible file ## from a URL: ## via scp |
在这个文件里面,我们使用scp的方法,除此还可以使用nfs把ceph.conf文件共享,总之目的就是将在整个集群里面使用同一份ceph.conf
该脚本在编译ceph的时候,会在src/里生成一个init-ceph文件,由init-ceph.in模板来生成
如果需要开机自动启动ceph集群的话,将该脚本复制到/etc/init.d/目录下,并使用chkconfig命令来添加该服务.
这个服务应该只需要在monitor端上安装即可.
在monitor端执行
$ mkcephfs -c /etc/ceph/ceph.conf --allhosts --mkbtrfs -k /etc/ceph/keyring.bin |
它会根据ceph.conf里面的配置自动的去各个节点上进行相应的配置.
在monitor端执行
$ /etc/init.d/ceph –a start
首先加载ceph.ko
$ modprobe ceph.ko
$ mount –t ceph ceph_mds:/ /mnt/ceph
这样一个ceph集群就搭建起来了.
当然在这个过程中也遇到了很多问题.如在客户端挂载ceph文件系统时,一直挂载失败,dmesg出以下信息
[root@ceph_client ~]# dmesg -c |
然后我使用netstat命令在monitor端查看6789端口是否已经打开(netstat -anp,可以看到数字形式的端口,还可以看到对应的进程),发现端口已经打开了,如果没有(-n)选项的话,6789端口会以(smc-https)的名称显示.
接着在客户端扫描6789端口是否已经打开,命令为
[root@ceph_client ~]# nmap -p 6789 192.168.233.182 Starting Nmap 5.00 ( http://nmap.org ) at 2010-05-25 16:19 CST Nmap done: 1 IP address (1 host up) scanned in 0.14 seconds |
发现该端口为filtered状态,没有关防火墙...查看iptables服务...禁用iptables服务...然后就ok了.花了好长时间才找出是这个错.不过发现了netstat,nmap这两个非常有用的命令.
再比如,在创建和启动ceph文件系统时,去osd端去创建btrfs文件系统时打出的log信息里面有
/sdb1 /data/osd1" |
这个failed没有关系,里面的一个脚本,要在osd节点上扫描所有的设备,看下哪个磁盘上创建的是btrfs,我的虚拟机里面都是sata硬盘,没有/dev/fd0,至于为什么有这个设备,我就不知道了.
总之不是报错.
6 参考文献
1. http://www.ece.umd.edu/~posulliv/ceph/cluster_build.html
2. http://ceph.newdream.net/wiki/Main_Page
3. http://faketjs.blogspot.com/2010/04/ceph-install-on-fedora.html #这个被GFW给屏了,如何看,大家google吧
google 百度一下吧
这里主要涉及 /etc/sysconfig/network文件, hostname命令, /etc/hosts文件
原理就是公私钥机制,我要向让别人访问我,那么就要把自己的公钥发给别人,这样他就可以凭该公钥来访问我了.
$ ssh-keygen –d #该命令会在~/.ssh下面生成几个文件,这里有用的是id_dsa.pub,为该节点(甲)的公钥,然后把里面的内容添加到对方节点(乙) #~/.ssh/目录下的authorized_keys文件中,如果没有则创建一个,这样就从乙节点不需要密码ssh登陆到甲上了. |