openstack+ceph:使用云主机对外提供nas服务

0 背景介绍

openstack+ceph,openstack中的云主机使用ceph rbd作为云硬盘

1 需求

1)支持对外提供文件存储服务

2)支持内部云主机访问存储服务

3)支持万兆访问,单客户端读速度不小于400MB/s,聚合读写速度不小于800MB/s

2 概要设计

使用openstack中的一台云主机作为NAS-server,挂载云硬盘提供存储空间,使用samba软件对外提供nas服务。

网络拓扑见下图:

 

openstack+ceph:使用云主机对外提供nas服务

【对部署的要求】

① 为了满足性能指标,要求external-net部署在万兆网络上

② 云主机的镜像中有samba和samba-client相关安装包(备注:CentOS-7.4-x86_64-Full中直接安装了所需的所有包,推荐直接使用该镜像安装虚拟机)

 

3 手动搭建服务

首先创建一个云主机作为NAS-Server,安装samba服务,然后挂载云硬盘,创建共享文件夹。

【关于磁盘挂载方式】

目前,关于NAS-server云主机挂载云硬盘的方式有两种

方式一:挂载单块大容量云硬盘

   格式化挂载盘: 

          # mkfs.xfs /dev/vdb

   创建挂载点 

          # mkdir /mnt/nas

   将磁盘挂载到挂载点

         # mount /dev/vdb /mnt/nas

   设置权限

        # chmod +777  /mnt/nas

   /mnt/nas就是nas服务共享的文件夹

方式二:同时挂载多块云硬盘,做成lvm逻辑卷的方式提供存储空间

    (调研中后续补充)

考虑单块大容量盘的克隆、快照操作都比较耗时,建议使用方式二

 

【配置文件】

配置文件路劲在: /etc/samba/smb.conf,配置文件实例如下(仅列出较为重要的几项),配置完之后可以使用 # testparm 检查配置的合法性:

[homes]

         comment = %s                # 描述信息

         path = %s                        # 用来指定共享目录的路径

         public = yes/no               # 用来指定该共享是否允许guest账户访问

         read only = yes/no          # 是否只允许读

         valid users = %s              # 允许访问该共享的用户

         write list = %s                 # 允许写入该共享的用户

samba服务提供了两种文件共享访问方式:① 使用账号密码登陆 ② 匿名登陆。分别的配置方式如下:

需要预先在samba server中创建系统用户以及设置用户密码

# useradd titan                      // 添加系统用户

# smbpasswd -a titan            // 设置samba访问的用户名密码

 

samba还支持用户组的概念

# groupadd group1             // 添加系统用户组group1

# useradd -G group1 alice   // 添加系统用户alice,且alice属于group1

# smbpasswd -a alice           // 设置samba访问的用户名密码

# useradd -G group1 bob    // 添加系统用户bob,且bob属于group1

# smbpasswd -a bob            // 设置samba访问的用户名密码

 

 

# 只有用户user1和组group1中所有的用户(即alice和bob)可以访问该文件夹,但是只有user1可以写该文件夹

[Test-A]

    public = no # 用户访问sambaserver需要提供用户名密码    comment = Test Directory

    path = /mnt/nas-A #共享的文件夹

    read only = No

    valid users = user1,@group1

    write list = user1

【关于匿名(免密)登陆】

 

我们建议使用免密登陆的方式给用户提供服务,因为方式① ,这种方式使用起来不方便。

 

匿名登陆的配置:

   首先,在[global]默认的配置项中加入map to guest = bad user,表示将匿名用户映射成nobody,

 

然后在共享盘的配置中填写

valid users =  nobody, write list = nobody

 

[Test-B]

    public = share # 用户访问sambaserver需要提供用户名密码    comment = Test Directory

    path = /mnt/nas-B #共享的文件夹

    browseable = yes

    read only = No

    valid users = nobody

    write list = nobody

4 需求实现

4.1 对外提供文件存储服务

即用户从外网向一体机中导入导出数据,我们对客户端系统是windows和linux俩种情况进行讨论。

4.1.1 外网系统是linux

在Linux的中, 可以通过Samba客户端直接访问共享文件系统,也可以把server中的共享文件夹挂载在本地机上使用.

(1)Samba客户端访问

使用smbclient,smbclient是samba的客户端,可以通过smbclient的put/get上传下载文件。

# smbclient //10.10.17.8/Test-A -U user1    使用user1账号登陆Test-A

# smbclient //10.10.17.8/Test-B    匿名登陆Test-B,遇到输入密码直接回车

 

常见错误:session setup failed: NT_STATUS_LOGON_FAILURE。登陆错误,建议重新看一下【配置文件】中的两种登陆方式、用户创建等内容。

(2)挂载到本地方式访问

直接将nas-server中的目录挂载到本地,提供服务。具体方法:

① 第一步,在本地创建一个挂载点 mkdir /mnt/local-nas

② 第二步,挂载到本地

# mount -t cifs -o username=user1,password=user1  //10.10.17.8/Test-A /mnt/local-A    使用账号密码登陆

# mount -t cifs -o username=guest,password=  //10.10.17.8/Test-B /mnt/local-B    匿名登陆

 

4.1.2 外网系统是windows

(1)ftp

    直接使用ftp向nas盘传输数据。这种方式依赖于windows中已经装了ftp软件,不推荐使用。

(2)映射网络文件夹方式

    在Windows网络中,可以直接就可以把共享文件夹当做本地硬盘来使用。

具体步骤:

计算机->网络->映射网络驱动器->输入 \\server\share->完成

openstack+ceph:使用云主机对外提供nas服务

 

4.2 内部虚拟机访问存储服务

也分成云主机系统是window和linux两种情况讨论。和3.5中方式完全一样,故不作复述。

总之,只要网络是通的,就可以使用nas服务

4.3 性能测试

测试方法,以单客户端为例:

(1) linuxs:首先在linux客户端端挂载一块云硬盘(记作 volume-client)作为本地存储,使用smbclient 的get/put命令下载/上传文件,smbclient自带测速度的功能。

(2) windows:首先在windows客户端挂载一块云硬盘,使用映射网络文件夹方式把共享文件夹当做本地硬盘来使用。通过拖拽文件查看详细信息中的文件传输速度来统计性能。

以上两种情况,均可以通过更改云硬盘(volume-client 和 nas-server所用的硬盘 volume-server)被分配的存储池的副本数来控制存储性能。

【注意】

为什么要在测试中的客户端也单独创建一块云硬盘?

原因:nas存储性能和 ① 客户端存储性能 ② nas-server端存储性能 ③ 网络性能 3者密不可分。我们在客户端也创建一块云硬盘是为了控制客户端存储性能(通过更改副本数的方式)

测试结果:1副本的情况多客户端可以达到800M以上,但是我忘记记录,之后再补充

nas-server存储方式

单客户端 

上传文件

单客户端 

下载文件

多客户端 上传文件

 

多客户端 下载文件

 

1副本

450M

420M

 

 

2副本

300M左右

300M 左右

3个客户端分别:330 279 296

 

3副本

 

 

 

 

5 存在问题

该方案在高可靠性方面存在风险:由于我们的nas服务是通过云主机+rbd盘方式提供,如果云主机迁移过程中(大概一分钟),服务会中端,如果恰好在文件传输过程中,文件传输会失败,需要用户重新传输文件。

6 其他调研

以下调研,本人均没有进行实验验证,也许后续会补充相关文档

(1) 服务器层 CephFS+nfsd/samba+consul

nfsd(是linux自带的守护进程)使用nfs协议向linux提供服务,samba使用cifs协议向windows提供服务

目前实现的高可用程度:

nfsd 可以支持高可用,切换节点(大概1分钟),服务重新连接上后,文件可以继续传输。注意:仅nfsd的v3版本支持无状态无连接的传输方式,故服务切换后可以继续传输,v4版本是无连接有状态的,不能支持高可用。目前云存储cifs协议不支持高可用。

(2) 在CephFS + Manila 

Manila项目全称是File Share Service,文件共享即服务。是OpenStack大帐篷模式下的子项目之一,用来提供云上的文件共享,支持CIFS协议和NFS协议。

些关于Ceph对接Manila的驱动:

1. Default Driver: 使用 RBD 作为 Manila Service VM 的后端,在 VM 上启动 NFS 实例提供服务

2. Ganesha Driver: 使用 Ganesha 将 CephFS 重新 Reexport 出去

3. Native CephFS Driver: 在 Guest VM 上直接使用原生 CephFS Module 访问

4. VirtFS Driver: 将 CephFS 挂载在 Host 端,VM 通过 VirtFS 访问

目前实现的高可用程度:

    时间原因,没有查到资料。