让NFS跑在RBD上

由Ceph中国社区-老王翻译,半天河 校稿。

英文出处:Sébastien Han 欢迎加入翻译组

1:架构

我选择在RBD上运行NFS的几个原因:

  1. 古老但是稳定可靠
  2. 容易安装
  3. 现成的Resource Agent:exportfs和对LSB agent(http://linux-ha.org/wiki/LSB_Resource_Agents)有良好的支持,

下图是我的架构。根据我的设置,需要map和export几个存储池。例如你可以有一个存储池存放客户数据,一个存储池存储您的虚拟机(/var/lib/nova/instances)。这取决于你自己。

2:先决条件

在每一个节点都安装Ceph客户端软件包和NFS服务:

$ sudo apt-get install ceph-common nfs-server -y
$ sudo echo "manual" > /etc/init/nfs-kernel-server.override

没有更多需要提前做的了,也不用modprobe RBD,因为Pacemake将替我们来管理这些。

创建RBD卷:
$ rbd create share1 --size 2048
$ rbd create share2 --size 2048

你需要map这些RBD卷以便在其上构建文件系统:

$ sudo modprobe rbd
$ sudo echo "172.17.1.4:6789,172.17.1.5:6789,172.17.1.7:6789 name=admin,secret=AQDVGc5P0LXzJhAA5C019tbdrgypFNXUpG2cqQ== rbd share1" > sudo tee /sys/bus/rbd/add
$ sudo mkfs.xfs /dev/rbd0
$ rbd unmap /dev/rbd0

share2也需要同样的操作

为了管理我们的RBD设备,我们需要用到Florian Haas为Ceph map RBD而写的Resource Agent来结合Pacemaker,你可以在github上看看他的代码
$ sudo mkdir /usr/lib/ocf/resource.d/ceph
$ cd /usr/lib/ocf/resource.d/ceph/
$ wget https://raw.github.com/ceph/ceph/master/src/ocf/rbd.in
$ chmod +x rbd.in

根据官方的OCF技术文档,对resource agent的做最小变更:

@@ -144,7 +144,7 @@ find_rbd_dev() {
rbd_validate_all() {
# Test for configuration errors first
if [ -z "$OCF_RESKEY_name" ]; then
-       ocf_log err 'Required parameter "name" is unset!'
+       ocf_log err "Required parameter "name" is unset!"
exit $OCF_ERR_CONFIGURED

变更的提交请求见这里

3:安装

3.1 公共部分

本文的安装只包括2个节点,因此你需要根据节点数字设置Pacemaker

$ sudo crm configure property stonith-enabled=false
$ sudo crm configure property no-quorum-policy=ignore

当然如果你计划通过第三个节点来扩展你的active/active,就必须取消上面的no-quorum-policy属性设置。

3.2 基础部分

为了条理清晰,我将按照从底层向上层的顺序进行配置,例如:

  1. Map RBD 设备
  2. Mount it!
  3. Export it!
  4. 设置虚拟IP地址
  5. 配置nfs服务

注意:为了更清晰的理解,制定如下命名规则:

  • 基础部分使用 p_ 前缀
  • 组使用 g_ 前缀
  • 位置规则使用 l_ 前缀
  • 其他参数也按照这个规则

所有的操作需要在crmshell中执行,或者简单的在每个命令之前加上sudo crm configure
你也可以执行sudo crm configure edit然后拷贝黏贴

第一步,map RBD:

primitive p_rbd_map_1 ocf:ceph:rbd.in \
params user="admin" pool="rbd" name="share1" cephconf="/etc/ceph/ceph.conf" \
op monitor interval="10s" timeout="20s"

primitive p_rbd_map_2 ocf:ceph:rbd.in \
params user="admin" pool="rbd" name="share2" cephconf="/etc/ceph/ceph.conf" \
op monitor interval="10s" timeout="20s"

第二步:文件系统:

primitive p_fs_rbd_1 ocf:heartbeat:Filesystem \
params directory="/mnt/share1" fstype="xfs" device="/dev/rbd/rbd/share1" fast_stop="no" \
op monitor interval="20s" timeout="40s" \
op start interval="0" timeout="60s" \
op stop interval="0" timeout="60s"

primitive p_fs_rbd_2 ocf:heartbeat:Filesystem \
params directory="/mnt/share2" fstype="xfs" device="/dev/rbd/rbd/share2" fast_stop="no" \
op monitor interval="20s" timeout="40s" \
op start interval="0" timeout="60s" \
op stop interval="0" timeout="60s"

第三步:export 目录:

primitive p_export_rbd_1 ocf:heartbeat:exportfs \
params directory="/mnt/share1" clientspec="192.168.146.0/24" options="rw,async,no_subtree_check,no_root_squash" fsid="1" \
op monitor interval="10s" timeout="20s" \
op start interval="0" timeout="40s"

primitive p_export_rbd_2 ocf:heartbeat:exportfs \
params directory="/mnt/share2" clientspec="192.168.146.0/24" options="rw,async,no_subtree_check,no_root_squash" fsid="2" \
op monitor interval="10s" timeout="20s" \
op start interval="0" timeout="40s"

第四步: VIP(虚拟IP地址):

primitive p_vip_1 ocf:heartbeat:IPaddr \
params ip="192.168.146.245" cidr_netmask="24" \
op monitor interval="5"

primitive p_vip_2 ocf:heartbeat:IPaddr \
params ip="192.168.146.246" cidr_netmask="24" \
op monitor interval="5"

第五步:NFS 服务

primitive p_nfs_server lsb:nfs-kernel-server \
op monitor interval="10s" timeout="30s"

primitive p_rpcbind upstart:rpcbind \
op monitor interval="10s" timeout="30s"

3.3 资源组和克隆

资源组包含一组需要绑定在一起的资源,它们按顺序依次启动并按照相反的顺序停止。首先你需要为每个NFS共享创建一组资源,然后为NFS所依赖的服务也创建一组资源:
group g_rbd_share_1 p_rbd_map_1 p_fs_rbd_1 p_export_rbd_1 p_vip_1
group g_rbd_share_2 p_rbd_map_2 p_fs_rbd_2 p_export_rbd_2 p_vip_2
group g_nfs p_rpcbind p_nfs_server

克隆是可以在多个主机上活动的资源。我们必须克隆NFS服务器,它将工作在active/active模式。这意味着,NFS守护进程将在两个节点上都处于running/active模式。
clone clo_nfs g_nfs \
meta globally-unique="false" target-role="Started"

3.4 位置规则

在这个设置中,每个export(导出)必须并且一直在特定的服务器上运行。资源将始终保持在其当前位置,除非被强制关闭,因为此时节点不再有资格运行资源。这两个约束定义的Score来确定两者之间的资源的位置关系。如果这个值为正数意味着资源应该运行在同一个节点上。而将其设置为INFINITY则可以强制资源在同一个节点上运行。

最后,你应该看到这样的显示结果:

$ sudo crm_mon -1
============
Last updated: Mon Jul  2 07:19:40 2012
Last change: Mon Jul  2 04:07:15 2012 via crm_attribute on nfs1
Stack: openais
Current DC: nfs2 - partition with quorum
Version: 1.1.6-9971ebba4494012a93c03b40a2c58ec0eb60f50c
2 Nodes configured, 2 expected votes
14 Resources configured.
============

Online: [ nfs1 nfs2 ]

Resource Group: g_rbd_share_1
p_rbd_map_1(ocf::heartbeat:rbd.in):Started nfs1
p_fs_rbd_1 (ocf::heartbeat:Filesystem):Started nfs1
p_export_rbd_1 (ocf::heartbeat:exportfs):  Started nfs1
p_vip_1(ocf::heartbeat:IPaddr):Started nfs1
Resource Group: g_rbd_share_2
p_rbd_map_2(ocf::heartbeat:rbd.in):Started nfs2
p_fs_rbd_2 (ocf::heartbeat:Filesystem):Started nfs2
p_export_rbd_2 (ocf::heartbeat:exportfs):  Started nfs2
p_vip_2(ocf::heartbeat:IPaddr):Started nfs2
Clone Set: clo_nfs [g_nfs]
Started: [ nfs1 nfs2 ]

结论:我们这里是一个可扩展的架构,可以根据需求添加许多NFS服务器(克隆)。这将扩展active/active模式。这里仅仅只是一个案例,如果仅仅Map一个RBD,你可能不需要active/active,active/passive模式应该足够了。

Leave a Comment

电子邮件地址不会被公开。