分布式存储之ceph软件安装及使用

前言

环境:centos7.9 ceph version 13.2.10
上一篇我们讲了文件类型的分布式存储glusterfs,这次我们来讲另外一个分布式存储系统,即ceph;
ceph是一个能提供文件存储、块存储、对象存储三种类型的分布式存储文件系统,它提供了一个可无限伸缩的ceph存储集群。

ceph官网

官网:https://ceph.com
官方文档:https://docs.ceph.com/en/latest/start/intro/

ceph的核心组件

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。

ceph可以提供3种存储

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

集群搭建

以上环境准备完毕,我们来开始搭建集群。

第1步、配置ssh免密登

此步骤不是必须,如果使用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

第2步、以node1为部署节点,在node1配置部署ceph-deploy工具

#ceph-deploy是一个工具,我们使用ceph-deploy这个工具来搭建ceph集群
[root@node1 ~]# yum install ceph-deploy -y

第3步、在node1上创建集群

[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]#

第4步、ceph集群节点安装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 ~]# 					

第5步、客户端安装ceph-common

#在client客户端服务器安装
[root@client ~]# yum -y  install ceph-common

第6步、创建mon(监控)

[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 /]# 

第7步、 创建mgr(管理)

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]# 

第8步、创建osd(存储盘)

#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存储系统了。

扩容

osd扩容

服务器新加一块磁盘,然后执行命令即可:ceph-deploy osd create --data /dev/sdb node4

ceph集群节点扩容

假设需要扩容,那么再加一个新的集群节点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里可以存放多个对象, 对象就是由客户端写入的数据分离的单位。
在这里插入图片描述

创建pool

[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

#删除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:     

ceph文件系统-cephfs

cephfs,即ceph filesystem的简写,cephfs可以支持多客户端同时挂载同时读取数据同时写入数据。cephfs类似于nfs,客户端只需要使用mount.ceph命令挂载远程的ceph集群的目录到本地即可,这样客户端就可以想写入本地数据一样轻松的使用cephfs。
cephfs的优缺点:可以同时被多个客户端同时挂载读写使用,缺点就是相对于ceph其他存储类型如rbd,对象网关而言读写性能差一点,但这不是在要求性能极其严格的业务场景下,cephfs完全胜任。。

创建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文件存储

一个客户端想要挂载远程上的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文件存储,可实现同读同写

删除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块存储

rbd块存储,ceph集群共享出来的一个块存储空间,对用户客户端而言就是一块硬盘,如/dev/rbd0,用户可以对/dev/rbd0这块硬盘进行自由的格式化成为自己想要的ext4或xfs文件系统。
注意:rbd块存储只能由一个客户端同一时刻挂载使用,换句话说就是具有独占性,不支持两个用户客户端同时挂载一个rbd块存储。
rbd块优缺点:读写性能好,具有独占性,即多个客户端无法同时挂载。

创建rbd块存储

创建rbd块设备步骤:
1、分发ceph配置文件和keyring文件给客户端(客户端要使用这些文件去链接ceph集群)、ceph集群内创建块设备pool、初始化pool、创建image;
2、客户端将image 映射为本地rbd块设备、格式化本地rbd块设备进行挂载使用即可。

# 确认内核是否支持rbd
[root@client ceph]# modprobe  rbd			#内核加载rbd
[root@client ceph]# lsmod | grep rbd		#有输出说明支持
rbd                    83640  0 
libceph               306625  1 rbd
#第1步: 在node1上同步配置文件到client客户端,因为客户端上要使用rbd就必须去链接ceph集群
[root@node1 ~]# cd /etc/ceph									#切换目录
[root@node1 ceph]# ceph-deploy admin client						#将node1上的配置文件同步给client客户端

#第2步: 服务端建立存储池,并初始化
[root@node1 ~]# cd /etc/ceph									#切换目录
[root@node1 ceph]# ceph osd pool create rbd_pool 64				#创建pool,pg为64个
pool 'rbd_pool' created
[root@node1 ceph]# rbd pool init rbd_pool						#使用rdb命令初始化存储池

#第3步: 创建一个image(我这里image名为volume1,大小为1024M)
[root@node1 ceph]# rbd create volume1 --pool rbd_pool --size 1024		#创建一个1G的image,名为volume1 
[root@node1 ceph]# rbd ls rbd_pool								#查看image
volume1
[root@node1 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@node1 ceph]# 
#第4步: 将创建的image 映射成块设备
[root@node1 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@node1 ceph]# rbd feature disable rbd_pool/volume1 object-map fast-diff deep-flatten		#根据上面的报错提示执行这一条命令

#现在去到客户端进行map映射image为rbd块设备
[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				#读写文件测试,正常

#注意:块存储是不能实现同读同写的,请不要两个客户端同时挂载进行读写

rbd块存储在线扩容

经测试,分区后/dev/rbd0p1不能在线扩容,直接使用/dev/rbd0才可以。为了更好的演示扩容,这里把上一步的分区删掉。
(这里应该这么理解,ceph集群内可以对image进行在线扩容,那么客户端看到的/dev/rbd0磁盘就会在线扩容成功了,如果/dev/rbd0是整个磁盘没有分区挂载的,那么肯定rbd0块设备增大了然后在扩展文件系统则你看到的文件系统自然就增大了,如果/dev/rbd0有分区/dev/rbd0p1,那么紧紧是/dev/rbd0快设备增大了,物理分区/dev/rbd0p1肯定没有增大呀,人家扩容增大的是rbd0磁盘设备,不管分区是否分占满整个磁盘空间,还是分区仅占磁盘的一部分空间,分区都不会随着磁盘的增大而增大,而不创建分区直接使用磁盘格式化为文件系统挂载,这样image增大,磁盘增大,挂载后的文件系统就可以随之扩展增大)

#先把上一步创建的分区删除,直接使用整块磁盘不分区
[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

rbd块存储离线缩容

缩容必须要数据备份,卸载,缩容后重新格式化再挂载,所以这里只做了解,因为企业线上环境一般不会做缩容。

[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]# 

删除rbd块存储

当一个块存储不需要的时候,我们可以删除块存储。

[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

对象存储-radosgw

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 ceph-radosgw@rgw.node1
[node1][WARNIN] Created symlink from /etc/systemd/system/ceph-radosgw.target.wants/ceph-radosgw@rgw.node1.service to /usr/lib/systemd/system/ceph-radosgw@.service.
[node1][INFO  ] Running command: systemctl start ceph-radosgw@rgw.node1
[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					#文件已经下载到本地了
  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值