ceph+docker方式搭建owncloud實現私網雲盤
項目背景
企業應用中越來越多的會使用容器技術來是實現解決方案
1、單節點的docker和docker-compose
2、多節點的docker swarm集群
3、多節點的k8s集群
以上都是可以基於容器技術實現企業應用的編排和快速部署
在特別大型的業務架構中, 數據達到T級別,P級別,甚至E級別或更高。如此大量 的數據,我們需要保證它的數據讀寫性能, 數據可靠性, 在線擴容等, 並且希望能 與容器技術整合使用。
ceph分布式存儲是非常不錯的開源解決方案
目前ceph在docker swarm集群與kubernetes集群中已經可以實現對接使用。 雖然3種類型存儲並不是在任何場合都支持,但開源社區中也有相應的解決方 案,也會越來越成熟。
下面我們就使用ceph做底層存儲, 分別在docker節點,docker swarm集 群,kubernetes集群中對接應用打造私有雲盤與web應用。
項目架構圖
PS:在架構圖中寫的比較全,但是在這個項目中不會全部做完,只是ceph集群加單台docker部署owncloud,實現雲盤的功能,並沒有docker集群的操作。
四台主機
系統版本為7.6 1810
ceph1 10.0.0.5 作為管理ceph集群的節點,它自身也在集群中
ceph2 10.0.0.6 組成ceph集群
ceph3 10.0.0.41 組成ceph集群
owncloud 10.0.0.63 docker部署owncloud
部署過程
准備過程
1、所有節點配置靜態IP地址(要求能上公網)(ceph1舉例)
[root@ceph1 yum.repos.d 04:14:18]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=10.0.0.5
NETMASK=255.255.255.0
GATEWAY=10.0.0.254
DNS1=223.5.5.5
2、所有節點主機名配置在/etc/hosts文件中
(ceph1舉例)
[root@ceph1 yum.repos.d 04:14:36]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.5 ceph1
10.0.0.6 ceph2
10.0.0.41 ceph3
10.0.0.63 owncloud
說明:還有沒有開始部署的節點,也請先把IP地址和主機名進行綁定到/etc/hosts中
3、所有節點關閉centos7的firewalld房防火牆,iptables規則清空
# systemctl stop firewalld # systemctl disable firewalld
# yum install iptables-services -y # systemctl restart iptables # systemctl enable iptables
# iptables -F # iptables -F -t nat # iptables -F -t mangle # iptables -F -t raw
# service iptables save iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
4、所有節點關閉selinux
[root@ceph1 yum.repos.d 04:16:08]# cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
[root@ceph1 yum.repos.d 04:18:09]# getenforce
Disabled
5、同步時間
# systemctl restart ntpd
# systemctl enabled ntpd
PS:准備工作是在所有節點都進行操作的
部署開始
1、添加ceph的yum源
[root@ceph1 yum.repos.d 02:40:54]# cat ceph.repo
[ceph]
name=ceph
baseurl=https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-mimic/el7/x86_64/
enabled=1
gpgcheck=0
priority=1
[ceph-noarch]
name=cephnoarch
baseurl=https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-mimic/el7/noarch/
enabled=1
gpgcheck=0
priority=1
[ceph-source]
name=Ceph source packages
baseurl=https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-mimic/el7/SRPMS/
enabled=1
gpgcheck=0
priority=1
[root@ceph1 yum.repos.d 02:40:57]#
注釋:我這里使用的清華源,也可以使用阿里源或者是搭建本地yum源(搭建本地yum源的前提是將所有的rpm下載到本地)
將此ceph.repo拷貝到其他所有節點
2、配置ceph集群ssh免密
以ceph1為部署節點,在ceph1上配置到其他節點的ssh免密
目的:因為ceph集群會經常同步配置文件到其他節點,免密會方便很多
[root@ceph1 ~]# ssh-keygen # 三次回車做成空密碼密鑰[root@ceph_node1 ~]# ssh-copy-id ceph1
[root@ceph_node1 ~]# ssh-copy-id ceph2
[root@ceph_node1 ~]# ssh-copy-id ceph3
[root@ceph_node1 ~]# ssh-copy-id owncloud
3、在ceph1上安裝部署工具
其他節點不需要安裝
yum install -y python-setuptools.noarch #先安裝一個模塊
yum install ceph-deploy -y #安裝部署工具
4、在ceph1上創建集群
創建一個集群配置目錄
注意:后面大部分的操作都在這個目錄中操作
mkdir /etc/ceph
cd /etc/ceph
創建一個ceph1集群
ceph-deploy new ceph1
[root@ceph1 ceph 06:41:01]# ll
total 16
-rw-r--r-- 1 root root 191 Apr 21 02:38 ceph.conf
-rw-r--r-- 1 root root 2917 Apr 21 02:38 ceph-deploy-ceph.log
-rw------- 1 root root 73 Apr 21 02:38 ceph.mon.keyring
-rw-r--r-- 1 root root 92 Apr 16 12:47 rbdmap
[root@ceph1 ceph 06:42:02]#
說明:
ceph.conf 集群配置文件
ceph-deploy-ceph.log 使用ceph-deploy部署的日志記錄
ceph.mon.keyring 驗證key文件
5、安裝ceph軟件
在所有ceph集群節點安裝ceph與ceph-radosgw軟件包
[root@ceph1 ceph 06:42:32]# ceph -v
ceph version 13.2.9 (58a2a9b31fd08d8bb3089fce0e312331502ff945) mimic (stable)
[root@ceph1 ceph 06:42:36]#
補充說明:如果網速夠好的話,可以使用ceph-deploy install ceph1 ceph2 ceph3 命令來安裝。ceph-deploy命令會自動通過公網官方源安裝。(網速不給力就不要使用這種方式了)
在ceph客戶端節點(k8s集群節點上)安裝ceph-common
# yum install ceph-common -y
創建mon監控組件
增加監控網絡,網段為實驗環境的集群物理網絡
[root@ceph1 ceph 06:50:47]# cat /etc/ceph/ceph.conf
[global]
fsid = bb1d01eb-0d72-4794-9d7c-cb692d7a8f34
mon_initial_members = ceph1
mon_host = 10.0.0.5
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
public network = 10.0.0.0/24 #添加的配置,監控網絡
1、集群節點初始化
[root@ceph1 ceph 06:52:13]# ceph-deploy mon create-initial
[root@ceph1 ceph 06:52:05]# ceph health
HEALTH_OK
2、將配置文件信息同步到所有的ceph集群節點
ceph-deploy admin ceph1 ceph2 ceph3
[root@ceph1 ceph 06:57:15]# ceph -s
cluster:
id: bb1d01eb-0d72-4794-9d7c-cb692d7a8f34
health: HEALTH_OK
services:
mon: 1 daemons, quorum ceph1
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:
[root@ceph1 ceph 06:57:19]#
此時集群已經搭建好了
3、多個mon節點
為了防止mon節點單點故障,你可以添加多個mon節點(非必要步驟)
ceph-deploy mon add ceph2
ceph-deploy mon add ceph3
[root@ceph1 ceph 06:59:11]# ceph -s
cluster:
id: bb1d01eb-0d72-4794-9d7c-cb692d7a8f34
health: HEALTH_OK
健康狀態為ok
services:
mon: 3 daemons, quorum ceph1,ceph2,ceph3 三個監控
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:
監控到時間不同不的解決方法
ceph集群對時間同步的要求非常高,即使你已經將ntpd服務開啟,但仍然有可能會有clock skew deteted相關警告
可以嘗試如下做法:
1、在ceph集群節點上使用crontab同步
# systemctl stop ntpd # systemctl disable ntpd
# crontab -e */10 * * * * ntpdate ntp1.aliyun.com 每5或10 分鍾同步1次公網的任意時間服務器
2、調大時間警告的閾值
[root@ceph_node1 ceph]# vim ceph.conf
[global] 在global參數組里添加 以下兩行 ......
mon clock drift allowed = 2 # monitor間的時鍾滴 答數(默認0.5秒)
mon clock drift warn backoff = 30 # 調大時鍾允許的偏移量 (默認為5)
3、同步到所有節點
[root@ceph_node1 ceph]# ceph-deploy --overwrite-conf admin ceph_node1 ceph_node2 ceph_node3
前面第1次同步不需要加--overwrite-conf參數 這次修改ceph.conf再同步就需要加--overwrite-conf參數覆蓋
4、所有ceph集群節點上重啟ceph-mon.target服務
systemctl restart ceph-mon.target
創建mgr管理組件
ceph luminous版本之后新增加了一個組件:ceph manager daemon ,簡稱ceph-mgr
該組件的主要作用是分擔和擴展monitor的部分功能,減輕monitor的負擔,讓更好的管理ceph存儲系統
ceph dashboard圖形化管理就用到了mgr
1、創建一個mgr
[root@ceph1 ceph 07:11:17]# ceph-deploy mgr create ceph1
查看一下
[root@ceph1 ceph 07:11:32]# ceph -s
cluster:
id: bb1d01eb-0d72-4794-9d7c-cb692d7a8f34
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph1,ceph2,ceph3
mgr: ceph1(active) 這里就是mgr
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:
2、添加多個mgr可以實現HA
ceph-deploy mgr create ceph2
ceph-deploy mgr create ceph3
[root@ceph1 ceph 07:13:12]# ceph -s
cluster:
id: bb1d01eb-0d72-4794-9d7c-cb692d7a8f34
health: HEALTH_WARN
OSD count 0 < osd_pool_default_size 3
services:
mon: 3 daemons, quorum ceph1,ceph2,ceph3 三個監控
mgr: ceph1(active), standbys: ceph2, ceph3 ceph1為主mgr
osd: 0 osds: 0 up, 0 in
看到0個磁盤
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 0 B used, 0 B / 0 B avail
pgs:
[root@ceph1 ceph 07:13:19]#
至此ceph集群基本已經搭建完成,但是還需要增加OSD磁盤
ceph集群管理
1、物理上添加磁盤
在ceph集群所有節點上增加磁盤
(我這里只是模擬,就增加一個5G的做測試使用)
ceph1 ceph2 ceph3 三個節點上都要進行操作
不重啟讓系統識別新增加的磁盤
操作之前
[root@ceph1 ceph 07:13:19]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 50G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 49G 0 part
├─centos-swap 253:0 0 2G 0 lvm [SWAP]
└─centos-root 253:1 0 47G 0 lvm /
sr0 11:0 1 4.3G 0 rom
[root@ceph1 ceph 07:24:28]#
操作之中
[root@ceph1 ceph 07:24:28]# echo "- - -" > /sys/class/scsi_host/host0/scan
[root@ceph1 ceph 07:26:01]# echo "- - -" > /sys/class/scsi_host/host1/scan
[root@ceph1 ceph 07:26:08]# echo "- - -" > /sys/class/scsi_host/host2/scan
操作之后
[root@ceph1 ceph 07:26:12]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 50G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 49G 0 part
├─centos-swap 253:0 0 2G 0 lvm [SWAP]
└─centos-root 253:1 0 47G 0 lvm /
sdb 這里就是我們新加的 8:16 0 5G 0 disk
sr0 11:0 1 4.3G 0 rom
[root@ceph1 ceph 07:26:36]#
2、創建OSD磁盤
將磁盤添加到ceph集群中需要osd
ceph OSD :功能是存儲於處理一些數據,並通過檢查其他OSD守護進程的心跳來向ceph monitors 提供一些監控信息
1、列表所有節點的磁盤 並使用zap命令清除磁盤信息准備創建OSD
ceph-deploy disk zap ceph1 /dev/sdb
ceph-deploy disk zap ceph2 /dev/sdb
ceph-deploy disk zap ceph3 /dev/sdb
[root@ceph1 ceph 07:32:01]# ceph-deploy disk zap ceph3 /dev/sdb
[ceph_deploy.conf][DEBUG ] found configuration file at: /root/.cephdeploy.conf
[ceph_deploy.cli][INFO ] Invoked (2.0.1): /usr/bin/ceph-deploy disk zap ceph3 /dev/sdb
[ceph_deploy.cli][INFO ] ceph-deploy options:
[ceph_deploy.cli][INFO ] username : None
[ceph_deploy.cli][INFO ] verbose : False
[ceph_deploy.cli][INFO ] debug : False
[ceph_deploy.cli][INFO ] overwrite_conf : False
[ceph_deploy.cli][INFO ] subcommand : zap
[ceph_deploy.cli][INFO ] quiet : False
[ceph_deploy.cli][INFO ] cd_conf : <ceph_deploy.conf.cephdeploy.Conf instance at 0x7feb12eb0368>
[ceph_deploy.cli][INFO ] cluster : ceph
[ceph_deploy.cli][INFO ] host : ceph3
[ceph_deploy.cli][INFO ] func : <function disk at 0x7feb12eec8c0>
[ceph_deploy.cli][INFO ] ceph_conf : None
[ceph_deploy.cli][INFO ] default_release : False
[ceph_deploy.cli][INFO ] disk : ['/dev/sdb']
[ceph_deploy.osd][DEBUG ] zapping /dev/sdb on ceph3
[ceph3][DEBUG ] connected to host: ceph3
[ceph3][DEBUG ] detect platform information from remote host
[ceph3][DEBUG ] detect machine type
[ceph3][DEBUG ] find the location of an executable
[ceph_deploy.osd][INFO ] Distro info: CentOS Linux 7.6.1810 Core
[ceph3][DEBUG ] zeroing last few blocks of device
[ceph3][DEBUG ] find the location of an executable
[ceph3][INFO ] Running command: /usr/sbin/ceph-volume lvm zap /dev/sdb
[ceph3][WARNIN] --> Zapping: /dev/sdb
[ceph3][WARNIN] --> --destroy was not specified, but zapping a whole device will remove the partition table
[ceph3][WARNIN] Running command: /bin/dd if=/dev/zero of=/dev/sdb bs=1M count=10 conv=fsync
[ceph3][WARNIN] --> Zapping successful for: <Raw Device: /dev/sdb>
2、創建OSD磁盤
ceph-deploy osd create --data /dev/sdb ceph1
ceph-deploy osd create --data /dev/sdb ceph2
ceph-deploy osd create --data /dev/sdb ceph3
3、驗證
[root@ceph1 ceph 07:34:31]# ceph -s
cluster:
id: bb1d01eb-0d72-4794-9d7c-cb692d7a8f34
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph1,ceph2,ceph3
mgr: ceph1(active), standbys: ceph2, ceph3
osd: 3 osds: 3 up, 3 in
三個磁盤
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 3.0 GiB used, 12 GiB / 15 GiB avail 合成一個15G的磁盤,但是使用了3G 是因為合成時會用掉一些空間
pgs:
擴容操作
節點中增加某個磁盤
如:在ceph3上再添加一塊磁盤/dev/sdc。做如下操作就可以
ceph-deploy disk zap ceph3 /dev/sdc
ceph-deploy osd create --data /dev/sdc ceph3
驗證
[root@ceph1 ceph 08:10:41]# ceph -s
cluster:
id: bb1d01eb-0d72-4794-9d7c-cb692d7a8f34
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph1,ceph2,ceph3
mgr: ceph1(active), standbys: ceph2, ceph3
osd: 4 osds: 4 up, 4 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 4.0 GiB used, 16 GiB / 20 GiB avail
pgs:
增加某個節點並添加此節點的磁盤
如果是新增加一個節點(假設是owncloud節點)並添加一塊磁盤
那么做法如下:
1、准備好owncloud節點的基本環境,安裝ceph相關軟件
yum install -y ceph ceph-radosgw -y
2、在ceph1上同步1配置到owncloud節點
ceph-deploy admin owncloud
3、將owncloud加入集群
ceph-deploy disk zap owncloud /dev/sdb
ceph-deploy osd create --data /dev/sdb owncloud
4、驗證
[root@ceph1 ceph 08:15:44]# ceph -s
cluster:
id: bb1d01eb-0d72-4794-9d7c-cb692d7a8f34
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph1,ceph2,ceph3
mgr: ceph1(active), standbys: ceph2, ceph3
osd: 5 osds: 5 up, 5 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 5.0 GiB used, 20 GiB / 25 GiB avail
pgs:
[root@ceph1 ceph 08:15:48]#
刪除磁盤方法
和很多存儲一樣,增加磁盤(擴容)都比較方便,但是要刪除磁盤會比較麻煩。
這里以刪除owncloud節點的/dev/sdb磁盤為例
1、查看osd磁盤狀態
[root@ceph1 ceph 08:23:49]# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.02449 root default
-3 0.00490 host ceph1
0 hdd 0.00490 osd.0 up 1.00000 1.00000
-5 0.00490 host ceph2
1 hdd 0.00490 osd.1 up 1.00000 1.00000
-7 0.00980 host ceph3
2 hdd 0.00490 osd.2 up 1.00000 1.00000
3 hdd 0.00490 osd.3 up 1.00000 1.00000
-9 0.00490 host owncloud
4 hdd 0.00490 osd.4 up 1.00000 1.00000
2、先標記為out
[root@ceph1 ceph 08:23:56]# ceph osd out osd.4
marked out osd.4.
[root@ceph1 ceph 08:24:46]# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.02449 root default
-3 0.00490 host ceph1
0 hdd 0.00490 osd.0 up 1.00000 1.00000
-5 0.00490 host ceph2
1 hdd 0.00490 osd.1 up 1.00000 1.00000
-7 0.00980 host ceph3
2 hdd 0.00490 osd.2 up 1.00000 1.00000
3 hdd 0.00490 osd.3 up 1.00000 1.00000
-9 0.00490 host owncloud
4 hdd 0.00490 osd.4 up 0 1.00000
可以看到權重為0但是狀態還是up
3、再rm刪除,但是要先去osd.4對應的節點上停止ceph-osd服務,否則刪除不了
[root@owncloud yum.repos.d 08:27:35]# systemctl stop ceph-osd@4.service
[root@ceph1 ceph 08:28:09]# ceph osd rm osd.4
removed osd.4
4、查看集群狀態
[root@ceph1 ceph 08:28:18]#
[root@ceph1 ceph 08:28:18]# ceph -s
cluster:
id: bb1d01eb-0d72-4794-9d7c-cb692d7a8f34
health: HEALTH_WARN 會有警告,是因為沒有在crush算法中刪除
1 osds exist in the crush map but not in the osdmap
services:
mon: 3 daemons, quorum ceph1,ceph2,ceph3
mgr: ceph1(active), standbys: ceph2, ceph3
osd: 4 osds: 4 up, 4 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 4.0 GiB used, 16 GiB / 20 GiB avail
pgs:
此時再查看,發現osd.4已經沒有up了
[root@ceph1 ceph 08:28:22]# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.02449 root default
-3 0.00490 host ceph1
0 hdd 0.00490 osd.0 up 1.00000 1.00000
-5 0.00490 host ceph2
1 hdd 0.00490 osd.1 up 1.00000 1.00000
-7 0.00980 host ceph3
2 hdd 0.00490 osd.2 up 1.00000 1.00000
3 hdd 0.00490 osd.3 up 1.00000 1.00000
-9 0.00490 host owncloud
4 hdd 0.00490 osd.4 DNE 0
[root@ceph1 ceph 08:29:23]#
5、在crush算法中和auth驗證中刪除
[root@owncloud yum.repos.d 08:32:29]# ceph osd crush remove osd.4
removed item id 4 name 'osd.4' from crush map
[root@owncloud yum.repos.d 08:32:43]# ceph auth del osd.4
updated
6、還需要在osd.4對應的節點上卸載磁盤
[root@owncloud yum.repos.d 08:33:04]# df -Th |grep osd
tmpfs tmpfs 487M 52K 487M 1% /var/lib/ceph/osd/ceph-4
[root@owncloud yum.repos.d 08:33:30]# umount /var/lib/ceph/osd/ceph-4/
[root@owncloud yum.repos.d 08:33:50]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/centos-root xfs 47G 1.6G 46G 4% /
devtmpfs devtmpfs 475M 0 475M 0% /dev
tmpfs tmpfs 487M 0 487M 0% /dev/shm
tmpfs tmpfs 487M 14M 473M 3% /run
tmpfs tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 xfs 1014M 133M 882M 14% /boot
tmpfs tmpfs 98M 0 98M 0% /run/user/0
在ceph1節點查看驗證
[root@ceph1 ceph 08:29:23]# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.01959 root default
-3 0.00490 host ceph1
0 hdd 0.00490 osd.0 up 1.00000 1.00000
-5 0.00490 host ceph2
1 hdd 0.00490 osd.1 up 1.00000 1.00000
-7 0.00980 host ceph3
2 hdd 0.00490 osd.2 up 1.00000 1.00000
3 hdd 0.00490 osd.3 up 1.00000 1.00000
-9 0 host owncloud
到這里,就完全刪除了。
如果想要加回來,再次部署在節點上即可
如下命令
[root@ceph1 ceph]# ceph-deploy disk zap ceph1 /dev/sdb
[root@ceph1 ceph]# ceph-deploy osd create --data /dev/sdb ceph1
小結與說明
ceph集群安裝要注意:
1、ceph-deploy命令默認找官方yum源,國內網速非常慢(而且ceph安裝時設置了300秒超時,也就是你安裝5分鍾內不安裝完就會斷開)
2、建議使用國內鏡像源(我使用的清華源),如果網速還是慢,就做好本地yum源。
3、ceph集群節點需要安裝ceph與ceph-radosgw軟件包,客戶端節點只需要安裝ceph-common軟件包
4、ceph集群對時間同步很敏感,請一定保證沒有時間不同的相關警告
ceph集群操作注意:
任何操作一定要保證集群健康的情況下操作,並使用ceph -s命令進行確認
修改配置文件請在部署節點上修改,然后使用
ceph-deploy --overwriteconf admin ceph1 ceph2 ceph3命令同步到其它節點
ceph的存儲類型
三種存儲類型介紹
無論用那種存儲,都可以分為以下三種類型
文件存儲:類似於一個大的目錄,多個客戶端可以掛載過來
優點:利於數據共享
缺點:速度較慢
塊存儲:類似於一個block的設備,客戶端可以格式化,掛載並使用,和用一個硬盤一樣
優點:和本地硬盤一樣直接使用
缺點:數據不同享
對象存儲:看做一個綜合了文件存儲和塊存儲優點的大硬盤,可以掛載也可以通過URL來訪問
優點:速度快,數據共享
缺點:成本高,不兼容現有的模式
RADOS;ceph的高可靠,高可擴展、高性能、高自動化都是由這一層來提供的,用戶數據的存儲最終也是通過這一層來進行存儲的
可以說RADOS就是ceph底層的原生態的數據引擎,但是實際應用時卻不直接使用它,而是分為以下4種方式來使用:
LIBRADOS是一個庫, 它允許應用程序通過訪問該庫來與RADOS系統進行交 互,支持多種編程語言。如Python,C,C++等. 簡單來說,就是給開發人員使 用的接口。
CEPH FS通過Linux內核客戶端和FUSE來提供文件系統。(文件存儲)
RBD通過Linux內核客戶端和QEMU/KVM驅動來提供一個分布式的塊設 備。(塊存儲)
RADOSGW是一套基於當前流行的RESTFUL協議的網關,並且兼容S3和 Swift。(對象存儲)
存儲原理
要實現數據存取需要建一個pool,創建pool要分配PG。
如果客戶端對一個pool寫了一個文件,那么這個文件是如何分布到多個節點的磁盤上呢?
答案是通過crush算法
CRUSH算法
CRUSH(Controlled Scalable Decentralized Placement of Replicated Data)算法為可控的,可擴展的,分布式的副本數據放置算法的簡稱。 PG到OSD的映射的過程算法叫做CRUSH 算法。(一個Object需要保存三個 副本,也就是需要保存在三個osd上)。
CRUSH算法是一個偽隨機的過程,他可以從所有的OSD中,隨機性選擇一 個OSD集合,但是同一個PG每次隨機選擇的結果是不變的,也就是映射的 OSD集合是固定的。
小結:
1、客戶端直接對pool操作(但文件存儲、塊存儲、對象存儲區我們不這么做)
2、pool里面要分配PG
3、PG里面可以存放多個對象
4、對象就是客戶端寫入的數據分離單位
5、crush算法將客戶端寫入的數據映射分布到OSD,從而最終存放到物理磁盤上。
RADOS原生數據存取
1、創建pool並測試
創建test_pool 指定pg數為128
[root@ceph1 ceph 09:03:17]# ceph osd pool create test_pool 128
pool 'test_pool' created
修改pg數量,可以使用修改調整
ceph osd pool set test_pool pg_num 64
查看數量
[root@ceph1 ceph 09:03:32]# ceph osd pool get test_pool pg_num
pg_num: 128
[root@ceph1 ceph 09:03:46]#
說明:pg數與osd數量關系
pg數為2的倍數,一般為5個一下osd,分為128個PG或者一下即可
可以使用ceph osd pool set test_pool pg_num 64 這樣的命令來嘗試調整。
2、存儲測試
1、我這里把本機的/etc/fstab文件上傳到test_pool並取名為netfatab
[root@ceph1 ceph 09:11:12]# rados put newfatab /etc/fstab --pool=test_pool
2、查看
[root@ceph1 ceph 09:11:19]# rados -p test_pool ls
newfatab
[root@ceph1 ceph 09:11:47]#
3、刪除並查看
[root@ceph1 ceph 09:12:45]# rados rm newfatab --pool=test_pool
[root@ceph1 ceph 09:13:16]# rados -p test_pool ls
3、刪除pool
1、在部署節點ceph1上增加參數允許ceph刪除pool
[root@ceph1 ceph 09:15:29]# cat ceph.conf
[global]
fsid = bb1d01eb-0d72-4794-9d7c-cb692d7a8f34
mon_initial_members = ceph1
mon_host = 10.0.0.5
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
public network = 10.0.0.0/24
mon_allow_pool_delete = true
增加最后一條信息
2、修改了配置,要同步到其他集群節點
[root@ceph1 ceph 09:17:19]# ceph-deploy --overwrite-conf admin ceph1 ceph2 ceph3
3、重啟監控服務
[root@ceph1 ceph 09:17:42]# systemctl restart ceph-mon.target
4、刪除pool名輸入兩次,后接--yes-i-really-really-mean-it參數就可以刪 除了
[root@ceph1 ceph 09:17:52]# ceph osd pool delete test_pool test_pool --yes-i-really-really-mean-it
pool 'test_pool' removed
[root@ceph1 ceph 09:19:23]#
創建ceph文件存儲
要運行ceph文件系統,你必須先創建至少一個帶mds的ceph存儲集群
(ceph塊設備和ceph對象存儲都不使用MDS)
ceph MDS為ceph文件存儲類型存放元數據metadata
1、在ceph1節點部署上同步配置文件,並創建MDS(也可以做多個mds實現HA)
ceph-deploy mds create ceph1 ceph2 ceph3
2、一個ceph文件系統需要至少兩個RADOS存儲池,一個用於數據,一個用於元數據。所以我們創建他們
[root@ceph1 ceph 09:24:47]# ceph osd pool create cephfs_pool 128
pool 'cephfs_pool' created
[root@ceph1 ceph 09:25:06]# ceph osd pool create cephfs_metadata 64
pool 'cephfs_metadata' created
[root@ceph1 ceph 09:25:27]# ceph osd pool ls |grep cephfs
cephfs_pool
cephfs_metadata
3、創建ceph文件系統並確認客戶端訪問的節點
[root@ceph1 ceph 09:26:38]# ceph fs new cephfs cephfs_metadata cephfs_pool
new fs with metadata pool 3 and data pool 2
[root@ceph1 ceph 09:26:59]# ceph fs ls
name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_pool ]
[root@ceph1 ceph 09:27:09]# ceph mds stat
cephfs-1/1/1 up {0=ceph3=up:active}, 2 up:standby
[root@ceph1 ceph 09:27:17]#
4、客戶端准備key驗證文件
說明:ceph默認啟用了cephx認證,所以客戶端的掛載必須要認證
[root@lsy ~ 09:52:52]# mount -t ceph 10.0.0.5:6789:/ /mnt -o name=admin,secret=AQBQ0J5eLDHnLRAAf850/HEvbZd3DAvWE8czrA==
[root@lsy ~ 09:54:04]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/centos-root xfs 47G 3.6G 44G 8% /
devtmpfs devtmpfs 475M 0 475M 0% /dev
tmpfs tmpfs 487M 0 487M 0% /dev/shm
tmpfs tmpfs 487M 14M 473M 3% /run
tmpfs tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 xfs 1014M 133M 882M 14% /boot
tmpfs tmpfs 98M 0 98M 0% /run/user/0
10.0.0.5:6789:/ ceph 5.0G 0 5.0G 0% /mnt
[root@lsy ~ 09:54:13]#
這樣的方式可以
但是使用文件密鑰的方式我就實現不出來。
[root@lsy ~ 10:05:42]# mount -t ceph ceph1:6789:/ /mnt -o name=admin,secretfile=/root/admin.key
mount: wrong fs type, bad option, bad superblock on ceph1:6789:/,
missing codepage or helper program, or other error
In some cases useful info is found in syslog - try
dmesg | tail or so.
幾種方式的總結:見博客
https://blog.csdn.net/weixin_42506599/article/details/105669234
刪除文件存儲方法
1、在客戶端上刪除數據,並umount所有掛載
[root@lsy ~ 10:24:55]# rm /mnt/* -rf
[root@lsy ~ 10:25:04]#
[root@lsy ~ 10:25:05]# umount /mnt/
[root@lsy ~ 10:25:09]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/centos-root xfs 47G 3.6G 44G 8% /
devtmpfs devtmpfs 475M 0 475M 0% /dev
tmpfs tmpfs 487M 0 487M 0% /dev/shm
tmpfs tmpfs 487M 14M 473M 3% /run
tmpfs tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 xfs 1014M 133M 882M 14% /boot
tmpfs tmpfs 98M 0 98M 0% /run/user/0
[root@lsy ~ 10:25:11]#
2、停止所有節點的MDS(只有停掉MDS才可以刪除文件系統)
[root@ceph1 ~]# systemctl stop ceph-mds.target
[root@ceph2 ~]# systemctl stop ceph-mds.target
[root@ceph3 ~]# systemctl stop ceph-mds.target
3、回到ceph1刪除
[root@ceph1 ceph 10:26:48]# ceph fs rm cephfs --yes-i-really-mean-it
[root@ceph1 ceph 10:29:25]# ceph osd pool delete cephfs_metadata cephfs_metadata --yes-i-really-really-mean-it
pool 'cephfs_metadata' removed
[root@ceph1 ceph 10:30:04]# ecph osd pool delete cephfs_pool cephfs_pool --yes-i-really-really-mean-it
bash: ecph: command not found
[root@ceph1 ceph 10:30:43]# ceph osd pool delete cephfs_pool cephfs_pool --yes-i-really-really-mean-it
pool 'cephfs_pool' removed
此時查看裝態為err
[root@ceph1 ceph 10:26:19]# ceph -s
cluster:
id: bb1d01eb-0d72-4794-9d7c-cb692d7a8f34
health: HEALTH_ERR
1 filesystem is degraded
1 filesystem has a failed mds daemon
1 filesystem is offline
insufficient standby MDS daemons available
services:
mon: 3 daemons, quorum ceph1,ceph2,ceph3
mgr: ceph1(active), standbys: ceph2, ceph3
mds: cephfs-0/1/1 up , 1 failed
osd: 4 osds: 4 up, 4 in
data:
pools: 2 pools, 192 pgs
objects: 22 objects, 3.1 KiB
usage: 4.0 GiB used, 16 GiB / 20 GiB avail
pgs: 192 active+clean
4、再次啟動mds服務
[root@ceph1 ceph 10:32:34]# systemctl start ceph-mds.target
此時查看狀態,又回到健康狀態
[root@ceph1 ceph 10:32:44]# ceph -s
cluster:
id: bb1d01eb-0d72-4794-9d7c-cb692d7a8f34
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph1,ceph2,ceph3
mgr: ceph1(active), standbys: ceph2, ceph3
osd: 4 osds: 4 up, 4 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 4.0 GiB used, 16 GiB / 20 GiB avail
pgs:
創建ceph塊存儲
1、創建塊存儲並使用
1、建立存儲池並初始化
[root@ceph1 ceph 10:35:32]# ceph osd pool create rbd_pool 8
pool 'rbd_pool' created
[root@ceph1 ceph 10:35:47]# rbd pool init rbd_pool
2、創建一個存儲卷volume1,大小為5000M
[root@ceph1 ceph 10:37:06]# rbd create volume1 --pool rbd_pool --size 5000
[root@ceph1 ceph 10:37:35]# rbd ls rbd_pool
volume1
[root@ceph1 ceph 10:37:45]# rbd info volume1 -p rbd_pool
rbd image 'volume1':
size 4.9 GiB in 1250 objects
order 22 (4 MiB objects)
id: 5ed46b8b4567
block_name_prefix: rbd_data.5ed46b8b4567
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Tue Apr 21 10:37:35 2020
[root@ceph1 ceph 10:38:03]#
4、將創建的卷映射為塊設備
因為rbd鏡像的一些特性,OS kernel並不支持,所以映射報錯
[root@ceph1 ceph 10:39:55]# rbd map rbd_pool/volume1
rbd: sysfs write failed
RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable rbd_pool/volume1 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
[root@ceph1 ceph 10:40:10]#
解決方法:distable相關特性
(四者之間有先后順序問題)
[root@ceph1 ceph 10:44:36]# rbd feature disable rbd_pool/volume1 fast-diff
[root@ceph1 ceph 10:45:42]# rbd feature disable rbd_pool/volume1 object-map
[root@ceph1 ceph 10:45:45]# rbd feature disable rbd_pool/volume1 exclusive-lock
[root@ceph1 ceph 10:46:02]#
[root@ceph1 ceph 10:48:17]# rbd feature disable rbd_pool/volume1 deep-flatten
再次映射
[root@ceph1 ceph 10:48:49]# rbd map rbd_pool/volume1
/dev/rbd0
5、查看映射(如果要取消映射,可以使用rbd unmap /dev/rbd0)
[root@ceph1 ceph 10:50:17]# rbd showmapped
id pool image snap device
0 rbd_pool volume1 - /dev/rbd0
[root@ceph1 ceph 10:50:28]#
6、格式化掛載
[root@ceph1 ceph 10:50:51]# mkfs.xfs /dev/rbd0
meta-data=/dev/rbd0 isize=512 agcount=8, agsize=160768 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=1280000, 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
[root@ceph1 ceph 10:51:03]# mount /dev/rbd0 /mnt/
df[root@ceph1 ceph 10:51:15]# df -Th |tail -1
/dev/rbd0 xfs 4.9G 33M 4.9G 1% /mnt
[root@ceph1 ceph 10:51:24]#
補充:第二個客戶端如果也要用此塊存儲,只需要執行以下幾步就可以
[root@ceph2 yum.repos.d 10:52:45]# rbd map rbd_pool/volume1
/dev/rbd0
[root@ceph2 yum.repos.d 10:53:03]# rbd showmapped
id pool image snap device
0 rbd_pool volume1 - /dev/rbd0
[root@ceph2 yum.repos.d 10:53:10]# mount /dev/rbd0 /mnt/
[root@ceph2 yum.repos.d 10:53:24]# df -Th |tail -1
/dev/rbd0 xfs 4.9G 33M 4.9G 1% /mnt
[root@ceph2 yum.repos.d 10:53:31]#
注意:塊存儲是不能實現同讀和同寫的,請不要兩個客戶端同時掛載進行讀寫。
2、刪除塊存儲方法
[root@ceph2 yum.repos.d 10:53:31]# umount /mnt/
[root@ceph2 yum.repos.d 10:55:03]# rbd unmap /dev/rbd0
[root@ceph2 yum.repos.d 10:55:15]# ceph osd pool delete rbd_pool rbd_pool --yes-i-really-really-mean-it
pool 'rbd_pool' removed
[root@ceph2 yum.repos.d 10:55:54]#
創建對象存儲網關
rgw(對象存儲網關):為客戶端訪問對象存儲的接口
rgw的創建
1、在ceph集群任意一個節點上創建rgw(我這里為ceph1)
確保你已經裝了這個軟件包
[root@ceph1 ceph 11:11:37]# yum install -y ceph-radosgw
創建rgw
[root@ceph1 ceph 11:11:37]# ceph-deploy rgw create ceph1
2、驗證7480端口
[root@ceph1 ceph 11:11:25]# lsof -i:7480
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
radosgw 121388 ceph 41u IPv4 1625237 0t0 TCP *:7480 (LISTEN)
對象網關創建成功,后面的項目中我們會通過ceph1的對象網關來連接就可以使用了。
連接的地址為10.0.0.5:7480
小結與說明:
我們實現了ceph集群,並創建了三中類型存儲,那么如何使用這些存儲呢?
在不同的場景與應用中,會需要不同類型的存儲類型,並不是說在一個項目里要把三中類型都用到
在后面的項目中,我們會分別用到這三種不同的類型。