vlambda博客
学习文章列表

读书笔记《ceph-cookbook-second-edition》使用Cave文件系统

Working with the Ceph Filesystem

在本章中,我们将介绍以下秘籍:

  • Understanding the Ceph Filesystem and MDS
  • Deploying Ceph MDS
  • Accessing Ceph FS through kernel driver
  • Accessing Ceph FS through FUSE client
  • Exporting the Ceph Filesystem as NFS
  • Ceph FS – a drop-in replacement for HDFS

Introduction

Ceph 文件系统,也称为 Ceph FS,是一个符合 POSIX 的文件系统,它使用 Ceph 存储集群来存储用户数据。 Ceph FS 支持本机 Linux 内核驱动程序,这使得 Ceph FS 在任何风格的 Linux 操作系统中都具有高度自适应性。在本章中,我们将详细介绍 Ceph 文件系统,包括它的部署、理解内核驱动程序和 FUSE。

Understanding the Ceph Filesystem and MDS

Ceph 文件系统提供了任何大小的符合 POSIX 标准的分布式文件系统,它使用 Ceph RADOS 来存储其数据。要实现 Ceph 文件系统,您需要一个正在运行的 Ceph 存储集群和至少一个 Ceph 元数据服务器 (MDS ) 管理其元数据并将其与数据分开,这有助于降低复杂性并提高可靠性。下图描述了 Ceph FS 及其接口的架构视图:

> 读书笔记《ceph-cookbook-second-edition》使用Cave文件系统

libcephfs 库在支持其多个客户端实现方面发挥着重要作用。它具有原生 Linux 内核驱动程序支持,因此客户端可以使用原生文件系统挂载,例如,使用 mount 命令。它与 SAMBA 紧密集成,并支持 CIFS 和 SMB。 Ceph FS 使用 cephfuse 模块将其支持扩展到 用户空间中的文件系统 (FUSE)。它还允许使用 libcephfs 库与 RADOS 集群直接应用程序交互。 Ceph FS 作为 Hadoop HDFS 的替代品越来越受欢迎。以前的 HDFS 版本只支持单名称节点,这会影响其可扩展性并造成单点故障;然而,这在当前版本的 HDFS 中已经改变。与 HDFS 不同,Ceph FS 可以在主动-主动状态下的多个 MDS 上实施,从而使其具有高度可扩展性、高性能且无单点故障。

只有 Ceph FS 需要 Ceph MDS;其他存储方式的块存储和基于对象的存储不需要MDS服务。 Ceph MDS 作为一个守护进程运行,它允许客户端挂载任意大小的 POSIX 文件系统。 MDS 不直接向客户端提供任何数据;数据服务仅由 OSD 完成。 MDS 提供了一个具有智能缓存层的共享一致文件系统,因此大大减少了读取和写入。它将其优势扩展到动态子树分区和用于元数据的单个 MDS。它本质上是动态的;守护进程可以加入和离开,接管故障节点很快。

MDS 不存储本地数据,这在某些场景下非常有用。如果一个 MDS 守护进程死掉,我们可以在任何具有集群访问权限的系统上重新启动它。元数据服务器的守护程序配置为主动或被动。主 MDS 节点变为活动状态,其余节点将进入备用。在主 MDS 发生故障的情况下,第二个节点负责并提升为活动节点。为了更快地恢复,您可以指定一个备用节点应该跟随您的一个活动节点,这会将相同的数据保留在内存中以预先填充缓存。

Jewel (v10.2.0) 是第一个包含稳定 Ceph FS 代码和 fsck/修复工具的 Ceph 版本,尽管多个活动 MDS 安全运行,并且快照仍处于试验阶段。 Ceph FS 的开发继续以非常快的速度进行,我们可以期待它在 Luminous 版本中完全投入生产。对于您的非关键工作负载,您可以考虑使用具有单个 MDS 且没有快照的 Ceph FS。

在接下来的部分中,我们将介绍配置内核和 FUSE 客户端的方法。您选择使用哪个客户端取决于您的用例。但是 FUSE 客户端是获取最新代码的最简单方法,而内核客户端通常会提供更好的性能。此外,客户端并不总是提供等效的功能。例如,FUSE 客户端支持客户端强制配额,而内核客户端不支持。

 Deploying Ceph MDS

要为 Ceph 文件系统配置元数据服务器,您应该有一个正在运行的 Ceph 集群。在前面的章节中,我们学习了使用 Ansible 部署 Ceph 存储集群;我们将使用相同的集群和 Ansible 进行 MDS 部署。

How to do it...

通过 ceph-ansible 部署 MDS 服务器非常简单,让我们回顾一下如何完成的步骤:

  1. Using Ansible from ceph-node1, we will deploy and configure MDS on ceph-node2. On our Ansible configuration node ceph-node1, add a new section [mdss] to the /etc/ansible/hosts file:
    读书笔记《ceph-cookbook-second-edition》使用Cave文件系统
  2. Navigate to the Ansible configuration directory on ceph-node1, /usr/share/ceph-ansible:
        root@ceph-node1 # cd /usr/share/ceph-ansible
  1. Run the Ansible playbook to deploy the MDS on ceph-node2:
         # ansible-playbook site.yml
  1. Once the playbook completes successfully, you can validate that the MDS is up and active, that we have created two pools, cephfs_data and cephfs_metadata, and that the Ceph Filesystem was created successfully:
         # ceph mds stat
         # ceph osd pool ls
         # ceph fs ls
读书笔记《ceph-cookbook-second-edition》使用Cave文件系统
  1. It's recommended that you don't share client.admin user keyring with Ceph clients, so we will create a user client.cephfs on the Ceph cluster and will allow this user access to the Ceph FS pools, then we will transfer the keyring we created to client-node1:
        root@ceph-node1 # ceph auth get-or-create client.cephfs 
                          mon 'allow r' 
        mds 'allow r, allow rw path=/' osd 'allow rw pool=cephfs_data' 
        -o ceph.client.cephfs.keyring
读书笔记《ceph-cookbook-second-edition》使用Cave文件系统
        root@client-node1 # scp root@ceph-node1:/etc/ceph/
        ceph.client.cephfs.keyring /etc/ceph/ceph.client.cephfs.keyring
        root@client-node1 cat /etc/ceph/client.cephfs.keyring
读书笔记《ceph-cookbook-second-edition》使用Cave文件系统

Accessing Ceph FS through kernel driver

Linux 内核 2.6.34 及更高版本中添加了对 Ceph 的原生支持。在这个秘籍中,我们将演示如何通过 client-node1 上的 Linux 内核驱动程序访问 Ceph FS。

How to do it...

为了让我们的客户端能够访问 Ceph FS,我们需要配置客户端以访问集群和挂载 Ceph FS。让我们回顾一下这是如何完成的:

  1. Check your client's Linux kernel version:
        root@client-node1 # uname -r
  1. Create a mount point directory in which you want to mount the filesystem:
        # mkdir /mnt/cephfs
  1. Get the keys for the client.cephfs user, which we created in the last section. Execute the following command from the Ceph monitor node to get the user keys:
        # ceph auth get-key client.cephfs
  1. Mount Ceph FS using the native Linux mount call with the following syntax:

语法:# mount -t ceph :/ -o name=admin,secret=<admin_user_key>

         # mount -t ceph ceph-node1:6789:/ /mnt/cephfs 
         -o name=cephfs,secret=AQAimbFZAFAVOBAAsksSA09rtD9+dVWoj0CDDA==
读书笔记《ceph-cookbook-second-edition》使用Cave文件系统
  1. To mount Ceph FS more securely and avoid the admin key being visible in the command history, store the admin keyring as plain text in a separate file and use this file as a mount option for secretkey:
        # echo AQAimbFZAFAVOBAAsksSA09rtD9+dVWoj0CDDA== 
          > /etc/ceph/cephfskey
        # mount -t ceph ceph-node1:6789:/ /mnt/cephfs 
        -o name=cephfs,secretfile=/etc/ceph/cephfskey
  1. To allow the Ceph FS mount during the OS startup, add the following lines in the /etc/fstab file on client-node1:

语法: <Mon_ipaddress>:<Monitor_port>:/ <mount_point> <文件系统名称> [name=username,secret=secretkey|secretfile=/

        # echo "ceph-node1:6789:/ /mnt/cephfs ceph 
          name=cephfs,secretfile=/etc/ceph/
               cephfskey,_netdev,noattime 0 0" >> 
          /etc/fstab
使用 _netdev 选项确保文件系统安装在网络子系统之后以防止网络问题。
  1. umount and mount the Ceph FS again to validate clean mount:
        # umount /mnt/cephfs
        # mount /mnt/cephfs
读书笔记《ceph-cookbook-second-edition》使用Cave文件系统
  1. Perform some I/O on the Ceph Filesystem and then umount it:
        # dd if=/dev/zero of=/mnt/cephfs/file1 bs=1M count=1024
        # umount /mnt/cephfs
读书笔记《ceph-cookbook-second-edition》使用Cave文件系统

Accessing Ceph FS through FUSE client

Linux内核原生支持Ceph文件系统;但是,如果您的主机在较低的内核版本上运行,或者您有任何应用程序依赖项,您始终可以使用 Ceph 的 FUSE 客户端来挂载 Ceph FS。

How to do it...

让我们回顾一下如何配置 FUSE 客户端以访问 Ceph 集群并挂载 Ceph FS:

  1. Validate that the Ceph FUSE package is installed on the machine client-node1 (Ansible installs this as part of the client packages):
        # rpm -qa |grep -i ceph-fuse
  1. Validate that the Ceph FS keyring file is created client-node1 in /etc/ceph/ceph.client.cephfs.keyring, with the following contents (note your key will be different from the example):
读书笔记《ceph-cookbook-second-edition》使用Cave文件系统
  1. Mount Ceph FS using the FUSE client:
        # ceph-fuse --keyring /etc/ceph/ceph.client.cephfs.keyring 
                    --name client.cephfs -m ceph-node1:6789 /mnt/cephfs
读书笔记《ceph-cookbook-second-edition》使用Cave文件系统
  1. To mount Ceph FS at OS boot, add the following lines to the /etc/fstab file on the client-node1:

         # echo "id=cephfs,keyring=ceph.client.cephfs.keyring /mnt/cephfs 
           fuse.ceph defaults 0 0 _netdev" >> /etc/fstab
         # umount /mnt/cephfs
         # mount /mnt/cephfs
读书笔记《ceph-cookbook-second-edition》使用Cave文件系统

Exporting the Ceph Filesystem as NFS

网络文件系统 (NFS) 是最流行的可共享文件系统协议之一,可用于每个基于 Unix 的系统。不了解 Ceph FS 类型的基于 Unix 的客户端仍然可以使用 NFS 访问 Ceph 文件系统。为此,我们需要一个可以将 Ceph FS 重新导出为 NFS 共享的 NFS 服务器。 NFS-Ganesha 是一个 NFS 服务器,在用户空间运行,并使用 libcephfs< 支持 Ceph FS 文件系统抽象层 (FSAL) /span>.

在这个秘籍中,我们将演示创建 ceph-node1 作为 NFS-Ganesha 服务器并导出 Ceph FS 作为 NFS 并将其安装在 client-node1.

How to do it...

让我们演练使用 client-node1 作为 NFS-Ganesha 服务器将 Ceph FS 导出为 NFS 的步骤:

  1. On ceph-node1, install the packages required for nfs-ganesha:
        # sudo yum install -y nfs-utils nfs-ganesha
  1. Since this is a test setup, disable the firewall. For the production setup, you might consider enabling the required ports over a firewall, which is generally 2049:
        # systemctl stop firewalld; systemctl disable firewalld
  1. Enable the rpc services required by NFS:
        # systemctl start rpcbind; systemctl enable rpcbind
        # systemctl start rpc-stat.d.service
  1. Create the NFS-Ganesha configuration file, /etc/ganesha.conf, with the following content:
读书笔记《ceph-cookbook-second-edition》使用Cave文件系统
  1. Finally, start the NFS Ganesha daemon by providing the ganesha.conf file that we created in the last step. You can verify the exported NFS share using the showmount command:
        # ganesha.nfsd -f /etc/ganesha.conf -L /var/log/ganesha.log -N NIV_DEBUG
        # showmount -e
读书笔记《ceph-cookbook-second-edition》使用Cave文件系统

让我们回顾一下我们采取的步骤: ceph-node2 有已配置为 Ceph MDS,并且 ceph-node1 已配置为 NFS-Ganesha 服务器。 span> 接下来,为了在客户端机器上挂载NFS共享,我们只需要安装NFS客户端包并挂载导出的共享 span> ceph-node1如下图:

client-node1上安装NFS客户端包mount

        root@client-node1 # yum install -y nfs-utils
                          # mkdir /mnt/cephfs
                          # mount -o rw,noatime 10.19.1.101:/ /mnt/cephfs
读书笔记《ceph-cookbook-second-edition》使用Cave文件系统

Ceph FS – a drop-in replacement for HDFS

Hadoop 是一个编程框架,支持在分布式计算环境中处理和存储大型数据集。 Hadoop 核心包括分析 MapReduce 引擎和称为 Hadoop 分布式文件系统 (HDFS) 的分布式文件系统,它有以下几个弱点:

  • 在 HDFS 的最新版本之前它一直存在单点故障

  • 它不符合 POSIX 标准

  • 至少存储三份数据

  • 它有一个集中的名称服务器,导致可扩展性挑战

Apache Hadoop 项目和其他软件供应商正在独立工作以弥补 HDFS 中的这些差距。

Ceph 社区在这方面做了一些开发,它有一个用于 Hadoop 的文件系统插件,它可能克服了 HDFS 的限制,可以作为它的替代品。将 Ceph FS 与 HDFS 结合使用有三个要求;它们如下:

  • 运行 Ceph 集群

  • 运行 Hadoop 集群

  • 安装 Ceph FS Hadoop 插件

Hadoop 和 HDFS 的实现超出了本书的范围;但是,在本节中,我们将肤浅地讨论如何将 Ceph FS 与 HDFS 结合使用。 Hadoop 客户端可以通过名为 hadoop-cephfs.jar 的基于Java 的插件访问Ceph FS . 需要以下两个 java 类来支持 Hadoop 与 Ceph FS 的连接。

  • libcephfs.jar这个文件应该放在/usr/share/java/ ,路径要添加到Hadoop_env.sh HADOOP_CLASSPATH span> 文件。

  • libcephfs_jni.so此文件应添加到 LD_LIBRARY_PATH 环境参数并放在 /usr/lib/hadoop/lib 你也应该软链接到 /usr/lib/hadoop/lib/native/Linux -amd64-64/libcephfs_jni.so

除此之外,必须在 Hadoop 集群的每个节点上安装原生 Ceph FS 客户端。有关使用 Ceph FS for Hadoop 的更多最新信息,请访问位于 http://ceph.com/docs/master/cephfs/hadoop,以及位于 https://github.com/ceph/cephfs-hadoop.