ceph分布式存储

ceph分布式存储

​ 分布式文件系统是指文件系统的物理存储不一定连接到本地节点上,而是通过计算机网络与节点相连。简单来说就是把一些分散的文件夹集合到一个文件夹里。对用户来说,要访问这些共享文件夹时,只要打开这个虚拟共享文件夹,就可以看到所有链接到虚拟共享文件夹内的共享文件夹,用户感觉不到这些共享文件是分散于各个计算机上的。分布式文件系统的好处是集中访问、简化操作、数据容灾,以及提高文件的存取性能。

ceph简介

​ Ceph是一个开源的、统一的分布式存储系统,设计初衷是提供较好的性能、可靠性和可扩展性。其中“统一”是说Ceph可以一套存储系统同时提供块设备存储、文件系统存储和对象存储三种存储功能。

官网:http://docs.ceph.org.cn/start/intro/

Ceph支持的三种存储方式

  • 块存储(将ceph集群看成是一块硬盘)
    块设备可以理解成一块硬盘,用户可以直接使用不含文件系统的块设备,也可以将其格式化成特定的文件系统,由文件系统来组织管理空间。
    块设备,即rbd。rdb就是由Ceph集群提供出来的块设备。可以理解,sda和hda都是通过数据线连接到了真实的硬盘。而rdb是通过网络连接到Ceph集群中的一块存储区域, 往rbd设备文件写入数据,最终会被存储到Ceph集群的这块区域中。

  • 文件系统存储(将ceph集群看成是)
    Ceph文件系统(CEPH FS),可以将ceph集群看成是一个共享文件系统挂载到本地,使用Ceph的存储集群来存储数据。它可以像NFS那样,提供共享文件夹,客户端通过挂载目录的方式使用Ceph提供的存储。

    ​ 在Ceph FS中,与对象存储与块存储最大的区别就是集群中增加了元数据服务节点MDS(Ceph Metedata Server)。MDS也支持多台服务器的分布式部署,以实现系统的高可用

  • 对象存储

    • 对象存储,也就是键值存储,通过其接口指令,也就是简单GET、PUT、DEL和 其他扩展指令,向存储服务上传下载数据等
    • 对象存储中所有数据都被认为是一个对象。所以,任何数据都可以存入对象存储服务器,如图片、视频、音频等
    • Ceph 对象存储的构成, Ceph 对象存储主要是通过RGW来实现,那么什么是 RGW 呢?
    • RGW 即 Rados Gateway 的全称。
    • RGW 是 Ceph 对象存储网关,用于向客户端应用程序提供存储界面,提供RESTful API 访问接口。
    • RGW 可以部署多台做为 高可用和负载均衡

块存储和文件系统存储的区别

  • Ceph的块设备接口不具有共享性,而 Ceph的文件系统具有共享性。
    • 对于块设备来说,文件系统的状态是维护在各用户机中的。假设Ceph块设备同时挂载到用户1和用户2,当在用户1上的文件系统中写入数据后,更新了用户1中的文件系统状态,最终存储到Ceph集群中,但是因为文件系统状态实在各个用户机中维护的,所以用户2不能得知ceph集群数据的更新。因此用户机2上读取用户机1上新写入的数据。

    • 对于ceph的文件系统而言,文件系统的结构是维护在远端的Ceph集群中的,Ceph文件系统同时挂载到了用户1和用户2,当往用户1的挂载点写入数据后,远端的Ceph集群中文件系统结构随之更新,当用户2的挂载点访问数据时会去远端的Ceph集群获取数据,由于远端的Ceph集群已经更新,所以用户2获取了最新的数据。
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RUy6BF5B-1645610886992)(C:\Users\77259\AppData\Roaming\Typora\typora-user-images\1629787868458.png)]

  • Ceph的块设备具有优异的读写性能,但不能多处挂载同时读写

ceph的优点

  • 统一存储
    ceph支持三种接口的调用:对象存储,块存储,文件系统挂载。三种方式可以一同使用。在国内一些公司的云环境会采用ceph作为openstack的唯一后端存储来提升数据转发效率。
  • CRUSH算法
    Crush算法是ceph的两大创新之一。传统的集中式存储是元数据寻址的方案,ceph使用crush算法来完成数据的存储操作。Crush在一致性哈希基础上很好的考虑了容灾的隔离,能够实现各类负载的副本放置规则。Crush算法有相当强大的扩展性,理论上支持数千个存储节点。
  • 高可扩展性
    扩容方便、容量大。能够管理数千台服务器、EB级的容量。
  • 可靠性强
    Ceph中的数据副本数量可以由管理员自行定义,副本能够垮主机、机架、机房、数据中心存放。所以安全可靠。存储节点可以自管理、自动修复。无单点故障,容错性强。
  • 高性能性
    因为是多个副本,因此在读写操作时候能够做到高度并行化。理论上,节点越多,整个集群的IOPS和吞吐量越高。另外一点ceph客户端读写数据直接与存储设 备(osd) 交互。

ceph组件

  • Ceph OSD:提供存储资源
    • Ceph OSD功能是用于集群中所有数据和对象的存储,处理集群数据的复制、恢复、回填、在均衡,与其他OSD间进行心跳检测等,并将一些变化情况上报给Ceph Monitor。
    • 一般情况下 一块硬盘对应一个OSD,由OSD对硬盘存储进行管理,当然一个分区也可以成为一个OSD。当Ceph存储集群设置为两个副本时,至少需要两个OSD守护进程,集群才能达到active+clean状态(Ceph默认由三个副本,可以调整副本数,active表示磁盘处于活动状态,clean表示主OSD和副本OSD成功同步)。
    • 伴随着OSD还有一个概念叫做Journal盘,一般写数据到Ceph集群时,都是先将数据写入到journal盘中,然后每隔一段时间再将Journal盘中的数据刷新到文件系统中。Journal盘都是采用SSD。
      Ceph中引入Journal盘的概念是因为Journal允许Ceph OSD随机小块的写操作首先写入journal,然后合并成顺序IO刷到文件系统。
  • Monitors
    • Ceph Monitor负责监视Ceph集群,维护Ceph集群的健康状态,同时维护着Ceph 集群中的各种Map图,包括监视器图、OSD 图、归置组( PG )图、和 CRUSH 图。
    • 还维护了monitor、OSD和PG的状态改变历史信息,这些Map统称为ClusterMap,Cluster Map是RADOS的关键数据结构,管理集群中的所有成员、关系、属性等信息以及数据的分发,比如当用户需要存储数据到Ceph集群时,OSD需要先通过Monitor获取最新的Map图,然后根据Map图和object id等计算出数据最终存储的位置。
    • Ceph 存储集群至少需要一个 Ceph Monitor(服务器数量必须是奇数)和两个 OSD 守护进程。而运行 Ceph 文件系统客户端时,则必须要有元数据服务器( Metadata Server )。
  • MDS
    Ceph 元数据服务器(MDS)为 Ceph 文件系统存储元数据,但对象存储和块存储设备是不需要使用该服务。元数据服务器使得 POSIX 文件系统的用户可以在不 对 Ceph 存储集群造成负担的前提下,执行诸如 ls、find 等基本命令。
  • Mgr
    • ceph luminous版本中新增加了一个组件: Ceph Manager Daemon,简称ceph-mgr。 该组件的主要作用是分担和扩展monitor的部分功能,减轻monitor的负担,让更 好地管理ceph存储系统。
    • Ceph Manager守护进程(ceph-mgr)负责跟踪运行时指标和Ceph集群的当前状态,包括存储利用率,当前性能指标和系统负载。Ceph Manager守护进程还基于python的插件来管理和公开Ceph集群信息,包括基于Web的Ceph Manager Dashboard(WEB界面的管理)和 RESTFUL API(API方式获取ceph信息,与之前的ceph-rest-api功能一致)、Zabbix、Prometheus、Influx(这三个实现了ceph的数据收集、监控等功能)。高可用性通常至少需要两个管理器。

ceph存储概念

  • 存储数据和object的关系
    无论使用哪种存储方式(对象、块、挂载),当用户要将数据存储到Ceph集群时,存储数据都会被分割成多个object,每个object都有一个object id,每个object的大小是可以设置的,默认是4MB,object可以看成是Ceph存储的最小存储单元。

  • Object与pg的关系
    由于object的数量很多,对象的size很小,在一个大规模的集群中可能有几百到几千万个对象。这么多对象光是遍历寻址,速度都是很缓慢的,为了解决这些问题,ceph引入了归置组(Placcment Group即PG)的概念用于管理object,每个object最后都会通过CRUSH算法计算映射到某个pg中,一个pg可以包含多个object。

  • pg和pgp的关系
    pg是用来存放object的,pgp相当于是pg存放osd的一种排列组合我举个例子,比如有3个osd,osd.1、osd.2和osd.3,副本数是2,如果pgp的数目为1,那么pg存放的osd组合就只有一种,可能是[osd.1,osd.2],那么所有的pg主从副本分别存放到osd.1和osd.2,如果pgp设为2,那么其osd组合可以两种,可能是[osd.1,osd.2]和[osd.1,osd.3],很像我们高中数学学过的排列组合

  • 存储池pool
    存储池(pool):是对Ceph集群进行的逻辑划分,主要设置其中存储对象的权限、备份数目、PG数以及CRUSH规则等属性。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4DJgEDNr-1645610886993)(C:\Users\77259\AppData\Roaming\Typora\typora-user-images\1629792808608.png)]

    Pool是管理员自定义的命名空间,像其他的命名空间一样,用来隔离对象与PG。我们在调用API存储即使用对象存储时,需要指定对象要存储进哪一个POOL中。除了隔离数据,我们也可以分别对不同的POOL设置不同的优化策略,比如副本数、数据块及对象大小等。

  • Ceph数据存储过程

    • Ceph存储集群从客户端接收文件,每个文件都会被客户端切分成一个或多个对象,然后将这些对象进行分组,再根据一定的策略存储到集群的OSD节点中。储过程如图所示:
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DFvTu94u-1645610886993)(C:\Users\77259\AppData\Roaming\Typora\typora-user-images\1629792969872.png)]
    • 图中,对象的分发需要经过两个阶段的计算,才能得到存储该对象的OSD,然后将对象存储到OSD中对应的位置。
    • 对象到PG的映射。
      PG是对象的逻辑集合。PG是系统向OSD节点分发数据的基本单位,相同PG里的对象将被分发到相同的OSD节点中(一个主OSD节点多个备份OSD节点)。对象的PG是由对象ID号通过Hash算法,结合其他一些修正参数得到的。
    • PG到相应的OSD的映射。
      RADOS系统利用相应的哈希算法根据系统当前的状态以及PG的ID号,将各个PG分发到OSD集群中。OSD集群是根据物理节点的容错区域(比如机架、机房等)来进行划分的。

IO流程

步骤

  1. client 创建cluster handler(集群处理信息)。
  2. client 读取配置文件。
  3. client 连接上monitor,获取集群map信息。
  4. client 读写io 根据crush map 算法请求对应的主osd数据节点。
  5. 主osd数据节点同时写入另外两个副本节点数据。
  6. 等待主节点以及另外两个副本节点写完数据状态。
  7. 主节点及副本节点写入状态都成功后,返回给client,io写入完成。

ceph集群部署(ceph FS)

1、部署环境

服务器IP角色
wy-3192.168.116.3admin,osd,mon,mgr
wy-4192.168.116.4osd,mds
wy-5192.168.116.5osd,mds
wy-6192.168.116.6client

禁用selinux,关闭防火墙

所有服务器上都进行一下操作

[root@wy-3 ~]# systemctl stop firewalld
[root@wy-3 ~]# systemctl disable firewalld
[root@wy-3 ~]# setenforce 0

编辑host文件

所有服务器上都进行一下操作

[root@wy-3 ~]# vim /etc/hosts

添加一下内容

192.168.116.3  wy-3
192.168.116.4  wy-4
192.168.116.5  wy-5
192.168.116.6  wy-6

SSH免密登录

[root@wy-3 ~]# ssh-keygen	//一直回车不设密码
[root@wy-3 ~]# ssh-copy-id wy-3
[root@wy-3 ~]# ssh-copy-id wy-4
[root@wy-3 ~]# ssh-copy-id wy-5
[root@wy-3 ~]# ssh-copy-id wy-6

测试免密登录

[root@wy-3 ~]# for i in 3 4 5 6 ; do ssh wy-$i hostname ; done
wy-3
wy-4
wy-5
wy-6

2、yum源配置

配置本地yum源

[root@wy-3 ~]# mount /dev/cdrom /mnt
[root@wy-3 ~]# vim /etc/yum.repos.d/centos.repo

添加内容

[centos7]
name=CentOS7
baseurl=file:///mnt
enable=1
gpgcheck=0

上传软件包并解压

上传软件包

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oJQ47Fro-1645610886994)(C:\Users\77259\AppData\Roaming\Typora\typora-user-images\1629795651803.png)]

解压

[root@wy-3 ~]# tar -zxvf ceph-12.2.12.tar.gz

产生一个新文件夹

配置ceph源

[root@wy-3 ~]# vim /etc/yum.repos.d/ceph-package.repo

添加一下内容

[ceph-package]
name=ceph-package
baseurl=file:///root/ceph
enabled=1
gpgcheck=0

复制ceph相关文件夹

复制ceph软件包和相关文件夹到wy-4,wy-5

发送ceph软件包

[root@wy-3 ~]# scp -r ceph wy-4:/root
[root@wy-3 ~]# scp -r ceph wy-5:/root

发送ceph源

[root@wy-3 ~]# scp /etc/yum.repos.d/ceph-package.repo wy-4:/etc/yum.repos.d/
[root@wy-3 ~]# scp /etc/yum.repos.d/ceph-package.repo wy-5:/etc/yum.repos.d/

部署ceph

在wy-3、wy-4、wy-5上安装,ceph-deploy是ceph集群部署工具。其他软件是依赖包。

如果失败,查看是否进行了挂载

[root@wy-3 ~]# yum install -y ceph-deploy ceph ceph-radosgw snappy leveldb gdisk python-argparse gperftools-libs
[root@wy-4 ~]# yum install -y ceph-deploy ceph ceph-radosgw snappy leveldb gdisk python-argparse gperftools-libs
[root@wy-5 ~]# yum install -y ceph-deploy ceph ceph-radosgw snappy leveldb gdisk python-argparse gperftools-libs

3、管理节点服务部署 wy-3

创建新集群

注:也可以在wy-4,wy-5上同时部署mon,实现高可用,生产环境中最少三个mon独立

在/etc/ceph目录操作,创建一个新集群,并设置wy-3为mon节点

[root@wy-3 ~]# cd /etc/ceph/
[root@wy-3 ceph]# ceph-deploy new wy-3

执行完成后,在此目录下会产生三个文件夹

  • **ceph.conf:**ceph配置文件,做各种参数优化
    在osd进程生成并挂载使用后,想修改配置需要使用命令行工具,修改配置文件是无效的,所以需要提前规划好优化的参数。
  • **ceph-deploy-ceph.log:**监视器密钥环

修改副本数

配置文件的默认副本数从3改成2,这样只有两个osd也能达到active+clean状态

[root@wy-3 ceph]# vim ceph.conf
[global]
fsid = 555b4c51-deb4-4c50-80f9-e4a66888c0f7
mon_initial_members = wy-3
mon_host = 192.168.116.3
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
#添加如下一行
osd_pool_default_size = 2

**osd_pool_default_size:**将默认副本数改为2,如果不设置默认的副本数为3

安装ceph monitor

[root@wy-3 ceph]# ceph-deploy mon create wy-3

收集节点的keyring文件

收集Ceph集群的密码文件

[root@wy-3 ceph]# ceph-deploy  gatherkeys wy-3
[root@wy-3 ceph]# ls

其中ceph.client.admin.keyring是连接ceph集群的admin账号密钥

看一下
[root@wy-3 ceph]# cat ceph.client.admin.keyring 
[client.admin]
	key = AQDdvSRhA8syBhAAVigp/boF/9U32xGyBle0mg==

4、部署osd服务

添加完硬盘不要分区,直接使用

使用ceph自动分区

用下列命令擦净(删除分区表)磁盘,以用于 Ceph

[root@wy-3 ceph]# ceph-deploy disk zap wy-3 /dev/sdb
[root@wy-3 ceph]# ceph-deploy disk zap wy-4 /dev/sdb
[root@wy-3 ceph]# ceph-deploy disk zap wy-5 /dev/sdb

添加osd节点

[root@wy-3 ceph]# ceph-deploy osd create wy-3 --data /dev/sdb
[root@wy-3 ceph]# ceph-deploy osd create wy-4 --data /dev/sdb
[root@wy-3 ceph]# ceph-deploy osd create wy-5 --data /dev/sdb

查看osd状态

[root@wy-3 ceph]# ceph-deploy osd list wy-3 wy-4 wy-5

5、部署mgr管理服务

在管理主机上部署mgr管理服务,也可以同时在wy-4,wy-5上部署mgr,实现高可用。

[root@wy-3 ceph]# ceph-deploy mgr create wy-3

6、统一集群配置

用ceph-deploy把配置文件和admin密钥拷贝到所有节点,这样每次执行Ceph命令行时就无需指定monitor地址和ceph.client.admin.keyring了

[root@wy-3 ceph]# ceph-deploy admin wy-3 wy-4 wy-5

会把这两个文件传给对应服务器

各个节点修改ceph.client.admin.keyring权限

[root@wy-3 ceph]#  chmod +r /etc/ceph/ceph.client.admin.keyring
[root@wy-4 ceph]#  chmod +r /etc/ceph/ceph.client.admin.keyring
[root@wy-5 ceph]#  chmod +r /etc/ceph/ceph.client.admin.keyring

7、部署mds服务

  • mds是ceph集群中的元数据服务器,而通常它不是必须的。因为只有在使用cephfs的时候才需要

  • Mds虽然是元数据服务器,但是它不负责存储元数据,元数据也被切成对象存储在各个osd节点中。

  • 在创建ceph fs时,至少需要两个POOL,一个用于存放数据,另一个用于存放元数据。

  • Mds只是负责接受用户的元数据查询请求,然后从osd中把数据取出来映射进自己的内存中供客户访问。

  • mds其实类似一个代理缓存服务器,替osd分担了用户的访问压力

安装mds

[root@wy-3 ceph]# ceph-deploy mds create wy-4 wy-5

查看mds服务状态

[root@wy-3 ceph]# ceph mds stat
, 2 up:standby

查看集群状态

[root@wy-3 ceph]# ceph -s
  • health:健康状态
  • mon:集群监视器,一个守护进程、服务器是wy-3
  • mgr:集群管理者,主机wy-3 活跃的
  • osd:存储资源,3个osd,3个在线,
  • data:数据信息
    • pools:存储池
    • objects:对象数量
    • usage空间使用

8、创建ceph文件系统

查看当前文件系统

[root@wy-3 ceph]# ceph fs ls
No filesystems enabled

创建存储池

#命令介绍
#创建数据存储池
ceph osd pool create cephfs_data <pg_num>
#创建数据源存储池
ceph osd pool create cephfs_metadata <pg_num>
其中:<pg_num> = 128  #pg的大小
#关于创建存储池
 确定 pg_num 取值是强制性的,因为不能自动计算。
 *少于 5 个 OSD 时可把 pg_num 设置为 128
 *OSD 数量在 510 个时,可把 pg_num 设置为 512
 *OSD 数量在 1050 个时,可把 pg_num 设置为 4096
 *OSD 数量大于 50 时,你得理解权衡方法、以及如何自己计算 pg_num 取值
 *自己计算 pg_num 取值时可借助 pgcalc 工具

随着 OSD 数量的增加,正确的 pg_num 取值变得更加重要,因为它显著地影响着集群的行为、以及出错时的数据持久性(即灾难性事件导致数据丢失的概率)。

创建存储池

[root@wy-3 ceph]# ceph osd pool create cephfs_data 128
pool 'cephfs_data' created
[root@wy-3 ceph]# ceph osd pool create cephfs_metadata 128
pool 'cephfs_metadata' created

创建文件系统

创建好存储池后,你就可以用 fs new 命令创建文件系统了

#命令  ceph fs new <fs_name> cephfs_metadata cephfs_data 
 其中:<fs_name> = cephfs  可自定义

给刚才创建的2个存储池创建文件系统

[root@wy-3 ceph]# ceph fs new cephfs cephfs_metadata cephfs_data
new fs with metadata pool 2 and data pool 1

看一下

[root@wy-3 ceph]# ceph fs ls
name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]

看一下mds状态

[root@wy-3 ceph]# ceph mds stat
cephfs-1/1/1 up  {0=wy-5=up:active}, 1 up:standby
#active是活跃的,另1个是处于热备份的状态

9、用内核驱动挂载Ceph文件系统

要挂载 Ceph 文件系统,如果你知道监视器 IP 地址可以用 mount 命令、或者用 mount.ceph 工具来自动解析监视器 IP 地址。

创建挂载点

[root@wy-6 ~]# mkdir wangyu

使用密钥挂载

[root@wy-6 ~]# mount -t ceph 192.168.116.3:/ 
			/root/wangyu -o name=admin,secret=AQDdvSRhA8syBhAAVigp/boF/9U32xGyBle0mg==

这里的secret是密钥,到admin中查看一下

[root@wy-3 ~]# cd /etc/ceph/
[root@wy-3 ceph]# ls
ceph.bootstrap-mds.keyring  ceph.bootstrap-rgw.keyring  ceph-deploy-ceph.log
ceph.bootstrap-mgr.keyring  ceph.client.admin.keyring   ceph.mon.keyring
ceph.bootstrap-osd.keyring  ceph.conf                   rbdmap
[root@wy-3 ceph]# cat ceph.client.admin.keyring 
[client.admin]
	key = AQDdvSRhA8syBhAAVigp/boF/9U32xGyBle0mg==

挂载成功

使用密钥文件挂载

创建密钥文件夹

[root@wy-6 ~]# mkdir /etc/ceph
[root@wy-6 ~]# vim /etc/ceph/admin.secret
#写入在管理节点上/etc/ceph/ceph.client.admin.keyring的key对应的值

解除挂载

[root@wy-6 ~]# umount /root/wangyu

使用秘钥文件挂在需要安装ceph-common-12.2.12

拷贝ceph软件包和yum配置文件到wy-6客户端

[root@wy-3 ~]# scp -r ceph wy-6:/root
[root@wy-3 ~]# scp /etc/yum.repos.d/ceph-package.repo wy-6:/etc/yum.repos.d/

安装ceph-common-12.2.12

[root@wy-6 ~]# yum install -y ceph-common-12.2.12

挂载

[root@wy-6 ~]# mount -t ceph 192.168.116.3:/ /root/wangyu -o 
				name=admin,secretfile=/etc/ceph/admin.secret

查看

[root@wy-6 ~]# df

取消挂载

[root@wy-6 ~]# umount /root/wangyu

用户控件挂载

安装ceph-fuse

[root@wy-6 ~]# yum install -y ceph-fuse

将ceph-mon中的密钥文件和ceph配置文件传给客户端

[root@wy-3 ceph]# scp ceph.client.admin.keyring ceph.conf wy-6:/etc/ceph/

挂载

[root@wy-6 ~]#  ceph-fuse -m 192.168.116.3 /root/wangyu 
[root@wy-6 ~]#  df

10、测试共享

创建一个新的挂载点
[root@wy-6 ~]# mkdir wangyu2

挂载

[root@wy-6 ~]#  ceph-fuse -m 192.168.116.3 /root/wangyu2 

查看

创建一个测试文件

[root@wy-6 ~]# ls
anaconda-ks.cfg  ceph  wangyu  wangyu2
[root@wy-6 ~]# cd wangyu
[root@wy-6 wangyu]# touch 1.txt
[root@wy-6 wangyu]# ls
1.txt

进入到wangyu2中查看

[root@wy-6 wangyu]# cd /root/wangyu2/
[root@wy-6 wangyu2]# ls
1.txt

确实存在 说明成功了,并且是共享的


版权声明:本文为weixin_44335659原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。