0%

使用 Ceph 实现多服务器存储共享

简介

Ceph 是一个分布式文件存储系统,具体工作原理可以参考官方文档。本博客主要介绍如何使用 ceph 实现多服务器之间的存储共享。这样一来,在使用 pycharm 进行 python 开发时,只需要与其中一台服务器进行文件同步。由于服务器之间的存储是共享的,所有需要用来跑代码的服务器都同步更新了所有最新修改,这能极大提高 python 多进程运行的效率。

部署 ceph 集群

为了实现多服务器中间的存储共享,首先需要搭建一个 ceph 集群。本教程主要针对 CentOS 系统,其他系统请自行 google。这部分内容主要参考[2],我进行了实际部署并对其内容进行了整理。

机器准备

本教程介绍的 ceph 集群包含一个管理节点,一个 monitor 节点和三个 osd 节点。其中 monitor 节点和 osd 节点可以放在同一台服务器上,因此我们需要四台服务器,hostname 分别为:

  • 管理节点:admin-node
  • monitor 节点:node1
  • osd 节点:node1, node2, node3
  1. 修改四台机器的 hostname,以管理节点为例:

    1
    2
    cp /etc/hostname /etc/hostname.bak
    vim /etc/hostname

    其中第一条命令的作用是对之前的 hostname 文件进行备份,在操作 linux 系统文件时我们需要养成备份的好习惯。

  2. 修改四台机器的 hosts 文件,以管理节点为例:

    1
    2
    cp /etc/hosts /etc/hosts.bak
    vim /etc/hosts

    修改成以下内容

    1
    2
    3
    4
    192.168.0.100 admin-node
    192.168.0.101 node1
    192.168.0.102 node2
    192.168.0.103 node3

    四台服务器的 IP 地址根据实际情况填写。

在接下来的步骤中,由于不同节点的配置方式不同,因此用括号标注了相应步骤是在哪个节点上操作的。

  • 管理节点:admin-node
  • ceph 节点:node1, node2, node3
  • 所有节点:admin-node, node1, node2, node3

ceph 节点安装

  1. 安装 NTP 服务(所有节点)

    1
    sudo yum install ntp ntpdate ntp-doc

    需要注意的是,当使用 yum 安装软件时,如果 terminal 提示某些源不能用或者安装比较慢时,可以相应的源备份掉并添加新的源,比如

    1
    mv ambarim.repo ambarim.repo.bak
  2. 创建部署 ceph 的新用户(所有节点)

    1
    2
    3
    4
    5
    6
    7
    # 在目录 ceph-user-folder 创建用户 ceph-user-name
    sudo useradd -d /ceph-user-folder -m ceph-user-name
    # 修改 ceph-user-name 用户的密码
    sudo passwd ceph-user-name
    # 为 ceph-user-name 用户添加 sudo 权限
    echo "ceph-user-name ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/ceph-user-name
    sudo chmod 0440 /etc/sudoers.d/cehph-user-name
  3. 配置管理节点免密登录 ceph 节点(管理节点)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 切换用户至刚创建的 ceph-user-name 用户
    su - ceph-user-name
    # 生成密钥对
    ssh-gen
    # 将公钥拷贝到 ceph 节点
    ssh-copy-id ceph-user-name@node1
    ssh-copy-id ceph-user-name@node2
    ssh-copy-id ceph-user-name@node3
    # 修改 ~/.ssh/config 文件
    sudo vim ~/.ssh/config

    加入以下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Host admin-node
    Hostname admin-node
    User ceph-user-name
    Host node1
    Hostname node1
    User ceph-user-name
    Host node2
    Hostname node2
    User ceph-user-name
    Host node3
    Hostname node3
    User ceph-user-name
  4. 关闭防火墙(ceph 节点)

    1
    2
    sudo systemctl stop firewalld
    sudo systemctl disable firewalld
  5. 设置 TTY 终端(ceph 节点)

    1
    2
    3
    # 编辑 /etc/sudoers 文件
    sudo visudo
    # 注释掉 Defaults requiretty 选项
  6. 关闭 selinux(ceph 节点)

    1
    sudo setenforce 0
  7. 配置 epel 源(管理节点)

    1
    sudo yum install -y yum-utils && sudo yum-config-manager --add-repo https://dl.fedoraproject.org/pub/epel/7/x86_64/ && sudo yum install --nogpgcheck -y epel-release && sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 && sudo rm /etc/yum.repos.d/dl.fedoraproject.org*
  8. 把源加入软件库(管理节点)

    1
    sudo vim /etc/yum.repos.d/ceph.repo

    添加以下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    [Ceph]
    name=Ceph packages for $basearch
    baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/
    enabled=1
    gpgcheck=0
    type=rpm-md
    gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
    priority=1

    [Ceph-noarch]
    name=Ceph noarch packages
    baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/noarch/
    enabled=1
    gpgcheck=0
    type=rpm-md
    gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
    priority=1

    [ceph-source]
    name=Ceph source packages
    baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/SRPMS/
    enabled=1
    gpgcheck=0
    type=rpm-md
    gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
    priority=1
  9. 安装 ceph-deploy(管理节点)

    1
    2
    3
    sudo yum update
    sudo yum install ceph-deploy
    sudo yum install yum-plugin-priorities

    yum update 耗时较长,请耐心等待。

搭建集群

集群搭建主要在管理节点上进行,用到上一步安装的 ceph-deploy 命令。

  1. 创建安装文件夹,用于存储安装配置文件

    1
    2
    3
    cd ~
    mkdir my-cluster
    cd my-cluster
  2. 创建集群并初始化 monitor 节点

    1
    2
    # 设置 node1 为 monitor 节点
    ceph-deploy new node1
  3. 修改配置文件

    1
    sed -i '$a\osd pool default size = 2' ceph.conf
  4. 在所有节点上安装 ceph
    教程[2]提供的方法是直接在管理节点上执行以下命令一键在所有节点上安装 ceph。

    1
    ceph-deploy install admin-node node1 node2 node3

然而在我实际的安装过程中,只有管理节点能成功安装,其他节点都失败了。我的解决方案是直接登录其他节点先把 ceph 安装好,然后在管理节点上执行 ceph-deploy install 命令。具体来说,首先在 ceph 节点上添加 epel 源:

1
vim /etc/yum.repo.d/epel.repo

添加以下内容并保存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
baseurl=http://mirrors.aliyun.com/epel/7/$basearch
failovermethod=priority
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7

[epel-debuginfo]
name=Extra Packages for Enterprise Linux 7 - $basearch - Debug
baseurl=http://mirrors.aliyun.com/epel/7/$basearch/debug
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=0

[epel-source]
name=Extra Packages for Enterprise Linux 7 - $basearch - Source
baseurl=http://mirrors.aliyun.com/epel/7/SRPMS
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=0

然后使用 yum 进行安装

1
sudo yum -y install ceph
  1. 初始化 monitor 节点,并收集所有秘钥

    1
    ceph-deploy mon create-initial
  2. 添加三个 OSD
    首先登陆到 ceph 节点,给每个 OSD 守护进程创建一个目录,并添加权限,以 node1 为例

    1
    2
    3
    4
    ssh node1
    sudo mkdir /var/local/osd0
    sudo chmod 777 /var/local/osd0/
    exit

    其中,需要为不同 ceph 节点指定不同的 osd 编号。

然后从管理节点执行 ceph-deploy 来准备 OSD

1
ceph-deploy osd prepare node1:/var/local/osd0 node2:/var/local/osd1 node3:/var/local/osd2

最后激活 OSD

1
ceph-deploy osd activate node1:/var/local/osd0 node2:/var/local/osd1 node3:/var/local/osd2
  1. 把配置文件和 admin 秘钥拷贝到管理节点和 ceph 节点

    1
    ceph-deploy admin admin-node node1 node2 node3
  2. 在所有节点上添加对 ceph.client.admin.keyring 的操作权限

    1
    sudo chmod +r /etc/ceph/ceph.client.admin.keyring
  3. 检查集群健康状况

    1
    ceph -s

如果想要添加新的 OSD 节点,可以在 ceph 安装好后,重复第6-9步。

安装 cephfs 文件系统

服务器之间的存储共享主要通故宫 cephfs 文件系统实现,有了 ceph 集群,安装和配置 cephfs 文件系统相对来说简单一些。本部分主要参考教程[3]。

  1. 创建 MDS 服务器(管理节点)
    如果要运行并挂载 cephfs 文件系统,必须至少创建一个元数据服务器(ceph MDS),可以在管理节点上使用 ceph-deploy 命令将 ceph MDS 安装到 OSD 节点上。

    1
    ceph-deploy mds create node1
  2. 创建 data pool 和 metadata pool(安装了 MDS 的 ceph 节点)

    1
    2
    ceph osd pool create cephfs_data 128
    ceph osd pool create cephfs_metadata 128
  3. 创建 cephfs 文件系统(安装了 MDS 的 ceph 节点)

    1
    ceph fs new cephfs cephfs_metadata cephfs_data

    其中 cephfs 为文件系统名称,可以自己指定。

  4. 检查 MDS 服务器列表和状态(安装了 MDS 的 ceph 节点)

    1
    2
    ceph fs ls
    ceph mds stat

挂载 cephfs 文件系统

安装好 cephfs 文件系统后,便可以在客户机上挂载 cephfs 文件系统了。一个 cephfs 文件系统可以挂载在很多客户机上,因此这些客户机可以共享 cephfs 指定的存储空间。需要注意的是,ceph 集群中的节点本身也可以作为客户机。

创建 cephfs 目录并远程挂载

1
2
sudo mkdir -p /mnt/cephfs
sudo mount -t ceph <monitor-ip>:6789:/ /mnt/cephfs -o name=admin,secret=<admin-key>

其中为 ceph 集群 monitor 节点的 ip 地址,可以在 ceph 集群中任意一个节点中通过以下命令得到

1
ceph auth get client.admin

创建家目录在 cephfs 文件系统上的新用户

为了方便使用,我们可以在每台客户机上创建一个家目录位于 cephfs 文件系统上的新用户。
最简单的方法是在每台客户机上分别创建用户 user-name,方法如下:

1
2
3
4
sudo useradd -d /mnt/cephfs/user-name -m user-name
sudo passwd user-name
echo "user-name ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/user-name
sudo chmod 0440 /etc/sudoers.d/user-name

需要注意的是,不同客户机创建的新用户一般有不同的 id,如果某台客户机创建新用户的 id 与 cephfs 文件的 owner id 不一致时,我们是无法使用该新建用户登录的。此时需要修改新用户 id 与 cephfs owner id 一致。

首先用 root 登录服务器,查看挂载 cephfs 的 owner id

1
2
cd /mnt/cephfs/
ls -l

然后查看新建用户 id

1
id user-name

如果新用户 id 与 cephfs owner id 不一致,修改新用户 id

1
2
usermod -u <cephfs-owner-id> user-name
groupmod -g <cephfs-owner-id> user-name

如果需要管理的用户很多时,可以使用LDAP来集中式管理账户,这样就不需要每次在所有客户机上都创建一个用户了。接下来有时间会部署一个LDAP并出相应的教程,敬请期待。

有用链接

[1] Ceph 官方文档
[2] Ceph/共享存储汇总
[3] 如何在CentOS 7上安装CephFS
[4] CephFS 使用
[5] 搭建一套OpenLDAP系统,实现账号的统一管理

本文标题:使用 Ceph 实现多服务器存储共享

文章作者:Zhikun Zhang

发布时间:2019年07月13日 - 11:00:01

最后更新:2020年05月16日 - 01:47:54

原始链接:http://zhangzhk.com/2019/07/13/deploy-ceph-for-storage-sharing/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。