-
什么是分布式文件系统
- 分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连
- 分布式文件系统的设计基于客户机/服务器模式
-
什么是Ceph
- Ceph是一个分布式文件系统
- 具有高扩展、高可用、高性能的特点
- Ceph可以提供对象存储、块存储、文件系统存储
- Ceph可以提供PB级别的存储空间
- 软件定义存储(Software Defined Storage)作为存储行业的一大发展趋势,已经越来越受到市场的认可
-
Ceph组件
- OSDs存储设备
- Monitors集群监控组件
- RadosGateway(RGW)对象存储网关
- MDSs存放文件系统的元数据(对象存储和块存储不需要该组件)
- Client-ceph客户端
-
步骤
-
- 安装前准备
- 在client上生成秘钥
- [root@client ~]# ssh-keygen -f /root/.ssh/id_rsa -N ‘’
- 将秘钥发送给三台节点
- [root@client ~]# for i in 21 40 41 42
> do
> ssh-copy-id 10.211.55.$i
> done - 修改/etc/hosts并同步到所有主机
- /etc/hosts解析的域名必须与本主机名一致
- 10.211.55.21 client
10.211.55.40 node1
10.211.55.41 node2
10.211.55.42 node3
[root@client ~]# vim /etc/hosts
[root@client ~]# for i in 40 41 42
> do
> scp /etc/hosts 10.211.55.$i:/etc/hosts
> done - 配置时间服务器同步,并发送给各节点
- [root@client ~]# vim /etc/chrony.conf
[root@client ~]# for i in node1 node2 node3
、> do
、> scp /etc/chrony.conf $i:/etc/
、> done
chrony.conf 100% 1176 1.2MB/s 00:00
chrony.conf 100% 1176 1.4MB/s 00:00
chrony.conf - 检查时间服务器是否可用
- [root@client ~]# chronyc sources
210 Number of sources = 2
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* 120.25.115.20 2 6 337 5 +4758us[+4612us] +/- 23ms
^+ 203.107.6.88 2 6 177 17 -8638us[-8784us] +/- 36ms - 为每一个node添加三块硬盘
-
部署ceph集群
- 目标:
- 安装部署工具ceph-deploy
- 创建ceph集群
- 准备日志磁盘分区
- 创建OSD存储空间
- 查看ceph状态,验证
- 步骤
-
- 安装部署软件ceph-deploy
- [root@client ~]# yum -y install ceph-deploy
- 创建目录,以后所有的操作必须在此目录下
- [root@client ~]# mkdir ceph-cluster
[root@client ~]# cd ceph-cluster -
- 部署ceph集群
- 创建ceph集群配置,在ceph-cluster目录下生成ceph配置文件
- [root@client ceph-cluster]# ceph-deploy new node1 node2 node3//指定mon主机
- [root@client ceph-cluster]# ls
ceph.conf ceph-deploy-ceph.log ceph.mon.keyring - 该命令会只是在新创建的目录内产生配置文件,不对节点产生影响
- 给所有节点安装ceph相关软件包
- 使用for循环,给三个节点安装ceph-mon ceph-osd ceph-mds ceph-radosgw
- [root@client ceph-cluster]# for i in node1 node2 node3; do ssh $i “yum -y install ceph-mon ceph-osd ceph-mds ceph-radosgw”; done
- 初始化所有节点的mon服务,也就是启动mon服务(主机名必须解析对)
- [root@client ceph-cluster]# ceph-deploy mon create-initial//一定要关闭firewalld和selinux
- 查证,在任何节点使用ceph -s查看
- [root@node1 ~]# ceph -s
cluster b5613b00-fd09-4fd1-b187-bd8d880d349b
health HEALTH_ERR
no osds
monmap e1: 3 mons at {node1=10.211.55.40:6789/0,node2=10.211.55.41:6789/0,node3=10.211.55.42:6789/0}
election epoch 4, quorum 0,1,2 node1,node2,node3
osdmap e1: 0 osds: 0 up, 0 in
flags sortbitwise,require_jewel_osds
pgmap v2: 64 pgs, 1 pools, 0 bytes data, 0 objects
0 kB used, 0 kB / 0 kB avail
64 creating -
- 创建OSD
- 规划:
- sdb 8:16 0 64G 0 disk
sdc 8:32 0 64G 0 disk
sdd 8:48 0 64G 0 disk - 将sdb分区为sdb1和sdb2,将sdc和sdd共享,sdb1和sdb2作为sdc、sdd的缓存盘
- [root@client ceph-cluster]# for i in node1 node2 node3
> do
> ssh $i “parted /dev/sdb mklabel gpt”//使用gpt分区
> ssh $i “parted /dev/sdb mkpart primary 1 50%”//第一个分区占50%
> ssh $i “parted /dev/sdb mkpart primary 50% 100%”
> done
*查看 sdb 8:16 0 64G 0 disk
├─sdb1 8:17 0 32G 0 part
└─sdb2 8:18 0 32G 0 part
sdc 8:32 0 64G 0 disk
sdd 8:48 0 64G 0 disk - 磁盘分区后的默认权限无法让ceph软件对其进行读写操作,需要修改权限
- [root@node1 ~]# ll /dev/sdb*
brw-rw----. 1 root disk 8, 16 Sep 27 00:25 /dev/sdb
brw-rw----. 1 root disk 8, 17 Sep 27 00:25 /dev/sdb1
brw-rw----. 1 root disk 8, 18 Sep 27 00:25 /dev/sdb2
可以看到sdb1和sdb2所有者是root,所属组是disk,权限都是读写,而ceph用户是没有权限的 - [root@node1 ~]# id ceph
uid=167(ceph) gid=167(ceph) groups=167(ceph) - [root@client ceph-cluster]# for i in node1 node2 node3//改变sdb1和2的属主、属组
> do
> ssh $i “chown ceph.ceph /dev/sdb1”
> ssh $i “chown ceph.ceph /dev/sdb2”
> done - [root@node1 ~]# ll /dev/sdb*
brw-rw----. 1 root disk 8, 16 Sep 27 00:25 /dev/sdb
brw-rw----. 1 ceph ceph 8, 17 Sep 27 00:25 /dev/sdb1
brw-rw----. 1 ceph ceph 8, 18 Sep 27 00:25 /dev/sdb2 - 但是这种修改是临时操作,重启计算机后,权限会再次被重置,需要持久化保存
- 在/etc/udev/rules.d/下创建以.rules为后缀名的文件
- [root@client ceph-cluster]# for i in node1 node2 node3
> do
> ssh $i “echo “ENV{DEVNAME}"/dev/sdb1",OWNER=“ceph”,GROUP=“ceph”" >> /etc/udev/rules.d/vdb.rules"//如果有设备名称是/dev/sdb1,那么属主是ceph,属组是ceph
> ssh $i "echo "ENV{DEVNAME}”/dev/sdb2”,OWNER=“ceph”,GROUP=“ceph”" >> /etc/udev/rules.d/vdb.rules"
> done - 用ceph-deploy格式各node的sdc和sdd(仅在client上操作)
- [root@client ceph-cluster]# for i in 1 2 3
> do
> for m in c d
> do
> ceph-deploy disk zap node i : s d i:sd i:sdm
> done
> done - 创建OSD存储空间(仅在client上操作)
- [root@client ceph-cluster]# for i in node1 node2 node3
> do
> ceph-deploy osd create $i:sdc:/dev/sdb1 $i:sdd:/dev/sdb2
> done
、、到此集群创建成功 -
- 创建ceph块存储
- 目标:
- 创建块存储镜像
- 客户端映射镜像
- 创建镜像快照
- 使用快照还原数据
- 使用快照克隆镜像
- 删除快照与镜像
- 步骤:
- 查看存储池–集群创建成功后默认会生成一个池
- [root@node1 ~]# ceph osd lspools
- 0 rbd,
- 创建镜像、查看镜像
- [root@node1 ~]# rbd create demo-image --image-feature layering --size 10G
- demo-image是镜像名称比如haha,image-feature layering是支持特性为cow
- 查看创建好的镜像
- [root@node2 ~]# rbd info lifei
rbd image ‘lifei’:
size 10240 MB in 2560 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.371d6b8b4567
format: 2
features: layering
flags: - 查看rbd池中的已经创建好的镜像
- [root@node2 ~]# rbd list
haha
lifei - 动态调整镜像
-
- 缩小容量
- [root@node1 ~]# rbd info haha
rbd image ‘haha’:
size 10240 MB in 2560 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.37146b8b4567
format: 2
features: layering
flags: - [root@node1 ~]# rbd resize --size 7G haha --allow-shrink
Resizing image: 100% complete…done. - [root@node1 ~]# rbd info haha
rbd image ‘haha’:
size 7168 MB in 1792 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.37146b8b4567
format: 2
features: layering
flags: - 缩小镜像时,需要加上参数allow-shrink,允许缩小
- [root@node1 ~]# rbd resize --size 100G haha
Resizing image: 100% complete…done.
[root@node1 ~]# rbd info haha
rbd image ‘haha’:
size 102400 MB in 25600 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.37146b8b4567
format: 2
features: layering
flags: - 扩大的时候直接指定大小即可
- 通过KRBD访问
-
- 客户端通过KRBD访问
- 客户端需要安装ceph-common软件包
- 拷贝配置文件
- 拷贝连接秘钥
- [root@client ~]# yum -y install ceph-common
- [root@client ~]# ls /etc/ceph/
rbdmap - 安装完后会生成/etc/ceph目录
- [root@client ~]# cp /root/ceph-cluster/ceph.conf /etc/ceph/
[root@client ~]# cp /root/ceph-cluster/ceph.client.admin.keyring /etc/ceph/
//将配置文件和client密码文件拷贝至/etc/ceph/下 - 查看client现有硬盘情况
- sdb 8:16 0 64G 0 disk
sdc 8:32 0 64G 0 disk
sdd 8:48 0 64G 0 disk - 添加块设备
- [root@client ~]# rbd list
haha
lifei
[root@client ~]# ceph osd lspools
0 rbd,
[root@client ~]# rbd list
haha
lifei
[root@client ~]# rbd map haha
/dev/rbd0
[root@client ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 64G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 63.5G 0 part
├─VolGroup-lv_root 253:0 0 50G 0 lvm /
├─VolGroup-lv_swap 253:1 0 2G 0 lvm [SWAP]
└─VolGroup-lv_home 253:2 0 11.6G 0 lvm /home
sdb 8:16 0 64G 0 disk
sdc 8:32 0 64G 0 disk
sdd 8:48 0 64G 0 disk
sr0 11:0 1 131.2M 0 rom /run/media/root/CDROM
sr1 11:1 1 4.4G 0 rom /run/media/root/CentOS 7 x86_64
rbd0 252:0 0 100G 0 disk - 查看已挂载情况
- [root@client ~]# rbd map lifei
/dev/rbd1
[root@client ~]# rbd showmapped
id pool image snap device
0 rbd haha - /dev/rbd0
1 rbd lifei - /dev/rbd1 -
- 客户端格式化、挂载分区
- [root@client ~]# mkfs.xfs /dev/rbd0
- [root@client ~]# mount /dev/rbd0 /mnt
[root@client ~]# echo “test” >> /mnt/test.txt - 为镜像创建快照
- [root@client ~]# rbd snap create haha --snap haha-snap1
- //为haha镜像创建一个名称为haha-snap1的快照
- 查看haha的快照
- [root@client ~]# rbd snap list haha
SNAPID NAME SIZE
8 haha-snap1 102400 MB -
- 删除客户端写入的测试文件,注意:还原镜像不支持在线还原,需要先 umount掉
- [root@client ~]# rm -rf /mnt/test.txt
[root@client ~]# ls /mnt
[root@client ~]# umount /mnt - 还原快照
- [root@client ~]# rbd snap rollback haha --snap haha-snap1
Rolling back to snapshot: 100% complete…done. - 重新挂载分区,并查看目录
- [root@client ~]# mount /dev/rbd0 /mnt
[root@client ~]# ls /mnt
test.txt - 创建快照克隆
- 克隆快照
- [root@client ~]# rbd snap protect haha --snap haha-snap1//对haha的镜像保护
- [root@client ~]# rbd snap rm haha --snap haha-snap1//被保护的镜像不允许被删除
rbd: snapshot ‘haha-snap1’ is protected from removal.
2021-09-29 08:08:05.319241 7f1988845d80 -1 librbd::Operations: snapshot is protected - [root@client ~]# rbd clone haha --snap haha-snap1 copyhaha --image-feature layering
- //用haha的snap1克隆一个叫copyhaha的镜像
- 查看
- [root@client ~]# rbd list
copyhaha
haha
lifei - [root@client ~]# rbd info copyhaha
rbd image ‘copyhaha’:
size 102400 MB in 25600 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.5e2f6b8b4567
format: 2
features: layering
flags:
parent: rbd/haha@haha-snap1//由快照创建的镜像,所以快照不能解保护或删除
overlap: 102400 MB - [root@client ~]# rbd flatten copyhaha//真正的拷贝过来原始数据,解除父子关系
- [root@client ~]# rbd flatten copyhaha
Image flatten: 100% complete…done.
[root@client ~]# rbd info copyhaha
rbd image ‘copyhaha’:
size 102400 MB in 25600 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.5e2f6b8b4567
format: 2
features: layering
flags: - 解除父子关系后,解保护,删除镜像
- [root@client ~]# rbd snap unprotect haha --snap haha-snap1
[root@client ~]# rbd snap rm haha --snap haha-snap1
[root@client ~]# rbd snap ls haha - Ceph文件系统
- 延续前面的实验,实现ceph文件系统的功能,具体实现现有以下功能:
- 部署MDSs节点
- 创建ceph文件系统
- 客户端挂载文件系统
- 方案:
- 启动节点mds服务
- [root@client ceph-cluster]# ceph-deploy mds create node1
- 在node1查看服务状态
- [root@node1 ~]# systemctl status ceph-mds@node1
● ceph-mds@node1.service - Ceph metadata server daemon
Loaded: loaded (/usr/lib/systemd/system/ceph-mds@.service; enabled; vendor preset: disabled)
Active: active (running) since 五 2021-10-01 21:49:00 CST; 1min 33s ago
Main PID: 363 (ceph-mds)
CGroup: /system.slice/system-ceph\x2dmds.slice/ceph-mds@node1.service
└─363 /usr/bin/ceph-mds -f --cluster ceph --id node1 --setuser ceph --setg…
10月 01 21:49:00 node1 systemd[1]: Started Ceph metadata server daemon.
10月 01 21:49:00 node1 ceph-mds[363]: starting mds.node1 at :/0
- 创建存储池
- [root@node1 ~]# ceph osd pool create cephfs_data 128///创建存放数据的池子
pool ‘cephfs_data’ created
[root@node1 ~]# ceph osd pool create cephfs_metadata 128///创建存放元数据的池子
pool ‘cephfs_metadata’ created
[root@node1 ~]# ceph osd lspools
0 rbd,1 cephfs_data,2 cephfs_metadata, - 创建fs(只能创建一个fs,inode放前面)
- [root@node1 ~]# ceph fs new myfs1 cephfs_metadata cephfs_data
new fs with metadata pool 2 and data pool 1 - [root@node1 ~]# ceph fs ls
name: myfs1, metadata pool: cephfs_metadata, data pools: [cephfs_data ] - 在客户端挂载
- [root@node1 ~]# cat /etc/ceph/ceph.client.admin.keyring
[client.admin]
key = AQCDSVFhOxuqBhAAdcB/qjwEDeI3wephURXhlw==
caps mds = “allow *”
caps mon = “allow *”
caps osd = “allow *”
[root@node1 ~]# 登出
Connection to node1 closed.
[root@client ceph-cluster]# mount -t ceph 10.211.55.40:6789:/ /mnt/ -o name=admin,secret=AQCDSVFhOxuqBhAAdcB/qjwEDeI3wephURXhlw== - 查看挂载情况
- [root@client ceph-cluster]# df -h
- 10.211.55.40:6789:/ 384G 1.2G 383G 1% /mnt