1 问题提出
现在要求把机房的设备存储都利用起来,建立一个存储池,能满足用多少创建多少而且能够跨平台挂载创建的硬盘。目前,验室的机房目前已经建立起来了CEPH的集群,存储池达到了257TB,于是设想创建一个RBD(RADOS block device),然后通过ISCSI-target把创建的RBD导出来用于客户端的挂载。
2 可行性分析
上述的问题的实现主要是两部分,一部分是创建RBD,另一部分是通过安装ISCSI-target把RBD导出,用于Ceph集群外主机挂载。目前的实验环境已经可以成功的创建RBD用于Ceph集群内的装有RBD客户端的主机挂载,剩下的就是第二部分的实现。由于Ceph已经支持通过iscsi协议来使用rbd,所以在理论上是可行的。
3 实现过程
3.1 环境说明
实验平台:ubuntu14.04 server,内核:3.13.0-32-generic
Ceph版本:version 0.94.2
服务端 ISCSI-target采用Linux SCSI target framework (tgt)(http://stgt.sourceforge.net/)
服务端IP:172.25.1.55
3.2 创建RBD
在ceph-admin节点执行下面命令:
rbd create --size {megabytes} {pool-name}/{image-name}
比如创建大小为1GB,名为ceph-rbd1的RBD:
rbd create --size 1024 ceph-rbd1
未指定pool-name则默认创建到rbd池里面
查看RBD:rbd ls {poolname} 不加poolname默认查看rbd池下的RBD
查看RBD详细信息:
rbd info {pool-name}/{image-name}
比如查看ceph-rbd1:rbd info ceph-rbd1 不加pool-name默认rbd池
3.3 映射RBD
创建好的RBD需要映射到客户机才能使用,客户机需要内核支持Ceph块设备和文件系统,推荐内核2.6.34或更高版本。
检查Linux版本和对RBD的支持:
modprobe rbd
Linux哲学,不返回消息就是最好的消息。所以modprobe rbd没有返回消息说明内核对rbd支持。
在ceph-osd节点执行下面命令:
rbd map rbd/ceph-rbd1
格式是rbd map {pool-name}/{image-name} 不加{pool-name}默认rbd
查看映射后的RBD在操作系统中的设备名:
rbd showmapped
可以看到创建的RBD在操作系统的设备名是/dev/rbd1
fdisk –l /dev/rbd1#参看分区情况
如果用于本机挂载执行接下来步骤:
mkfs.xfs /dev/rbd1 #格式化RBD mkdir /mnt/ceph-vol1 #创建挂载点 mount /dev/rbd1 /mnt/ceph-vol1 #挂载RBD,可以写入数据测试一下挂载后的RBD
不过我们的目的是Ceph集群外主机挂载RBD,所以上面的步骤了解一下即可,集群外主机挂载RBD需要用到ISCSI-target。
3.4 配置rbdmap
根据网络文档了解到,创建rbd块设备并rbd map后,如果不及时rbd unmap,关机的时候系统会停留在umount此rbd设备上。所以要配置rbdmap。官方文档无rbdmap的介绍,而且这个脚本也不是官方发布的,为避免遇到这种问题先下载并设置开机启动rbdmap,将来再尝试不加入这个脚本会不会出现问题。
sudo wget https://raw.github.com/ceph/ceph/a4ddf704868832e119d7949e96fe35ab1920f06a/src/init-rbdmap -O /etc/init.d/rbdmap #获得脚本文件 sudo chmod +x /etc/init.d/rbdmap #增加执行权限 sudo update-rc.d rbdmap defaults #添加开机启动
修改rbdmap的配置文件/etc/ceph/rbdmap将映射好的rbd添加进去,注意/etc/ceph/rbdmap路径是wget时的当前路径 ,我wget时是在/etc/ceph路径下的。
vi /etc/ceph/rbdmap # RbdDevice Parameters #poolname/imagename id=client,keyring=/etc/ceph/ceph.client.keyring rbd/ceph-rbd1 id=client,keyring=/etc/ceph/ceph.client.keyring
如果使用了cephx那么,keyring=/etc/ceph/ceph.client.keyring就要加上了
3.5 配置ISCSI-target
Linux SCSI target framework (tgt)用来将 Linux 系统仿真成为 iSCSI target 的功能;安装tgt,并检查是否支持rbd:
apt-get install tgt tgtadm --lld iscsi --op show --mode system | grep rbd
rbd (bsoflags sync:direct)#返回这个信息表明支持rbd
文件的了解:
/etc/tgt/targets.conf:主要配置文件,设定要分享的磁盘格式与哪几颗;
/usr/sbin/tgt-admin:在线查询、删除 target 等功能的设定工具;
/usr/sbin/tgt-setup-lun:建立 target 以及设定分享的磁盘与可使用的客户端等工具软件。
/usr/sbin/tgtadm:手动直接管理的管理员工具 (可使用配置文件取代);
/usr/sbin/tgtd:主要提供 iSCSI target 服务的主程序;
/usr/sbin/tgtimg:建置预计分享的映像文件装置的工具 (以映像文件仿真磁盘);
SCSI 有一套自己分享 target 档名的定义,基本上,藉由 iSCSI 分享出来的 target 檔名都是以 iqn 为开头,意思是:『iSCSI Qualified Name (iSCSI 合格名称)』的意思。那么在 iqn 后面要接啥档名呢?通常是这样的:
iqn.yyyy-mm.<reversed domain name>:identifier
单位网域名的反转写法 :这个分享的target名称
比如:target iqn.2015-9.localhost:iscsi 在接下看的配置中会用到
我们主要是修改 /etc/tgt/targets.conf,把创建好的RBD信息添加进去。
vim /etc/tgt/targets.conf
# 此档案的语法如下:
<target iqn.相关装置的target名称> backing-store 存储设备名 -1 backing-store 存储设备名 -2 </target> <target iqn.2015-9.localhost:iscsi> driver iscsi #驱动 bs-type rbd # 后端存储类型 – 默认 rdwr, 可选 aio, 等...在这里选rbd backing-store rbd/ceph-rbd1 # <==LUN 1 (LUN 的编号通常照顺序)Format is <iscsi-pool>/<iscsi-rbd-image> </target>
backing-store (虚拟的装置), direct-store (实际的装置): 设定装置时,如果你的整个磁盘是全部被拿来当 iSCSI 分享之用,那么才能够使用 direct-store 。不过,根据网络上的其他文件, 似乎说明这个设定值有点危险的样子。所以,基本上还是建议单纯使用模拟的 backing-store 较佳。
当然,配置文件中还有其他的一些参数可以参考:/usr/share/doc/tgt/examples/targets.conf.example里面的内容。
然后重启tgt:/etc/init.d/tgt restart
参看端口是否开启:netstat -tlunp | grep tgt 默认3260端口
观察一下target 相关信息,以及提供的 LUN 数据内容:
tgt-admin –show Target 1: iqn.2015-9.localhost:iscsi <==就是我们的 target System information: Driver: iscsi State: ready I_T nexus information: LUN information: LUN: 0 Type: controller <==这是个控制器,并非可以用的 LUN 喔! ……省略中间…….. LUN: 1 Type: disk <==第一个 LUN (Logical Unit Number) SCSI ID: IET 00010001 SCSI SN: beaf11 Size: 10995116 MB, Block size: 512 <==容量 Online: Yes Removable media: No Prevent removal: No Readonly: No SWP: No Thin-provisioning: No Backing store type: rbd Backing store path: rbd/ceph-rbd1 <==磁盘所在的实际文件名 Backing store flags: Account information: ACL information: ALL
至此ISCSI-target就已经配置好了。
3.6 windows客户端挂载
iSCSI initiator:就是能够使用 target 的客户端,通常是服务器。 也就是说,想要连接到 iSCSI target 的服务器,也必须要安装 iSCSI initiator 的相关功能后才能够使用 iSCSI target 提供的磁盘。
上面配置都成功的话就可以进行正常挂载,我是在windows7上面进行的挂载。windows7自带有iSCSI initiator。
打开控制面板—》系统与安全—》管理工具 iSCSI 发起程序
点发现门户然后填入你的服务端IP或DNS
可以看到当前的状态是不活动的,可以点击连接:
连接成功后相当于挂载了一个硬盘,这时我们可以在磁盘管理中进行分区和格式化等一些操作,格式化成功后可以看到磁盘已经在系统中了。
3.7 linux客户端挂载
本次主要针对的windows客户端挂载,成功的挂载说明服务器端是没有问题的,如果要在linux上进行挂载,只需要安装iSCSI initiator然后进行简单的配置。具体的配置方法下面的参考文献中的鸟哥文章有详细介绍,这里只是说明其是具有可行性的,不进行实例验证了。
注意,linux客户端和windows客户端都是ceph集群外的主机,集群内的不需要用到iscsi就可以进行创建挂载。
参考文档:
1. 《鸟哥的Linux私房菜》服务器篇:第十八章、网络驱动器装置: iSCSI 服务器http://vbird.dic.ksu.edu.tw/linux_server/0460iscsi.php#reference
2.《Learning Ceph》,Sage Weil . Chaper 6:Storage Provisioning with Ceph