Ceph 筆記(一)

Ceph 是一個符合POSIX、開源的分佈式存儲系統;其具有了極好的可靠性、統一性、魯棒性;通過近幾年的發展,Ceph 開闢了一個全新的數據存儲途徑。Ceph 具有了企業級存儲的分佈式、可大規模擴展、沒有單點故障等特色,愈來愈受到人們青睞;如下記錄了 Ceph 的相關學習筆記。
node

1、 Ceph Quick Start

1.一、安裝前準備

本文以 Centos 7 3.10 內核爲基礎環境,節點爲 4 臺 Vagrant 虛擬機;Ceph 版本爲 Jewel.算法

首先須要一臺部署節點,這裏使用的是宿主機;在部署節點上須要安裝一些部署工具,以下docker

# 安裝 EPEL 源yum install -y epel-release# 添加 ceph 官方源cat << EOF >> /etc/yum.repos.d/ceph.repo
[ceph-noarch]
name=Ceph noarch packages
baseurl=https://download.ceph.com/rpm-jewel/el7/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
EOF# 安裝部署工具yum update -y && yum install ceph-deploy -y

同時,ceph-deploy 工具須要使用 ssh 來自動化部署 Ceph 各個組件,所以須要保證部署節點可以免密碼登陸待部署節點;最後,待部署節點最好加入到部署節點的 hosts 中,方便使用域名(某些地方強制)鏈接管理編程

1.二、校對時鐘

因爲 Ceph 採用 Paxos 算法保證數據一致性,因此安裝前須要先保證各個節點時鐘同步json

# 安裝 ntp 工具yum install ntp ntpdate ntp-doc -y# 校對系統時鐘ntpdate 0.cn.pool.ntp.org

1.三、建立集羣配置

ceph-deploy 工具部署集羣前須要建立一些集羣配置信息,其保存在 ceph.conf 文件中,這個文件將來將會被複制到每一個節點的 /etc/ceph/ceph.confcentos

# 建立集羣配置目錄mkdir ceph-cluster && cd ceph-cluster# 建立 monitor-nodeceph-deploy new docker1# 追加 OSD 副本數量(測試虛擬機總共有3臺)echo "osd pool default size = 3" >> ceph.conf

1.四、建立集羣

建立集羣使用 ceph-deploy 工具便可網絡

# 安裝 ceph
ceph-deploy install docker1 docker2 docker3
# 初始化 monitor node 和 祕鑰文件
ceph-deploy mon create-initial
# 在兩個 osd 節點建立一個目錄做爲 osd 存儲
mkdir /data
chown -R ceph:ceph /data
# 初始化 osd
ceph-deploy osd prepare docker1:/data docker2:/data docker3:/data
# 激活 osd
ceph-deploy osd activate docker1:/data docker2:/data docker3:/data
# 部署 ceph cli 工具和祕鑰文件
ceph-deploy admin docker1 docker2 docker3
# 確保祕鑰有讀取權限
chmod +r /etc/ceph/ceph.client.admin.keyring
# 檢測集羣狀態
ceph health

執行 ceph health 命令後應當返回 HEALTH_OK;如出現 HEALTH_WARN clock skew detected on mon.docker2; Monitor clock skew detected,說明時鐘不一樣步,手動同步時鐘稍等片刻後便可;其餘錯誤能夠經過以下命令重置集羣從新部署session

ceph-deploy purge {ceph-node} [{ceph-node}]ceph-deploy purgedata {ceph-node} [{ceph-node}]ceph-deploy forgetkeys

更多細節,如防火牆、SELinux配置等請參考 官方文檔架構

1.五、其餘組件建立

# 建立 MDSceph-deploy mds create docker1# 建立 RGWceph-deploy rgw create docker1# 增長 monitorecho "public network = 192.168.1.0/24" >> ceph.conf
ceph-deploy --overwrite-conf mon create docker2 docker3# 查看仲裁信息ceph quorum_status --format json-pretty

2、Ceph 組件及測試

2.一、Ceph 架構圖

如下圖片(摘自網絡)展現了基本的 Ceph 架構less

ceph 架構

  • OSD: Ceph 實際存儲數據單元被稱爲 OSD,OSD 可使用某個物理機的目錄、磁盤設備,甚至是 RAID 陣列;

  • MON: 在 OSD 之上則分佈着多個 MON(monitor),Ceph 集羣內組件的狀態信息等被維護成一個個 map,而 MON 則負責維護集羣全部組件 map 信息,各個集羣內組件心跳請求 MON 以確保其 map 保持最新狀態;當集羣發生故障時,Ceph 將採用 Paxos 算法保證數據一致性,這其中仲裁等主要由 MON 完成,因此 MON 節點建議最少爲 3 個,而且爲奇數以防止腦裂狀況的發生;

  • MDS: Ceph 自己使用對象形式存儲數據,而對於外部文件系統訪問支持則提供了上層的 CephFS 接口;CephFS 做爲文件系統接口則須要一些元數據,這些原數據就存放在 MDS 中;目前 Ceph 只支持單個 MDS 工做,可是能夠經過設置 MDS 副本,以保證 MDS 的可靠性

  • RADOS: RADOS 全稱 Reliable Autonomic Distributed Object Store,便可靠分佈式對象存儲;其做爲在整個 Ceph 集羣核心基礎設施,向外部提供基本的數據操做

  • librados: 爲了支持私有云等程序調用,Ceph 提供了 C 實現的 API 庫 librados,librados 能夠支持主流編程語言直接調用,溝通 RADOS 完成數據存取等操做

  • RBD: RDB 我的理解是一個命令行工具,通常位於宿主機上,經過該工具能夠直接跟 librados 交互,實現建立存儲對象,格式化 Ceph 塊設備等操做

  • RADOS GW: 從名字能夠看出來,這個組件是一個代理網關,經過 RADOS GW 能夠將 RADOS 響應轉化爲 HTTP 響應,一樣能夠將外部 HTTP 請求轉化爲 RADOS 調用;RADOS GW 主要提供了三大功能: 兼容 S3 接口、兼容 Swift 接口、提供管理 RestFul API

下圖(摘自網絡)從應用角度描述了 Ceph 架構

APP Ceph 架構

2.二、對象存儲測試

此處直接上代碼

# 建立測試文件dd if=/dev/zero of=test bs=1G count=1# 建立對象存儲池rados mkpool data# 放入對象rados put test-file test --pool=data# 檢查存儲池rados -p data ls# 檢查對象信息ceph osd map data test-file# 刪除對象rados -p data rm test-file# 刪除存儲池(存儲池寫兩遍而且加上確認)rados rmpool data data --yes-i-really-really-mean-it

2.三、塊設備測試

官方文檔中提示,使用 rdb 的客戶端不建議與 OSD 等節點在同一臺機器上

You may use a virtual machine for your ceph-client node, but do not execute the following procedures on the same physical node as your Ceph Storage Cluster nodes (unless you use a VM). See FAQ for details.

這裏從第四臺虛擬機上執行操做,首先安裝所需客戶端工具

# 部署節點上 ceph-cluster 目錄下執行ceph-deploy install docker4
ceph-deploy admin docker4

而後建立塊設備

# 塊設備單位爲 MBrbd create data --size 10240# 映射塊設備map foo --name client.admin

在上面的 map 映射操做時,可能出現以下錯誤

RBD p_w_picpath feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable"

查看系統日誌能夠看到以下輸出

  ~ dmesg | tail[-1127592253.530346] rbd: p_w_picpath data: p_w_picpath uses unsupported features: 0x38[-1127590337.563180] libceph: mon0 192.168.1.11:6789 session established[-1127590337.563741] libceph: client4200 fsid dd9fdfee-438a-47aa-be21-114372bc1f44

問題緣由: 在 Ceph 高版本進行 map p_w_picpath 時,默認 Ceph 在建立 p_w_picpath(上文 data)時會增長許多 features,這些 features 須要內核支持,在 Centos7 的內核上支持有限,因此須要手動關掉一些 features

首先使用 rbd info data 命令列出建立的 p_w_picpath 的 features

rbd p_w_picpath 'data':
        size 10240 MB in 2560 objects
        order 22 (4096 kB objects)
        block_name_prefix: rbd_data.37c6238e1f29
        format: 2
        features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
        flags:

在 features 中咱們能夠看到默認開啓了不少:

  • layering: 支持分層

  • striping: 支持條帶化 v2

  • exclusive-lock: 支持獨佔鎖

  • object-map: 支持對象映射(依賴 exclusive-lock)

  • fast-diff: 快速計算差別(依賴 object-map)

  • deep-flatten: 支持快照扁平化操做

  • journaling: 支持記錄 IO 操做(依賴獨佔鎖)

而實際上 Centos 7 的 3.10 內核只支持 layering… 因此咱們要手動關閉一些 features,而後從新 map;若是想要一勞永逸,能夠在 ceph.conf 中加入 rbd_default_features = 1 來設置默認 features(數值僅是 layering 對應的 bit 碼所對應的整數值)。

# 關閉不支持特性rbd feature disable data exclusive-lock, object-map, fast-diff, deep-flatten# 從新映射rbd map data --name client.admin# 成功後返回設備位置/dev/rbd0

最後咱們即可以格式化正常掛載這個設備了

  ~ mkfs.xfs /dev/rbd0
meta-data=/dev/rbd0              isize=512    agcount=17, agsize=162816 blks         =                       sectsz=512   attr=2, projid32bit=1         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=2621440, imaxpct=25         =                       sunit=1024   swidth=1024 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2         =                       sectsz=512   sunit=8 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
  ~ mkdir test1
  ~ mount /dev/rbd0 test1# 寫入測試  ~ dd if=/dev/zero of=test1/test-file bs=1G count=1
記錄了1+0 的讀入
記錄了1+0 的寫出
1073741824字節(1.1 GB)已複製,16.3689 秒,65.6 MB/秒
  ~ ls test1test-file

2.四、CephFS 測試

在測試 CephFS 以前須要先建立兩個存儲池和一個 fs,建立存儲池要指定 PG 數量

ceph osd pool create cephfs_data 32
ceph osd pool create cephfs_metadata 32
ceph fs new testfs cephfs_metadata cephfs_data

PG 概念:

當 Ceph 集羣接收到存儲請求時,Ceph 會將其分散到各個 PG 中,PG 是一組對象的邏輯集合;根據 Ceph 存儲池的複製級別,每一個 PG的數據會被複制並分發到集羣的多個 OSD 上;通常來講增長 PG 數量能下降 OSD 負載,通常每一個 OSD 大約分配 50 ~ 100 PG,關於 PG 數量通常遵循如下公式

  • 集羣 PG 總數 = (OSD 總數 * 100) / 數據最大副本數

  • 單個存儲池 PG 數 = (OSD 總數 * 100) / 數據最大副本數 /存儲池數

注意,PG 最終結果應當爲最接近以上計算公式的 2 的 N 次冪(向上取值);如個人虛擬機環境每一個存儲池 PG 數 = 3(OSD) * 100 / 3(副本) / 5(大約 5 個存儲池) = 20,向上取 2 的 N 次冪 爲 32

掛載 CephFS 通常有兩種方式,一種是使用內核驅動掛載,一種是使用 ceph-fuse 用戶空間掛載;內核方式掛載須要提取 Ceph 管理 key,以下

# key 在 ceph.conf 中echo "AQB37CZZblBkDRAAUrIrRGsHj/NqdKmVlMQ7ww==" > ceph-key# 建立目錄掛載mkdir test2
mount -t ceph 192.168.1.11:6789:/ /root/test2 -o name=admin,secretfile=ceph-key# 寫入測試  ~ dd if=/dev/zero of=test2/testFs bs=1G count=1
記錄了1+0 的讀入
記錄了1+0 的寫出
1073741824字節(1.1 GB)已複製,6.83251 秒,157 MB/秒

使用 ceph-fuse 用戶空間掛載方式比較簡單,但須要先安裝 ceph-fuse 軟件包

# 安裝 ceph-fuseyum install -y ceph-fuse# 掛載mkdir test3
ceph-fuse -m 192.168.1.11:6789 test3# 寫入測試  ~ dd if=/dev/zero of=test3/testFs bs=1G count=1
記錄了1+0 的讀入
記錄了1+0 的寫出
1073741824字節(1.1 GB)已複製,8.18417 秒,131 MB/秒

2.五、對象網關測試

對象網關在 1.五、其餘組件建立 部分已經作了建立(RGW),此時直接訪問 http://ceph-node-ip:7480返回以下

<ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <Owner>
        <ID>anonymous</ID>
        <DisplayName/>
    </Owner>
    <Buckets/></ListAllMyBucketsResult>

這就說明網關已經 ok,因爲手裏沒有能讀寫測試工具,這裏暫不作過多說明

本文主要參考 Ceph 官方文檔 Quick Start 部分,若有其它未說明到的細節可從官方文檔獲取

轉載請註明出處,本文采用 CC4.0 協議受權


本文轉自: https://mritd.me/2017/05/27/ceph-note-1/

相關文章
相關標籤/搜索