分布式文件系统

  • 分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连
  • 分布式文件系统的设计基于客户机/服务器模式

常用的分布式文件系统

  • Lustre
  • Hadoop
  • FastDFS
  • Ceph
  • GlusterFS

什么是Ceph

  • Ceph是一个分布式文件系统
  • 具有高扩展,高可用,高性能的特点
  • Ceph可以提供对象存储,块存储,文件系统存储
  • 块存储(iscsi)客户端多了一个磁盘,文件系统(NFS)客户端直接mount
  • Ceph可以提供PB级别的存储空间(PB→TB→GB),1024G*1024G=1058576G
  • 软件定义存储(Software Defined Storage)作为存储行业的一大发展趋势,已经越来越受到市场的认可
    ceph-编程知识网
    链接在此!

Ceph组件

  • OSDs 存储设备
  • Monitors 集群监控软件
  • RadosGateway(RGW) 对象存储网关
  • MDSs 存放文件系统的元数据(对象存储和 块存储不需要该组件)
  • Client ceph客户端

实验准备

问题
准备四台KVM虚拟机,其三台作为存储集群节点, 一台安装为客户端,实现如下功能:

  • 创建1台客户端虚拟机
  • 创建3台存储集群虚拟机
  • 配置主机名、IP地址、YUM源
  • 修改所有主机的主机名
  • 配置无密码SSH连接
    – 配置NTP时间同步
  • 创建虚拟机磁盘

实验拓扑图

  • 1台客户端虚拟机
  • 3台存储集群虚拟机
    ceph-编程知识网
    所有主机的主机名及对应的IP地址如表-1所示。
    注意:所有主机基本系统光盘的YUM源必须提前配置好。
    ceph-编程知识网

步骤

1)物理机为所有节点配置yum源服务器。所有主机都要做!!!
提示:前提ceph.iso已经挂载好才可以进行下一步!!

[root@node1 ~]# vim  /etc/yum.repos.d/ceph.repo
[MON]
name=mon
baseurl=file:///media/MON
gpgcheck=0
[OSD]
name=osd
baseurl=file:///media/OSD
gpgcheck=0
[Tools]
name=tools
baseurl=file:///media/Tools
gpgcheck=0
[root@node1 ~]# yum  repolist 
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
源标识                                源名称                               状态
!MON                                  mon                                     41
!OSD                                  osd                                     28
!Tools                                tools                                   33
!centos                               centos                               9,911
repolist: 10,013
  1. SSH免密登录,配置无密码连接(包括自己远程自己也不需要密码),在node1操作。
[root@node1 ~]# ssh-keygen   #一路回车
[root@node1 ~]# for  i  in 10 11 12 13  
> do
> ssh-copy-id   192.168.4.$i
> done
#############################################################
测试:
[root@node1 ~]# ssh  192.168.4.10
Last login: Thu Feb  6 00:17:09 2020 from 192.168.4.1
[root@client ~]# exit
登出
Connection to 192.168.4.10 closed.
[root@node1 ~]# ssh  192.168.4.12
Last login: Wed Feb  5 23:21:36 2020 from 192.168.4.1
[root@node2 ~]# exit
登出
Connection to 192.168.4.12 closed.
[root@node1 ~]# ssh  192.168.4.13
Last login: Wed Feb  5 23:25:45 2020 from 192.168.4.1
[root@node3 ~]# exit
登出
Connection to 192.168.4.13 closed.
[root@node1 ~]# ssh  192.168.4.11
Last login: Thu Feb  6 00:18:12 2020 from 192.168.4.1
[root@node1 ~]# exit
登出
Connection to 192.168.4.11 closed.
确保每台计算机远程都不需要密码

3)修改/etc/hosts并同步到所有主机。
警告:/etc/hosts解析的域名必须与本机主机名一致!!!!

[root@node1 ~]# vim  /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.4.10   client
192.168.4.11   node1
192.168.4.12   node2
192.168.4.13   node3
[root@node1 ~]# for  i  in  client  node2  node3
> do
> scp  /etc/hosts  $i:/etc
> done
###########################################################
测试:此时,每台计算机的hosts解析中都有client,node1,node2,node3
[root@node2 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.4.10   client
192.168.4.11   node1
192.168.4.12   node2
192.168.4.13   node3

4)配置NTP时间同步(client做时间服务器,所有node节点与client时间同步)

[root@client ~]# vim  /etc/chrony.conf26 allow 192.168.4.0/1629 local stratum 10
[root@client ~]# systemctl  restart   chronyd
[root@client ~]# firewall-cmd --set-default-zone=trusted 
success
[root@client ~]# vim  /etc/sysconfig/selinux 
7 SELINUX=permissive
[root@client ~]# setenforce 0所有node节点与client同步时间
[root@node1 ~]# vim  /etc/chrony.conf3 server 192.168.4.10 iburst
[root@node1 ~]# for  i  in  node1 node2  node3 
> do
> scp  /etc/chrony.conf   $i:/etc
> ssh   $i   "systemctl  restart  chronyd"
> done
chrony.conf                                                              100%  991     1.1MB/s   00:00    
chrony.conf                                                              100%  991     1.1MB/s   00:00    
chrony.conf                                                              100%  991   962.8KB/s  
[root@node1 ~]# chronyc   sources  -V        #快速测试时间同步,*表示已经同步
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* client                       10  10   377   609    -12us[  -18us] +/-  150us

5)打开VMware,给除了client的每台虚拟机添加两块磁盘(20G)
ceph-编程知识网
一路下一步,最后呈现的效果如下:
ceph-编程知识网
添加完后,重启虚拟机,使用lsblk查看是否添加成功

部署ceph集群

问题
部署Ceph集群服务器,实现以下目标:

  • 安装部署工具ceph-deploy
  • 创建ceph集群
  • 准备日志磁盘分区
  • 创建OSD存储空间
  • 查看ceph状态,验证

步骤

  • 步骤一:安装部署软件ceph-deploy

1)在node1安装部署工具,学习工具的语法格式。

[root@node1 ~]# yum  -y  install  ceph-deploy      #一定要在有ssh密钥的主机上安装
[root@node1 ~]# mkdir   ceph-cluster         #但凡执行ceph-cluster脚本,必须在该目录下,否则会出错
[root@node1 ~]# cd ceph-cluster
  • 步骤二:部署Ceph集群

1)给所有节点安装ceph相关软件包。

[root@node1 ceph-cluster]# for  i   in  node1  node2 node3> do 
> ssh  $i  "yum  -y  install  ceph-mon  ceph-osd   ceph-mds  ceph-radosgw"
> done

部署mon集群,一定要确保 在ceph-cluster目录下!!!

首先关闭所有节点的防火墙和selinux
[root@node1 ceph-cluster]# firewall-cmd  --set-default-zone=trusted
success
[root@node1 ceph-cluster]# vim  /etc/sysconfig/selinux 
7 SELINUX=permissive
[root@node1 ceph-cluster]# setenforce 0
############################################################
[root@node1 ceph-cluster]# pwd
/root/ceph-cluster

2)创建Ceph集群配置,在ceph-cluster目录下生成Ceph配置文件。
在ceph.conf配置文件中定义monitor主机是谁。

[root@node1 ceph-cluster]# ceph-deploy  new  node1 node2  node3#测试所有node节点的状态,创建了ceph的配置文件ceph.conf(在当前目录下)
[root@node1 ceph-cluster]# ls
ceph.conf  ceph-deploy-ceph.log  ceph.mon.keyring
###################################
[root@node1 ceph-cluster]# ls  /etc/ceph/
rbdmap
#/etc/ceph目录是启动ceph需要读取配置文件的地方

3)初始化所有节点的mon服务,也就是启动mon服务(主机名解析必须对)。

[root@node1 ceph-cluster]# ceph-deploy  mon  create-initial
#把当前目录下的ceph配置文件远程拷贝到目标主机(node1 node2 node3)放到/etc/ceph目录,并且启动ceph-mon服务(服务名为ceph-mon@主机名)
#############################################################
查看状态:
[root@node1 ceph-cluster]# systemctl  status  ceph-mon@node1
#确认mon服务是否已经启动
[root@node1 ceph-cluster]# ceph  -scluster 3b2ca6aa-8018-42c4-8bfe-05902cd313ddhealth HEALTH_ERR64 pgs are stuck inactive for more than 300 seconds64 pgs stuck inactiveno osdsmonmap e2: 3 mons at {node1=192.168.4.11:6789/0,node2=192.168.4.12:6789/0,node3=192.168.4.13:6789/0}    #6789为起完服务后monitior的端口号election epoch 8, quorum 0,1,2 node1,node2,node3osdmap e1: 0 osds: 0 up, 0 inflags sortbitwisepgmap v2: 64 pgs, 1 pools, 0 bytes data, 0 objects0 kB used, 0 kB / 0 kB avail64 creating

常见错误及解决方法(非必要操作,有错误可以参考):
如果提示如下错误信息:

[node1][ERROR ] admin_socket: exception getting command descriptions: [Error 2] No such file or directory

解决方案如下(在node1操作):
先检查自己的命令是否是在ceph-cluster目录下执行的!!!!如果确认是在该目录下执行的create-initial命令,依然报错,可以使用如下方式修复。

[root@node1 ceph-cluster]# vim ceph.conf      #文件最后追加以下内容
public_network = 192.168.4.0/24

修改后重新推送配置文件:

[root@node1 ceph-cluster]# ceph-deploy --overwrite-conf config push node1 node2 node3
  • 步骤三:创建OSD
    每台虚拟机都添加了 两块磁盘(/dev/sdb、/dev/sdc)
    sdb用来做缓存盘,sdc做数据盘

读写操作 缓存 数据
client<——–>ceph集群[sdb]<——–>[sdc] 硬盘分为传统磁盘固态盘
传统磁盘:性能较低,容量大
固态盘(SSD):容量很小,性能很好 可以使用固态盘做缓存盘,磁盘做数据盘

假设每个磁盘是20G,最终我们的ceph集群提供60G的容量(不考虑冗余备份)
node1 [sdb]+[sdc]=20G #sdb为缓存盘,只能临时读写数据,不能算作容量内
node2 [sdb]+[sdc]=20G
node3 [sdb]+[sdc]=20G

1)把所有磁盘初始化(格式化,仅在node1操作)

[root@node1 ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   20G  0 disk 
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0   19G  0 part ├─centos-root 253:0    0   17G  0 lvm  /└─centos-swap 253:1    0    2G  0 lvm  [SWAP]
sdb               8:16   0   20G  0 disk 
sdc               8:32   0   20G  0 disk 
sr0              11:0    1  284M  0 rom  /media
sr1              11:1    1  8.8G  0 rom  /mnt
[root@node1 ~]# cd  ceph-cluster/
[root@node1 ceph-cluster]# ceph-deploy  disk  zap  node1:sdb    node1:sdc    #相当于远程加for循环,写几个参数就循环几次
[root@node1 ceph-cluster]# ceph-deploy  disk  zap  node2:sdb    node2:sdc
[root@node1 ceph-cluster]# ceph-deploy  disk  zap  node3:sdb    node3:sdc
########################################################
也可以直接一次性初始化
[root@node1 ceph-cluster]# ceph-deploy  disk  zap  node1:sdb    node1:sdc node2:sdb   node2:sdc  node3:sdb   node3:sdc

2)启动OSD服务,共享这些磁盘

[root@node1 ceph-cluster]# ceph-deploy   osd  create  node1:sdc:/dev/sdb
//远程node1启动osd服务,把/dev/sdc共享给用户,/dev/sdb做为缓存盘
并且把sdc挂载到了/var/lib/ceph/xxx目录
[root@node1 ceph-cluster]# ceph-deploy   osd  create  node2:sdc:/dev/sdb
[root@node1 ceph-cluster]# ceph-deploy   osd  create  node3:sdc:/dev/sdb
#########################################################
也可以一次性远程多台主机
[root@node1 ceph-cluster]# ceph-deploy   osd  create  node1:sdc:/dev/sdb   node2:sdc:/dev/sdb   node3:sdc:/dev/sdb
  • 常见错误及解决方法(非必须操作)。

使用osd create创建OSD存储空间时,如提示下面的错误提示:

[ceph_deploy][ERROR ] RuntimeError: bootstrap-osd keyring not found; run 'gatherkeys'

可以使用如下命令修复文件,重新配置ceph的密钥文件:

[root@node1 ceph-cluster]#  ceph-deploy gatherkeys node1 node2 node3 

3)验证测试,检查集群状态:

[root@node1 ceph-cluster]# ceph  -scluster 3b2ca6aa-8018-42c4-8bfe-05902cd313ddhealth HEALTH_OKmonmap e2: 3 mons at {node1=192.168.4.11:6789/0,node2=192.168.4.12:6789/0,node3=192.168.4.13:6789/0}election epoch 14, quorum 0,1,2 node1,node2,node3osdmap e14: 3 osds: 3 up, 3 inflags sortbitwisepgmap v28: 64 pgs, 1 pools, 0 bytes data, 0 objects100 MB used, 61306 MB / 61406 MB avail64 active+clean
此时可以看到,有三个osd,容量为60G,状态为OK

验证是否挂载成功

[root@node1 ceph-cluster]# df  -h
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   17G  1.4G   16G    8% /
devtmpfs                 224M     0  224M    0% /dev
tmpfs                    236M     0  236M    0% /dev/shm
tmpfs                    236M  5.6M  230M    3% /run
tmpfs                    236M     0  236M    0% /sys/fs/cgroup
/dev/sr0                 284M  284M     0  100% /media
/dev/sr1                 8.8G  8.8G     0  100% /mnt
/dev/sda1               1014M  142M  873M   14% /boot
tmpfs                     48M     0   48M    0% /run/user/0
/dev/sdc1                 20G   34M   20G    1% /var/lib/ceph/osd/ceph-0
可以看到/dev/sdc已经挂载到ceph集群中了
[root@node1 ceph-cluster]# systemctl   status    ceph-osd@0.service    #服务已经成功启动,OSD的服务名称ceph-osd@数字(可以在@后tab)
● ceph-osd@0.service - Ceph object storage daemonLoaded: loaded (/usr/lib/systemd/system/ceph-osd@.service; enabled; vendor preset: disabled)Active: active (running) since 四 2020-02-06 18:49:43 CST; 40min agoMain PID: 1973 (ceph-osd)
[root@node1 ceph-cluster]# ceph   osd  tree
ID WEIGHT  TYPE NAME      UP/DOWN REWEIGHT PRIMARY-AFFINITY 
-1 0.05846 root default                                     
-2 0.01949     host node1                                   0 0.01949         osd.0       up  1.00000          1.00000 
-3 0.01949     host node2                                   1 0.01949         osd.1       up  1.00000          1.00000 
-4 0.01949     host node3                                   2 0.01949         osd.2       up  1.00000          1.00000 

2)常见错误(非必须操作)。
如果查看状态包含如下信息:

health: HEALTH_WARNclock skew detected on  node2, node3…  

clock skew表示时间不同步,解决办法:请先将所有主机的时间都使用NTP时间同步!!!
Ceph要求所有主机时差不能超过0.05s,否则就会提示WARN。
如果状态还是失败,可以尝试执行如下命令,重启ceph服务:

[root@node1 ~]#  systemctl restart ceph\*.service ceph\*.target

Ceph块存储

  • 单机块设备
    1.光盘
    2.磁盘
  • 分布式块存储
    1.ceph
    2.cinder

什么是块存储

  • ceph块设备也叫做RADOS块设备 RADOS block device : RBD
  • RBD驱动已经很好地集成在了linux内核中
  • RBD提供了企业功能,如快照,COW克隆等
  • RBD还支持内存缓存,从而能够大大的提高性能
  • Linux内核可以直接访问ceph块存储
  • KVM可用于j借助于librbd访问
    ceph-编程知识网

创建Ceph块存储

问题
使用Ceph集群的块存储功能,实现以下目标:

  • 创建块存储镜像

  • 客户端映射镜像

  • 创建镜像快照

  • 使用快照还原数据

  • 使用快照克隆镜像

  • 删除快照与镜像
    步骤

  • 步骤一:创建镜像

1)查看存储池。

	[root@node1 ~]# ceph   osd  lspools
0 rbd,

2)创建镜像、查看镜像

[root@node1 ~]# rbd create jacob  --image-feature  layering --size 5G

#这里的jacob为创建的镜像名称,可以为任意字符。
#–image-feature参数指定我们创建的镜像有哪些功能,layering是开启COW(写实复制)功能。
#提示:ceph镜像支持很多功能,但很多是操作系统不支持的,我们只开启layering。

[root@node1 ~]# rbd  list      #列出所有共享镜像
jacob
[root@node1 ~]# rbd  info  jacob    #列出某个镜像的详细信息
rbd image 'jacob':size 5120 MB in 1280 objectsorder 22 (4096 kB objects)block_name_prefix: rbd_data.5e3a2ae8944aformat: 2features: layeringflags: 
  • 步骤二:动态调整

1)扩容容量

[root@node1 ~]# rbd  resize --size 15G  jacob
Resizing image: 100% complete...done.
[root@node1 ~]# rbd  info  jacob
rbd image 'jacob':size 15360 MB in 3840 objectsorder 22 (4096 kB objects)block_name_prefix: rbd_data.5e3a2ae8944aformat: 2features: layeringflags: 

2)缩减容量

[root@node1 ~]# rbd  resize --size 10G  jacob
rbd: shrinking an image is only allowed with the --allow-shrink flag
#此时缩减容量会报错,如果确认要缩减,添加--allow-shrink选项
[root@node1 ~]# rbd  resize --size 10G  jacob  --allow-shrink
Resizing image: 100% complete...done.
[root@node1 ~]# rbd  info  jacob
rbd image 'jacob':size 10240 MB in 2560 objectsorder 22 (4096 kB objects)block_name_prefix: rbd_data.5e3a2ae8944aformat: 2features: layeringflags: 

客户端访问共享(client做客户端主机)

首先确保客户端的yum源已经加载
[root@client ~]# yum  repolist
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
源标识                               源名称                                状态
MON                                  mon                                      41
OSD                                  osd                                      28
Tools                                tools                                    33
centos                               centos                                9,911
repolist: 10,013
[root@client ~]# yum -y  install  ceph-common.x86_64 
#客户端需要安装ceph-common软件包
[root@client ~]# scp   192.168.4.11:/etc/ceph/ceph.conf    /etc/ceph
#拷贝配置文件,配置文件中记录的有ceph集群服务器的IP信息
[root@client ~]# scp   node1:/etc/ceph/ceph.client.admin.keyring     /etc/ceph                #拷贝访问集群的密钥文件,有了密钥才有权限访问集群
[root@client ~]# lsblk         查看磁盘分布情况
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   20G  0 disk 
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0   19G  0 part ├─centos-root 253:0    0   17G  0 lvm  /└─centos-swap 253:1    0    2G  0 lvm  [SWAP]
sr0              11:0    1  284M  0 rom  /media
sr1              11:1    1  8.8G  0 rom  /mnt
[root@client ~]# rbd  map  jacob               #客户端连接jacob镜像
/dev/rbd0
[root@client ~]# lsblk      #再次查看 ,此时磁盘中多了一个rbd0
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   20G  0 disk 
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0   19G  0 part ├─centos-root 253:0    0   17G  0 lvm  /└─centos-swap 253:1    0    2G  0 lvm  [SWAP]
sr0              11:0    1  284M  0 rom  /media
sr1              11:1    1  8.8G  0 rom  /mnt
rbd0            252:0    0   10G  0 disk 
  • 步骤三:客户端进行快照还原数据的实验:
    快照:写数据;快照;模拟人为的误操作;还原快照
    副本:写数据,可以自动备份3份;删数据时,删除3份,主要用来解决单点故障的问题
    1)格式化,挂载,写数据
[root@client ~]# mkfs.xfs  /dev/rbd0
[root@client ~]# mount   /dev/rbd0  /data
[root@client ~]# df  -h 
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   17G  1.2G   16G    8% /
devtmpfs                 224M     0  224M    0% /dev
tmpfs                    236M     0  236M    0% /dev/shm
tmpfs                    236M  5.6M  230M    3% /run
tmpfs                    236M     0  236M    0% /sys/fs/cgroup
/dev/sr0                 284M  284M     0  100% /media
/dev/sda1               1014M  142M  873M   14% /boot
/dev/sr1                 8.8G  8.8G     0  100% /mnt
tmpfs                     48M     0   48M    0% /run/user/0
/dev/rbd0                 10G   33M   10G    1% /data
[root@client ~]# echo  "abc  hello  world"   >  /data/test.txt
  • 步骤四:回到node集群,创建快照
[root@node1 ~]# rbd  snap  ls  jacob                       #默认该镜像没有快照
[root@node1~]# rbd  snap  create   jacob  --snap  jacob-snap1
#给jacob镜像创建快照,快照名为jacob-snap1
[root@node1 ~]# rbd  snap  ls  jacob
SNAPID NAME            SIZE 4 jacob-snap1 10240 MB 

到client模拟数据被误操作删除(ceph不支持在线还原快照)

[root@client ~]# ls  /data
test.txt
[root@client ~]# rm  -rf  /data/test.txt 
[root@client ~]# umount  /data
[root@client ~]# ls /data

到node集群还原快照

[root@node1 ~]# rbd  snap  rollback jacob  --snap  jacob-snap1
Rolling back to snapshot: 100% complete...done.

客户端再次挂载访问共享

[root@client ~]# mount   /dev/rbd0  /data
[root@client ~]# ls  /data
test.txt
[root@client ~]# cat  /data/test.txt 
abc  hello  world
  • 步骤五:创建块照克隆
  • 使用快照克隆一个新的镜像盘image
    jacob——–3G数据(快照)———>创建新的共享
    创建一个新的共享
    1)保护快照(防止快照被误删除)
[root@node1 ~]# rbd  snap  protect  jacob  --snap  jacob-snap1        #保护快照
[root@node1 ~]# rbd  snap  rm  jacob  --snap  jacob-snap1          #删除快照,此时无法删除,因为做了快照保护
rbd: snapshot 'jacob-snap1' is protected from removal.
2020-02-06 21:56:47.950350 7f10f5b44d80 -1 librbd::Operations: snapshot is protected

2)克隆快照

[root@node1 ~]# rbd  clone  jacob  --snap  jacob-snap1   jacob-clone   --image-feature  layering
#使用现有jacob镜像盘的jacob-snap1这个快照,克隆一个新的共享镜像盘,名称为jacob-clone
[root@node1 ~]# rbd  ls 
jacob
jacob-clone

3)查看克隆镜像与父镜像快照之间的关系

[root@node1 ~]# rbd info  jacob  
rbd image 'jacob':size 10240 MB in 2560 objectsorder 22 (4096 kB objects)block_name_prefix: rbd_data.5e3a2ae8944aformat: 2features: layeringflags: 
[root@node1 ~]# rbd   info  jacob-clone
rbd image 'jacob-clone':size 10240 MB in 2560 objectsorder 22 (4096 kB objects)block_name_prefix: rbd_data.5e3e2ae8944aformat: 2features: layeringflags: parent: rbd/jacob@jacob-snap1               #克隆镜像此时显示有父镜像overlap: 10240 MB       
#克隆镜像很多数据都来自于快照链
#如果希望克隆镜像可以独立工作,就需要将父快照中的数据,全部拷贝一份,但比较耗时!!!                         
[root@node1 ~]# rbd  flatten  jacob-clone
Image flatten: 100% complete...done.
[root@node1 ~]# rbd   info  jacob-clone
rbd image 'jacob-clone':size 10240 MB in 2560 objectsorder 22 (4096 kB objects)block_name_prefix: rbd_data.5e3e2ae8944aformat: 2features: layeringflags:                                        #此时父快照的信息不见了!
[root@node1 ~]# rbd  snap  unprotect  jacob  --snap  jacob-snap1
#取消快照保护
[root@node1 ~]# rbd  snap  rm   jacob   --snap   jacob-snap1
#删除快照,此时快照就可以被删除

客户端取消对ceph的挂载实验

[root@client ~]# df  -h
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   17G  1.2G   16G    8% /
devtmpfs                 224M     0  224M    0% /dev
tmpfs                    236M     0  236M    0% /dev/shm
tmpfs                    236M  5.6M  230M    3% /run
tmpfs                    236M     0  236M    0% /sys/fs/cgroup
/dev/sr0                 284M  284M     0  100% /media
/dev/sda1               1014M  142M  873M   14% /boot
/dev/sr1                 8.8G  8.8G     0  100% /mnt
tmpfs                     48M     0   48M    0% /run/user/0
/dev/rbd0                 10G   33M   10G    1% /data
[root@client ~]# umount  /data          #卸载
[root@client ~]# lsblk                    #查看,此时,rbd0依然存在
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   20G  0 disk 
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0   19G  0 part ├─centos-root 253:0    0   17G  0 lvm  /└─centos-swap 253:1    0    2G  0 lvm  [SWAP]
sr0              11:0    1  284M  0 rom  /media
sr1              11:1    1  8.8G  0 rom  /mnt
rbd0            252:0    0   10G  0 disk 
[root@client ~]# rbd  showmapped
id pool image snap device    
0  rbd  jacob -    /dev/rbd0 
[root@client ~]# rbd  unmap   /dev/rbd0           #也可以写rbd   unmap    jacob
[root@client ~]# lsblk                       #此时,rbd0不存在了
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   20G  0 disk 
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0   19G  0 part ├─centos-root 253:0    0   17G  0 lvm  /└─centos-swap 253:1    0    2G  0 lvm  [SWAP]
sr0              11:0    1  284M  0 rom  /media
sr1              11:1    1  8.8G  0 rom  /mnt
[root@client ~]# rbd  map  jacob-clone
/dev/rbd0
[root@client ~]# mount  /dev/rbd0   /data
[root@client ~]# ls  /data
test.txt
[root@client ~]# umount  /data
[root@client ~]# rbd  unmap  /dev/rbd0

Ceph文件系统存储

什么是CephFS

  • 分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连
  • CephFS使用Ceph集群提供与POSIX兼容的文件系统
  • 允许 Linux直接将Ceph存储mount到本地

什么是元数据

  • 元数据(Metadata)
  • 任何文件系统中的数据分为数据和元数据
  • 数据是指普通文件中的实际数据
  • 而元数据指用来描述一个文件特征的系统数据
  • 比如:访问权限、文件拥有者以及文件数据块的分布信息(inode…)等
  • 所以CephFS必须要有MDSs节点

ceph集群支持块共享,文件系统共享,对象存储共享
块共享(同一时间仅可以同一个客户端访问)

iscsi服务 server[挂载]格式化 mount 写数据10个文件
desktop 挂载 mount 写10个文件
server 再次访问 看到20个文件
文件系统共享
NFS(/common)
desktop (mount) 写数据,读数据
node1 (mount) 写数据,读数据

Ceph 集群支持块共享、文件系统共享、对象存储共享 块共享(同一时间仅可以一个客户端访问) 块(没有格式化) 文件系统(格式化,NFS,fat32,ext4,xfs文件系统) 硬盘没有格式化,就相当于一幢空的大厦
假设一块硬盘此时有100G,将硬盘分为inode区域和block两个区域 inode block
2G 98G 再将inode区域的空间划分为每块256字节,block区域空间划分为每块4k的字节 ceph-编程知识网
写数据时,数据会被写入到block中(4M的文件,会占用多个block)
block中存数据,inode中存储元数据(metadata)【元数据是数据的数据,描述数据的数据,比如一个文件,有文件名,时间,权限,大小…类似于描述信息,同时还记录文件数据的地址】

Ceph文件系统实验

问题
实现Ceph文件系统的功能。具体实现有以下功能:

  • 部署MDSs节点
  • 创建Ceph文件系统
  • 客户端挂载文件系统
    方案
    使用现有的虚拟机进行操作
    ceph-编程知识网
    步骤
  • 1).ceph提供文件系统共享的实验:(使用node3做ceph-mds服务,操作指令在node1执行)
[root@node1 ~]# cd   ceph-cluster/
[root@node1 ceph-cluster]# ceph-deploy  mds  create  node3
#######################################################################
此时:
【node1】/root/ceph-cluster/ceph.conf
【node3】/etc/ceph/ceph.conf
文件内容要一毛一样![root@node1 ceph-cluster]# cat  ceph.conf 
[global]
fsid = 3b2ca6aa-8018-42c4-8bfe-05902cd313dd
mon_initial_members = node1, node2, node3
mon_host = 192.168.4.11,192.168.4.12,192.168.4.13
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
[root@node3 ~]# cat  /etc/ceph/ceph.conf 
[global]
fsid = 3b2ca6aa-8018-42c4-8bfe-05902cd313dd
mon_initial_members = node1, node2, node3
mon_host = 192.168.4.11,192.168.4.12,192.168.4.13
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephxconfig  file /etc/ceph/ceph.conf   exist   with different   content   
有文件,但内容不一致,可以加--overwrite-conf选项在node3查看,此时ceph-mds服务已经启动
[root@node3 ~]# systemctl  status   ceph-mds@node3.service 
● ceph-mds@node3.service - Ceph metadata server daemonLoaded: loaded (/usr/lib/systemd/system/ceph-mds@.service; enabled; vendor preset: disabled)Active: active (running) since 五 2020-02-07 18:13:49 CST; 9min ago
  • 2).创建存储池
[root@node1 ~]# ceph  osd  pool  create  cephfs_data  128
pool 'cephfs_data' created
#创建存储池,对应128个PG
[root@node1 ceph-cluster]# ceph  osd  pool  create  cephfs_metadata  128
pool 'cephfs_metadata' created
#创建存储池,对应128个PG
#cephfs_metadata做inode  ,cephfs_data做block
[root@node1 ceph-cluster]# ceph  osd  lspools   #查看
0 rbd,1 cephfs_data,2 cephfs_metadata,

ceph-编程知识网

  • 3)创建文件系统
[root@node1 ceph-cluster]# ceph  fs  new  myfs1  cephfs_metadata   cephfs_data
#创建一个文件系统,这个文件系统由inode和block组成,cephfs_metadata做inode,存元数据,cephfs_data做block,存数据,文件系统名称是myfs1
[root@node1 ceph-cluster]# ceph  fs  ls         #查看文件系统
name: myfs1, metadata pool: cephfs_metadata, data pools: [cephfs_data ]

4)客户端mount访问

[root@client ~]# mkdir  /cephfs
[root@node1 ceph-cluster]# cat  /etc/ceph/ceph.client.admin.keyring 
[client.admin]key = AQCb/TpeWGpVJBAALIlg4tgvgDTbr+Poza3xCw==
#查看 /etc/ceph/ceph.client.admin.keyring找用户名和密码
[root@client ~]# mount  -t  ceph  192.168.4.11:6789:/   /cephfs  -o  name=admin,secret=AQCb/TpeWGpVJBAALIlg4tgvgDTbr+Poza3xCw==
#客户端mount访问共享,-t访问的服务类型是ceph(nfs,cifs),服务IP是192.168.4.11,端口号是6789,ceph仅支持一个文件系统共享,只能写访问/,把共享挂载到/cephfs目录,name指定用户名,secret指定密码(因为ceph集群需要验证用户和密码才可以访问)
[root@node1 ceph-cluster]# ceph  -scluster 3b2ca6aa-8018-42c4-8bfe-05902cd313ddhealth HEALTH_WARNtoo many PGs per OSD (320 > max 300)monmap e2: 3 mons at {node1=192.168.4.11:6789/0,node2=192.168.4.12:6789/0,node3=192.168.4.13:6789/0}election epoch 18, quorum 0,1,2 node1,node2,node3fsmap e5: 1/1/1 up {0=node3=up:active}osdmap e31: 3 osds: 3 up, 3 inflags sortbitwisepgmap v830: 320 pgs, 3 pools, 84386 kB data, 2606 objects362 MB used, 61044 MB / 61406 MB avail320 active+clean

Ceph对象存储

  • 对象存储:
  • 基于kv的存储,通过API接口访问,对象存储中所有的数据都被认为是一个对象。基于对象的存储就是对象存储
  • 也就是键值存储,通其接口指令,也就是简单的GET、PUT、DEL和其他扩展,向存储服务上传或下载数据
  • 对象存储中所有数据都被认为是一个对象,所以,任何数据都可以存入对象服务器,如图片,视频,音频等
  • RGW全称是Rados Gateway
  • RGW是ceph对象存储网关,用于向客户端应用呈现存储页面,提供RESTful API访问接口
    运维:部署集群,维护集群,故障排错
    开发:写程序,基于程序中的指令连接ceph服务器,上传下载数据
    百度云盘就属于对象存储(不能直接mount,不是在客户端多一个磁盘)
    百度云盘,客户端需要下载他的客户端软件(网页也是软件)

Ceph对象存储实验

步骤

  • 1)登录node1使用ceph-deploy运城启动RGW服务(radosgw)
[root@node1 ~]# cd  ceph-cluster/
[root@node1 ceph-cluster]# ceph-deploy   rgw  create  node3
...
[ceph_deploy.rgw][INFO  ] The Ceph Object Gateway (RGW) is now running on host node3 and default port 7480
#起完服务后默认端口7480
[root@node3 ~]# systemctl    status  ceph-radosgw@rgw.node3.service    #查看服务是否已经启动
● ceph-radosgw@rgw.node3.service - Ceph rados gatewayLoaded: loaded (/usr/lib/systemd/system/ceph-radosgw@.service; enabled; vendor preset: disabled)Active: active (running) since 五 2020-02-07 19:46:54 CST; 7min ago
[root@node3 ~]# ss  -nutlp |  grep  7480        #也可以查看端口号
tcp    LISTEN     0      128       *:7480                  *:*                   users:(("radosgw",pid=2120,fd=27))
  • 2)可以修改配置文件,修改服务的端口(非必须操作)【在node3操作】
[root@node3 ~]# vim   /etc/ceph/ceph.conf
手动输入三行
[client.rgw.node3]
host=node3
rgw_frontends="civetweb port=8000"
[root@node3 ~]# systemctl   restart  ceph-radosgw@rgw.node3.service 
[root@node3 ~]# ss  -nutlp  |  grep  radosgw
tcp    LISTEN     0      128       *:8000                  *:*               users:(("radosgw",pid=2556,fd=27))