一文參透分佈式存儲系統 Ceph 的架構設計、集羣搭建

1. Ceph 概述

1.1 背景

Ceph 是一個去中心化的分佈式存儲系統, 提供較好的性能、可靠性和可擴展性。Ceph 項目最早起源於 Sage 就讀博士期間的工作(最早的成果於 2004 年發表),並隨後貢獻給開源社區, 遵循 LGPL 協議(LESSER GENERAL PUBLIC LICENSE 的簡寫,中文譯爲 “較寬鬆公共許可證”)。在經過了數年的發展之後,目前已得到衆多雲計算廠商(OpenStack、CloudStack、OpenNebula、Hadoop)的支持並被廣泛應用。

1.2 介紹

Ceph 是一個可靠、自動重均衡、自動恢復的分佈式存儲系統,根據場景劃分可以將 Ceph 分爲三大塊,分別是對象存儲、塊設備和文件系統服務。

Ceph 的主要優點是分佈式存儲,在存儲每一個數據時,都會通過計算得出該數據存儲的位置,儘量將數據分佈均衡,不存在傳統的單點故障的問題,可以水平擴展。

Ceph 存儲集羣至少需要一個 Ceph Monitor 和兩個 OSD 守護進程。而運行 Ceph 文件系統客戶端時,則必須要有元數據服務器(Metadata Server)。

1.3 特點

Ceph 適合跨集羣的小文件存儲, 擁有以下特點:

1.4 分佈式存儲系統橫縱對比

lWwyOH

2. Ceph 架構設計

2.1 Ceph 整體設計

2.2 邏輯架構

2.3 Ceph 專業術語

3. Ceph 集羣部署配置

3.1 部署結構

虛擬機創建三臺服務器,CENTOS 版本爲 7.6, IP 網段 192.168.116.0/24。三臺主機名稱爲:

3.2 系統配置

系統配置工作, 三臺節點依次執行:

  1. 修改主機名稱 [root@CENTOS7-1 ~]# vi /etc/hostname

    CENTOS7-1
  2. 編輯 hosts 文件

    192.168.116.141 CENTOS7-1
    192.168.116.142 CENTOS7-2
    192.168.116.143 CENTOS7-3
  3. 注意, 這裏面的主機名稱要和節點名稱保持一致, 否則安裝的時候會出現問題

  1. 修改 yum 源 vi /etc/yum.repos.d/ceph.repo, 爲避免網速過慢問題, 這裏採用的是清華鏡像源:

    [Ceph]
    name=Ceph packages for $basearch
    baseurl=https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-mimic/el7/x86_64/
    enabled=1
    gpgcheck=1
    type=rpm-md
    gpgkey=https://download.ceph.com/keys/release.asc
    [Ceph-noarch]
    name=Ceph noarch packages
    # 官方源
    #baseurl=http://download.ceph.com/rpm-mimic/el7/noarch
    # 清華源
    baseurl=https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-mimic/el7/noarch/
    enabled=1
    gpgcheck=1
    type=rpm-md
    gpgkey=https://download.ceph.com/keys/release.asc
    [ceph-source]
    name=Ceph source packages
    baseurl=https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-mimic/el7/SRPMS/
    enabled=1
    gpgcheck=1
    type=rpm-md
    gpgkey=https://download.ceph.com/keys/release.asc
  2. 安裝 ceph 與 ceph-deploy 組件

    yum update && yum -y install ceph ceph-deploy

    安裝完成, 如果執行 ceph-deploy 出現 ImportError: No module named pkg_resources

    安裝 python2-pip:yum -y install python2-pip

    yum install epel-release -y

  3. 安裝 NTP 時間同步工具

    yum install ntp ntpdate ntp-doc -y

    確保時區是正確, 設置開機啓動:

    systemctl enable ntpd

    並將時間每隔 1 小時自動校準同步。編輯 vi /etc/rc.d/rc.local 追加:

    /usr/sbin/ntpdate ntp1.aliyun.com > /dev/null 2>&1; /sbin/hwclock -w

    配置定時任務,執行 crontab -e 加入:

    0 */1 * * * ntpdate ntp1.aliyun.com > /dev/null 2>&1; /sbin/hwclock -w

3.3 免密碼 SSH 登陸

  1. 官方建議不用系統內置用戶, 創建名爲 ceph_user 用戶, 密碼也設爲 ceph_user:

    useradd -d /home/ceph_user -m ceph_user
    passwd ceph_user
  2. 設置 sudo 權限

    echo "ceph_user ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/ceph_user
    sudo chmod 0440 /etc/sudoers.d/ceph_user

    1、2 兩個步驟依次在三臺機器上執行。

    接下來在主節點, 繼續執行:

  3. 生成密鑰:

    切換用戶:su ceph_user

    執行 ssh-keygen,一直按默認提示點擊生成 RSA 密鑰信息。

  4. 分發密鑰至各機器節點

    ssh-copy-id ceph_user@CENTOS7-1
    ssh-copy-id ceph_user@CENTOS7-2
    ssh-copy-id ceph_user@CENTOS7-3
  5. 修改管理節點上的 ~/.ssh/config 文件, 簡化 SSH 遠程連接時的輸入信息:

    管理節點是會有 root 和 ceph_user 多個用戶, ssh 遠程連接默認會以當前用戶身份進行登陸,

    如果我們是 root 身份進行遠程連接, 還是需要輸入密碼, 我們想簡化, 該怎麼處理?

    切換 root 身份,

    su root

    修改~/.ssh/config 文件

    Host CENTOS7-1
       Hostname CENTOS7-1
       User ceph_user
    Host CENTOS7-2
       Hostname CENTOS7-2
       User ceph_user
    Host CENTOS7-3
       Hostname CENTOS7-3
       User ceph_user

    注意修改文件權限, 不能採用 777 最大權限:

    chmod 600 ~/.ssh/config

    進行 ssh 遠程連接時, Host 的主機名稱是區分大小寫的, 所以要注意配置文件的主機名稱。

  6. 開放端口, 非生產環境, 可以直接禁用防火牆:

    systemctl stop firewalld.service
    systemctl disable firewalld.service
  7. SELINUX 設置

    SELinux 設爲禁用:

    setenforce 0

    永久生效:編輯 vi /etc/selinux/config 修改:

    SELINUX=disabled

3.4 集羣搭建配置

採用 root 身份進行安裝

  1. 在管理節點創建集羣配置目錄,cd /usr/local:

    mkdir ceph-cluster
    cd ceph-cluster

    注意:此目錄作爲 ceph 操作命令的基準目錄, 會存儲處理配置信息。

  2. 創建集羣, 包含三臺機器節點:

    ceph-deploy new CENTOS7-1  CENTOS7-2 CENTOS7-3
  3. 創建成功後, 會生一個配置文件。

    如果接下來集羣的安裝配置出現問題, 可以執行以下命令清除, 再重新安裝:

    ceph-deploy purge CENTOS7-1  CENTOS7-2 CENTOS7-3
    ceph-deploy purgedata CENTOS7-1  CENTOS7-2 CENTOS7-3
    ceph-deploy forgetkeys

    將三臺節點的 mon 信息也刪除

    rm -rf /var/run/ceph/
  4. 修改配置文件, 有些配置後面需用到:

    vi /usr/local/ceph-cluster/ceph.conf

    加入:

    [global]
    # 公網網絡
    public network = 192.168.116.0/24
    # 設置pool池默認分配數量 默認副本數爲3
    osd pool default size = 2
    # 容忍更多的時鐘誤差
    mon clock drift allowed = 2
    mon clock drift warn backoff = 30
    # 允許刪除pool
    mon_allow_pool_delete = true
    [mgr]
    # 開啓WEB儀表盤
    mgr modules = dashboard

    第一項爲副本數, 設爲 2 份。

    第二項爲對外 IP 訪問網段,注意根據實際 IP 修改網段。

    第三、四項爲允許一定時間的漂移誤差。

  5. 執行安裝:

    ceph-deploy install  CENTOS7-1  CENTOS7-2 CENTOS7-3

    如果出現錯誤:

    ceph_deploy][ERROR ] RuntimeError: Failed to execute command: ceph --version

    可以在各節點上單獨進行安裝:

    yum -y install ceph

    如果沒有倉庫文件 ceph.repo, 按上面的步驟手工創建。

  6. 初始 monitor 信息:

    ceph-deploy mon create-initial
    ## ceph-deploy --overwrite-conf mon create-initial

    執行完成後, 會生成以下文件: 

  7. 同步管理信息:

    下發配置文件和管理信息至各節點:

    ceph-deploy admin  CENTOS7-1  CENTOS7-2 CENTOS7-3
  8. 安裝 mgr (管理守護進程), 大於 12.x 版本需安裝, 我們裝的是最新版,需執行:

    ceph-deploy mgr create CENTOS7-1  CENTOS7-2 CENTOS7-3
  9. 安裝 OSD (對象存儲設備)

    注意:新版本的 OSD 沒有 prepare 與 activate 命令。

    這裏需要新的硬盤作爲 OSD 存儲設備, 關閉虛擬機, 增加一塊硬盤, 不用格式化。

重啓, fdisk -l 查看新磁盤名稱: 

執行創建 OSD 命令:

ceph-deploy osd create --data /dev/sdb CENTOS7-2

三臺節點都需分別依次執行。

ceph-deploy gatherkeys CENTOS7-1
  1. 驗證節點:
輸入 ceph health 或 ceph -s 查看, 出現 HEALTH_OK 代表正常。 ![](https://mmbiz.qpic.cn/mmbiz_png/dkwuWwLoRK9bccsRMoAkibfQ9zPJFUq7H66oiaSwo6MtHFic7nFianAricfhjsSAvPiaTCaA5LLIppxNtuT2s2IxDQfg/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1)

通過虛擬機啓動,如果出現錯誤:

[root@CENTOS7-1 ~]# ceph -s
  cluster:
    id:     0ec99aa9-e97e-43d3-b5b9-90eb21c4abff
    health: HEALTH_WARN
            1 filesystem is degraded
            1 osds down
            1 host (1 osds) down
            Reduced data availability: 41 pgs inactive
            Degraded data redundancy: 134/268 objects degraded (50.000%), 22 pgs degraded, 87 pgs undersized
            39 slow ops, oldest one blocked for 2286 sec, daemons [osd.0,mon.CENTOS7-2,mon.CENTOS7-3] have slow ops.
            clock skew detected on mon.CENTOS7-2, mon.CENTOS7-3
  services:
    mon: 3 daemons, quorum CENTOS7-1,CENTOS7-2,CENTOS7-3
    mgr: centos7-1(active), standbys: centos7-3, centos7-2
    mds: fs_test-1/1/1 up  {0=centos7-1=up:replay}
    osd: 3 osds: 1 up, 2 in
  data:
    pools:   9 pools, 128 pgs
    objects: 134  objects, 64 KiB
    usage:   1.0 GiB used, 19 GiB / 20 GiB avail
    pgs:     32.031% pgs unknown
             134/268 objects degraded (50.000%)
             65 active+undersized
             41 unknown
             22 active+undersized+degraded

在各節點執行命令,確保時間同步一致:

ntpdate ntp1.aliyun.com

3.5 安裝管理後臺

  1. 開啓 dashboard 模塊

    ceph mgr module enable dashboard
  2. 生成簽名

    ceph dashboard create-self-signed-cert
  3. 創建目錄

    mkdir mgr-dashboard

    [root@CENTOS7-1 mgr-dashboard]# pwd
    /usr/local/ceph-cluster/mgr-dashboard
  4. 生成密鑰對

    cd  /usr/local/ceph-cluster/mgr-dashboard
    openssl req -new -nodes -x509   -subj "/O=IT/CN=ceph-mgr-dashboard" -days 3650   -keyout dashboard.key -out dashboard.crt -extensions v3_ca
    [root@CENTOS7-1 mgr-dashboard]# ll
    total 8
    -rw-rw-r-- 1 ceph_user ceph_user 1155 Jul 14 02:26 dashboard.crt
    -rw-rw-r-- 1 ceph_user ceph_user 1704 Jul 14 02:26 dashboard.key
  5. 啓動 dashboard

    ceph mgr module disable dashboard
    ceph mgr module enable dashboard
  6. 設置 IP 與 PORT

    ceph config set mgr mgr/dashboard/server_addr 192.168.116.141
    ceph config set mgr mgr/dashboard/server_port 18843
  7. 關閉 HTTPS

    ceph config set mgr mgr/dashboard/ssl false
  8. 查看服務信息

    [root@CENTOS7-1 ceph-cluster]# ceph mgr services
    {
        "dashboard": "http://192.168.116.142:18843/"
    }
  9. 設置管理用戶與密碼

    ceph dashboard set-login-credentials admin admin
  10. 訪問

3.6 創建 Cephfs

集羣創建完後, 默認沒有文件系統, 我們創建一個 Cephfs 可以支持對外訪問的文件系統。

ceph-deploy --overwrite-conf mds create CENTOS7-1 CENTOS7-2 CENTOS7-3
  1. 創建兩個存儲池,執行兩條命令:

    ceph osd pool create cephfs_data 128
    ceph osd pool create cephfs_metadata 64

    少於 5 個 OSD 可把 pg_num 設置爲 128

    OSD 數量在 5 到 10,可以設置 pg_num 爲 512

    OSD 數量在 10 到 50,可以設置 pg_num 爲 4096

    OSD 數量大於 50,需要計算 pg_num 的值

    通過下面命令可以列出當前創建的存儲池:

    ceph osd lspools
  2. 創建 fs, 名稱爲 fs_test:

    ceph fs new fs_test cephfs_metadata cephfs_data
  3. 狀態查看, 以下信息代表正常:

    [root@CENTOS7-1 mgr-dashboard]# ceph fs ls
    name: fs_test, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
    [root@CENTOS7-1 mgr-dashboard]# ceph mds stat
    fs_test-1/1/1 up  {0=centos7-1=up:active}

    附:如果創建錯誤, 需要刪除, 執行:

    ceph fs rm fs_test --yes-i-really-mean-it
    ceph osd pool delete cephfs_data cephfs_data  --yes-i-really-really-mean-it

    確保在 ceph.conf 中開啓以下配置:

    [mon]
    mon allow pool delete = true
  4. 採用 fuse 掛載

    先確定 ceph-fuse 命令能執行, 如果沒有, 則安裝:

         
        
    yum -y install ceph-fuse
  5. 創建掛載目錄

    mkdir -p /usr/local/cephfs_directory
  6. 掛載 cephfs

    [root@node3 ~]# ceph-fuse -k /etc/ceph/ceph.client.admin.keyring -m 192.168.116.141:6789 /usr/local/cephfs_directory
    ceph-fuse[6687]: starting ceph client
    2019-07-14 21:39:09.644181 7fa5be56e040 -1 init, newargv = 0x7fa5c940b500 newargc=9
    ceph-fuse[6687]: starting fuse
  7. 查看磁盤掛載信息

    [root@CENTOS7-1 mgr-dashboard]# df -h
    Filesystem               Size  Used Avail Use% Mounted on
    /dev/mapper/centos-root   38G  3.0G   35G   8% /
    devtmpfs                 1.9G     0  1.9G   0% /dev
    tmpfs                    1.9G     0  1.9G   0% /dev/shm
    tmpfs                    1.9G   20M  1.9G   2% /run
    tmpfs                    1.9G     0  1.9G   0% /sys/fs/cgroup
    /dev/sda1                197M  167M   31M  85% /boot
    tmpfs                    378M     0  378M   0% /run/user/0
    tmpfs                    1.9G   24K  1.9G   1% /var/lib/ceph/osd/ceph-0
    ceph-fuse                 27G     0   27G   0% /usr/local/cephfs_directory
    tmpfs                    378M     0  378M   0% /run/user/1000

    /usr/local/cephfs_directory 目錄已成功掛載。

3.7 客戶端連接驗證 (Rados Java)

  1. 安裝好 JDK、GIT 和 MAVEN。

  2. 下載 rados java 客戶端源碼

    git clone https://github.com/ceph/rados-java.git

    下載目錄位置:

    [root@CENTOS7-1 rados-java]# pwd
    /usr/local/sources/rados-java
  3. 執行 MAVEN 安裝,忽略測試用例:

    [root@CENTOS7-1 rados-java]# mvn install -Dmaven.test.skip=true

    生成 jar 包, rados-0.7.0.jar

    [root@CENTOS7-1 target]# ll
    總用量 104
    drwxr-xr-x 3 root root     17 8月  11 18:32 classes
    drwxr-xr-x 2 root root     27 8月  11 18:32 dependencies
    drwxr-xr-x 3 root root     25 8月  11 18:32 generated-sources
    drwxr-xr-x 2 root root     28 8月  11 18:32 maven-archiver
    drwxr-xr-x 3 root root     35 8月  11 18:32 maven-status
    -rw-r--r-- 1 root root 105701 8月  11 18:32 rados-0.7.0.jar
  4. 創建軟鏈接, 加入 CLASSPATH

    ln -s /usr/local/sources/rados-java/target/rados-0.7.0.jar /opt/jdk1.8.0_301/jre/lib/ext/rados-0.7.0.jar

    安裝 jna

    yum -y install jna

    創建軟鏈接

    ln -s /usr/share/java/jna.jar /opt/jdk1.8.0_301/jre/lib/ext/jna.jar

    查看

    [root@CENTOS7-1 target]# ll /opt/jdk1.8.0_301/jre/lib/ext/jna.jar
    lrwxrwxrwx 1 root root 23 8月  11 19:00 /opt/jdk1.8.0_301/jre/lib/ext/jna.jar -> /usr/share/java/jna.jar
    [root@CENTOS7-1 target]# ll /opt/jdk1.8.0_301/jre/lib/ext/jna.jar
    lrwxrwxrwx 1 root root 23 8月  11 19:00 /opt/jdk1.8.0_301/jre/lib/ext/jna.jar -> /usr/share/java/jna.jar
  5. 創建 JAVA 測試類

    CephClient 類,注意, 最新版 0.6 的異常處理包位置已發生變化。

    import com.ceph.rados.Rados;
    import com.ceph.rados.exceptions.*;
    import java.io.File;
    public class CephClient {
            public static void main (String args[]){
                    try {
                            Rados cluster = new Rados("admin");
                            System.out.println("Created cluster handle.");
                            File f = new File("/etc/ceph/ceph.conf");
                            cluster.confReadFile(f);
                            System.out.println("Read the configuration file.");
                            cluster.connect();
                            System.out.println("Connected to the cluster.");
                    } catch (RadosException e) {
                            System.out.println(e.getMessage() + ": " + e.getReturnValue());
                    }
            }
    }
  6. 運行驗證

    需要在 linux 環境下運行,且要在 client 節點。

    編譯並運行:

    [root@CENTOS7-1 sources]# javac CephClient.java 
    [root@CENTOS7-1 sources]# java CephClient
    Created cluster handle.
    Read the configuration file.
    Connected to the cluster.
  7. 成功與 ceph 建立連接。

    注意:如果 java 和 javac 版本不同,可以使用 rpm -qa |grep java 進行查找, rpm -e --nodeps jdk 進行刪除,source /etc/profile 進行生效

    jdk 的位數爲 64 位

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/bt5Df-sY3QETgvGp3Kp8Yw