一文參透分佈式存儲系統 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 適合跨集羣的小文件存儲, 擁有以下特點:
-
高性能
Client 和 Server 直接通信, 不需要代理和轉發;
Client 不需要負責副本的複製, 有 Primary 主節點負責, 這樣可以有效降低 clien 網絡的消耗;
採用 CRUSH 算法,數據分佈均衡,並行度高,支持上千個存儲節點, 支持 TB 及 PB 級數據。
-
高可用性
數據多副本, 支持故障域分隔,數據強一致性;
沒有單點故障,較好的容錯性, 有效支撐各種故障場景;
支持所有故障的檢測和自動恢復,可以做到自動化管理;
支持並行恢復,能夠極大的降低數據恢復時間, 提高數據的可靠性。
-
高擴展性
高度並行化設計,沒有單箇中心控制組件,所有負載都能動態的劃分到各個服務器上。
去中心化、靈活、隨節點增加線性增長。
-
場景豐富
支持三種存儲接口類型:塊存儲、文件存儲、對象存儲。同時支持自定義接口,C++ 爲底層實現, 兼容多種語言。
-
塊存儲:將磁盤空間映射給主機使用, 適用 docker 容器、虛擬機磁盤存儲分配;日誌存儲, 文件存儲。
-
文件存儲:解決塊存儲無法共享問題, 在服務器架設 FTP 和 NFS 服務器,適用目錄結構的存儲、日誌存儲等。
-
對象存儲:大容量硬盤, 安裝存儲管理軟件, 對外提供讀寫訪問能力, 具備塊存儲的高速讀寫能力, 也具備文件存儲共享的特性;適用圖片存儲或視頻存儲。
1.4 分佈式存儲系統橫縱對比
2. Ceph 架構設計
2.1 Ceph 整體設計
-
基礎存儲系統 RADOS
Reliable, Autonomic,Distributed Object Store,即可靠的、自動化的、分佈式的對象存儲
這就是一個完整的對象存儲系統,所有存儲在 Ceph 系統中的用戶數據事實上最終都是由這一層來存儲的。而 Ceph 的高可靠、高可擴展、高性能、高自動化等等特性本質上也是由這一層所提供的。
-
基礎庫 librados
這層的功能是對 RADOS 進行抽象和封裝,並向上層提供 API,以便直接基於 RADOS(而不是整個 Ceph)進行應用開發。特別要注意的是,RADOS 是一個對象存儲系統,因此,librados 實現的 API 也只是針對對象存儲功能的。RADOS 採用 C++ 開發,所提供的原生 librados API 包括 C 和 C++ 兩種。
-
高層應用接口
這層包括了三個部分:RADOS GW(RADOS Gateway)、 RBD(Reliable Block Device)和 Ceph FS(Ceph File System),其作用是在 librados 庫的基礎上提供抽象層次更高、更便於應用或客戶端使用的上層接口。其中,RADOS GW 是一個提供與 Amazon S3 和 Swift 兼容的 RESTful API 的 gateway,以供相應的對象存儲應用開發使用。RADOS GW 提供的 API 抽象層次更高,但功能則不如 librados 強大。
-
應用層
這層是不同場景下對於 Ceph 各個應用接口的各種應用方式,例如基於 librados 直接開發的對象存儲應用,基於 RADOS GW 開發的對象存儲應用,基於 RBD 實現的雲硬盤等等。librados 和 RADOS GW 的區別在於,librados 提供的是本地 API,而 RADOS GW 提供的則是 RESTfulAPI。
由於 Swift 和 S3 支持的 API 功能近似,這裏以 Swift 舉例說明。Swift 提供的 API 功能主要包括:
-
用戶管理操作:用戶認證、獲取賬戶信息、列出容器列表等;
-
容器管理操作:創建 / 刪除容器、讀取容器信息、列出容器內對象列表等;
-
對象管理操作:對象的寫入、讀取、複製、更新、刪除、訪問許可設置、元數據讀取或更新等。
2.2 邏輯架構
2.3 Ceph 專業術語
-
OSD: Ceph 的對象存儲設備,OSD 守護進程的功能是存儲數據,處理數據的複製、恢復、回填、再均衡,並通過檢查其他 OSD 守護進程的心跳來向 Ceph Monitors 提供一些監控信息。
-
Monitors: Ceph 監視器,Monitor 維護着展示集羣狀態的各種圖表,包括監視器圖、OSD 圖、歸置組(PG)圖、和 CRUSH 圖。
-
PG:Ceph 歸置組,每個 Object 最後都會通過 CRUSH 計算映射到某個 PG 中,一個 PG 可以包含多個 Object。
-
MDS: Ceph 元數據服務器(MDS),爲 Ceph 文件系統存儲元數據。
-
CephFS: Ceph 文件系統,CephFS 提供了一個任意大小且兼容 POSIX 的分佈式文件系統。
-
RADOS: Reliable Autonomic Distributed Object Store,表示可靠、自動、分佈式的對象存儲。Ceph 中的一切都是以對象形式存儲,RADOS 就負責存儲這些對象,RADOS 層確保數據一致性和可靠性。
-
Librados:librados 庫是一種用來簡化訪問 RADOS 的方法,目前支持 PHP、Python、Ruby、Java、C 和 C++ 語言。
-
RBD:Ceph 的塊設備,它對外提供塊存儲,可以被映射、格式化進而像其他磁盤一樣掛載到服務器。
-
RGW/RADOSGW:Ceph 對象網關,它提供了一個兼容 S3 和 Swift 的 restful API 接口。
3. Ceph 集羣部署配置
3.1 部署結構
虛擬機創建三臺服務器,CENTOS 版本爲 7.6, IP 網段 192.168.116.0/24。三臺主機名稱爲:
-
CENTOS7-1: IP 爲 192.168.116.141, 既做管理節點, 又做子節點。
-
CENTOS7-2: IP 爲 192.168.116.142, 子節點。
-
CENTOS7-3: IP 爲 192.168.116.143, 子節點。
3.2 系統配置
系統配置工作, 三臺節點依次執行:
-
修改主機名稱 [root@CENTOS7-1 ~]# vi /etc/hostname
CENTOS7-1
-
編輯 hosts 文件
192.168.116.141 CENTOS7-1 192.168.116.142 CENTOS7-2 192.168.116.143 CENTOS7-3
-
注意, 這裏面的主機名稱要和節點名稱保持一致, 否則安裝的時候會出現問題
-
修改 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
-
安裝 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
-
安裝 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 登陸
-
官方建議不用系統內置用戶, 創建名爲 ceph_user 用戶, 密碼也設爲 ceph_user:
useradd -d /home/ceph_user -m ceph_user passwd ceph_user
-
設置 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 兩個步驟依次在三臺機器上執行。
接下來在主節點, 繼續執行:
-
生成密鑰:
切換用戶:su ceph_user
執行 ssh-keygen,一直按默認提示點擊生成 RSA 密鑰信息。
-
分發密鑰至各機器節點
ssh-copy-id ceph_user@CENTOS7-1 ssh-copy-id ceph_user@CENTOS7-2 ssh-copy-id ceph_user@CENTOS7-3
-
修改管理節點上的
~/.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 的主機名稱是區分大小寫的, 所以要注意配置文件的主機名稱。
-
開放端口, 非生產環境, 可以直接禁用防火牆:
systemctl stop firewalld.service systemctl disable firewalld.service
-
SELINUX 設置
SELinux 設爲禁用:
setenforce 0
永久生效:編輯 vi /etc/selinux/config 修改:
SELINUX=disabled
3.4 集羣搭建配置
採用 root 身份進行安裝
-
在管理節點創建集羣配置目錄,cd /usr/local:
mkdir ceph-cluster cd ceph-cluster
注意:此目錄作爲 ceph 操作命令的基準目錄, 會存儲處理配置信息。
-
創建集羣, 包含三臺機器節點:
ceph-deploy new CENTOS7-1 CENTOS7-2 CENTOS7-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/
-
修改配置文件, 有些配置後面需用到:
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 修改網段。
第三、四項爲允許一定時間的漂移誤差。
-
執行安裝:
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, 按上面的步驟手工創建。
-
初始 monitor 信息:
ceph-deploy mon create-initial ## ceph-deploy --overwrite-conf mon create-initial
執行完成後, 會生成以下文件:
-
同步管理信息:
下發配置文件和管理信息至各節點:
ceph-deploy admin CENTOS7-1 CENTOS7-2 CENTOS7-3
-
安裝 mgr (管理守護進程), 大於 12.x 版本需安裝, 我們裝的是最新版,需執行:
ceph-deploy mgr create CENTOS7-1 CENTOS7-2 CENTOS7-3
-
安裝 OSD (對象存儲設備)
注意:新版本的 OSD 沒有 prepare 與 activate 命令。
這裏需要新的硬盤作爲 OSD 存儲設備, 關閉虛擬機, 增加一塊硬盤, 不用格式化。
重啓, fdisk -l 查看新磁盤名稱:
執行創建 OSD 命令:
ceph-deploy osd create --data /dev/sdb CENTOS7-2
三臺節點都需分別依次執行。
ceph-deploy gatherkeys CENTOS7-1
- 驗證節點:
輸入 ceph health 或 ceph -s 查看, 出現 HEALTH_OK 代表正常。 
通過虛擬機啓動,如果出現錯誤:
[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 安裝管理後臺
-
開啓 dashboard 模塊
ceph mgr module enable dashboard
-
生成簽名
ceph dashboard create-self-signed-cert
-
創建目錄
mkdir mgr-dashboard
[root@CENTOS7-1 mgr-dashboard]# pwd /usr/local/ceph-cluster/mgr-dashboard
-
生成密鑰對
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
-
啓動 dashboard
ceph mgr module disable dashboard ceph mgr module enable dashboard
-
設置 IP 與 PORT
ceph config set mgr mgr/dashboard/server_addr 192.168.116.141 ceph config set mgr mgr/dashboard/server_port 18843
-
關閉 HTTPS
ceph config set mgr mgr/dashboard/ssl false
-
查看服務信息
[root@CENTOS7-1 ceph-cluster]# ceph mgr services { "dashboard": "http://192.168.116.142:18843/" }
-
設置管理用戶與密碼
ceph dashboard set-login-credentials admin admin
-
訪問
3.6 創建 Cephfs
集羣創建完後, 默認沒有文件系統, 我們創建一個 Cephfs 可以支持對外訪問的文件系統。
ceph-deploy --overwrite-conf mds create CENTOS7-1 CENTOS7-2 CENTOS7-3
-
創建兩個存儲池,執行兩條命令:
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
-
創建 fs, 名稱爲 fs_test:
ceph fs new fs_test cephfs_metadata cephfs_data
-
狀態查看, 以下信息代表正常:
[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
-
採用 fuse 掛載
先確定 ceph-fuse 命令能執行, 如果沒有, 則安裝:
yum -y install ceph-fuse
-
創建掛載目錄
mkdir -p /usr/local/cephfs_directory
-
掛載 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
-
查看磁盤掛載信息
[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)
-
安裝好 JDK、GIT 和 MAVEN。
-
下載 rados java 客戶端源碼
git clone https://github.com/ceph/rados-java.git
下載目錄位置:
[root@CENTOS7-1 rados-java]# pwd /usr/local/sources/rados-java
-
執行 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
-
創建軟鏈接, 加入 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
-
創建 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()); } } }
-
運行驗證
需要在 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.
-
成功與 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