https://blog.51cto.com/99cloud/2119884
Ceph bluestore部署
首先為大家分享Ceph bluestore具體該如何部署,使用環境如下
• 單節點
• CentOS 7.4
• 使用 ceph-deploy 進行部署
准備 centos 7.4 系統的機器,並配置好 ssh 的無密碼登錄。
安裝 ceph-deploy
yum install https://download.ceph.com/rpm-luminous/el7/noarch/ceph-deploy-2.0.0-0.noarch.rpm
數據 ceph 安裝包
mkdir ceph-install
cd ceph-install
ceph-deploy new node1
把如下內容加入到 ceph.conf 里面,把默認的副本數據調成1。
[global]
osd pool default size = 1
osd pool default min size = 1
安裝 ceph 包
ceph-deploy install --release luminous node2
初始化 mon
ceph-deploy mon create-initial
ceph-deploy admin node1
這時 ceph 已經可以訪問了
$ ceph -s
cluster:
id: 5b2f0020-fc24-44de-a6c9-a88efdc5074f
health: HEALTH_OK
services:
mon: 1 daemons, quorum node1
mgr: no daemons active
osd: 0 osds: 0 up, 0 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 bytes
usage: 0 kB used, 0 kB / 0 kB avail
pgs:
接下來要部署 ceph mgr, 這個組件在 Luminous 里面是必裝組件
ceph-deploy mgr create node1
接下來部署 ceph osd, 現在推薦使用 ceph-volume lvm 來管理磁盤。所有安裝的時候 ,就需要准備一個 lv 出來。為了測試 bluestore 的 block.db 和 block.wal, 我們來做三個lv 分別用於單 osd 。
$ pv create /dev/sdb
Physical volume "/dev/sdb" successfully created.
$ vgcreate ceph-pool /dev/sdb
Volume group "ceph-pool" successfully created
$ lvcreate -n osd0.wal -L 1G ceph-pool
Logical volume "osd0.wal" created.
$ lvcreate -n osd0.db -L 1G ceph-pool
Logical volume "osd0.db" created.
$ lvcreate -n osd0 -l 100%FREE ceph-pool
Logical volume "osd0" created.
接下來,就可以創建 OSD 了。
ceph-deploy osd create \
--data ceph-pool/osd0 \
--block-db ceph-pool/osd0.db \
--block-wal ceph-pool/osd0.wal \
--bluestore node1
這樣,一個最小的集群就建好了
$ ceph -s
cluster:
id: 5b2f0020-fc24-44de-a6c9-a88efdc5074f
health: HEALTH_OK
services:
mon: 1 daemons, quorum node1
mgr: node2(active)
osd: 1 osds: 1 up, 1 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 bytes
usage: 2048 MB used, 37883 MB / 39931 MB avail
pgs:
$ ls -alh /var/lib/ceph/osd/ceph-0/
total 52K
drwxrwxrwt. 2 ceph ceph 340 Apr 4 16:27 .
drwxr-x---. 3 ceph ceph 20 Apr 4 16:27 ..
-rw-r--r--. 1 ceph ceph 183 Apr 4 16:27 activate.monmap
lrwxrwxrwx. 1 ceph ceph 19 Apr 4 16:27 block -> /dev/ceph-pool/osd0
lrwxrwxrwx. 1 root root 23 Apr 4 16:27 block.db -> /dev/ceph-pool/osd0.wal
lrwxrwxrwx. 1 root root 23 Apr 4 16:27 block.wal -> /dev/ceph-pool/osd0.wa
-rw-r--r--. 1 ceph ceph 2 Apr 4 16:27 bluefs
-rw-r--r--. 1 ceph ceph 37 Apr 4 16:27 ceph_fsid
-rw-r--r--. 1 ceph ceph 37 Apr 4 16:27 fsid
-rw-------. 1 ceph ceph 55 Apr 4 16:27 keyring
-rw-r--r--. 1 ceph ceph 8 Apr 4 16:27 kv_backend
-rw-r--r--. 1 ceph ceph 21 Apr 4 16:27 magic
-rw-r--r--. 1 ceph ceph 4 Apr 4 16:27 mkfs_done
-rw-r--r--. 1 ceph ceph 41 Apr 4 16:27 osd_key
-rw-r--r--. 1 ceph ceph 24 Apr 4 16:27 path_block.db
-rw-r--r--. 1 ceph ceph 6 Apr 4 16:27 ready
-rw-r--r--. 1 ceph ceph 10 Apr 4 16:27 type
-rw-r--r--. 1 ceph ceph 2 Apr 4 16:27 whoami
bluestore & rocksdb & ceph-volume
ceph 的組件多采用插件的機制,包括后端存儲,KV 數據庫,磁盤管理等。各組件之間可以靈活的組合。
基於后端存儲包括 filestore, kvstore,memstore 和新的 bluestore。 Ceph Luminous 引用了 bluestore 的存儲類型,不依賴文件系統,直接管理物理磁盤,相比filestore, 在 io 寫入的時候路徑更短,也避免了二次寫入的問題,性能會更加好。
KV 存儲主要包括 LevelDB, MemDB 和新的 RocksDB。 RocksDB 是 Facebook 基於 LevelDB 開發的 key-value 數據,並對閃存(flash)有更友好的優化。
磁盤管理之前只有個 ceph-disk, 現在新引入了 ceph-volume。基於 lvm 來管理磁盤,並會逐漸廢棄掉 ceph-disk。
其中比較有意思的是 RocksDB 的實現,RocksDB 原本只基於文件系統的。但是得益於它本身的靈活性,bluestore 實現了一套 RocksDB 的 Env 接口,還在 BlueStore 上面實現了一套 BlueFS 的接口與 BluestoreEnv 對接。使得 RocksDB 可以存儲在 BlueStore 上面。
wal & db 的大小問題
在 ceph bluestore 的情況下,wal 是 RocksDB 的 write-ahead log, 相當於之前的 journal 數據,db 是 RocksDB 的 metadata 信息。在磁盤選擇原則是 block.wal > block.db > block。當然所有的數據也可以放到同一塊盤上。
默認情況下, wal 和 db 的大小分別是 512 MB 和 1GB, 包括 Sage Weil 的 PPT 里面也是這樣標明的【注釋1請添加鏈接描述】。現在沒有一個好的理論值,好像和 ceph 本身承載的數據類型有關系。更多討論可以參看【注釋2請添加鏈接描述】。
值得注意的是,如果所有的數據都在單塊盤上,那是沒有必要指定 wal & db 的大小的。如果 wal & db 是在不同的盤上,由於 wal/db 一般都會分的比較小,是有滿的可能性的。如果滿了,這些數據會遷移到下一個快的盤上(wal - db - main)。所以最少不會因為數據滿了,而造成無法寫入【注釋3請添加鏈接描述】。
使用 bluestore 時的 osd 分區
如果是使用的 ceph-disk 管理磁盤,他會建立一個 100MB 的分區,來存放 keyring / whoami 這些信息,這和之前的邏輯是一樣的。
如果使用 ceph-volume 管理磁盤,/var/lib/ceph/osd/ceph-0 分區會從 tmpfs 掛載過來(也就是內存)
$ mount | grep osd
tmpfs on /var/lib/ceph/osd/ceph-0 type tmpfs (rw,relatime,seclabel)
$ ls -Alh /var/lib/ceph/osd/ceph-0
lrwxrwxrwx. 1 ceph ceph 19 Apr 7 21:36 block -> /dev/ceph-pool/osd0
lrwxrwxrwx. 1 root root 22 Apr 7 21:36 block.db -> /dev/ceph-pool/osd0.db
lrwxrwxrwx. 1 root root 23 Apr 7 21:36 block.wal -> /dev/ceph-pool/osd0.wal
-rw-------. 1 ceph ceph 37 Apr 7 21:36 ceph_fsid
-rw-------. 1 ceph ceph 37 Apr 7 21:36 fsid
-rw-------. 1 ceph ceph 55 Apr 7 21:36 keyring
-rw-------. 1 ceph ceph 6 Apr 7 21:36 ready
-rw-------. 1 ceph ceph 10 Apr 7 21:36 type
-rw-------. 1 ceph ceph 2 Apr 7 21:36 whoami
至於目錄中的這些文件則是從 bluestore 盤一開始的BDEV_LABEL_BLOCK_SIZE=4096位置讀取過來的。通過以下命令,可以把所有的 label 打印出來:
$ ceph-bluestore-tool show-label --path /var/lib/ceph/osd/ceph-0
{
"/var/lib/ceph/osd/ceph-0/block": {
"osd_uuid": "c349b2ba-690f-4a36-b6f6-2cc0d0839f29",
"size": 2147483648,
"btime": "2018-04-04 10:22:25.216117",
"description": "main",
"bluefs": "1",
"ceph_fsid": "14941be9-c327-4a17-8b86-be50ee2f962e",
"kv_backend": "rocksdb",
"magic": "ceph osd volume v026",
"mkfs_done": "yes",
"osd_key": "AQDgNsRaVtsRIBAA6pmOf7y2GBufyE83nHwVvg==",
"ready": "ready",
"whoami": "0"
}
}
相關代碼參看
• ceph-volume activate
• ceph-bluestore-tool prime-osd-dir
使用ceph-volume, 不管 store 使用的是 filestore 還是 bluestore, 都會把一些 tag 存在 lvm 上面, 可以使用以下命令查看(做了格式化處理)
$lvs -o lv_tags /dev/mapper/ceph--pool-osd
LV Tags
ceph.block_device=/dev/ceph-pool/osd
ceph.block_uuid=dRW0FO-KiVS-vBjB-PE42-RnSd-mL04-FRQmAz
ceph.cephx_lockbox_secret=
ceph.cluster_fsid=14941be9-c327-4a17-8b86-be50ee2f962e
ceph.cluster_name=ceph
ceph.crush_device_class=None
ceph.encrypted=0
ceph.osd_fsid=c349b2ba-690f-4a36-b6f6-2cc0d0839f29
ceph.osd_id=0
ceph.type=block
osd 的盤是如何掛載的
ceph 依賴 systemd 來管理掛載,不需要配置 /etc/fstab 文件。在初始化 osd 的時候, ceph 會 enable 一個 ceph-volume@x.service 服務,其中 x 的格式如 {lvm|simple}-{osd id}-{osd uuid}, 這個服務會在系統的local-fs.target 組里面,當系統掛載本地盤的時候,會自動掛載上。
這個 ceph-volume@.service 定義如下:
$systemctl cat ceph-volume@lvm-0-b7b4fa98-d36e-430b-9789-a432a078292c
# /usr/lib/systemd/system/ceph-volume@.service
[Unit]
Description=Ceph Volume activation: %i
After=local-fs.target
Wants=local-fs.target
[Service]
Type=oneshot
KillMode=none
Environment=CEPH_VOLUME_TIMEOUT=10000
ExecStart=/bin/sh -c 'timeout $CEPH_VOLUME_TIMEOUT /usr/sbin/ceph-volume-systemd %i'
TimeoutSec=0
[Install]
WantedBy=multi-user.target
可以看到, 他是把參數傳遞給了 ceph-volume-systemd 命令, 而這個命令又把參數解析后,傳給了 ceph-volume 命令,最后執行的命令是:
ceph-volume lvm trigger {osd id} {osd uuid]
需要ceph-volume-systemd 這個命令的原因應該是systemd只能傳一個參數。
這個 trigger 會調用 ceph-volume lvm activate 命令,去准備相對應掛載及里面的數據初始化。
最后, ceph-volume lvm activate 會調用 ceph-bluestore-tool pirme-osd-dir 命令來初始化里面的數據。
其他
ceph osd purge
ceph Limunous 新加了一個 ceph osd purge 命令,很好用,可以一個命令,把某個 osd 相關的信息都清除掉。包括
• osd
• crush rule
• auth key
ceph-disk lvm
ceph-disk 應試不支持 lvm , 參見 :
http://tracker.ceph.com/issues/5461
不過 kolla 是否支持,可以驗證下, 因為 kolla 的腳本里面不依賴 ceph-disk
參考鏈接:
http://www.sysnote.org/2016/08/19/ceph-bluestore/
https://ceph.com/community/new-luminous-bluestore/
http://liyichao.github.io/posts/ceph-bluestore-%E5%9F%BA%E6%9C%AC%E5%8E%9F%E7%90%86.html