主機名 | 角色 | 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 |
對全部機器配置 epel 倉庫、基礎軟件包倉庫、ceph 軟件包倉庫,全部的鏡像倉庫地址可到阿里雲開源鏡像站中查找,地址:https://developer.aliyun.com/mirror/,配置步驟以下:node
wget http://mirrors.aliyun.com/repo/epel-7.repo -O /etc/yum.repos.d/epel-7.repo
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
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
爲了保證 ceph 集羣 mon 組件通訊正常,須要對每一個節點的時間進行同步,這裏對管理節點和 osd 節點進行時間同步,首先在全部服務器中安裝 chrony 用於系統時間同步,步驟以下:python
安裝 chrony 服務linux
yum -y install chrony
設置系統時區web
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 時間寫入硬件時鐘,並重啓依賴於系統時間的服務json
timedatectl set-local-rtc 0 systemctl restart rsyslog && systemctl restart crond
使用 ceph-deploy 部署集羣時,須要經過主機名來查找主機 IP 地址,因此要在本地 hosts 文件中配置地址解析:bootstrap
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
閉系統防火牆並禁止開機啓動,清理防火牆規則並設置默認轉發策略swift
systemctl stop firewalld.service && systemctl disable firewalld.service iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat iptables -P FORWARD ACCEPT
永久關閉selinuxcentos
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
在 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-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
在 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
接下來須要在各個 osd 節點安裝 ceph 組件包:
yum -y install ceph ceph-mon ceph-mgr ceph-mds ceph-radosgw
在初始化集羣的過程當中已經指定了 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 節點。
配置 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:
當前環境中,每一個 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:
mon 和 mgr 是 ceph 集羣中很是重要的組件,其中 mon 做爲整個集羣的控制中心,裏面存放着集羣的信息,因此須要確保 mon 和 mgr 處於高可用的狀態,爲了保證選舉正常,節點數要爲奇數。
首先將 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
接下來擴容 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 狀態。
在 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。若是不進行這個初始化的操做,不會影響存儲的使用,可是會在集羣信息中顯示報警信息。後面會對於該報警信息和解決辦法進行說明。
使用以下命令建立一個塊存儲的 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
使用以下命令將 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 字節
將 /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
上面已經建立了一個大小爲 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
上面說到了若是沒有對 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": {} }
在 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
首先更改 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
建立的用戶有兩種,一種是兼容 S3 風格的,還有一種是 Swift 風格。
使用以下命令建立一個用於訪問 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
須要使用一個 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。
在命令行中調用 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
將本地的 /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_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)
[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
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
將本地的 /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
將 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
將 s3://ops-s3-demo/fstab-demo 文件刪除,命令以下:
s3cmd rm s3://ops-s3-demo/fstab-demo
將 s3://ops-s3-demo/opt/ 目錄刪除,命令以下:
s3cmd rm s3://ops-s3-demo/opt/ --recursive
此時查看資源池信息,會發現資源池中多了幾個與 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
建立 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
使用 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
使用 swift 命令在 pool 中建立 bucket,命令以下:
swift post swift-demo
查看當前有哪些 bucket:
[root@ceph-admin ~]# swift list my-new-bucket ops-s3-demo swift-demo
將 /etc/passwd 文件上傳到 swift-demo 中,命令以下:
swift upload swift-demo /etc/passwd
將 /opt 目錄上傳到 swift-demo 中,命令以下:
swift upload swift-demo /opt/
[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
將 passwd 文件下載到本地:
swift download swift-demo etc/passwd
首先在 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
在 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
建立文件系統以前須要建立兩個 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
首先在須要掛載文件系統的機器上建立一個掛載點,這裏選擇掛載到 /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
若是內核版本不支持加載 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