环境:centos7.9 ceph version 13.2.10
上一篇我们讲了文件类型的分布式存储glusterfs,这次我们来讲另外一个分布式存储系统,即ceph;
ceph是一个能提供文件存储、块存储、对象存储
三种类型的分布式存储文件系统,它提供了一个可无限伸缩的ceph存储集群。
官网:https://ceph.com
官方文档:https://docs.ceph.com/en/latest/start/intro/
Monitor:Ceph监视器(Ceph-mon)维护集群状态的映射,包括监视器映射、管理器映射、OSD映射、MDS映射和CRUSH映射。这些映射是Ceph守护进程相互协调
所需的关键集群状态。监视器还负责管理守护进程和客户端之间的身份验证。通常需要至少3个Monitor来实现冗余和高可用性。
Manager:Ceph Manager守护进程(Ceph-mgr)负责跟踪Ceph集群的运行时指标和当前状态,包括存储利用率、当前性能指标和系统负载。Ceph Manager守护进程
还承载基于python的模块来管理和公开Ceph集群信息,包括基于web的Ceph Dashboard和REST API。通常需要至少2个Manager来实现高可用性。
Ceph OSD:对象存储守护进程(Ceph OSD, Ceph-OSD)存储数据,处理数据复制、恢复、再平衡,并通过检查其他Ceph OSD守护进程的心跳,为Ceph监视器和管
理器提供一些监控信息。通常需要至少3个Ceph osd来实现冗余和高可用性。
MDS:Ceph元数据服务器(MDS, Ceph - MDS)代表Ceph文件系统存储元数据(即,Ceph块设备和Ceph对象存储不使用MDS)。Ceph元数据服务器允许POSIX文件系
统用户执行基本命令(如ls、find等),而不会给Ceph存储集群带来巨大的负担。
从以上,我们可以得知,一个ceph高可用集群至少需要3个Monitor、2个Manager、3个osd,如果ceph集群需要提供cephfs文件系统存储,则还需要安装mds。
cephfs: 通过Linux内核客户端和FUSE来提供文件系统。(cephfs就是文件存储);
rdb: 通过Linux内核客户端和QEMU/KVM驱动来提供一个分布式的块设备。(rdb就是块存储);
radosgw: 是一套基于当前流行的RESTFUL协议的网关,并且兼容S3和Swift。(radosgw就是对象存储)。
1、准备3个干净的存储服务器+1个干净的客户端服务器,3个存储服务器都挂载1块新磁盘,不用分区;
2、配置4个服务器的主机名为node1、node2、node3、client,绑定本地解析主机名;
vim /etc/hosts
192.168.118.128 node1
192.168.118.129 node2
192.168.118.130 node3
192.168.118.131 client
3、4个服务器都能上外网,而且两两ping通;
4、关闭防火墙等基本配置
systemctl stop firewalld
systemctl disable firewalld
vim /etc/selinux/config
setenforce 0
yum install ntp
systemctl enable ntpd
systemctl start ntpd;
5、4台服务器都配置好公网的centos7源+epel源+ceph源(如果不想配置外网,也可以自己配置本地ceph源)
yum install epel-release -y #安装配置epel源
vim /etc/yum.repos.d/ceph.repo #配置ceph源
[ceph]
name=ceph
baseurl=http://mirrors.aliyun.com/ceph/rpm-mimic/el7/x86_64/
enabled=1
gpgcheck=0
priority=1
[ceph-noarch]
name=cephnoarch
baseurl=http://mirrors.aliyun.com/ceph/rpm-mimic/el7/noarch/
enabled=1
gpgcheck=0
priority=1
[ceph-source]
name=Ceph source packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-mimic/el7/SRPMS
enabled=1
gpgcheck=0
priority=1
以上环境准备完毕,我们来开始搭建集群。
此步骤不是必须,如果使用ceph-deploy工具来安装ceph集群,做服务器免密登陆会比较方便;
以node1为部署节点,在node1上配置免密登录;
ssh-keygen -t rsa #在node1上做免密登陆,按回车保存默认即可
ssh-copy-id -i /root/.ssh/id_rsa.pub root@node1 #分发公钥,自己也要加
ssh-copy-id -i /root/.ssh/id_rsa.pub root@node2 #分发公钥
ssh-copy-id -i /root/.ssh/id_rsa.pub root@node3 #分发公钥
ssh-copy-id -i /root/.ssh/id_rsa.pub root@client #分发公钥
cd /root/.ssh && cat authorized_keys #到node1、node2、node3、client的目录查看公钥是否分发成功
ssh root@node2 #验证免密登陆node2
ssh root@node3 #验证免密登陆node3
ssh root@client #验证免密登陆client
#ceph-deploy是一个工具,我们使用ceph-deploy这个工具来搭建ceph集群
[root@node1 ~]# yum install ceph-deploy -y
[root@node1 ~]# mkdir /etc/ceph #创建一个目录,用于保存ceph-deploy生成的配置文件
[root@node1 ~]# cd /etc/ceph
[root@node1 ceph]# yum install -y python-setuptools #先安装python-setuptools依赖,防止报错
[root@node1 ceph]# ceph-deploy new node1 #创建一个集群,node1是主机名,不是集群名
[ceph_deploy.conf][DEBUG ] found configuration file at: /root/.cephdeploy.conf
[ceph_deploy.cli][INFO ] Invoked (2.0.1): /usr/bin/ceph-deploy new node1
[ceph_deploy.cli][INFO ] ceph-deploy options:
[ceph_deploy.cli][INFO ] username : None
[ceph_deploy.cli][INFO ] func : <function new at 0x7fc5b6a1a320>
[ceph_deploy.cli][INFO ] verbose : False
[ceph_deploy.cli][INFO ] overwrite_conf : False
[ceph_deploy.cli][INFO ] quiet : False
[ceph_deploy.cli][INFO ] cd_conf : <ceph_deploy.conf.cephdeploy.Conf instance at 0x7fc5b618b7a0>
[ceph_deploy.cli][INFO ] cluster : ceph
[ceph_deploy.cli][INFO ] ssh_copykey : True
[ceph_deploy.cli][INFO ] mon : ['node1']
[ceph_deploy.cli][INFO ] public_network : None
[ceph_deploy.cli][INFO ] ceph_conf : None
[ceph_deploy.cli][INFO ] cluster_network : None
[ceph_deploy.cli][INFO ] default_release : False
[ceph_deploy.cli][INFO ] fsid : None
[ceph_deploy.new][DEBUG ] Creating new cluster named ceph #ceph是集群名,自动帮我们生成一个名叫ceph的集群
[ceph_deploy.new][INFO ] making sure passwordless SSH succeeds
[node1][DEBUG ] connected to host: node1
[node1][DEBUG ] detect platform information from remote host
[node1][DEBUG ] detect machine type
[node1][DEBUG ] find the location of an executable
[node1][INFO ] Running command: /usr/sbin/ip link show
[node1][INFO ] Running command: /usr/sbin/ip addr show
[node1][DEBUG ] IP addresses found: [u'192.168.118.128']
[ceph_deploy.new][DEBUG ] Resolving host node1
[ceph_deploy.new][DEBUG ] Monitor node1 at 192.168.118.128
[ceph_deploy.new][DEBUG ] Monitor initial members are ['node1']
[ceph_deploy.new][DEBUG ] Monitor addrs are ['192.168.118.128']
[ceph_deploy.new][DEBUG ] Creating a random mon key...
[ceph_deploy.new][DEBUG ] Writing monitor keyring to ceph.mon.keyring...
[ceph_deploy.new][DEBUG ] Writing initial config to ceph.conf...
[root@node1 ceph]# ll #查看一下生成了哪些文件
total 12
-rw-r--r--. 1 root root 198 Jan 3 13:52 ceph.conf #集群配置文件
-rw-r--r--. 1 root root 2923 Jan 3 13:52 ceph-deploy-ceph.log #使用ceph-deploy部署的日志记录
-rw-------. 1 root root 73 Jan 3 13:52 ceph.mon.keyring #mon的验证key文件
[root@node1 ceph]#
[root@node1 ~]# yum install ceph ceph-radosgw -y #在node1、node2、node3上安装软件
[root@node2 ~]# yum install ceph ceph-radosgw -y #如果出现依赖冲突,自己解决
[root@node3 ~]# yum install ceph ceph-radosgw -y #安装的软件依赖会比较多
[root@node1 ~]# ceph -v #查看版本
ceph version 13.2.10 (564bdc4ae87418a232fc901524470e1a0f76d641) mimic (stable)
[root@node1 ~]#
#在client客户端服务器安装
[root@client ~]# yum -y install ceph-common
[root@node1 ~]# cd /etc/ceph/ #以下操作的目录均在集群的配置目录下面进行操作
[root@node1 ceph]# vim ceph.conf
public_network = 192.168.118.0/24 #monitor网络,写网段即可
[root@node1 ceph]# ceph-deploy mon create-initial #创建初始化monitor监控
[root@node1 ceph]# ceph-deploy admin node1 node2 node3 #将配置文件信息同步到所有节点
[root@node1 ceph]# ceph -s #查看集群状态
cluster:
id: 4aaecade-1822-43ba-a7e7-ae20d4241527 #集群id
health: HEALTH_WARN #集群健康状态
mon node1 is low on available space #这是因为我的node1根存储空间已经达到79%,所以我需要删除一些文件
services:
mon: 1 daemons, quorum node1 #有1个监控,mon可以有多个
mgr: no daemons active #这个是mgr管理,等下第7步我们再创建
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单点故障,可以加多个mon节点(建议奇数个,因为有quorum仲裁投票)
[root@node1 ceph]# ceph-deploy mon add node2 #加多一个mon
[root@node1 ceph]# ceph-deploy mon add node3 #再加多一个mon
[root@node1 ceph]# ceph -s #再次查看集群状态
cluster:
id: 4aaecade-1822-43ba-a7e7-ae20d4241527
health: HEALTH_WARN
clock skew detected on mon.node3 #总是报node3节点时间有误差
mons node1,node2 are low on available space #需要释放node1和node2根存储空间降到70%以下
services:
mon: 3 daemons, quorum node1,node2,node3 #现在已经有3个mon监控了
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@node1 ceph]#
#如何处理集群总是报node3时间有偏差呢?监控到时间不同步的解决方法可以有两种方案:
#1、在ceph集群所有节点上(node1、node2、node3)不使用ntpd服务,直接使用ntpdate命令+crontab定时任务同步
systemctl stop ntpd
systemctl disable ntpd
crontab -e
*/5 * * * * ntpdate ntp1.aliyun.com #每5或10分钟同步1次公网的任意时间服务器
#2、调大时间警告的阈值(这里我采用这种方法处理)
[root@node1 ceph]# cd /etc/ceph
[root@node1 ceph]# vim ceph.conf
[global] #在global参数组里添加以下两行
......
mon clock drift allowed = 2 # monitor间的时钟滴答数(默认0.5秒)
mon clock drift warn backoff = 30 #调大时钟允许的偏移量(默认为5)
[root@node1 ceph]# systemctl restart ceph-mon.target #在所有node节点上重启ceph-mon.target服务
[root@node1 ceph]# ceph-deploy --overwrite-conf admin node1 node2 node3 #将配置文件信息同步到所有节点,加--overwrite-conf参数表示覆盖
#为什么要同步ceph.conf配置文件呢?
#因为修改了node1的/etc/ceph/ceph.conf配置文件,为了保持各个节点的配置文件一致,不然后面的操作可能会出现报错。
#为了不让它再报存储空间low的问题,我需要把node1和node2删除一些文件来达到释放根目录空间
[root@node1 /]# ceph -s #再次查看集群监控状态
cluster:
id: 4aaecade-1822-43ba-a7e7-ae20d4241527
health: HEALTH_OK #现在集群健康状态已经是ok了
services:
mon: 3 daemons, quorum node1,node2,node3
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@node1 /]#
ceph luminous版本中新增加了一个组件:Ceph Manager Daemon
,简称ceph-mgr
,该组件的主要作用是分担和扩展monitor的部分功能,减轻monitor的负担,让更好地管理ceph存储系统。
[root@node1 /]# cd /etc/ceph/ #同样需要切换到集群配置文件目录
[root@node1 ceph]# ceph-deploy mgr create node1 #创建一个mgr,node1是主机名
#添加多个mgr可以实现HA
[root@node1 ceph]# ceph-deploy mgr create node2 #同理再创建一个node2
[root@node1 ceph]# ceph-deploy mgr create node3 #再创建一个node3
[root@node1 ceph]# ceph -s
cluster:
id: 4aaecade-1822-43ba-a7e7-ae20d4241527
health: HEALTH_WARN
OSD count 0 < osd_pool_default_size 3
services:
mon: 3 daemons, quorum node1,node2,node3
mgr: node1(active), standbys: node2, node3 #已经创建好了3个mgr,node1为主,node2,node3为备
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@node1 ceph]#
#osd 必须是磁盘设备、分区、逻辑卷lv 反正不能是普通目录,普通目录创建的时候会报错,好像lv挂载的目录也可以,但是这引入一个思考
# 如果是lv挂载的目录,那么当该lv扩容之后,osd并不会扩容,所以这样做的目的是什么,还不如直接是磁盘或分区,osd扩容直接扩一个磁盘或分区即#可
[root@node1 ~]# cd /etc/ceph #切换到集群的配置文件目录
[root@node1 ceph]# ceph-deploy disk --help #可以查看命令帮助
#列表所有node节点的磁盘,都有sda和sdb两个盘,sdb为我们要加入分布式存储的盘
[root@node1 ceph]# ceph-deploy disk list node1 #列出node1节点服务器的磁盘
[root@node1 ceph]# ceph-deploy disk list node2 #列出node2节点服务器的磁盘
[root@node1 ceph]# ceph-deploy disk list node3 #列出node3节点服务器的磁盘
#zap表示干掉磁盘上的数据,相当于格式化
[root@node1 ceph]# ceph-deploy disk zap node1 /dev/sdb #格式化node1上的sdb磁盘
[root@node1 ceph]# ceph-deploy disk zap node2 /dev/sdb #格式化node2上的sdb磁盘
[root@node1 ceph]# ceph-deploy disk zap node3 /dev/sdb #格式化node3上的sdb磁盘
[root@node1 ceph]# ceph-deploy osd --help #查看帮助
# ceph-deploy osd create 包含prepare和active,以前可能将该命令拆分成ceph-deploy osd prepare xx和ceph-deploy osd active xx
[root@node1 ceph]# ceph-deploy osd create --data /dev/sdb node1 #将node1上的sdb磁盘创建为osd
[root@node1 ceph]# ceph -s #查看集群状态
cluster:
id: 4aaecade-1822-43ba-a7e7-ae20d4241527
health: HEALTH_WARN
OSD count 1 < osd_pool_default_size 3
services:
mon: 3 daemons, quorum node1,node2,node3
mgr: node1(active), standbys: node2, node3
osd: 1 osds: 1 up, 1 in #这是已经有了1个osd了
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 5.2 MiB used, 1015 MiB / 1020 MiB avail #可用空间时1G,因为我的node1的sdb空间就是1G
pgs:
[root@node1 ceph]# ceph-deploy osd create --data /dev/sdb node2 #继续将node2上的sdb磁盘创建为osd
[root@node1 ceph]# ceph-deploy osd create --data /dev/sdb node3 #继续将node3上的sdb磁盘创建为osd
[root@node1 ceph]# ceph -s #再来看一下集群状态
cluster:
id: 4aaecade-1822-43ba-a7e7-ae20d4241527
health: HEALTH_OK #健康状态是ok
services:
mon: 3 daemons, quorum node1,node2,node3 #3个mon
mgr: node1(active), standbys: node2, node3 #3个mgr,1主2备
osd: 3 osds: 3 up, 3 in #3个osd
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 19 MiB used, 3.0 GiB / 3.0 GiB avail #可用存储空间时3G,因为我的3个node节点的sdb磁盘空间都是1G
pgs:
[root@node1 ceph]#
以上8大步骤我们已经搭建完了ceph存储系统了。
服务器新加一块磁盘,然后执行命令即可:ceph-deploy osd create --data /dev/sdb node4
假设需要扩容,那么再加一个新的集群节点node4,做以下几步即可:
1、主机名配置和绑定,配置ceph源,设置时间同步;
2、在node4上yum install ceph ceph-radosgw -y
安装软件;
3、在部署节点node1上同步配置文件给node4节点: ceph-deploy admin node4
;
4、按需求选择在node4上添加mon或mgr;
5、格式化node4磁盘,如:ceph-deploy disk zap node4 /dev/sdb
6、 在node1上将将node4上的磁盘创建为osd,如: ceph-deploy osd create --data /dev/sdb node4
要实现数据存取需要创建一个pool,创建pool要先分配pg。pool里要分配pg,pg里可以存放多个对象, 对象就是由客户端写入的数据分离的单位。
[root@node1 ~]# ceph osd pool create test_pool 16 #创建一个test_pool的池,并分配16个pg
[root@node1 ~]# ceph osd lspools 或者 ceph osd pool ls #查看有多少pool
[root@node1 ~]# ceph osd pool get test_pool pg_num #查看指定池的pg数量
pg_num: 16
[root@node1 ~]# ceph osd pool set test_pool pg_num 18 #调整pg的数量
set pool 1 pg_num to 18
[root@node1 ~]# ceph osd pool get test_pool pg_num #再次查看指定池的pg数量
pg_num: 18
[root@node1 ~]# ceph -s
cluster:
id: 4aaecade-1822-43ba-a7e7-ae20d4241527
health: HEALTH_OK
services:
mon: 3 daemons, quorum node1,node2,node3
mgr: node1(active), standbys: node2, node3
osd: 3 osds: 3 up, 3 in
data:
pools: 1 pools, 18 pgs #有1个池,18个pg
objects: 0 objects, 0 B
usage: 1.2 GiB used, 1.8 GiB / 3.0 GiB avail
pgs: 50.000% pgs unknown
8 unknown
8 active+clean
#删除pool之前需在ceph.conf配置文件添加mon_allow_pool_delete=true参数,并重启ceph-mon.target服务
[root@node1 ~]# cd /etc/ceph
[root@node1 ceph]# vim ceph.conf #打开配置文件添加下面这行参数
mon_allow_pool_delete=true
[root@node1 ceph]# ceph-deploy --overwrite-conf admin node1 node2 node3 #同步文件
[root@node1 ceph]# systemctl restart ceph-mon.target #重启ceph-mon.target服务
[root@node1 ~]# ceph osd pool delete test_pool test_pool --yes-i-really-really-mean-it
[root@node1 ceph]# ceph -s
cluster:
id: 4aaecade-1822-43ba-a7e7-ae20d4241527
health: HEALTH_WARN
mon node1 is low on available space
services:
mon: 3 daemons, quorum node1,node2,node3
mgr: node1(active), standbys: node2, node3
osd: 3 osds: 3 up, 3 in
data:
pools: 0 pools, 0 pgs #test_pool已经删除
objects: 0 objects, 0 B
usage: 1.2 GiB used, 1.8 GiB / 3.0 GiB avail
pgs:
cephfs,即ceph filesystem的简写,cephfs可以支持多客户端同时挂载同时读取数据同时写入数据。cephfs类似于nfs,客户端只需要使用mount.ceph命令挂载远程的ceph集群的目录到本地即可,这样客户端就可以想写入本地数据一样轻松的使用cephfs。
cephfs的优缺点:可以同时被多个客户端同时挂载读写使用,缺点就是相对于ceph其他存储类型如rbd,对象网关而言读写性能差一点,但这不是在要求性能极其严格的业务场景下,cephfs完全胜任。。
要运行cephfs文件系统,必须先创建至少带一个mds的ceph存储集群(ceph块设备和ceph对象存储不使用mds)。
Ceph MDS: Ceph文件存储类型存放与管理元数据metadata的服务。
#第1步、 在node1节点创建mds服务(最少创建一个mds,也可以做多个mds实现HA)
[root@node1 ceph]# cd /etc/ceph
[root@node1 ceph]# ceph-deploy mds create node1 node2 node3 #这里创建3个mds
[root@node1 ceph]# ceph mds stat #查看mds状态
cephfs-1/1/1 up {0=node3=up:active}, 2 up:standby
[root@node1 ceph]#
#第2步、 一个Ceph文件系统需要至少两个RADOS存储池,一个用于存放数据,一个用于存放元数据,下面我们就来创建这两个池
[root@node1 ceph]# ceph osd pool create ceph_data 16 #创建ceph_data池,用于存数据
[root@node1 ceph]# ceph osd pool create ceph_metadata 8 #创建ceph_metadata池,用于存元数据
#第3步、创建ceph文件系统,并确认客户端访问的节点
[root@node1 ceph]# ceph fs new cephfs ceph_metadata ceph_data #cephfs就是ceph文件系统名,即客户端挂载点,ceph_metadata是上一步创建的元数据池,ceph_data是上一步创建的数据此,这两个池的顺序不能乱
new fs with metadata pool 3 and data pool 4
[root@node1 ceph]# ceph fs ls #查看我们创建的ceph文件系统
name: cephfs, metadata pool: ceph_metadata, data pools: [ceph_data ]
[root@node1 ceph]#
一个客户端想要挂载远程上的ceph文件存储系统,它需要连接谁呢?答案是连接monitor监控,所以客户端只需要连接mon监控的节点和端口,而mon监控端口为6789;
在ceph的配置文件ceph.conf中,有auth_client_required = cephx的几行,这几行表示cepg启用了cephx认证, 所以客户端的挂载必须要验证秘钥,而ceph在创建集群的时候就生成一个客户端秘钥;
[root@node1 ~]# cd /etc/ceph
[root@node1 ceph]# cat ceph.client.admin.keyring #在node1上查看客户端的秘钥文件内容,这个文件叫ceph.client.admin.keyring,其中admin是用户名
[client.admin] #admin是用户名
key = AQAGn9JhQ3AUOxAAHz+xz6M8B86uoj+gV/ElIw== #这个就是客户端的秘钥
caps mds = "allow *"
caps mgr = "allow *"
caps mon = "allow *"
caps osd = "allow *"
[root@node1 ceph]#
[root@client ~]# mkdir /etc/ceph #在cline客户端创建一个/etc/ceph目录
[root@client ceph]# echo 'AQAGn9JhQ3AUOxAAHz+xz6M8B86uoj+gV/ElIw==' >>admin.key #新建一个秘钥文件,并把从node1上看到的客户端秘钥复制到这个文件里来
[root@client ceph]# cat admin.key
AQAGn9JhQ3AUOxAAHz+xz6M8B86uoj+gV/ElIw==
[root@client ceph]# mkdir /cephfs_data #先创建一个目录作为挂载点
[root@client ceph]# mount.ceph node1:6789:/ /cephfs_data/ -o name=admin,secretfile=/etc/ceph/admin.key
#解读:node1:6789:/ /cephfs_data/,其中6789是mon的端口,客户端挂载连接找mon的,因为我们node1上创建了3个mon,所以这里写node2,node3都可以,斜杠表示找根,找node1的根就是找我们在node1上创建的cephfs文件系统,/cephfs_data/表示挂载到本地的ceph_data目录,-o表示指定参数选项,name=admin,secretfile=/etc/ceph/admin.key 表示使用用户名为admin,秘钥使用/etc/ceph/admin.key秘钥文件进行连接mon
[root@client ceph]# df -h #查看是否挂载了
Filesystem Size Used Avail Use% Mounted on
192.168.118.128:6789:/ 532M 0 532M 0% /cephfs_data #已成功挂载
#可以使用多个客户端, 同时挂载此cephfs文件存储,可实现同读同写
上一步我们创建一个ceph文件存储,下载我们测试删除ceph文件存储。
#第1步: 在客户端上删除数据,并umount所有挂载
[root@client /]# cd /cephfs_data/
[root@client cephfs_data]# rm -rf * #删除全部文件
[root@client /]# umount /cephfs_data/ #在客户端先卸载
[root@client /]# df -h #查看一下,发现已经卸载了
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 6.2G 1.6G 4.7G 26% /
/dev/sda1 1014M 138M 877M 14% /boot
[root@client /]#
#第2步: 停掉所有节点的mds(只有停掉mds才能删除文件存储),因为我们刚开始的创建了3个mds,所以需要都停掉
[root@node1 ~]# systemctl stop ceph-mds.target #停掉node1上的mds服务
[root@node2 ~]# systemctl stop ceph-mds.target #停掉node2上的mds服务
[root@node3 ~]# systemctl stop ceph-mds.target #停掉node3上的mds服务
#第3步: 回到集群任意一个节点上(node1,node2,node3其中之一)删除Ceph文件存储
[root@node1 ceph]# ceph fs rm cephfs --yes-i-really-mean-it #删除文件存储,文件存储名就是cephfs
[root@node1 ceph]# ceph fs ls #查看文件存储,已经没有了
No filesystems enabled
[root@node1 ceph]#
#第4步: 删除文件存储的那两个池
[root@node1 ceph]# ceph osd pool ls #查看池
ceph_metadata
ceph_data
[root@node1 ceph]# ceph osd pool delete ceph_metadata ceph_metadata --yes-i-really-really-mean-it #删除ceph_metadata池
pool 'ceph_metadata' removed
[root@node1 ceph]# ceph osd pool delete ceph_data ceph_data --yes-i-really-really-mean-it #删除ceph_data池
pool 'ceph_data' removed
[root@node2 ceph]# ceph osd pool ls #查看池已经被删除了
#第4步: 如果你下次还要创建cephfs文件存储,可以把mds服务启动,然后参照上的创建步骤即可
[root@node1 ~]# systemctl start ceph-mds.target
[root@node2 ~]# systemctl start ceph-mds.target
[root@node3 ~]# systemctl start ceph-mds.target
rbd块存储,ceph集群共享出来的一个块存储空间,对用户客户端而言就是一块硬盘,如/dev/rbd0,用户可以对/dev/rbd0这块硬盘进行自由的格式化成为自己想要的ext4或xfs文件系统。
注意:rbd块存储只能由一个客户端同一时刻挂载使用,换句话说就是具有独占性,不支持两个用户客户端同时挂载一个rbd块存储。
rbd块优缺点:读写性能好,具有独占性,即多个客户端无法同时挂载。
注意:块存储要在客户端上面做的,这一点与gluster不同。
# 确认内核是否支持rbd
[root@node3 ceph]# modprobe rbd #内核加载rbd
[root@node3 ceph]# lsmod | grep rbd #有输出说明支持
rbd 83640 0
libceph 306625 1 rbd
#第1步: 在node1上同步配置文件到client客户端,因为要在客户端上做块储存
[root@node1 ~]# cd /etc/ceph #切换目录
[root@node1 ceph]# ceph-deploy admin client #将node1上的配置文件同步给client客户端
#第2步: 客户端建立存储池,并初始化
[root@client ~]# cd /etc/ceph #切换目录
[root@client ceph]# ceph osd pool create rbd_pool 64 #创建pool,pg为64个
pool 'rbd_pool' created
[root@client ceph]# rbd pool init rbd_pool #使用rdb命令初始化存储池
#第3步: 创建一个image(我这里image名为volume1,大小为1024M)
[root@client ceph]# rbd create volume1 --pool rbd_pool --size 1024 #创建一个1G的image,名为volume1
[root@client ceph]# rbd ls rbd_pool #查看image
volume1
[root@client ceph]# rbd info volume1 -p rbd_pool #查看刚才创建image
rbd image 'volume1':
size 1 GiB in 256 objects
order 22 (4 MiB objects)
id: 86256b8b4567
block_name_prefix: rbd_data.86256b8b4567
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Wed Jan 5 21:19:19 2022
[root@client ceph]#
#第4步: 将创建的image 映射成块设备
[root@client ceph]# rbd map rbd_pool/volume1 #将创建的volume1映射成块设备
rbd: sysfs write failed #因为rbd镜像的一些特性,OS kernel并不支持,所以映射报错
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@client ceph]# rbd feature disable rbd_pool/volume1 object-map fast-diff deep-flatten #根据上面的报错提示执行这一条命令
[root@client ceph]# rbd map rbd_pool/volume1 #继续将创建的volume1映射成块设备,映射成功
/dev/rbd0 #这个就是映射成功的块设备,可以自由分区格式化了
#第5步: 查看映射
[root@client ceph]# rbd showmapped #显示已经映射的块设备
id pool image snap device
0 rbd_pool volume1 - /dev/rbd0
[root@client ceph]# rbd unmap /dev/rbd0 #使用这条命令可以取消映射
#第6步: 分区,格式化,挂载
[root@client ceph]# fdisk /dev/rbd0 #分区
[root@client ceph]# lsblk #查看磁盘设备
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
rbd0p1 252:1 0 1020M 0 part #已经分好区了
[root@client ceph]# mkfs.xfs /dev/rbd0p1 #格式化分区,创建文件系统
[root@client ceph]# mount /dev/rbd0p1 /mnt/ #挂载
[root@client ceph]# df -Th #查看已挂载设备
Filesystem Type Size Used Avail Use% Mounted on
/dev/rbd0p1 xfs 1018M 33M 986M 4% /mnt #已成功挂载
[root@client ceph]# cat /etc/passwd >>/mnt/file.txt #读写文件测试,正常
#注意:块存储是不能实现同读同写的,请不要两个客户端同时挂载进行读写
经测试,分区后/dev/rbd0p1
不能在线扩容,直接使用/dev/rbd0
才可以。为了更好的演示扩容,这里把上一步的分区删掉。
#先把上一步创建的分区删除,直接使用整块磁盘不分区
[root@client ~]# cd /etc/ceph
[root@client ceph]# umount /mnt #先卸载
[root@client ceph]# fdisk /dev/rbd0 #输入d删除分区
[root@client ceph]# mkfs.xfs /dev/rbd0 -f #将整个设备格式化,不分区了
[root@client ceph]# mount /dev/rbd0 /mnt #重新挂载
[root@client ceph]# df -h |tail -1 #查看是否挂载成功,已经挂载成功了
/dev/rbd0 1014M 33M 982M 4% /mnt
#开始在线扩容
[root@client ceph]# rbd resize --size 1500 rbd_pool/volume1 #扩容成1500M,原来是1024M
Resizing image: 100% complete...done.
[root@client ceph]# rbd info rbd_pool/volume1 |grep size #现在变成1.5G了
size 1.5 GiB in 375 objects
[root@client ceph]# xfs_growfs -d /mnt/ #扩展文件系统,虽然上一步扩容了磁盘,但还需要使用xfs_growfs命令来扩容xfs文件系统
[root@client ceph]# df -h |tail -1 #查看是否扩容成功,已经显示为1.5G了
/dev/rbd0 1.5G 33M 1.5G 3% /mnt
缩容必须要数据备份,卸载,缩容后重新格式化再挂载,所以这里只做了解,因为企业线上环境一般不会做缩容。
[root@client ceph]# rbd resize --size 500 rbd_pool/volume1 --allow-shrink #容量缩小为500M
Resizing image: 100% complete...done.
[root@client ceph]# rbd info rbd_pool/volume1 |grep size #查看容量,已经是500M了
size 500 MiB in 125 objects
[root@client ceph]# umount /mnt/ #客户端卸载
[root@client ceph]# mkfs.xfs -f /dev/rbd0 #重新格式化设备
[root@client ceph]# mount /dev/rbd0 /mnt/ #重新挂载
[root@client ceph]# df -h |tail -1 #查看已挂载设备,已经是500M了,缩容成功
/dev/rbd0 498M 26M 473M 6% /mnt
[root@client ceph]#
当一个块存储不需要的时候,我们可以删除块存储。
[root@client ceph]# umount /mnt/ #客户端先卸载
[root@client ceph]# rbd unmap /dev/rbd0 #取消映射
[root@client ceph]# ceph osd pool delete rbd_pool rbd_pool --yes-i-really-really-mean-it #删除pool
pool 'rbd_pool' removed
ceph对象存储使用ceph对象网关守护进程radosgw,radosgw是一个用于ceph存储集群交互的http 服务器。
ceph object gateway提供了兼容Amazon S3和OpenStack Swift接口,
#第1步: 在node1上创建rgw对象网关
[root@node1 ~]# cd /etc/ceph/ #必须先切换到ceph的配置文件目录
[root@node1 ceph]# ceph-deploy rgw create node1 #创建一个对象存储,关键字就是rgw
[ceph_deploy.conf][DEBUG ] found configuration file at: /root/.cephdeploy.conf
[ceph_deploy.cli][INFO ] Invoked (2.0.1): /usr/bin/ceph-deploy rgw create node1
[ceph_deploy.cli][INFO ] ceph-deploy options:
[ceph_deploy.cli][INFO ] username : None
[ceph_deploy.cli][INFO ] verbose : False
[ceph_deploy.cli][INFO ] rgw : [('node1', 'rgw.node1')]
[ceph_deploy.cli][INFO ] overwrite_conf : False
[ceph_deploy.cli][INFO ] subcommand : create
[ceph_deploy.cli][INFO ] quiet : False
[ceph_deploy.cli][INFO ] cd_conf : <ceph_deploy.conf.cephdeploy.Conf instance at 0x7f7b32ef6f38>
[ceph_deploy.cli][INFO ] cluster : ceph
[ceph_deploy.cli][INFO ] func : <function rgw at 0x7f7b3353f500>
[ceph_deploy.cli][INFO ] ceph_conf : None
[ceph_deploy.cli][INFO ] default_release : False
[ceph_deploy.rgw][DEBUG ] Deploying rgw, cluster ceph hosts node1:rgw.node1
[node1][DEBUG ] connected to host: node1
[node1][DEBUG ] detect platform information from remote host
[node1][DEBUG ] detect machine type
[ceph_deploy.rgw][INFO ] Distro info: CentOS Linux 7.9.2009 Core
[ceph_deploy.rgw][DEBUG ] remote host will use systemd
[ceph_deploy.rgw][DEBUG ] deploying rgw bootstrap to node1
[node1][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf
[node1][WARNIN] rgw keyring does not exist yet, creating one
[node1][DEBUG ] create a keyring file
[node1][DEBUG ] create path recursively if it doesn't exist
[node1][INFO ] Running command: ceph --cluster ceph --name client.bootstrap-rgw --keyring /var/lib/ceph/bootstrap-rgw/ceph.keyring auth get-or-create client.rgw.node1 osd allow rwx mon allow rw -o /var/lib/ceph/radosgw/ceph-rgw.node1/keyring
[node1][INFO ] Running command: systemctl enable [email protected]
[node1][WARNIN] Created symlink from /etc/systemd/system/ceph-radosgw.target.wants/[email protected] to /usr/lib/systemd/system/[email protected].
[node1][INFO ] Running command: systemctl start [email protected]
[node1][INFO ] Running command: systemctl enable ceph.target
[ceph_deploy.rgw][INFO ] The Ceph Object Gateway (RGW) is now running on host node1 and default port 7480 #7480就是对象存储的对外端口
[root@node1 ceph]# lsof -i:7480 #7480就是对象存储的对外端口
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
radosgw 94111 ceph 40u IPv4 720930 0t0 TCP *:7480 (LISTEN)
[root@node1 ceph]#
#第2步: 在客户端测试连接对象网关。连接对象存储需要用户账号秘钥连接,所以需要再客户端创建用户秘钥
#创建账号秘钥,如下所示(radosgw-admin命令其实是yum -y install ceph-common安装的)
[root@client ceph]# radosgw-admin user create --uid="MyUser" --display-name="MyUser"
{
"user_id": "MyUser",
"display_name": "MyUser",
"email": "",
"suspended": 0,
"max_buckets": 1000,
"auid": 0,
"subusers": [],
"keys": [
{
"user": "MyUser", #用户名
"access_key": "KPCUG4915AJIEWIYRPP5", #访问秘钥
"secret_key": "bTUYij5DMcMM7qnXyQrr8jtcuoPjhYU2nsB7Psim" #安全密码
}
],
"swift_keys": [],
"caps": [],
"op_mask": "read, write, delete",
"default_placement": "",
"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": []
}
#第3步:使用S3连接ceph对象网关
#AmazonS3是一种面向Internet的对象存储服务.我们这里可以使用s3工具连接ceph的对象存储进行操作。
[root@client ceph]# yum install s3cmd -y #安装s3模块,用于连接对象存储
#安装好s3包后就会有s3cmd命令用于连接对象存储,为了方便,我们可以把一些连接参数写成一个.s3cfg文件,s3cmd命令默认会去读这个文件
[root@client ~]# vim /root/.s3cfg #创建文件,并写入一下内容
[default]
access_key = KPCUG4915AJIEWIYRPP5 #这个访问秘钥就是我们创建MyUser用户时的访问秘钥
secret_key = AAbYij5DMcMM7qnXyQrr8jTYuoPjhFH2nsB7Psim #这个安全秘钥就是我们创建MyUser用户时的安全秘钥
host_base = 192.168.118.128:7480 #对象存储的IP和端口
host_bucket = 192.168.118.128:7480/%(bucket) #桶,对象存储的IP和端口
cloudfront_host = 192.168.118.128:7480
use_https = False
#第4步:s3cmd命令测试连接对象存储
[root@client ceph]# s3cmd mb s3://test #创建一个名为test的桶,桶的概念可理解为目录
Bucket s3://test/ created
[root@client ceph]# s3cmd ls #查看桶
2022-01-05 16:19 s3://test
[root@client ~]# s3cmd put /var/log/yum.log s3://test #put文件到桶,即上传文件
upload: /var/log/yum.log -> s3://test/yum.log [1 of 1]
5014 of 5014 100% in 1s 3.72 KB/s done
[root@client ~]# s3cmd get s3://test/yum.log #get文件到本地,即下载文件到本地
download: s3://test/yum.log -> ./yum.log [1 of 1]
5014 of 5014 100% in 0s 1106.05 KB/s done
[root@client ~]# ll #查看文件
total 12
-rw-------. 1 root root 1203 Jan 1 15:45 anaconda-ks.cfg
-rw-r--r--. 1 root root 5014 Jan 5 16:22 yum.log #文件已经下载到本地了