一、概述
1.什么是分布式文件系统
分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连.分布式文件系统的设计基于客户机/服务器模式
2.常见分布式文件系统
- Lustre
- Hadoop
- FastDFS
- Ceph
- ClusterFS
3.什么是Ceph
- Ceph是一个分布式文件系统
- 具有高扩展,高可用,高性能的特点
- Ceph可以提供对象存储,块存储,文件系统存储
- Ceph可以提供PB级别的存储空间(PB>TB>GB) 1PB=1024*1TB=1024*1024*GB
4.Ceph组件
- OSDs:存储设备
- Monitors:集群监控组件
- RadosGateway(RGW):对象存储网关
- MDSs:存放文件系统的元数据(对象存储和块存储不需要该组件)
- Client:客户端,需要安装ceph支持组件
如图,从右边向左边看,osd是ceph最基础的存储设备.osd直接使用存储磁盘,在osd的基础上.我们可以将数个osd合并成一个存储池pool,有了存储池之后.我们将提供一个对外的接口,以便客户端写入数据,那这个接口可以是块存储rbd,于是我们将块存储格式化,将其挂载到目录下.这样我们就可以写入数据了
5.细谈对象存储,块存储,文件系统存储
- 对象存储 : 也就是通常意义的键值存储,其接口就是简单的GET、PUT、DEL 和其他扩展,代表主要有 Swift 、S3 以及 Gluster 等;
- 块存储 : 这种接口通常以 QEMU Driver 或者 Kernel Module 的方式存在,这种接口需要实现 Linux 的 Block Device 的接口或者 QEMU 提供的 Block Driver 接口,如 Sheepdog,AWS 的 EBS,青云的云硬盘和阿里云的盘古系统,还有 Ceph 的 RBD(RBD是Ceph面向块存储的接口)。在常见的存储中 DAS、SAN 提供的也是块存储;
- 文件存储 : 通常意义是支持 POSIX 接口,它跟传统的文件系统如 Ext4 是一个类型的,但区别在于分布式存储提供了并行化的能力,如 Ceph 的 CephFS (CephFS是Ceph面向文件存储的接口),但是有时候又会把 GlusterFS ,HDFS 这种非POSIX接口的类文件存储接口归入此类。当然 NFS、NAS也是属于文件系统存储;
二、安装Ceph,搭建Ceph集群
1.拓扑图
准备四台主机,在node1上安装Monitors监控服务.
2.yum仓库支持
需要准备一张ceph镜像
[下载地址ceph.ios] 链接: https://pan.baidu.com/s/1LYzXXUaDTq7lNP5rWqHj4Q 提取码: 5vac
需要配置yum源
- [root@node1 ~]# mkdir /mnt/ceph
- [root@node1 ~]# mount ceph10.ios /mnt/ceph #将镜像挂载到目录下
- [root@node1 ~]# cat /etc/yum.repos.d/ceph.repo
- [mon]
- name=mon
- baseurl=ftp://192.168.4.254/ceph/MON
- gpgcheck=0
- [osd]
- name=osd
- baseurl=ftp://192.168.4.254/ceph/OSD
- gpgcheck=0
- [tools]
- name=tools
- baseurl=ftp://192.168.4.254/ceph/Tools
- gpgcheck=0
- [root@node1 ~]# yum repolist #验证YUM源软件数量
- 源标识 源名称 状态
- Dvd redhat 9,911
- Mon mon 41
- Osd osd 28
- Tools tools 33
- repolist: 10,013
- [root@node1 ~]# for i in client node1 node2 node3
- do
- scp /etc/yum.repos.d/ceph.repo $i:/etc/yum.repos.d/
- done
3.建立免密登录
自己也需要发送
- [root@node1 ~]# ssh-keygen -f /root/.ssh/id_rsa -N ''
- [root@node1 ~]# for i in 10 11 12 13
- do
- ssh-copy-id 192.168.4.$i
- done
4.配置域名解析
/etc/hosts解析的域名必须与本机主机名一致
- [root@node1 ~]# cat /etc/hosts
- ... ...
- 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 10 11 12 13 #发送给其他主机
- do
- scp root@192.168.4.$i:/etc/yum.repos.d/
- done
5.配置时间同步
每台主机都必须要配置
- [root@node1 ~]# vim /etc/chrony.conf #添加一个共同时间节点
- … …
- server s1a.time.edu.cn iburst #iburst参数设置重启服务后尽快同步时间
- [root@node1 ~]# for i in client node1 node2 node3
- do
- scp /etc/chrony.conf $i:/etc/
- ssh $i "systemctl restart chronyd"
- done
6.准备存储磁盘
准备2张20G的磁盘
我使用的是Linux的KVM虚拟平台,添加磁盘非常简单(添加硬件,添加磁盘即可)
使用VMware也非常简单
三、部署ceph集群
1.node1配置
在node1安装部署Ceph服务的软件
- [root@node1 ~]# yum -y install ceph-deploy
- [root@node1 ~]# ceph-deploy --help #可以查看Ceph使用命令
- [root@node1 ~]# ceph-deploy mon --help
- [root@node1 ~]# mkdir ceph-cluster #创建目录用于保存ceph生成的配置文件
- [root@node1 ~]# cd ceph-cluster/
2.node2,node3配置
给所有节点安装ceph相关软件包。必须在node1的ceph-cluster下执行命令
- [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
- #创建Ceph集群配置,在ceph-cluster目录下生成Ceph配置文件。
- [root@node1 ceph-cluster]# ceph-deploy new node1 node2 node3
- #初始化所有节点的mon服务,也就是启动mon服务(主机名解析必须对)。
- [root@node1 ceph-cluster]# ceph-deploy mon create-initial
3.创建OSD存储空间
初始化清空磁盘数据和创建OSD存储空间(仅node1操作即可)。
- [root@node1 ceph-cluster]#lsblk
- [root@node1 ceph-cluster]# ceph-deploy disk zap node1:vdb #初始化清空磁盘数据
- [root@node1 ceph-cluster]# ceph-deploy disk zap node2:vdb
- [root@node1 ceph-cluster]# ceph-deploy disk zap node3:vdb
- [root@node1 ceph-cluster]# ceph-deploy osd create node1:vdb #创建OSD存储空间
- [root@node1 ceph-cluster]# ceph-deploy osd create node2:vdb
- [root@node1 ceph-cluster]# ceph-deploy osd create node3:vdb
4.查看ceph集群信息
- [root@node1 ~]# ceph -s
- cluster 9074897d-8da1-4a29-bb64-c039cbdefe0f
health HEALTH_OK
monmap e1: 3 mons at {ceph1=192.168.1.11:6789/0,ceph2=192.168.1.12:6789/0,ceph3=192.168.1.13:6789/0}
election epoch 4, quorum 0,1,2 ceph1,ceph2,ceph3
osdmap e18: 3 osds: 3 up, 3 in
flags sortbitwise
pgmap v1481: 64 pgs, 1 pools, 14756 kB data, 23 objects
134 MB used, 45912 MB / 46046 MB avail
64 active+clean
5.创建镜像
我们使用ceph的块存储
ceph镜像支持很多功能,但很多是操作系统不支持的,我们只开启layering。
- [root@node1 ~]# ceph osd lspools #查看存储池
- 0 rbd,
- #jacob为创建的镜像名称,可以为任意字符。
- #--image-feature参数指定我们创建的镜像有哪些功能,layering是开启COW功能。
- [root@node1 ~]# rbd create image1 --image-feature layering --size 10G
- [root@node1 ~]# rbd list
- image1
- [root@node1 ~]# rbd info image1 #查看image1详细
- rbd image 'image1':
- size 10240 MB in 2560 objects
- order 22 (4096 kB objects)
- block_name_prefix: rbd_data.d3aa2ae8944a
- format: 2
- features: layering
6.客户端使用存储块
客户端通过KRBD访问
- #客户端需要安装ceph-common软件包
- #拷贝配置文件(否则不知道集群在哪)
- #拷贝连接密钥(否则无连接权限)
- [root@client ~]# yum -y install ceph-common
- [root@client ~]# scp 192.168.4.11:/etc/ceph/ceph.conf /etc/ceph/
- [root@client ~]# scp 192.168.4.11:/etc/ceph/ceph.client.admin.keyring /etc/ceph/
- [root@client ~]#rbd list #查看镜像池
- demo-image
- [root@client ~]# rbd map imges #生成磁盘块
- [root@client ~]# lsblk
- rbd0 252:0 0 10G 0 disk
- [root@client ~]# rbd showmapped
- id pool image snap device
- 0 rbd image1 - /dev/rbd0
- [root@client ~]# mkfs.xfs /dev/rbd0 #格式化分区,只有第一次使用需要格式化
- [root@client ~]# mount /dev/rbd0 /mnt/ #挂载使用
- [root@client ~]# echo "test" > /mnt/test.txt
7.客户端撤销磁盘映射
- [root@client ~]# umount /mnt
- [root@client ~]# rbd showmapped
- id pool image snap device
- 0 rbd jacob - /dev/rbd0
- //语法格式:
- [root@client ~]# rbd unmap /dev/rbd0
四、镜像扩容
1.扩容容量
- [root@node1 ~]# rbd info jacob
- rbd image 'demo-image':
size 10240 MB in 3840 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.102e2ae8944a
format: 2
features: layering
flags:- [root@node1 ~]# rbd resize --size 15G jacob
- [root@node1 ~]# rbd info jacob
- rbd image 'demo-image':
size 15360 MB in 3840 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.102e2ae8944a
format: 2
features: layering
flags:- [root@client mnt]# lsblk #看到客户端的磁盘块也扩大了
- rbd0 252:0 0 15G 0 disk /mnt
2.缩小容量
- [root@node1 ~]# rbd resize --size 7G jacob --allow-shrink #--allow-shrink允许缩小
- [root@node1 ~]# rbd info image
五、创建镜像快照
1.查看镜像快照(默认所有镜像都没有快照)
- [root@node1 ~]# rbd snap ls jacob
2.给镜像创建快照
- [root@node1 ~]# rbd snap create image1 --snap image1-snap1 #--snap后接快照名
- #为image1镜像创建快照,快照名称为jacob-snap1
- [root@node1 ~]# rbd snap ls jacob
- SNAPID NAME SIZE
- 4 jacob-snap1 15360 MB
3.删除客户端写入的测试文件
- [root@client ~]# rm -rf /mnt/test.txt
- [root@client ~]# umount /mnt
4. 还原快照
- [root@node1 ~]# rbd snap rollback image1 --snap image1-snap1
- #客户端重新挂载分区
- [root@client ~]# mount /dev/rbd0 /mnt/
- [root@client ~]# ls /mnt
六、快照克隆
1.克隆快照
- [root@node1 ~]# rbd snap protect image1 --snap image1-snap1 #生成快照,并且保护镜像
- [root@node1 ~]# rbd snap rm image1 --snap image1-snap1 #会失败,提示被保护
- 2019-10-25 19:38:04.570601 7f5e7d9c1d80 -1 librbd::Operations: snapshot is protected
- #使用image1镜像的快照image1-snap1克隆一个新的名称为image1-clone的镜像
- [root@node1 ~]# rbd clone image1 --snap image1-snap1 image1-clone --image-feature layering
2.查看克隆镜像与父镜像快照的关系
- [root@node1 ~]# rbd info image1-clone
- rbd image 'image1-clone':
- size 15360 MB in 3840 objects
- order 22 (4096 kB objects)
- block_name_prefix: rbd_data.d3f53d1b58ba
- format: 2
- features: layering
- flags:
- parent: rbd/image1@image1-snap1
- #克隆镜像很多数据都来自于快照链
- #如果希望克隆镜像可以独立工作,就需要将父快照中的数据,全部拷贝一份,但比较耗时!!!
- [root@node1 ~]# rbd flatten jacob-clone
- [root@node1 ~]# rbd info jacob-clone
- rbd image 'jadob-clone':
- size 15360 MB in 3840 objects
- order 22 (4096 kB objects)
- block_name_prefix: rbd_data.d3f53d1b58ba
- format: 2
- features: layering
- flags:
- #注意,父快照信息没了!
- [root@node1 ~]# rbd snap unprotect jacob --snap jacob-snap1 #取消快照保护
- [root@node1 ~]# rbd snap rm jacob --snap jacob-snap1 #可以删除快照