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

目录

    • 前言
    • ceph官网
    • ceph的核心组件
    • ceph可以提供3种存储
    • 环境要求及搭建
    • 集群搭建
      • 第1步、配置ssh免密登
      • 第2步、以node1为部署节点,在node1配置部署ceph-deploy工具
      • 第3步、在node1上创建集群
      • 第4步、ceph集群节点安装ceph
      • 第5步、客户端安装ceph-common
      • 第6步、创建mon(监控)
      • 第7步、 创建mgr(管理)
      • 第8步、创建osd(存储盘)
    • 扩容
      • osd扩容
      • ceph集群节点扩容
    • 存储原理
    • 创建pool
    • 删除pool
    • ceph文件系统-cephfs
      • 创建cephfs文件存储
      • 客户端挂载Ceph文件存储
      • 删除cephfs文件存储
    • rbd块存储
      • 创建rbd块存储
      • rbd块存储在线扩容
      • rbd块存储离线缩容
      • 删除rbd块存储
    • 对象存储-radosgw

前言

环境: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里可以存放多个对象, 对象就是由客户端写入的数据分离的单位。
分布式存储之ceph软件安装及使用_第1张图片

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

注意:块存储要在客户端上面做的,这一点与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				#读写文件测试,正常

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

rbd块存储在线扩容

经测试,分区后/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

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 [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					#文件已经下载到本地了

你可能感兴趣的:(存储篇,分布式,运维,ceph,分布式存储)