搭建 Ceph 分布式集群( nautilus 版本 )
一、服務器環境說明
| 主機名 | 角色 | IP地址 |
|---|---|---|
| ceph-admin | ceph-deploy | 192.168.92.21 |
| ceph-node1 | mon、mgr、osd | 192.168.92.22 |
| ceph-node2 | mon、mgr、osd | 192.168.92.23 |
| ceph-node3 | mon、mgr、osd | 192.168.92.24 |
二、集群架構圖
三、服務器環境準備
1. 配置 yum 倉庫地址
對所有機器配置 epel 倉庫、基礎軟體包倉庫、ceph 軟體包倉庫,所有的鏡像倉庫地址可到阿里云開源鏡像站中查找,地址:https://developer.aliyun.com/mirror/,配置步驟如下:
- 安裝 epel 倉庫:
wget http://mirrors.aliyun.com/repo/epel-7.repo -O /etc/yum.repos.d/epel-7.repo
- 安裝阿里云 yum 源
wget http://mirrors.aliyun.com/repo/Centos-7.repo -O /etc/yum.repos.d/CentOS7-Base-ali.repo
sed -i 's/$releasever/7/g' /etc/yum.repos.d/CentOS7-Base-ali.repo
- 在 /etc/yum.repos.d 目錄下創建 ceph.repo 檔案,作為 ceph 倉庫,內容如下:
cat >> /etc/yum.repos.d/ceph.repo << EOF
[noarch]
name=ceph-noarch
baseurl=https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/noarch/
enable=1
gpgcheck=0
[ceph]
name=ceph
baseurl=https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/x86_64/
enable=1
gpgcheck=0
EOF
2. 同步服務器時間
為了保證 ceph 集群 mon 組件通信正常,需要對每個節點的時間進行同步,這里對管理節點和 osd 節點進行時間同步,首先在所有服務器中安裝 chrony 用于系統時間同步,步驟如下:
安裝 chrony 服務
yum -y install chrony
設定系統時區
timedatectl set-timezone Asia/Shanghai
設定系統時鐘同步,輸出以下內容代表同步正常
[root@ceph-admin ~]# systemctl enable chronyd && systemctl start chronyd
[root@ceph-admin ~]# timedatectl status
Local time: 一 2020-07-27 14:52:14 CST
Universal time: 一 2020-07-27 06:52:14 UTC
RTC time: 一 2020-07-27 06:52:15
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: n/a
將當前的 UTC 時間寫入硬體時鐘,并重啟依賴于系統時間的服務
timedatectl set-local-rtc 0
systemctl restart rsyslog && systemctl restart crond
3. 配置主機名決議
使用 ceph-deploy 部署集群時,需要通過主機名來查找主機 IP 地址,所以要在本地 hosts 檔案中配置地址決議:
cat >> /etc/hosts << EOF
192.168.92.21 ceph-admin
192.168.92.22 ceph-node1
192.168.92.23 ceph-node2
192.168.92.24 ceph-node3
EOF
4. 關閉防火墻和 selinux
閉系統防火墻并禁止開機啟動,清理防火墻規則并設定默認轉發策略
systemctl stop firewalld.service && systemctl disable firewalld.service
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat
iptables -P FORWARD ACCEPT
永久關閉selinux
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
5. 配置免密認證
在 ceph-admin 節點執行 ceph-deploy 命令時,需要通過 ssh 方式連接到各個 osd 節點中運行指令,所以需要配置 ceph-admin 節點到其他 osd 節點的 ssh 免密認證(以下操作只需要在 ceph-admin 節點中進行),需要注意的是,如果需要非 root 用戶部署 ceph 集群,需要針對該用戶配置免密認證:
在各個機器上生成密鑰對
ssh-keygen -t rsa -f ~/.ssh/id_rsa -N ''
將各節點的主機資訊(host key)寫入control_node的~/.ssh/known_hosts檔案
for host in 192.168.92.{21..24} ceph-admin ceph-node{1..3}; do ssh-keyscan $host >>~/.ssh/known_hosts 2>/dev/null; done
將公鑰分發給各個機器(需提前安裝 sshpass)
for host in ceph-admin ceph-node{1..3}; do sshpass -p'123456' ssh-copy-id root@$host &>/dev/null; done
四、搭建 Ceph 集群
1. 安裝 ceph-deploy 工具
ceph-deploy 工具只需要安裝在 ceph-admin 節點中,命令如下:
yum -y install python-setuptools ceph-deploy ceph
安裝 ceph 包的目的是為了以后能在 ceph-admin 節點中查看 ceph 集群的狀態
在 ceph-admin 節點中創建集群的作業目錄,該目錄中會存放 ceph-deploy 執行指令時生成的日志和秘鑰資訊等:
mkdir -p /opt/ops-ceph-cluster
2. 初始化集群
在 ceph-admin 節點上進入 /opt/ops-ceph-cluster 目錄下,執行 ceph-deploy 命令初始化集群設定,初始化要求指定節點作為 mon,命令如下:
ceph-deploy new --public-network 192.168.92.0/24 --cluster-network 192.168.92.0/24 ceph-node1
--public-network 代表 ceph 集群對外提供呼叫的網路,--cluster-network 代表用于集群內部通信的網路,一般情況下 ceph 集群中需要有兩個網路,這樣可以保證 ceph 集群的安全性,由于此次搭建的環境中只有一個網路,所以此處兩個配置項填寫同一個網段的地址,
上面的命令執行完成后會將 ceph-node1 節點配置為 mon,并且會在 /opt/ops-ceph-cluster 目錄下生成集群的組態檔、key 檔案(用于身份驗證)、日志檔案等:
[root@ceph-admin ops-ceph-cluster]# ll
總用量 12
-rw-r--r--. 1 root root 268 7月 27 14:58 ceph.conf
-rw-r--r--. 1 root root 3248 7月 27 14:58 ceph-deploy-ceph.log
-rw-------. 1 root root 73 7月 27 14:58 ceph.mon.keyring
組態檔 ceph.conf 內容如下:
[root@ceph-admin ops-ceph-cluster]# cat ceph.conf
[global]
fsid = f52099ba-cec0-4c77-bd92-3a21ad224be3
public_network = 192.168.92.0/24
cluster_network = 192.168.92.0/24
mon_initial_members = ceph-node1
mon_host = 192.168.92.22
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
3. 安裝 ceph 組件
接下來需要在各個 osd 節點安裝 ceph 組件包:
yum -y install ceph ceph-mon ceph-mgr ceph-mds ceph-radosgw
4. 初始化 mon
在初始化集群的程序中已經指定了 mon 的節點,現在需要對 mon 進行初始化,在 ceph-admin 節點的 /opt/ops-ceph-cluster 目錄下執行如下命令進行初始化:
ceph-deploy mon create-initial
初始化完成后,會在當前目錄下生成各個組件需要的 key 檔案:
[root@ceph-admin ops-ceph-cluster]# ll
總用量 44
-rw-------. 1 root root 113 7月 27 15:16 ceph.bootstrap-mds.keyring
-rw-------. 1 root root 113 7月 27 15:16 ceph.bootstrap-mgr.keyring
-rw-------. 1 root root 113 7月 27 15:16 ceph.bootstrap-osd.keyring
-rw-------. 1 root root 113 7月 27 15:16 ceph.bootstrap-rgw.keyring
-rw-------. 1 root root 151 7月 27 15:16 ceph.client.admin.keyring
-rw-r--r--. 1 root root 268 7月 27 14:58 ceph.conf
-rw-r--r--. 1 root root 16375 7月 27 15:16 ceph-deploy-ceph.log
-rw-------. 1 root root 73 7月 27 14:58 ceph.mon.keyring
接下來將 admin用戶的 key 檔案拷貝給各個 osd 節點,如果為了在 ceph-admin 節點中使用 ceph 命令查看集群狀態,那么也需要將 key 檔案拷貝給 ceph-admin 節點(ceph-admin節點需要安裝 ceph 包)
ceph-deploy admin ceph-admin ceph-node1 ceph-node2 ceph-node3
拷貝完成后執行 ceph -s 命令可以查看到當前集群的狀態:
[root@ceph-admin ops-ceph-cluster]# ceph -s
cluster:
id: f52099ba-cec0-4c77-bd92-3a21ad224be3
health: HEALTH_OK
services:
mon: 1 daemons, quorum ceph-node1 (age 7m)
mgr: no daemons active
osd: 0 osds: 0 up, 0 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 0 B used, 0 B / 0 B avail
pgs:
可以看到當前集群中已經有一個 mon 節點,
5. 安裝 mgr 行程
配置 ceph-node1 節點作為 mgr,在 ceph-admin 節點的 /opt/ops-ceph-cluster 目錄下執行如下命令:
ceph-deploy mgr create ceph-node1
查看集群狀態,可以看到啟動了一個 mgr daemon:
[root@ceph-admin ops-ceph-cluster]# ceph -s
cluster:
id: f52099ba-cec0-4c77-bd92-3a21ad224be3
health: HEALTH_WARN
OSD count 0 < osd_pool_default_size 3
services:
mon: 1 daemons, quorum ceph-node1 (age 11m)
mgr: ceph-node1(active, since 33s)
osd: 0 osds: 0 up, 0 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 0 B used, 0 B / 0 B avail
pgs:
6. 部署 OSD 節點
當前環境中,每個 OSD 節點都有兩塊磁盤 sdb 和 sdc,資訊如下:
[root@ceph-node1 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 100G 0 disk
├─sda1 8:1 0 200M 0 part /boot
└─sda2 8:2 0 99.8G 0 part
├─centos-root 253:0 0 95.8G 0 lvm /
└─centos-swap 253:1 0 4G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
sdc 8:32 0 20G 0 disk
sr0 11:0 1 4.4G 0 rom
接下來將每個 OSD 節點中的 sdb 磁盤加入到 ceph 集群中,命令如下:
for host in 1 2 3
do
ceph-deploy disk zap ceph-node${host} /dev/sdb
ceph-deploy osd create ceph-node${host} --data /dev/sdb
done
ceph-deploy disk zap 命令用于將目標磁盤的磁區表和內容擦除,實際上它是呼叫 /bin/dd if=/dev/zero of=/dev/sdb bs=1M count=10 conv=fsync 命令來銷毀 GPT 和 MBR ,如果目標磁盤是未被磁區的,可以不使用該命令
此時查看 ceph 集群的狀態,可以看到有三個 OSD 已經被加入到集群中:
[root@ceph-admin ops-ceph-cluster]# ceph -s
cluster:
id: f52099ba-cec0-4c77-bd92-3a21ad224be3
health: HEALTH_OK
services:
mon: 1 daemons, quorum ceph-node1 (age 21m)
mgr: ceph-node1(active, since 10m)
osd: 3 osds: 3 up (since 2m), 3 in (since 2m)
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 3.0 GiB used, 57 GiB / 60 GiB avail
pgs:
7. 擴展 mon 和 mgr 節點
mon 和 mgr 是 ceph 集群中非常重要的組件,其中 mon 作為整個集群的控制中心,里面存放著集群的資訊,所以需要確保 mon 和 mgr 處于高可用的狀態,為了保證選舉正常,節點數要為奇數,
7.1 擴容 mon 節點
首先將 ceph-node2 和 ceph-node3 擴容為 mon 節點:
ceph-deploy mon add ceph-node2
ceph-deploy mon add ceph-node3
擴容完成后查看集群狀態:
[root@ceph-admin ops-ceph-cluster]# ceph -s
cluster:
id: f52099ba-cec0-4c77-bd92-3a21ad224be3
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph-node1,ceph-node2,ceph-node3 (age 27s)
mgr: ceph-node1(active, since 15m)
osd: 3 osds: 3 up (since 7m), 3 in (since 7m)
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 3.0 GiB used, 57 GiB / 60 GiB avail
pgs:
集群資訊中顯示當前的 mon 節點已經為 3 個,使用如下命令查看 mon 節點的選舉狀態:
[root@ceph-admin ops-ceph-cluster]# ceph quorum_status --format json-pretty
{
"election_epoch": 12,
"quorum": [
0,
1,
2
],
"quorum_names": [
"ceph-node1",
"ceph-node2",
"ceph-node3"
],
"quorum_leader_name": "ceph-node1",
"quorum_age": 88,
可以看到當前已經可以正常選舉,leader 為 ceph-node1 節點上的 mon,也可以使用 ceph mon stat 命令查看 mon 的資訊:
[root@ceph-admin ops-ceph-cluster]# ceph mon stat
e3: 3 mons at {ceph-node1=[v2:192.168.92.22:3300/0,v1:192.168.92.22:6789/0],ceph-node2=[v2:192.168.92.23:3300/0,v1:192.168.92.23:6789/0],ceph-node3=[v2:192.168.92.24:3300/0,v1:192.168.92.24:6789/0]}, election epoch 12, leader 0 ceph-node1, quorum 0,1,2 ceph-node1,ceph-node2,ceph-node3
或者使用 ceph mon dump 命令查看詳細的資訊:
[root@ceph-admin ops-ceph-cluster]# ceph mon dump
dumped monmap epoch 3
epoch 3
fsid f52099ba-cec0-4c77-bd92-3a21ad224be3
last_changed 2020-07-27 15:42:02.273752
created 2020-07-27 15:16:09.870184
min_mon_release 14 (nautilus)
0: [v2:192.168.92.22:3300/0,v1:192.168.92.22:6789/0] mon.ceph-node1
1: [v2:192.168.92.23:3300/0,v1:192.168.92.23:6789/0] mon.ceph-node2
2: [v2:192.168.92.24:3300/0,v1:192.168.92.24:6789/0] mon.ceph-node3
7.2 擴容 mgr 節點
接下來擴容 mgr 節點,命令如下:
ceph-deploy mgr create ceph-node2 ceph-node3
查看集群資訊:
[root@ceph-admin ops-ceph-cluster]# ceph -s
cluster:
id: f52099ba-cec0-4c77-bd92-3a21ad224be3
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph-node1,ceph-node2,ceph-node3 (age 11m)
mgr: ceph-node1(active, since 26m), standbys: ceph-node2, ceph-node3
osd: 3 osds: 3 up (since 18m), 3 in (since 18m)
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 3.0 GiB used, 57 GiB / 60 GiB avail
pgs:
可以看到 mgr 變為 3 個節點,其中兩個節點處于 standby 狀態,
五、創建 RBD 塊存盤
1. 創建 pool
在 ceph-admin 節點中執行如下命令創建 pool:
ceph osd pool create ops-pool 64 64
第一個 64 代表設定的 pg 數量,第二個 64 代表設定的 pgp 數量
使用如下命令查看當前已有的 pool:
[root@ceph-admin ~]# ceph osd lspools
1 ops-pool
查看指定 pool 中的 pg 和 pgp 數量:
[root@ceph-admin ~]# ceph osd pool get ops-pool pg_num
pg_num: 64
[root@ceph-admin ~]# ceph osd pool get ops-pool pgp_num
pgp_num: 64
查看指定 pool 中的副本數(副本數默認為3):
[root@ceph-admin ~]# ceph osd pool get ops-pool size
size: 3
查看指定 pool 的調度演算法(默認為replicated_rule):
[root@ceph-admin ~]# ceph osd pool get ops-pool crush_rule
crush_rule: replicated_rule
調整指定 pool 的 pg 和 pgp 數量:
ceph osd pool set ops-pool pg_num 128
ceph osd pool set ops-pool pgp_num 128
調整指定 pool 的副本數:
ceph osd pool set ops-pool size 2
一般來說,創建 pool 后,需要對這個 pool 進行初始化,例如用于 rbd 塊存盤的 pool 使用 rbd pool init 命令就可以將指定 pool 初始化為 rbd 型別的 application,如果不進行這個初始化的操作,不會影響存盤的使用,但是會在集群資訊中顯示報警資訊,后面會對于該報警資訊和解決辦法進行說明,
2. 創建塊存盤和映射
2.1 創建 image
使用如下命令創建一個塊存盤的 image:
rbd create -p ops-pool --image ops-rbd.img --size 5G
上面的命令也可以寫為如下形式:
rbd create ops-pool/ops-rbd-1.img --size 5G
查看指定 pool 中的 image:
[root@ceph-admin ~]# rbd -p ops-pool ls
ops-rbd-1.img
ops-rbd.img
查看指定 image 的資訊:
[root@ceph-admin ~]# rbd info ops-pool/ops-rbd.img
rbd image 'ops-rbd.img':
size 5 GiB in 1280 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 11cd172302e2
block_name_prefix: rbd_data.11cd172302e2
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Mon Jul 27 16:36:25 2020
access_timestamp: Mon Jul 27 16:36:25 2020
modify_timestamp: Mon Jul 27 16:36:25 2020
其中 features 項中代表當前 rbd 中啟用的一些內核特性,有些內核不支持啟用這些特性,所以在掛載的 rbd 的時候會報錯,后面的內容會說明如何禁用已啟用的內核特性
洗掉 pool 中指定的 image:
rbd rm -p ops-pool --image ops-rbd-1.img
2.2 使用 map 映射
使用如下命令將 image 映射到當前機器上:
rbd map ops-pool/ops-rbd.img
執行命令后會看到有如下報錯:
rbd: sysfs write failed
RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable ops-pool/ops-rbd.img object-map fast-diff deep-flatten".
In some cases useful info is found in syslog - try "dmesg | tail".
rbd: map failed: (6) No such device or address
報錯內容就是上面提到的,由于 rbd 默認啟用了一些內核特性,而當前機器中的內核版本不支持這些內核特性,所以需要提前將這些特性給禁用掉,命令如下:
for i in deep-flatten fast-diff object-map exclusive-lock; do rbd feature disable ops-pool/ops-rbd.img ${i}; done
操作完成后重新執行上面的 map 命令即可完成映射,命令執行完成后可以看到已經將 ops-rbd.img 映射到本地的一個塊設備名稱:
[root@ceph-admin ~]# rbd map ops-pool/ops-rbd.img
/dev/rbd0
通過如下命令可以查看到設備映射的資訊:
[root@ceph-admin ~]# rbd device list
id pool namespace image snap device
0 ops-pool ops-rbd.img - /dev/rbd0
[root@ceph-admin ~]# fdisk -l | grep -A3 /dev/rbd0
磁盤 /dev/rbd0:5368 MB, 5368709120 位元組,10485760 個扇區
Units = 扇區 of 1 * 512 = 512 bytes
扇區大小(邏輯/物理):512 位元組 / 512 位元組
I/O 大小(最小/最佳):4194304 位元組 / 4194304 位元組
2.3 格式化存盤并掛載
將 /dev/vdb0 格式化為 ext4,并掛載到 /media 目錄下:
mkfs.ext4 /dev/rbd0 && mount /dev/rbd0 /media
此時就可以向該存盤中寫入資料:
[root@ceph-admin media]# echo "message" > testfile
[root@ceph-admin media]# cat testfile
message
3. 對塊存盤進行擴容
上面已經創建了一個大小為 5G 的塊設備,如果需要給塊設備進行擴容,例如擴大到 10G,可以使用如下命令:
rbd resize ops-pool/ops-rbd.img --size 10G
擴容完成后查看塊設備的資訊:
[root@ceph-admin ~]# rbd info ops-pool/ops-rbd.img
rbd image 'ops-rbd.img':
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 11cd172302e2
block_name_prefix: rbd_data.11cd172302e2
format: 2
features: layering
op_features:
flags:
create_timestamp: Mon Jul 27 16:36:25 2020
access_timestamp: Mon Jul 27 16:36:25 2020
modify_timestamp: Mon Jul 27 16:36:25 2020
可以看到存盤已經調整為 10G,但是查看掛載目錄的大小還是 5G:
[root@ceph-admin ~]# df -Th /media
檔案系統 型別 容量 已用 可用 已用% 掛載點
/dev/rbd0 ext4 4.8G 20M 4.6G 1% /media
所以需要使檔案系統也識別到擴容的空間,這個存盤設備使用的 ext4 格式,所以使用 resize2fs 命令即可完成識別:
resize2fs /dev/rbd0
然后再次查看檔案系統大小如下:
[root@ceph-admin ~]# df -Th /media
檔案系統 型別 容量 已用 可用 已用% 掛載點
/dev/rbd0 ext4 9.8G 23M 9.3G 1% /media
4. 告警排查
上面說到了如果沒有對 pool 進行初始化,會觸發告警資訊,通過查看集群資訊可以看到相應的告警:
[root@ceph-admin ~]# ceph -s
cluster:
id: f52099ba-cec0-4c77-bd92-3a21ad224be3
health: HEALTH_WARN
application not enabled on 1 pool(s)
可以看到在健康檢查中告警"未在 pool 中啟用 application",使用如下命令可以查看到告警的詳細資訊:
[root@ceph-admin ~]# ceph health detail
HEALTH_WARN application not enabled on 1 pool(s)
POOL_APP_NOT_ENABLED application not enabled on 1 pool(s)
application not enabled on pool 'ops-pool'
use 'ceph osd pool application enable <pool-name> <app-name>', where <app-name> is 'cephfs', 'rbd', 'rgw', or freeform for custom applications.
接下來使用告警資訊中給出的命令來設定這個 pool 啟用 application,并將型別設定為 rbd:
ceph osd pool application enable ops-pool rbd
此時再次查看集群狀態資訊,可以看到告警已經恢復,健康狀態檢查正常:
[root@ceph-admin ~]# ceph -s
cluster:
id: f52099ba-cec0-4c77-bd92-3a21ad224be3
health: HEALTH_OK
通過如下命令可以查看到 pool 中已啟用的 application:
[root@ceph-admin ~]# ceph osd pool application get ops-pool
{
"rbd": {}
}
六、創建 RGW 物件存盤
1. 創建 RGW
在 ceph-admin 節點中的 /opt/ops-ceph-cluster 目錄下執行如下命令創建 RGW:
ceph-deploy rgw create ceph-node1
執行完成后查看集群資訊,可以看到已經啟用了一個 RGW:
[root@ceph-admin ops-ceph-cluster]# ceph -s
cluster:
id: f52099ba-cec0-4c77-bd92-3a21ad224be3
health: HEALTH_WARN
application not enabled on 1 pool(s)
services:
mon: 3 daemons, quorum ceph-node1,ceph-node2,ceph-node3 (age 117m)
mgr: ceph-node1(active, since 2h), standbys: ceph-node2, ceph-node3
osd: 3 osds: 3 up (since 2h), 3 in (since 2h)
rgw: 1 daemon active (ceph-node1)
task status:
data:
pools: 5 pools, 256 pgs
objects: 240 objects, 143 MiB
usage: 3.3 GiB used, 57 GiB / 60 GiB avail
pgs: 256 active+clean
在 ceph-node1 節點中查看 RGW 監聽的埠(默認為 7480):
[root@ceph-node1 ~]# netstat -anplut | grep 7480
tcp 0 0 0.0.0.0:7480 0.0.0.0:* LISTEN 19986/radosgw
tcp6 0 0 :::7480 :::* LISTEN 19986/radosgw
2. 修改 RGW 埠號
首先更改 ceph-admin 節點中 /opt/ops-ceph-cluster 目錄下 ceph.conf 檔案的內容,添加如下配置:
[client.rgw.ceph-node1]
rgw_frontends = "civetweb port=80"
注意
[client.rgw.ceph-node1]中要將 client.rgw. 后面的部分改為部署了 RGW 機器的主機名
檔案修改完成后將組態檔 push 到其他 OSD 節點中去:
ceph-deploy --overwrite-conf config push ceph-admin ceph-node1 ceph-node2 ceph-node3
在 ceph-node1 節點中重啟 RGW 服務:
systemctl restart ceph-radosgw.target
查看 RGW 服務當前監聽的埠:
[root@ceph-node1 ~]# netstat -anplut | grep radosgw | grep LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 20929/radosgw
3. 創建訪問 S3 的用戶
創建的用戶有兩種,一種是兼容 S3 風格的,還有一種是 Swift 風格,
3.1 創建訪問 S3 的用戶
使用如下命令創建一個用于訪問 S3 的用戶:
radosgw-admin user create --uid ops-s3-user --display-name "Ops S3 User Demo"
命令執行后會輸出如下結果:
{
"user_id": "ops-s3-user",
"display_name": "Ops S3 User Demo",
"email": "",
"suspended": 0,
"max_buckets": 1000,
"subusers": [],
"keys": [
{
"user": "ops-s3-user",
"access_key": "JV54B80DTZ8VQ2P4IYD4",
"secret_key": "GKURUiaXt2cf7B2O5cl7kmCvWWHDnAl7U6CGtPb2"
}
],
"swift_keys": [],
"caps": [],
"op_mask": "read, write, delete",
"default_placement": "",
"default_storage_class": "",
"placement_tags": [],
"bucket_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"user_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"temp_url_keys": [],
"type": "rgw",
"mfa_ids": []
}
上面的內容中顯示了用戶的 key 資訊以及一些用戶的配額資訊,以上的資訊也可以通過如下命令再次輸出:
radosgw-admin user info --uid ops-s3-user
3.2 測驗 s3 介面訪問
需要使用一個 python 程式來測驗 s3 介面的訪問,首先安裝一個 python 包,名稱為:python-boto:
yum -y install python-boto
創建一個名為 s3test.py 的檔案,內容如下:
import boto.s3.connection
access_key = 'JV54B80DTZ8VQ2P4IYD4'
secret_key = 'GKURUiaXt2cf7B2O5cl7kmCvWWHDnAl7U6CGtPb2'
conn = boto.connect_s3(
aws_access_key_id=access_key,
aws_secret_access_key=secret_key,
host='192.168.92.22', port=80,
is_secure=False, calling_format=boto.s3.connection.OrdinaryCallingFormat(),
)
bucket = conn.create_bucket('my-new-bucket')
for bucket in conn.get_all_buckets():
print "{name} {created}".format(
name=bucket.name,
created=bucket.creation_date,
)
需要注意的是,要將程式中的 access_key 和 secret_key 修改為前面生成用戶的相關資訊,host 需要修改為 RGW 服務器的地址,port 修改為相應的埠,
執行這個 python 程式,會輸出如下資訊:
[root@ceph-admin ~]# python s3test.py
my-new-bucket 2020-07-27T10:30:40.473Z
這代表成功創建了一個 bucket,
4. 使用命令列工具訪問 s3 介面
4.1 配置 s3cmd
在命令列中呼叫 s3 介面來管理物件存盤,首先需要安裝 s3cmd 軟體包:
yum -y install s3cmd
安裝完成后需要對 s3cmd 進行配置,配置程序如下:
[root@ceph-admin ~]# s3cmd --configure
Enter new values or accept defaults in brackets with Enter.
Refer to user manual for detailed description of all options.
Access key and Secret key are your identifiers for Amazon S3. Leave them empty for using the env variables.
Access Key: JV54B80DTZ8VQ2P4IYD4 # 設定訪問用戶的 Access Key
Secret Key: GKURUiaXt2cf7B2O5cl7kmCvWWHDnAl7U6CGtPb2 # 設定訪問用戶的 Secret Key
Default Region [US]:
Use "s3.amazonaws.com" for S3 Endpoint and not modify it to the target Amazon S3.
S3 Endpoint [s3.amazonaws.com]: 192.168.92.22:80 # 設定 RWG 的地址和埠
Use "%(bucket)s.s3.amazonaws.com" to the target Amazon S3. "%(bucket)s" and "%(location)s" vars can be used
if the target S3 system supports dns based buckets.
DNS-style bucket+hostname:port template for accessing a bucket [%(bucket)s.s3.amazonaws.com]: 192.168.92.22:80/%(bucket)s # 設定 bucket 的名稱(可以將IP地址更換為域名)
Encryption password is used to protect your files from reading
by unauthorized persons while in transfer to S3
Encryption password: # 不設定密碼
Path to GPG program [/usr/bin/gpg]: # 使用 gpg 加密
When using secure HTTPS protocol all communication with Amazon S3
servers is protected from 3rd party eavesdropping. This method is
slower than plain HTTP, and can only be proxied with Python 2.7 or newer
Use HTTPS protocol [Yes]: no # 不使用 HTTPS
On some networks all internet access must go through a HTTP proxy.
Try setting it here if you can't connect to S3 directly
HTTP Proxy server name: # 不設定代理訪問
New settings:
Access Key: JV54B80DTZ8VQ2P4IYD4
Secret Key: GKURUiaXt2cf7B2O5cl7kmCvWWHDnAl7U6CGtPb2
Default Region: US
S3 Endpoint: 192.168.92.22:80
DNS-style bucket+hostname:port template for accessing a bucket: 192.168.92.22:80/%(bucket)s
Encryption password:
Path to GPG program: /usr/bin/gpg
Use HTTPS protocol: False
HTTP Proxy server name:
HTTP Proxy server port: 0
Test access with supplied credentials? [Y/n] y # 驗證訪問
Please wait, attempting to list all buckets...
Success. Your access key and secret key worked fine :-)
Now verifying that encryption works...
Not configured. Never mind.
Save settings? [y/N] y # 保存配置
Configuration saved to '/root/.s3cfg'
配置完成后,組態檔存盤在 /root/.s3cfg 檔案中,需要將該檔案中的 signature_v2 配置項改為 True,否則在后續執行命令的時候會觸發 ERROR: S3 error: 403 (SignatureDoesNotMatch) 報錯:
signature_v2 = True
保存退出后,就可以使用 s3cmd 命令來管理物件存盤,首先使用如下命令查看當前的 bucket:
[root@ceph-admin ~]# s3cmd ls
2020-07-27 10:30 s3://my-new-bucket
創建一個新的 bucket:
[root@ceph-admin ~]# s3cmd mb s3://ops-s3-demo
Bucket 's3://ops-s3-demo/' created
[root@ceph-admin ~]# s3cmd ls
2020-07-27 10:30 s3://my-new-bucket
2020-07-28 02:20 s3://ops-s3-demo
4.2 上傳檔案
將本地的 /etc/fstab 檔案上傳到物件存盤中,并將存盤的名稱修改為 fstab-demo:
[root@ceph-admin ~]# s3cmd put /etc/fstab s3://ops-s3-demo/fstab-demo
upload: '/etc/fstab' -> 's3://ops-s3-demo/fstab-demo' [1 of 1]
465 of 465 100% in 1s 266.57 B/s done
如果上傳檔案時出現報錯資訊:ERROR: S3 error: 416 (InvalidRange),可按照如下步驟進行處理:
- 查看 RGW 服務器的日志檔案,路徑為:/var/log/ceph/ceph-client.rgw.${hostname}.log
- 由于上傳的檔案是小檔案,所以一般情況下觸發這個報錯的日志是如下內容:
rgw_init_ioctx ERROR: librados::Rados::pool_create returned (34) Numerical result out of range (this can be due to a pool or placement group misconfiguration, e.g. pg_num < pgp_num or mon_max_pg_per_osd exceeded)
- 這個是由于 pg 數量不足導致的,到 ceph-admin 節點的 /opt/ops-ceph-cluster 目錄下,修改 ceph.conf 檔案,在 [global] 下面添加一行:mon_max_pg_per_osd = 1000
[global]
fsid = f52099ba-cec0-4c77-bd92-3a21ad224be3
public_network = 192.168.92.0/24
cluster_network = 192.168.92.0/24
mon_initial_members = ceph-node1
mon_host = 192.168.92.22
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
mon_max_pg_per_osd = 1000
[client.rgw.ceph-node1]
rgw_frontends = "civetweb port=80"
- 將修改后的組態檔下發給各個節點:
ceph-deploy --overwrite-conf config push ceph-admin ceph-node1 ceph-node2 ceph-node3
- 重啟各個節點的 mon 和 mgr 服務:
systemctl restart ceph-mgr@ceph-node1
systemctl restart ceph-mon@ceph-node1
systemctl restart ceph-mgr@ceph-node2
systemctl restart ceph-mon@ceph-node2
systemctl restart ceph-mgr@ceph-node3
systemctl restart ceph-mon@ceph-node3
配置完成后即可實作檔案上傳,檔案上傳后使用如下命令查看 bucket 中的檔案:
[root@ceph-admin ~]# s3cmd ls s3://ops-s3-demo
2020-07-28 02:37 465 s3://ops-s3-demo/fstab-demo
4.3 上傳目錄
將本地的 /opt 目錄上傳到 bucket 中,命令如下:
s3cmd put /opt/ s3://ops-s3-demo/opt/ --recursive
查看 bucket 中的目錄:
[root@ceph-admin ~]# s3cmd ls s3://ops-s3-demo
DIR s3://ops-s3-demo/opt/
2020-07-28 02:37 465 s3://ops-s3-demo/fstab-demo
[root@ceph-admin ~]# s3cmd ls s3://ops-s3-demo/opt/
DIR s3://ops-s3-demo/opt/ops-ceph-cluster/
[root@ceph-admin ~]# s3cmd ls s3://ops-s3-demo/opt/ops-ceph-cluster/
2020-07-28 02:49 109928 s3://ops-s3-demo/opt/ops-ceph-cluster/ceph-deploy-ceph.log
2020-07-28 02:49 113 s3://ops-s3-demo/opt/ops-ceph-cluster/ceph.bootstrap-mds.keyring
2020-07-28 02:49 113 s3://ops-s3-demo/opt/ops-ceph-cluster/ceph.bootstrap-mgr.keyring
2020-07-28 02:49 113 s3://ops-s3-demo/opt/ops-ceph-cluster/ceph.bootstrap-osd.keyring
2020-07-28 02:49 113 s3://ops-s3-demo/opt/ops-ceph-cluster/ceph.bootstrap-rgw.keyring
2020-07-28 02:49 151 s3://ops-s3-demo/opt/ops-ceph-cluster/ceph.client.admin.keyring
2020-07-28 02:49 353 s3://ops-s3-demo/opt/ops-ceph-cluster/ceph.conf
2020-07-28 02:49 73 s3://ops-s3-demo/opt/ops-ceph-cluster/ceph.mon.keyring
4.3 下載檔案
將 s3://ops-s3-demo/opt/ops-ceph-cluster/ceph.conf 檔案下載到本地,并重命名為 ceph.conf-download,命令如下:
s3cmd get s3://ops-s3-demo/opt/ops-ceph-cluster/ceph.conf ceph.conf-download
4.4 洗掉檔案
將 s3://ops-s3-demo/fstab-demo 檔案洗掉,命令如下:
s3cmd rm s3://ops-s3-demo/fstab-demo
4.5 洗掉目錄
將 s3://ops-s3-demo/opt/ 目錄洗掉,命令如下:
s3cmd rm s3://ops-s3-demo/opt/ --recursive
5. 查看資源池資訊
此時查看資源池資訊,會發現資源池中多了幾個與 rgw 相關的資源池:
[root@ceph-admin ~]# ceph osd lspools
1 ops-pool
2 .rgw.root
3 default.rgw.control
4 default.rgw.meta
5 default.rgw.log
6 default.rgw.buckets.index
7 default.rgw.buckets.data
其中 2 3 4 5 是之前創建 RGW 后就自動生成的,而 6 是在呼叫 s3 介面創建 bucket 后生成的,7 是在呼叫介面上傳檔案后生成的,由于剛才已經將洗掉的檔案洗掉,所以 default.rgw.buckets.data 當前沒有資料,現在重新上傳一個檔案進行測驗,例如將 /etc/fstab 檔案上傳到 bucket:
[root@ceph-admin ~]# s3cmd put /etc/fstab s3://ops-s3-demo/fstab
upload: '/etc/fstab' -> 's3://ops-s3-demo/fstab' [1 of 1]
465 of 465 100% in 0s 7.27 KB/s done
此時查看一下資源池 default.rgw.buckets.data 中的資訊:
[root@ceph-admin ~]# rados -p default.rgw.buckets.data ls
9ad04f74-dd9d-4dac-abdd-77bf20241f53.4818.3_fstab
可以看到有一個以 index + fstab 的資料,實際上剛才上傳的 fstab 檔案就是存盤在這個資源池里,而這個資料前面的索引資訊是存盤在 default.rgw.buckets.index 資源池中:
[root@ceph-admin ~]# rados -p default.rgw.buckets.index ls
.dir.9ad04f74-dd9d-4dac-abdd-77bf20241f53.4818.1
.dir.9ad04f74-dd9d-4dac-abdd-77bf20241f53.4818.3
6. 創建 Swift 風格的用戶
創建 Swift 風格的用戶需要基于已經創建用于訪問 S3 介面的用戶至上來實作,前面已經創建一個用戶 ops-s3-user,所以基于這個用戶的創建命令如下:
radosgw-admin subuser create --uid ops-s3-user --subuser=ops-s3-user:swift --access=full
命令執行完成后會輸出以下資訊:
{
"user_id": "ops-s3-user",
"display_name": "Ops S3 User Demo",
"email": "",
"suspended": 0,
"max_buckets": 1000,
"subusers": [
{
"id": "ops-s3-user:swift",
"permissions": "full-control"
}
],
"keys": [
{
"user": "ops-s3-user",
"access_key": "JV54B80DTZ8VQ2P4IYD4",
"secret_key": "GKURUiaXt2cf7B2O5cl7kmCvWWHDnAl7U6CGtPb2"
}
],
"swift_keys": [
{
"user": "ops-s3-user:swift",
"secret_key": "ZHaXnUFfX0MOjpM925tCEfRRKeandVXDlo1V4bjM"
}
],
"caps": [],
"op_mask": "read, write, delete",
"default_placement": "",
"default_storage_class": "",
"placement_tags": [],
"bucket_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"user_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"temp_url_keys": [],
"type": "rgw",
"mfa_ids": []
}
如果在 swift_keys 中沒有為 ops-s3-user:swift 用戶生成 secret_key,可以手動為其生成一個,命令如下:
radosgw-admin key create --subuser=ops-s3-user:swift --key-type=swift --gen-secret
7. 使用 swift 方式訪問
使用 swift 方式訪問存盤,首先需要提前安裝好 swift 客戶端,命令如下:
yum -y install python-setuptools python-pip
pip install --upgrade setuptools -i https://mirrors.aliyun.com/pypi/simple/
pip install --upgrade python-swiftclient -i https://mirrors.aliyun.com/pypi/simple/
使用 swift 命令查看 pool 中的 bucket:
swift -A http://192.168.92.22:80/auth -U ops-s3-user:swift -K ZHaXnUFfX0MOjpM925tCEfRRKeandVXDlo1V4bjM list
輸入結果如下:
my-new-bucket
ops-s3-demo
查詢結果與使用 s3 介面查詢一致,但是上面的命令使用起來比較麻煩,swift 也支持使用環境變數的方式:
[root@ceph-admin ~]# swift list
Auth version 1.0 requires ST_AUTH, ST_USER, and ST_KEY environment variables
to be set or overridden with -A, -U, or -K.
Auth version 2.0 requires OS_AUTH_URL, OS_USERNAME, OS_PASSWORD, and
OS_TENANT_NAME OS_TENANT_ID to be set or overridden with --os-auth-url,
--os-username, --os-password, --os-tenant-name or os-tenant-id. Note:
adding "-V 2" is necessary for this.
從幫助資訊中可以看到,Auth version 1.0 版本可以設定 ST_AUTH, ST_USER, ST_KEY 環境變數來使用:
export ST_AUTH=http://192.168.92.22:80/auth
export ST_USER=ops-s3-user:swift
export ST_KEY=ZHaXnUFfX0MOjpM925tCEfRRKeandVXDlo1V4bjM
這樣就可以直接使用 swift 指令:
[root@ceph-admin ~]# swift list
my-new-bucket
ops-s3-demo
7.1 創建 bucket
使用 swift 命令在 pool 中創建 bucket,命令如下:
swift post swift-demo
查看當前有哪些 bucket:
[root@ceph-admin ~]# swift list
my-new-bucket
ops-s3-demo
swift-demo
7.2 上傳檔案
將 /etc/passwd 檔案上傳到 swift-demo 中,命令如下:
swift upload swift-demo /etc/passwd
7.3 上傳目錄
將 /opt 目錄上傳到 swift-demo 中,命令如下:
swift upload swift-demo /opt/
7.4 查看 bucket 中的檔案
[root@ceph-admin ~]# swift list swift-demo
etc/passwd
opt/ops-ceph-cluster/ceph-deploy-ceph.log
opt/ops-ceph-cluster/ceph.bootstrap-mds.keyring
opt/ops-ceph-cluster/ceph.bootstrap-mgr.keyring
opt/ops-ceph-cluster/ceph.bootstrap-osd.keyring
opt/ops-ceph-cluster/ceph.bootstrap-rgw.keyring
opt/ops-ceph-cluster/ceph.client.admin.keyring
opt/ops-ceph-cluster/ceph.conf
opt/ops-ceph-cluster/ceph.mon.keyring
7.5 下載檔案
將 passwd 檔案下載到本地:
swift download swift-demo etc/passwd
七、創建 Ceph FS 檔案存盤
1. 部署 MDS
首先在 ceph-admin 節點的 /opt/ops-ceph-cluster 目錄中執行如下命令,在 ceph-node1 節點中部署 MDS服務:
ceph-deploy --overwrite-conf mds create ceph-node1
部署完成后查看集群資訊,可以看到有一個 mds 節點是 up 狀態:
[root@ceph-admin ops-ceph-cluster]# ceph -s
cluster:
id: f52099ba-cec0-4c77-bd92-3a21ad224be3
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph-node1,ceph-node2,ceph-node3 (age 4h)
mgr: ceph-node1(active, since 4h), standbys: ceph-node2, ceph-node3
mds: 1 up:standby
osd: 3 osds: 3 up (since 23h), 3 in (since 23h)
rgw: 1 daemon active (ceph-node1)
task status:
data:
pools: 7 pools, 320 pgs
objects: 295 objects, 143 MiB
usage: 3.3 GiB used, 57 GiB / 60 GiB avail
pgs: 320 active+clean
2. 擴容 MDS
在 ceph-admin 節點的 /opt/ops-ceph-cluster 目錄中執行如下命令,將另外兩個節點服務器中部署 MDS 服務:
ceph-deploy --overwrite-conf mds create ceph-node2
ceph-deploy --overwrite-conf mds create ceph-node3
再次查看集群狀態,可以看到三個節點均為 standby 狀態,這是由于當前還未創建檔案系統的原因:
[root@ceph-admin ops-ceph-cluster]# ceph -s
cluster:
id: f52099ba-cec0-4c77-bd92-3a21ad224be3
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph-node1,ceph-node2,ceph-node3 (age 4h)
mgr: ceph-node1(active, since 4h), standbys: ceph-node2, ceph-node3
mds: 3 up:standby
osd: 3 osds: 3 up (since 23h), 3 in (since 23h)
rgw: 1 daemon active (ceph-node1)
task status:
data:
pools: 7 pools, 320 pgs
objects: 295 objects, 143 MiB
usage: 3.3 GiB used, 57 GiB / 60 GiB avail
pgs: 320 active+clean
也可以使用如下命令查看 mds 的狀態:
[root@ceph-admin ops-ceph-cluster]# ceph mds stat
3 up:standby
3. 創建檔案系統
創建檔案系統之前需要創建兩個 pool,其中一個用于存放資料,另一個用于存放元資料(pg 和 pgp 數量均設為 16):
ceph osd pool create cephfs_metadata 16 16
ceph osd pool create cephfs_data 16 16
接下來創建一個檔案系統,并制定資料 pool 和元資料 pool,這樣可以將兩個 pool 與檔案系統進行關聯:
ceph fs new cephfs-demo cephfs_metadata cephfs_data
查看當前已有的檔案系統:
[root@ceph-admin ~]# ceph fs ls
name: cephfs-demo, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
查看當前的集群狀態資訊,可以看到有一個 mds 為 up 狀態,另外兩個 mds 為 standby 狀態:
[root@ceph-admin ~]# ceph -s
cluster:
id: f52099ba-cec0-4c77-bd92-3a21ad224be3
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph-node1,ceph-node2,ceph-node3 (age 4h)
mgr: ceph-node1(active, since 4h), standbys: ceph-node2, ceph-node3
mds: cephfs-demo:1 {0=ceph-node1=up:active} 2 up:standby
osd: 3 osds: 3 up (since 23h), 3 in (since 23h)
rgw: 1 daemon active (ceph-node1)
task status:
scrub status:
mds.ceph-node1: idle
data:
pools: 9 pools, 352 pgs
objects: 317 objects, 143 MiB
usage: 3.3 GiB used, 57 GiB / 60 GiB avail
pgs: 352 active+clean
4. 使用內核驅動掛載檔案系統
首先在需要掛載檔案系統的機器上創建一個掛載點,這里選擇掛載到 /media 目錄下,掛載的機器中需要安裝 ceph-common 軟體包,使用如下命令進行掛載:
mount -t ceph 192.168.92.22:6789,192.168.92.23:6789,192.168.92.24:6789:/ /media -o name=admin
查看掛載資訊:
[root@ceph-admin ~]# df -Th /media
檔案系統 型別 容量 已用 可用 已用% 掛載點
192.168.92.22:6789:/ ceph 18G 0 18G 0% /media
此時檔案系統就可以正常使用了,并且支持多個機器同時掛載,達到資料共享的目的:
[root@ceph-admin media]# echo "This is a message" > testfile
[root@ceph-admin media]# ll
總用量 1
-rw-r--r-- 1 root root 18 7月 28 15:08 testfile
查看當前的內核資訊,可以看到檔案系統掛載后,是自動將模塊加載到內核中:
[root@ceph-admin ~]# lsmod | grep ceph
ceph 358802 1
5. 使用用戶控制元件掛載檔案系統
如果內核版本不支持加載 ceph 模塊,可以使用用戶空間的掛載方式,首先需要安裝 ceph-fuse 軟體包:
yum -y install ceph-fuse
安裝完成后,開始進行掛載,在掛載之前首先將已經掛載的檔案系統 umount,然后使用如下命令再次掛載到 /media 目錄下:
ceph-fuse -n client.admin -m 192.168.92.22:6789,192.168.92.23:6789,192.168.92.24:6789 /media
命令中指定了三個 mon 的地址,這是為了確保一個 mon 掛掉了,還可以通過另外兩個 mon 查詢到資訊,如果不指定 mon 的話,ceph-fuse 也會默認自動到 /etc/ceph/ceph.conf 組態檔中查找 mon 資訊,
查看掛載狀態:
[root@ceph-admin ~]# df -Th /media
檔案系統 型別 容量 已用 可用 已用% 掛載點
ceph-fuse fuse.ceph-fuse 18G 0 18G 0% /media
在 /media 目錄下可以看到之前寫入的檔案和內容:
[root@ceph-admin ~]# ll /media/
總用量 1
-rw-r--r--. 1 root root 18 7月 28 15:08 testfile
[root@ceph-admin ~]# cat /media/testfile
This is a message
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/191687.html
標籤:其他
上一篇:jumpserver部署使用
