概述

分布式存储

  • 分布式是一种独特的系统架构,它由一组网络进行通信、为了完成共同的任务而协调工作的计算机节点组成
  • 分布式系统为了用廉价的、普通的机器完成单个计算机无法完成的计算、存储任务
  • 其目的就是利用更多的机器,处理更多的数据

常用的分布式文件系统

  • Lustre
  • Hadoop
  • FastDFS
  • Ceph
  • GlusterFS

Ceph简介

  • Ceph是一种分布式文件系统

  • 具有高扩展、高可用、高性能的特点

  • Ceph可以提供对象存储、块存储、文件存储系统

  • Ceph可以提供EB,PB级别的存储空间(EB>PB>TB>GB)

  • 软件定义存储(Software Defined Storage)作为存储行业的一大发展趋势,已经越来越受市场认可

  • 帮助文档

    https://docs.ceph.com/

    http://docs.ceph.org.cn/

Ceph组件

  • OSDs

    存储设备(共享磁盘)

  • Monitors

    集群监控组件,绘制地图(文件,写明了磁盘的相关信息 )

  • RadosGateway(RGW)

    对象存储网关

  • MDSs

    存放文件系统的元数据(对象存储块存储不需要该组件)

  • Client

    ceph客户端

Ceph特点

  • 每个组件皆可扩展
  • 基于软件实现
  • EB级存储
  • 默认3副本
  • mon过半原则

实验环境准备

  • 1台客户端虚拟机
  • 3台存储集群虚拟机
  • 每台存储集群添加两块新磁盘(sdb做缓存盘、sdc做数据盘)
节点 角色 ip
client 客户端 192.168.1.10
node1 存储集群 192.168.1.11
node2 存储集群 192.168.1.12
node3 存储集群 192.168.1.13

ceph源配置

  • node1添加一个CD驱动指向ceph10.iso镜像
  • 做ftp源拷贝给其他服务器
  • 所有节点配置好hosts解析
  • 配置ssh无密码连接
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#配置hosts域名解析
[root@node1 ~]# cat /etc/hosts
192.168.1.10 client
192.168.1.11 node1
192.168.1.12 node2
192.168.1.13 node3

#配置免密码连接
[root@node1 ~]# ssh-keygen
[root@node1 ~]# for i in client node1 node2 node3;do ssh-copy-id root@$i;done

#ceph yum源
[root@node1 opt]# yum install vsftpd -y && echo "anon_root=/opt" >> /etc/vsftpd/vsftpd.conf && systemctl enable --now vsftpd

[root@node1 ~]# mount /dev/sr0 /opt/ceph/
[root@node1 ~]# ls /opt/ceph/
EULA GPL MON OSD README RPM-GPG-KEY-redhat-release Tools TRANS.TBL

[root@node1 opt]# vim /etc/yum.repos.d/local.repo && cat /etc/yum.repos.d/local.repo
[centos]
name=centos
baseurl=file:///opt/centos
gpgcheck=0
[MON]
name=mon
baseurl=ftp://node1/ceph/MON
gpgcheck=0
[OSD]
name=osd
baseurl=ftp://node1/ceph/OSD
gpgcheck=0
[Tools]
name=Tools
baseurl=ftp://node1/ceph/Tools
gpgcheck=0

[root@node1 ~]# for i in client node1 node2 node3;do scp /etc/yum.repos.d/local.repo $i:/etc/yum.repos.d/local.repo;done

时间同步

  • 和client时间同步
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@client ~]# vim /etc/chrony.conf
allow 192.168.1.0/24
local stratum 10
[root@client ~]# systemctl restart chronyd

[root@node1 ~]# vim /etc/chrony.conf
server 192.168.1.10 iburst

[root@node1 ~]# for i in node1 node2 node3
do
scp /etc/chrony.conf $i:/etc/chrony.conf
ssh $i "systemctl restart chronyd"
done
[root@node1 ~]# chronyc sources
210 Number of sources = 1
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* client 10 6 17 27 +3174ns[ +30us] +/- 290us

关闭防火墙、SELinux

1
2
3
4
5
[root@client ~]# for i in  client node1 node2 node3
do
ssh $i "systemctl disable --now firewalld"
ssh $i "setenforce 0"
done

部署Ceph集群

部署MON集群

安装软件

  • node1安装ceph-deploy脚本
1
[root@node1 ~]# yum install -y ceph-deploy 
  • 所有node节点安装ceph所有组件
1
2
3
4
[root@node1 ~]# for i in node1 node2 node3
do
ssh $i "yum install -y ceph-mon ceph-osd ceph-mds ceph-radosgw"
done

初始化MON配置

  • 仅node1操作
  • 主配置文件为ceph.conf(在ceph-cluster当前目录下)
1
2
3
4
[root@node1 ~]# mkdir ceph-cluster
[root@node1 ~]# cd ceph-cluster
#自动生成配置文件
[root@node1 ceph-cluster]# ceph-deploy new node1 node2 node3
  • 远程所有node主机,拷贝配置文件,并启动ceph-mon服务
  • 配置文件拷贝到/etc/ceph/ceph.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@node1 ceph-cluster]# ceph-deploy mon create-initial
[root@node1 ceph-cluster]# systemctl status ceph-mon@node1

[root@node1 ceph-cluster]# ceph -s
cluster b3a61a28-b31a-48c8-bc9a-2e0aec26b097
health HEALTH_ERR
no osds
monmap e1: 3 mons at {node1=192.168.1.11:6789/0,node2=192.168.1.12:6789/0,node3=192.168.1.13:6789/0}
election epoch 6, quorum 0,1,2 node1,node2,node3
osdmap e1: 0 osds: 0 up, 0 in
flags sortbitwise
pgmap v2: 64 pgs, 1 pools, 0 bytes data, 0 objects
0 kB used, 0 kB / 0 kB avail
64 creating

部署OSD集群

创建磁盘分区表

  • 仅在node1操作
1
2
[root@node1 ceph-cluster]# ceph-deploy disk zap node1:sdb node1:sdc
[root@node1 ceph-cluster]# ceph-deploy disk zap node2:sdb node2:sdc node3:sdb node3:sdc

创建OSD共享

  • 启动OSD服务、共享OSD磁盘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@node1 ceph-cluster]# ceph-deploy osd create node1:sdc:/dev/sdb
[root@node1 ceph-cluster]# ceph-deploy osd create node2:sdc:/dev/sdb
[root@node1 ceph-cluster]# ceph-deploy osd create node3:sdc:/dev/sdb
#sdc做缓存盘, sdb做数据盘

[root@node1 ceph-cluster]# systemctl status ceph-osd@0
[root@node1 ceph-cluster]# ceph -s
cluster b3a61a28-b31a-48c8-bc9a-2e0aec26b097
health HEALTH_OK #显示OK表示正常
monmap e1: 3 mons at {node1=192.168.1.11:6789/0,node2=192.168.1.12:6789/0,node3=192.168.1.13:6789/0}
election epoch 6, quorum 0,1,2 node1,node2,node3
osdmap e14: 3 osds: 3 up, 3 in
flags sortbitwise
pgmap v30: 64 pgs, 1 pools, 0 bytes data, 0 objects
100 MB used, 61306 MB / 61406 MB avail
64 active+clean

#查看共享盘信息
[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
  • 常见错误
1
2
3
[ceph_deploy][ERROR ]RuntimeError:  bootstrap-osd keyring not found; run 'gatherkeys'
#解决方案
[root@node1 ceph-cluster]# ceph-deploy gatherkeys node1 node2 node3

Ceph块存储

什么是块存储

  • Ceph块设备也被叫做RADOS块设备

    RADOS block device:RBD

  • RBD提供了企业功能,如快照、COW克隆等

创建块共享

创建镜像(块设备)

  • 查看存储池(默认有一个rbd池)
1
2
[root@node1 ~]# ceph osd lspools
0 rbd,
  • 创建镜像、查看镜像
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@node1 ~]# rbd create jacob --image-feature layering --size 10G    
#--image-feature支持哪些功能 layering(快照、写时复制)
[root@node1 ~]# rbd create rbd/nb --image-feature layering --size 10G
[root@node1 ~]# rbd list
jacob
nb
[root@node1 ~]# rbd info jacob
rbd image 'jacob':
size 10240 MB in 2560 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.102b2ae8944a
format: 2
features: layering
flags:

  • 调整镜像大小
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#扩容
[root@node1 ~]# rbd resize jacob --size 15G

[root@node1 ~]# rbd info jacob
rbd image 'jacob':
size 15360 MB in 3840 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.102b2ae8944a
format: 2
features: layering
flags:

#缩减
[root@node1 ~]# rbd resize jacob --size 7G --allow-shrink
#--allow-shrink确认缩减参数,防止误操作

[root@node1 ~]# rbd info jacob
rbd image 'jacob':
size 7168 MB in 1792 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.102b2ae8944a
format: 2
features: layering
flags:

客户端通过KRBD访问

  • 客户端需要安装ceph-common软件包
  • 拷贝配置文件(否则不知道集群在哪)
  • 拷贝连接密钥(否则无连接权限)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[root@client ~]# yum install -y ceph-common
[root@client ~]# scp node1:/etc/ceph/ceph.conf /etc/ceph/

[root@client ~]# scp node1:/etc/ceph/ceph.client.admin.keyring /etc/ceph/

#客户端访问共享镜像
[root@client ~]# rbd map jacob
/dev/rbd0
[root@client ~]# rbd map nb
/dev/rbd1

[root@client ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 500G 0 disk
├─sda1 8:1 0 200M 0 part /boot
└─sda2 8:2 0 201G 0 part
├─centos_master-root 253:0 0 150G 0 lvm /
├─centos_master-swap 253:1 0 1G 0 lvm
└─centos_master-home 253:2 0 50G 0 lvm /home
sr0 11:0 1 4.2G 0 rom /media/centos
rbd0 252:0 0 7G 0 disk <-------
rbd1 252:16 0 10G 0 disk <-------

#查看磁盘和ceph集群对应关系
[root@client ~]# rbd showmapped
id pool image snap device
0 rbd jacob - /dev/rbd0
1 rbd nb - /dev/rbd1

客户端写入数据

  • 格式化
1
2
3
4
5
6
7
8
9
10
11
[root@client ~]# mkfs.xfs /dev/rbd0
meta-data=/dev/rbd0 isize=512 agcount=8, agsize=229376 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=1835008, imaxpct=25
= sunit=1024 swidth=1024 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=8 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0

  • 挂载磁盘、写入数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@client ~]# mount /dev/rbd0 /mnt/

[root@client ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos_master-root 150G 1.2G 149G 1% /
devtmpfs 980M 0 980M 0% /dev
tmpfs 992M 0 992M 0% /dev/shm
tmpfs 992M 9.5M 982M 1% /run
tmpfs 992M 0 992M 0% /sys/fs/cgroup
/dev/sr0 4.2G 4.2G 0 100% /media/centos
/dev/sda1 197M 108M 90M 55% /boot
/dev/mapper/centos_master-home 50G 33M 50G 1% /home
tmpfs 199M 0 199M 0% /run/user/0
/dev/rbd0 7.0G 33M 7.0G 1% /mnt

[root@client ~]# echo "test" >> /mnt/test.txt

快照

创建快照

  • 查看快照
1
2
[root@node1 ~]# rbd snap ls jacob

  • 创建快照
1
2
3
4
5
6
#为jacob镜像创建快照,名称为jacob-snap1
[root@node1 ~]# rbd snap create jacob --snap jacob-snap1

[root@node1 ~]# rbd snap ls jacob
SNAPID NAME SIZE
4 jacob-snap1 7168 MB

恢复快照

  • 客户端删除数据
  • 必须卸载数据盘,不支持在线数据恢复
1
2
[root@client ~]# rm -rf /mnt/test.txt 
[root@client ~]# umount /mnt
  • 回滚快照、还原数据
1
2
3
4
5
6
7
[root@node1 ~]# rbd snap rollback jacob --snap jacob-snap1
Rolling back to snapshot: 100% complete...done.

#客户端重新挂载
[root@client ~]# mount /dev/rbd0 /mnt/
[root@client ~]# ls /mnt/
test.txt

客户端卸载网络磁盘

  • 卸载磁盘
1
2
[root@client ~]# umount /mnt/

  • 取消磁盘映射
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@client ~]# rbd showmapped
id pool image snap device
0 rbd jacob - /dev/rbd0
1 rbd nb - /dev/rbd1

#通过设备名取消映射
[root@client ~]# rbd unmap /dev/rbd0
[root@client ~]# rbd showmapped
id pool image snap device
1 rbd nb - /dev/rbd1

#通过共享镜像名取消映射
[root@client ~]# rbd unmap nb
[root@client ~]# rbd showmapped

[root@client ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 500G 0 disk
├─sda1 8:1 0 200M 0 part /boot
└─sda2 8:2 0 201G 0 part
├─centos_master-root 253:0 0 150G 0 lvm /
├─centos_master-swap 253:1 0 1G 0 lvm
└─centos_master-home 253:2 0 50G 0 lvm /home
sr0 11:0 1 4.2G 0 rom /media/centos

Ceph文件系统

什么是文件系统

  • 块(裸设备)

    没有格式化的设备

  • 文件系统

    ext3、ext4、xfs

    Fat32、NTFS ······

  • 一个文件系统是由inode和block两部分组成

    inode存储文件的描述信息(metadata元数据)

    –文件名、大小、时间、权限、数据在block中的地址编号等信息

    block中存储真正的数据

1.png

创建ceph文件系统

启动MDS服务

  • 在node1主机通过ceph-deploy脚本启动MDS服务
  • 可以启动任何一个节点的mds服务,以node3为例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@node1 ~]# cd ceph-cluster/
#拷贝配置文件启动服务
[root@node1 ceph-cluster]# ceph-deploy mds create node3

[root@node3 ~]# systemctl status ceph-mds@node3
● ceph-mds@node3.service - Ceph metadata server daemon
Loaded: loaded (/usr/lib/systemd/system/ceph-mds@.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2023-04-12 17:57:39 CST; 6min ago
Main PID: 13023 (ceph-mds)
CGroup: /system.slice/system-ceph\x2dmds.slice/ceph-mds@node3.service
└─13023 /usr/bin/ceph-mds -f --cluster ceph --id node3 --setuser ceph --setgroup ce...

Apr 12 17:57:39 node3 systemd[1]: Started Ceph metadata server daemon.
Apr 12 17:57:39 node3 systemd[1]: Starting Ceph metadata server daemon...
Apr 12 17:57:39 node3 ceph-mds[13023]: starting mds.node3 at :/0

创建存储池

  • 在集群中的任何一台主机(node主机)都可以操作
1
2
3
4
5
6
7
8
9
#用于存放block数据,名为cephfs_data,64个PG
[root@node1 ~]# ceph osd pool create cephfs_data 64

#用于存放inode数据,名为cephfs_metadadata,64个PG
[root@node1 ~]# ceph osd pool create cephfs_metadata 64

[root@node1 ~]# ceph osd lspools
0 rbd,1 cephfs_data,2 cephfs_metadata,

2.png

  • obj表示需要读写的数据
  • PG(逻辑概念)对应OSD,数据先写到PG中,PG再写到OSD中
  • OSD表示数据存储的磁盘

创建Ceph文件系统

  • 任何node节点都可以操作
1
2
3
4
5
6
#创建文件系统myfs1,先写metadata池,再写data池
[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 ]

客户端挂载

  • 临时挂载
1
2
3
4
5
6
[root@client ~]# mount -t ceph 192.168.1.11:6789:/ /mnt -o name=admin,secret=AQDwZDZk5f0NKxAA3RQhPEhCwaXGFJDoo7ttHg==

#文件系统类型为ceph
#192.168.1.11为MON节点IP(不是MDS节点)
#admin是用户名,secret是密钥
#密钥在/etc/ceph/ceph.client.admin.keyring
  • 高可用方案(多个IP)
1
[root@client ~]# mount -t ceph 192.168.1.11:6789,192.168.1.12:6789,192.168.1.13:6789:/ /mnt -o name=admin,secret=AQDwZDZk5f0NKxAA3RQhPEhCwaXGFJDoo7ttHg==
  • 永久挂载
1
2
3
[root@client ~]# yum install libcephfs1 -y
[root@client ~]# vim /etc/fstab
192.168.1.11:6789,192.168.1.12:6789,192.168.1.13:6789:/ /mnt ceph defaults,_netdev,name=admin,secret=AQDwZDZk5f0NKxAA3RQhPEhCwaXGFJDoo7ttHg== 0 0
  • 查看
1
2
3
4
[root@client ~]# df -h /mnt
Filesystem Size Used Avail Use% Mounted on
192.168.1.11:6789,192.168.1.12:6789,192.168.1.13:6789:/ 60G 184M 60G 1% /mnt

Ceph对象存储

什么是对象存储

  • 对象存储

    也就是键值存储,通过API接口指令,也就是简单的GET、PUT、DEL和其他扩展,向存储服务器上传下载数据

    对象存储中所有数据都被认为是一个对象,所以,任何数据都可以存入对象存储服务器,如图片、视频、音频等

  • RGW全称是Rados Gateway

  • RGW是Ceph对象存储网关,提供RESTful API访问接口

部署对象存储服务

启动RGW服务

  • 在node1主机通过ceph-deploy脚本启动RGW服务
  • 可以启动任何一个节点的rgw服务,以node3为例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@node1 ~]# cd ceph-cluster/
#拷贝配置文件启动服务
[root@node1 ceph-cluster]# ceph-deploy rgw create node3

[root@node3 ~]# systemctl status ceph-radosgw@rgw.node3
● ceph-radosgw@rgw.node3.service - Ceph rados gateway
Loaded: loaded (/usr/lib/systemd/system/ceph-radosgw@.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2023-04-12 20:56:48 CST; 1min 50s ago
Main PID: 13353 (radosgw)
CGroup: /system.slice/system-ceph\x2dradosgw.slice/ceph-radosgw@rgw.node3.service
└─13353 /usr/bin/radosgw -f --cluster ceph --name client.rgw.node3 --setuser ceph -...

Apr 12 20:56:48 node3 systemd[1]: Started Ceph rados gateway.
Apr 12 20:56:48 node3 systemd[1]: Starting Ceph rados gateway...

修改端口

  • RGW服务默认开放7480端口
  • 修改端口需要到node3节点操作
1
2
3
4
5
6
7
8
9
10
11
12
13
[root@node3 ~]# vim /etc/ceph/ceph.conf
#最后添加
[client.rgw.node3]
rgw_frontends = "civetweb port=8000"

[root@node3 ~]# ss -ntulp |grep radosgw
tcp LISTEN 0 128 *:7480 *:* users:(("radosg",pid=13353,fd=27))

[root@node3 ~]# systemctl restart ceph-radosgw@rgw.node3

[root@node3 ~]# ss -ntulp |grep radosgw
tcp LISTEN 0 128 *:8000 *:* users:(("radosg",pid=13670,fd=27))

客户端测试

  • Client主机操作
1
2
[root@client ~]# curl 192.168.1.13:8000
<?xml version="1.0" encoding="UTF-8"?><ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Owner><ID>anonymous</ID><DisplayName></DisplayName></Owner><Buckets></Buckets></ListAllMyBucketsResult>
  • 第三方软件

    s3cmd