Linux云计算 |【第二阶段】CLUSTER-DAY3

主要内容:

Ceph概述、部署Ceph集群、Ceph块存储

一、分布式存储基础

分布式系统(Distributed File System)是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连组成的系统;分布式系统的出现是为了用廉价的、普通的机器完成单个计算机无法完成的计算、存储任务。其目的是利用更多的机器,处理更多的数据;

常用分布式文件系统:Lustre、Hadoop、FastDFS、Ceph、GlusterFS

1)Ceph架构简介及使用场景介绍

  • Ceph 是一个统一的分布式存储系统,特点具有高性能、高可用性、高可扩展性、特性丰富;
  • Ceph 可以提供:对象存储、块存储、文件系统存储;
  • Ceph 可以提供PB级别的存储空间(PB->TB->GB,即1024*1024GB=1048576GB)
  • 软件定义存储(Software Defined Storage)
  • Ceph 帮助手册官网:https://docs.ceph.comhttp://docs.ceph.org.cn

2) Ceph特点介绍

① 高性能

  • 摒弃了传统的集中式存储元数据寻址的方案,采用CRUSH算法,数据分布均衡,并行度高。
  • 考虑了容灾域的隔离,能够实现各类负载的副本放置规则,例如跨机房、机架感知等。
  • 能够支持上千个存储节点的规模,支持TB到PB级的数据。

② 高可用性

  • 副本数可以灵活控制。
  • 支持故障域分隔,数据强一致性。
  • 多种故障场景自动进行修复自愈。
  • 没有单点故障,自动管理。

③ 高可扩展性

  • 去中心化。
  • 扩展灵活。
  • 随着节点增加而线性增长。

④ 特性丰富

  • 支持三种存储接口:块存储、文件存储、对象存储。
  • 支持自定义接口,支持多种语言驱动。

3)Ceph组件

  • OSDs(ceph-osd)真实的提供存储空间的硬件设备

作用:共享硬盘,OSD三备份(三副本)

  • Monitors(ceph-mon)集群监控组件

作用:带健康检测功能及绘制map地图,MON过半原则(要求超过一半的服务器是正常的,所以服务器数量一般为奇数)

补充:地图内容包括几台主机组成OSD存储、主机IP、共享的存储磁盘等,且实时更新;

  • RadosGateway(RGW,ceph-radosgw)对象存储网关

  • MDSs(ceph-mds)存放文件系统的元数据(对象存储和块存储不需要该组件)

  • Client-ceph(ceph-common)ceph客户端

注意:一个服务器至少需要3个OSD (做OSD的3副本备份);MON至少需要奇数位个服务器(MON过半原则)

扩展:Ceph核心组件及概念介绍(作为参考)

  1. **Monitor:**一个Ceph集群需要多个Monitor组成的小集群,它们通过Paxos同步数据,用来保存OSD的元数据。
  2. **OSD:**OSD全称Object Storage Device,也就是负责响应客户端请求返回具体数据的进程。一个Ceph集群一般都有很多个OSD。一般配置成和磁盘一一对应,一块磁盘启动一个OSD进程。
  3. **MDS:**MDS全称Ceph Metadata Server,是CephFS服务依赖的元数据服务。
  4. **pool:**是存储对象的逻辑分区,它规定了数据冗余的类型和对应的副本分布策略;支持两种类型:副本(replicated)和 纠删码( Erasure Code)
  5. **PG:**PG全称Placement Grouops归置组,是一个逻辑的概念,一个PG包含多个对象,是对象的集合,该集合里的所有对象都具有相同的放置策略(相同PG内的对象都会放到相同的硬盘上);PG是 ceph的核心概念,服务端数据均衡和恢复的最小粒度就是PG,引入PG这一层其实是为了更好的分配数据和定位数据。
  6. **Object:**Ceph最底层的存储单元是Object对象,每个Object包含元数据和原始数据。
  7. **RADOS:**RADOS全称Reliable Autonomic Distributed Object Store,是Ceph集群的精华,用户实现数据分配、Failover等集群操作。
  8. **Libradio:**Librados是Rados提供库,因为RADOS是协议很难直接访问,因此上层的RBD、RGW和CephFS都是通过librados访问的,目前提供PHP、Ruby、Java、Python、C和C++支持。
  9. **CRUSH:**CRUSH是Ceph使用的数据分布算法,类似一致性哈希,让数据分配到预期的地方。
  10. **RBD:**RBD全称RADOS block device,是Ceph对外提供的块设备服务。
  11. **RGW:**RGW全称RADOS gateway,是Ceph对外提供的对象存储服务,接口与S3和Swift兼容。
  12. **CephFS:**CephFS全称Ceph File System,是Ceph对外提供的文件系统服务。

OSD存储代表共享的硬盘,MON用来健康检查健康和绘制地图;客户端可访问MON获取MAP地图(元数据),地图内容:主机组成OSD存储、主机IP、共享的存储磁盘信息;

用户端在存储数据时,通过数据切片(默认4M)进行上传;(高性能--->数据切割)

Ceph集群会自动将数据拷贝3份存放,且有寄生作用,当某个存放的服务器宕机通过寄生可以再复制,一般标准3副本(安全性--->3副本拷贝)

CRUSH数据分布算法(Controlled, Scalable, Decentralized Placement of Replicated Data),可控的、可扩展的、分布式的副本数据放置算法,主要目的是为了定位所存储数据的位置;

补充:在Ceph存储中,数据都是以object为基本单位进行存储的,每个object默认为4MB大小;若干个object属于一个PG(Placement Group,归置组);而若干个PG又属于一个OSD;一般来说,一个OSD对应于一块磁盘。PG到OSD的映射的过程算法叫做CRUSH 算法。(一个Object需要保存三个副本,也就是需要保存在三个osd上);

CRUSH算法是一个伪随机的过程,他可以从所有的OSD中,随机性选择一个OSD集合,但是同一个PG每次随机选择的结果是不变的,也就是映射的OSD集合是固定的。


案例1:部署实验环境

案例要求:设置防火墙/SELinux、配置主机名、IP、YUM源、无密码SSH连接、/etc/hosts域名解析、NTP时间同步、添加磁盘

  • 1)创建1台客户端虚拟机192.168.4.10,3台存储集群虚拟机192.168.4.11、4.12、4.13
  • 3)配置主机名、IP地址、YUM源
  • 4)配置无密码SSH连接
  • 5)配置NTP时间同步
  • 6)添加虚拟机磁盘(为ceph集群作为存储使用)

步骤1:安装前准备

1)为所有节点配置yum源服务器

真机第二阶段素材中ceph10.iso挂载到/var/ftp/ceph目录,为所有虚拟机提供YUM源

bash 复制代码
[root@localhost 桌面]# mkdir /var/ftp/ceph
[root@localhost 桌面]# mount -t iso9660 /linux-soft/2/ceph10.iso /var/ftp/ceph/
[root@localhost 桌面]# df -h
文件系统        容量  已用  可用 已用% 挂载点
/dev/loop2     284M  284M   0  100% /var/ftp/ceph
[root@localhost 桌面]# vim /etc/fstab
/dev/loop2 /var/ftp/ceph iso9660 defaults 0 0
[root@localhost 桌面]# mount -a

补充:[-t] 选项为指定驱动设备,否则在配置永久挂载时无驱动设备,mount -a会报错;

2)为虚拟机添加磁盘(node1、node2、node3主机操作)

除client客户端,所有3台ceph服务器都添加2块 20G磁盘

bash 复制代码
[root@node1 ~]# lsblk      //查看新增的2块磁盘(以node1为例)
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda    253:0    0  30G  0 disk
└─vda1 253:1    0  30G  0 part /
vdb    253:16   0  20G  0 disk
vdc    253:32   0  20G  0 disk

3)所有主机设置防火墙和SELinux(所有主机操作)

bash 复制代码
[root@client ~]# firewall-cmd --set-default-zone=trusted
[root@client ~]# sed -i '/SELINUX/s/enforcing/permissive/' /etc/selinux/config
[root@client ~]# setenforce 0

[root@node1 ~]# firewall-cmd --set-default-zone=trusted
[root@node1 ~]# sed -i '/SELINUX/s/enforcing/permissive/' /etc/selinux/config
[root@node1 ~]# setenforce 0

[root@node2 ~]# firewall-cmd --set-default-zone=trusted
[root@node2 ~]# sed -i '/SELINUX/s/enforcing/permissive/' /etc/selinux/config
[root@node2 ~]# setenforce 0

[root@node3 ~]# firewall-cmd --set-default-zone=trusted
[root@node3 ~]# sed -i '/SELINUX/s/enforcing/permissive/' /etc/selinux/config
[root@node3 ~]# setenforce 0

4)配置SSH无密码连接(node1操作)

配置SSH无密码连接为了同时给其它所有主机远程拷贝文件、安装软件包、启动服务等;

注意:拷贝公钥时,包括node1主机也需要拷贝,实现远程自己不需要密码

bash 复制代码
[root@node1 ~]# ssh-keygen -f /root/.ssh/id_rsa -N ''
[root@node1 ~]# for i in {10..13}
> do
> ssh-copy-id 192.168.4.$i   //将密钥传递给192.168.4.10、4.11、4.12、4.13
> done

5)修改/etc/hosts并同步到所有主机(node1操作)

注意:/etc/hosts解析的域名要与本机主机名一致

bash 复制代码
[root@node1 ~]# vim /etc/hosts    //修改文件(不要删除文件原有内容)
...
192.168.4.10  client
192.168.4.11  node1
192.168.4.12  node2
192.168.4.13  node3

将/etc/hosts文件拷贝给所有其他主机(client、node1、node2、node3)

bash 复制代码
[root@node1 ~]# for i in client node{1..3}
> do
> scp /etc/hosts/ $i:/etc/
> done

6)修改所有节点都需要配置YUM源,并同步到所有主机

注意:由于真机以将ceph10.iso挂载到/var/ftp/ceph目录,且有3个YUM源

bash 复制代码
[root@node1 ~]# vim /etc/yum.repos.d/ceph.repo    //新建YUM源配置文件
[mon]
name=mon
baseurl=ftp://192.168.4.254/ceph/MON
enabled=1
gpgcheck=0
[osd]
name=osd
baseurl=ftp://192.168.4.254/ceph/OSD
enabled=1
gpgcheck=0
[tools]
name=tools
baseurl=ftp://192.168.4.254/ceph/Tools
enabled=1
gpgcheck=0
[root@node1 ~]# yum clean all     //清空缓存
[root@node1 ~]# yum repolist     //列出yum清单
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
源标识                             源名称                            状态
local_repo                         CentOS-7 - Base                  9,911
mon                                mon                              41
osd                                osd                              28
tools                              tools                            33
repolist: 10,013

将/etc/yum.repos.d/ceph.repo文件拷贝给所有其他主机(client、node1、node2、node3)

bash 复制代码
[root@node1 ~]# for i in client node{1..3}
> do
> scp /etc/yum.repos.d/ceph.repo $i:/etc/yum.repos.d/
> done

7)配置NTP服务器(Client操作)

bash 复制代码
[root@client ~]# yum -y install chrony    //安装网络时间同步(NTP)软件包
[root@client ~]# vim /etc/chrony.conf
 28 allow 192.168.4.0/24     //允许192.168.4.0网段访问
 31 local stratum 10
[root@client ~]# systemctl restart chronyd     //重启服务

8)修改NTP客户端配置(node1,node2,node3操作)

bash 复制代码
[root@node1 ~]# for i in node{1..3}    //安装网络时间同步(NTP)软件包
> do
> ssh $i "yum -y install chrony"
> done
[root@node1 ~]# vim /etc/chrony.conf    //修改配置文件
server 192.168.4.10 iburst
[root@node1 ~]# systemctl restart chronyd    //重启NTP服务
[root@node1 ~]# chronyc sources -v    //查看同步结果,【^*】
210 Number of sources = 1
  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
 / .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| /   '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
||                                                 .- xxxx [ yyyy ] +/- zzzz
||      Reachability register (octal) -.           |  xxxx = adjusted offset,
||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
||                                \     |          |  zzzz = estimated error.
||                                 |    |           \
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* client                       10   6    17    13  +1776ns[  +90us] +/- 1229us

[root@node2 ~]# yum -y install chrony
[root@node2 ~]# vim /etc/chrony.conf
server 192.168.4.10 iburst
[root@node2 ~]# systemctl restart chronyd
[root@node2 ~]# chronyc sources -v        //查看同步结果,【^*】

[root@node3 ~]# yum -y install chrony
[root@node3 ~]# vim /etc/chrony.conf
server 192.168.4.10 iburst
[root@node3 ~]# systemctl restart chronyd
[root@node3 ~]# chronyc sources -v        //查看同步结果,【^*】

9)给所有节点安装ceph相关软件包(client、node1,node2,node3)

bash 复制代码
[root@node1 ~]# for i in client node{1..3}
> do
> ssh $i "yum -y install ceph-mon ceph-osd ceph-mds ceph-radosgw"
> done

解释说明:

ceph-mon 集群监控组件

ceph-osd 存储设备

ceph-mds 存放文件系统的元数据

ceph-radosgw 对象存储网关


案例2:部署ceph集群(node1操作)

案例要求:沿用案例1,部署Ceph集群服务器,实现以下目标:

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

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

1)安装部署工具,学习工具的语法格式(node1操作)

  • 软件包:ceph-deploy.noarch 工具
bash 复制代码
[root@node1 ~]# yum -y install ceph-deploy.noarch   //安装ceph-deploy工具
[root@node1 ~]# which ceph-deploy
/usr/bin/ceph-deploy
[root@node1 ~]# head -2 /usr/bin/ceph-deploy
#!/usr/bin/env python     //ceph-deploy是python脚本,可自动配置文件及启服务
...
[root@node1 ~]# ceph-deploy  --help   //ceph-deploy命令支持--help查看帮助
[root@node1 ~]# ceph-deploy mon --help   //子命令也支持--help查看帮助

2)为部署工具创建目录,存放密钥与配置文件

bash 复制代码
[root@node1 ~]# mkdir ceph-cluster    //创建目录(类似ansible原理)
[root@node1 ~]# cd ceph-cluster/   //切换目录,识别配置文件,执行命令操作
[root@node1 ceph-cluster]#

步骤2:部署Ceph集群

1)创建Ceph集群配置,在ceph-cluster目录下生成Ceph主配置文件

在生成的ceph.conf配置文件中定义了monitor主机是谁(至少3台服务器)

  • 配置文件:ceph.conf
  • 命令:ceph-deploy new 域名1 域名2 域名... //创建ceph集群,生成ceph配置文件

注意:在执行脚本生成配置文件前,需要确保所有主机配置SSH及无密码认证,ceph在生成配置文件时,需要SSH远程到定义的monitor主机收集IP地址信息;

注意:new后面是ceph集群定义的mon节点,需填写/etc/hosts识别的域名,不能是IP;

bash 复制代码
[root@node1 ceph-cluster]# ceph-deploy new node1 node2 node3  //执行脚本生成配置文件
[root@node1 ceph-cluster]# ls
ceph.conf  ceph-deploy-ceph.log  ceph.mon.keyring

2)修改生成的配置文件,并添加COW(Copy on write写时复制)

bash 复制代码
[root@node1 ceph-cluster]# vim ceph.conf    //修改配置文件
[global]
fsid = b3f2a3cd-b8c3-4213-8508-3342378844fb   //ceph集群唯一id
mon_initial_members = node1, node2, node3     //集群的mon节点
mon_host = 192.168.4.11,192.168.4.12,192.168.4.13   //mon节点的IP
auth_cluster_required = cephx    //cephx为密码占位符,提示访问集群需要密码
auth_service_required = cephx
auth_client_required = cephx
rbd_default_features = 1     //手动添加,默认开启COW分层快照的功能(写时复制)

3)初始化所有节点的mon服务,启动mon服务(软件包ceph-mon)

注意:由于执行脚本时,配置文件在当前目录/root/ceph-cluster下,启动ceph-mon服务则需要在/etc/ceph读取配置文件才能运行mon服务;执行ceph-deploy mon create-initial命令拷贝当前目录的配置文件到所有mon节点的/etc/ceph/目录并启动mon服务(自动设置服务开机自启)

  • 命令:ceph-deploy mon create-initial //初始化所有节点的mon服务并启动
bash 复制代码
[root@node1 ceph-cluster]# ceph-deploy mon create-initial   //初始化mon服务
[root@ceph-client ceph-cluster]# ls      //验证,当前目录初始化后新增各服务的.keyring文件
ceph.bootstrap-mds.keyring  ceph.client.admin.keyring
ceph.bootstrap-mgr.keyring  ceph.conf
ceph.bootstrap-osd.keyring  ceph-deploy-ceph.log
ceph.bootstrap-rgw.keyring  ceph.mon.keyring
[root@node1 ceph-cluster]# ls /etc/ceph/    //验证
ceph.client.admin.keyring  ceph.conf  rbdmap  tmpIFdgm_

[root@node2 ~]# ls /etc/ceph/   //验证
ceph.client.admin.keyring  ceph.conf  rbdmap  tmpW5qL9K

[root@node3 ~]# ls /etc/ceph/   //验证
ceph.client.admin.keyring  ceph.conf  rbdmap  tmpXq1c1r

补充:配置文件ceph.conf中定义了3个mon节点,每个节点已获取了对应的IP,所以ceph-deploy脚本知道需远程的主机,并给每个节点拷贝配置文件;

注意:初始化拷贝的3台主机配置文件中fsid 是一致的,不能重复执行初始化,否则报错;


常见报错:初始化失败【ERROR】,/etc/ceph/ceph.conf已存在报错

bash 复制代码
[ceph_deploy.mon][ERROR]
RuntimeError: config file /etc/ceph/ceph.conf exists with different content; use --overwrite-conf to overwrite

**解析分析:**因重复执行initial初始化而导致配置文件已存在报错,且该操作行为容易导致配置文件的集群ID不一致,需要重新卸载、重新安装ceph软件包、配置、初始化;

**解决办法:**purge卸载软件和purgedata清空数据,重新安装ceph软件包、配置、初始化

ceph-deploy purge no

bash 复制代码
# ceph-deploy purge node1 node2 node3    //卸载ceph集群软件(purge清除)
# ceph-deploy purgedata node1 node2 node3    //清空ceph集群数据

4)查看ceph-mon服务启动状态(注意每台主机服务名称不同)

bash 复制代码
[root@node1 ceph-cluster]# systemctl status ceph-mon@node1
[root@node2 ~]# systemctl status ceph-mon@node2
[root@node3 ~]# systemctl status ceph-mon@node3

注意:ceph-mon服务在30分钟只能启动3次,超过就报错

  • StartLimitInterval=30min //启动服务超过限制次数,需间隔时间30分钟

  • StartLimitBurst=3 //启动服务限制3次

可定义/usr/lib/systemd/system/ceph-mon@.service文件修改,修改后需要执行命令# systemctl daemon-reload重新加载配置

5)查看ceph集群状态(当前状态health HEALTH_ERR)

bash 复制代码
[root@node1 ceph-cluster]# ceph -s
    cluster b3f2a3cd-b8c3-4213-8508-3342378844fb      //集群ID
     health HEALTH_ERR    //状态为ERR(没有OSD)
            64 pgs are stuck inactive for more than 300 seconds
            64 pgs stuck inactive
            no osds
     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 8, 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

**常见报错:**clock skew表示时间不同步(skew偏移)

bash 复制代码
health: HEALTH_WARN
        clock skew detected on  node2, node3...  

解释分析:Ceph要求所有主机时差不能超过0.05s,否则就会提示WARN

解决办法:设置所有主机的NTP时间同步;

步骤3:创建OSD并共享磁盘存储空间(node1操作)

1)初始化清空磁盘数据

  • 初始化磁盘,将所有磁盘分区格式设置为GPT格式(根据实际情况填写磁盘名称)
  • 命令:ceph-deploy disk zap 域名1:磁盘 域名2:磁盘 // disk硬盘,zap为初始化
bash 复制代码
[root@node1 ceph-cluster]# lsblk    //核对磁盘名称(建议)
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda    253:0    0  30G  0 disk
└─vda1 253:1    0  30G  0 part /
vdb    253:16   0  20G  0 disk
vdc    253:32   0  20G  0 disk
[root@node1 ceph-cluster]# ceph-deploy disk zap node1:vdb node1:vdc
[root@node1 ceph-cluster]# ceph-deploy disk zap node2:vdb node2:vdc node3:vdb node3:vdc    //可同时对识别的主机远程和创建GPT分区

相当于ssh远程node1并执行parted /dev/vdb mktable gpt;脚本ceph-deploy会自动ssh远程自动创建GPT分区(脚本中定义的就是GPT分区,没有MBR分区)

**常见报错:**未安装ceph-osd软件包

bash 复制代码
"ExecutableNotFound: Could not locate executable 'ceph-disk' make sure it is installed and available on node3"

2)创建OSD存储空间

  • 脚本远程所有node主机,创建分区,格式化磁盘,挂载磁盘,启动osd服务共享磁盘
  • 命令:ceph-deploy osd create 域名1:磁盘 域名2:磁盘
bash 复制代码
[root@node1 ceph-cluster]# ceph-deploy osd create node1:vdb node1:vdc
[root@node1 ceph-cluster]# ceph-deploy osd create node2:vdb node2:vdc node3:vdb node3:vdc

相当于ssh远程node1,通过脚本ceph-deploy创建2个分区,格式化磁盘,挂载磁盘,启动osd服务共享磁盘;每个磁盘都会被自动分成两个分区;一个固定5G大小(5G分区为Journal日志缓存);一个为剩余所有容量(剩余所有空间为数据盘)

3)查看ceph-osd服务状态

bash 复制代码
[root@node1 ceph-cluster]# systemctl status ceph-osd@0
[root@node1 ceph-cluster]# systemctl status ceph-osd@1 
[root@node2 ~]# systemctl status ceph-osd@2
[root@node2 ~]# systemctl status ceph-osd@3
[root@node3 ~]# systemctl status ceph-osd@4
[root@node3 ~]# systemctl status ceph-osd@5

注意:ceph-osd服务状态查看方式,【@】后面是创建共享磁盘顺序编号(从0开始)

注意:ceph-osd服务也是在30分钟只能启动3次,超过就报错

  • #StartLimitInterval=30min //启动服务超过限制次数,需间隔时间30分钟
  • #StartLimitBurst=3 //启动服务限制3次

可定义/usr/lib/systemd/system/ceph-mon@.service文件修改,修改后需要执行命令# systemctl daemon-reload重新加载配置

4)查看ceph集群状态

bash 复制代码
[root@node1 ceph-cluster]# ceph -s
    cluster b3f2a3cd-b8c3-4213-8508-3342378844fb
     health HEALTH_OK    //状态为OK
     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 8, quorum 0,1,2 node1,node2,node3
     osdmap e44: 6 osds: 6 up, 6 in    //共享磁盘数量为6个
            flags sortbitwise
      pgmap v83: 64 pgs, 1 pools, 0 bytes data, 0 objects
            203 MB used, 91890 MB / 92093 MB avail  //OSD服务共享磁盘总空间
                  64 active+clean
                  
[root@node1 ceph-cluster]# ceph osd tree   //可查看OSD磁盘创建的顺序编号
ID WEIGHT  TYPE NAME      UP/DOWN REWEIGHT PRIMARY-AFFINITY
-1 0.08752 root default                                     
-2 0.02917     host node1                                   
 0 0.01459         osd.0       up  1.00000          1.00000
 1 0.01459         osd.1       up  1.00000          1.00000
-3 0.02917     host node2                                   
 2 0.01459         osd.2       up  1.00000          1.00000
 3 0.01459         osd.3       up  1.00000          1.00000
-4 0.02917     host node3                                   
 4 0.01459         osd.4       up  1.00000          1.00000
 5 0.01459         osd.5       up  1.00000          1.00000

步骤4:其它验证测试

1)验证挂载

bash 复制代码
[root@node1 ceph-cluster]# df -Th
文件系统       类型      容量  已用  可用 已用% 挂载点
/dev/vda1      xfs        30G  1.5G   29G    5% /
devtmpfs       devtmpfs  697M     0  697M    0% /dev
tmpfs          tmpfs     707M     0  707M    0% /dev/shm
tmpfs          tmpfs     707M   17M  691M    3% /run
tmpfs          tmpfs     707M     0  707M    0% /sys/fs/cgroup
tmpfs          tmpfs     142M     0  142M    0% /run/user/0
/dev/vdb1      xfs        15G   35M   15G    1% /var/lib/ceph/osd/ceph-0
/dev/vdc1      xfs        15G   35M   15G    1% /var/lib/ceph/osd/ceph-1

2)验证磁盘空间

bash 复制代码
[root@node1 ceph-cluster]# lsblk
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda    253:0    0  30G  0 disk
└─vda1 253:1    0  30G  0 part /
vdb    253:16   0  20G  0 disk
├─vdb1 253:17   0  15G  0 part /var/lib/ceph/osd/ceph-0
└─vdb2 253:18   0   5G  0 part
vdc    253:32   0  20G  0 disk
├─vdc1 253:33   0  15G  0 part /var/lib/ceph/osd/ceph-1
└─vdc2 253:34   0   5G  0 part

补充:通过ceph-deploy脚本做集群时,所有有关ceph的服务默认都是开机自启,重启所有ceph服务(注意不要一直重启,"30分钟限制")

  • 命令:systemctl restart ceph.target //将所有ceph有关服务全部重启
bash 复制代码
[root@node1 ~]# systemctl restart ceph.target

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

bash 复制代码
[ceph_deploy][ERROR ] RuntimeError: bootstrap-osd keyring not found; run 'gatherkeys'

解决办法:使用命令修复文件,重新配置ceph的密钥文件

bash 复制代码
[root@node1 ceph-cluster]#  ceph-deploy gatherkeys node1 node2 node3

二、Ceph块存储

1)块存储

  • 单机块设备:光盘、磁盘
  • 分布式块存储:Ceph、Cinder

Ceph块设备也叫做RADOS块设备(RADOS block device:RBD)

2)Ceph 中Pool、PG、OSD的关系

  • Pool是存储对象的逻辑分区,它规定了数据冗余的类型和对应的副本分布策略;支持两种类型:副本(replicated)和 纠删码( Erasure Code)
  • PG(placement group)是一个放置策略组(归置组),它是对象的集合,该集合里的所有对象都具有相同的放置策略(相同PG内的对象都会放到相同的硬盘上);
  • OSD是负责物理存储的进程,一般配置成和磁盘一一对应,一块磁盘启动一个OSD进程;

相互关系:

一个Pool存储池里有很多PG归置组,一个PG归置组里包含一堆对象;(一个对象只能属于一个PG,PG有主从之分,一个PG分布在不同的OSD上(针对三副本类型)

3)客户端访问Ceph块存储的两种方式:

① Linux内核可直接访问Ceph块存储(kernel rbd是ceph 块存储当中的linux-kernel client)

② KVM可借助于librbd访问Ceph块存储;

补充:ceph 作为一个统一存储的分布式存储系统,提供了对象,文件和块存储三种存储接口。其中块存储又提供了两种client接口用于块存储的不同场景使用。

1)librbd:是ceph 块存储目前使用最多的一个场景,也就是云计算场景对接openstack或者其他平台。

2)krbd(kernel rbd):这是ceph 块设备直接对接到linux 系统的场景。在linux kernel当中提供了一个块设备的driver,直接对ceph server端进行数据IO。这个场景主要用于不能直接利用librbd 进行业务改造的场景。


案例3:创建Ceph块存储(node1操作)

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

  • 1)创建、查看、动态扩容/缩小块存储镜像
  • 2)客户端映射镜像
  • 3)删除镜像

步骤1:创建镜像

1)查看存储池,ceph默认存储池名称为rbd,可在pool存储池中创建共享镜像;(PG归置组)

  • 命令:ceph osd lspools
bash 复制代码
[root@node1 ceph-cluster]# ceph osd lspools    //查看存储池
0 rbd,

补充:查看结果显示,共享池的名称为rbd,该共享池的编号为0;

2)创建镜像(create)

  • 创建demo-image镜像(创建的镜像名称可任意字符),size可以指定镜像大小;
  • 命令:rbd create [存储池]/镜像名称 --size 镜像大小
bash 复制代码
[root@node1 ceph-cluster]# rbd create demo-image --size 10G
[root@node1 ceph-cluster]# rbd ls   //列出所有镜像(与rbd list效果一样)
demo-image

[root@node1 ceph-cluster]# rbd create rbd/jacob --size 10G
[root@node1 ceph-cluster]# rbd list   //列出所有镜像
demo-image
jacob

补充:当前存储池只有rdb池,不指定存储池默认为rdb池;

3)查看镜像信息(list、info)

  • 命令:rbd list //列出所有镜像
  • 命令:rbd info 镜像名称 //查看镜像的详细信息
bash 复制代码
[root@node1 ceph-cluster]# rbd info demo-image    //查看镜像的详细信息
rbd image 'demo-image':
size 10240 MB in 2560 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.1032238e1f29
format: 2
features: layering
flags:
    
[root@node1 ceph-cluster]# rbd info jacob     //查看镜像的详细信息
rbd image 'jacob':
size 10240 MB in 2560 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.103d238e1f29
format: 2
features: layering
flags:

步骤2:动态调整(resize)

1)扩容容量

  • 命令:rbd resize --size 镜像大小 镜像名称
bash 复制代码
[root@node1 ceph-cluster]# rbd resize --size 15G jacob
Resizing image: 100% complete...done.
[root@node1 ceph-cluster]# rbd info jacob
rbd image 'jacob':
size 15360 MB in 3840 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.103c238e1f29
format: 2
features: layering
flags:

调整jacob镜像的大小,jacob是镜像的名称,size指定扩容到15G

2)缩小容量

  • 命令:rbd resize --size 镜像大小 镜像名称 --allow-shrink

allow允许,shrink缩小;缩小容量会提示是否允许缩写,要求加--allow-shrink

bash 复制代码
[root@node1 ceph-cluster]# rbd resize --size 7G jacob
rbd: shrinking an image is only allowed with the --allow-shrink flag
[root@node1 ceph-cluster]# rbd resize --size 7G jacob --allow-shrink
Resizing image: 100% complete...done.
[root@node1 ceph-cluster]# rbd info jacob    //查看镜像的详细信息
rbd image 'jacob':
size 7168 MB in 1792 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.103c238e1f29
format: 2
features: layering
flags:

步骤3:客户端通过KRBD访问(client操作)

ceph.client.admin.keyring文件存放用户名和密码

bash 复制代码
[root@node1 ceph-cluster]# ls /etc/ceph/
ceph.client.admin.keyring  ceph.conf  rbdmap  tmpdJqPxM
[root@node1 ceph-cluster]# cat /etc/ceph/ceph.client.admin.keyring
[client.admin]
key = AQD4L45g76YIFRAAlU3jUSGU2oKP45v3U6/WTg==

1)安装ceph-common软件包

  • 需要拷贝monitor节点的配置文件(否则不知道集群在哪)
  • 需要拷贝monitor节点的连接密钥(否则无连接权限)
bash 复制代码
[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 ~]# ls /etc/ceph/
ceph.client.admin.keyring  ceph.conf  rbdmap

2)客户端访问映射共享镜像

  • 命令:rbd map 镜像名称 //映射服务器的共享镜像
  • 命令:rbd unmap 镜像名称 //客户端撤销磁盘映射
  • 命令:rbd showmapped //查看磁盘名和共享镜像名称的对应关系
bash 复制代码
[root@client ~]# rbd map jacob   //客户端访问映射服务器的jacob共享镜像
/dev/rbd0
[root@client ~]# lsblk
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda    253:0    0  30G  0 disk
└─vda1 253:1    0  30G  0 part /
rbd0   252:0    0   7G  0 disk       //映射的共享镜像

[root@client ~]# rbd map demo-image  //客户端访问映射服务器的demo-image共享镜像
/dev/rbd1
[root@client ~]# lsblk
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda    253:0    0  30G  0 disk
└─vda1 253:1    0  30G  0 part /
rbd0   252:0    0   7G  0 disk
rbd1   252:16   0  10G  0 disk

[root@client ~]# rbd showmapped    //查看磁盘名和共享镜像名称的对应关系
id pool image      snap device    
0  rbd  jacob      -    /dev/rbd0
1  rbd  demo-image -    /dev/rbd1

2)客户端格式化分区、挂载分区

bash 复制代码
[root@client ~]# mkfs.xfs /dev/rbd0    //格式化分区,xfs文件系统
[root@client ~]# blkid /dev/rbd0
/dev/rbd0: UUID="13bdcc31-fcfd-40a7-a2fb-1e4081f614f0" TYPE="xfs"
[root@client ~]# mount /dev/rbd0 /mnt    //挂载磁盘
[root@client ~]# df -h
文件系统        容量  已用  可用 已用% 挂载点
/dev/rbd0       7.0G   33M  7.0G    1% /mnt
[root@client ~]# echo "test" > /mnt/test.txt
[root@client ~]# cat /mnt/test.txt
test

步骤4:删除镜像

1) 客户端撤销磁盘映射

  • 命令:rbd unmap 镜像名称 //客户端撤销磁盘映射(前提:该磁盘未挂载使用)
bash 复制代码
[root@client ~]# lsblk
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda    253:0    0  30G  0 disk
└─vda1 253:1    0  30G  0 part /
rbd0   252:0    0   7G  0 disk /mnt
rbd1   252:16   0  10G  0 disk

补充:挂载点已挂载并正在使用,如需要撤销硬盘映射,需先卸载挂载点

bash 复制代码
[root@client ~]# umount /mnt/     //卸载挂载点
[root@client ~]# rbd showmapped   //查看磁盘名和共享镜像名称的对应关系
id pool image      snap device    
0  rbd  jacob      -    /dev/rbd0
1  rbd  demo-image -    /dev/rbd1
[root@client ~]# rbd unmap /dev/rbd0   //撤销磁盘映射
[root@client ~]# rbd showmapped   //查看磁盘名和共享镜像名称的对应关系
id pool image      snap device    
1  rbd  demo-image -    /dev/rbd1

**常见报错:**挂载点已挂载并正在使用,如需要撤销硬盘映射,需先卸载挂载点

bash 复制代码
[root@client ~]# rbd unmap /dev/rbd0
rbd: sysfs write failed
rbd: unmap failed: (16) Device or resource busy

**常见报错:**需要卸载的磁盘不存在(Invalid argument无效的参数)

bash 复制代码
[root@client ~]# rbd unmap /dev/rbd0
rbd: '/dev/rbd0' is not a block device
rbd: unmap failed: (22) Invalid argument

总结:Ceph部署思路

1)环境准备:

IP网络环境(IP地址、主机名)、关闭防火墙与SELinux限制、SSH无密码连接(所有主机,包括node1)、/etc/hosts本机域名解析(所有主机)、YUM源配置(所有主机)、NTP时间同步(client作为NTP服务器,node节点为NTP客户端)

2)部署Ceph分布式系统:

  • 步骤1:安装工具包和组件
  • 安装工具包:ceph-deploy(脚本)
  • 安装Ceph组件:ceph-mon、ceph-osd、ceph-mds、ceph-radosgw(集群组件)
  • 安装客户端组件:ceph-common
  • 步骤2:修改配置启动mon服务
  • 创建并切换存放配置文件的目录
  • 生成配置文件(# ceph-deploy new node1 node2 node3)
  • 修改配置文件,添加COW(rbd_default_features = 1)
  • 拷贝到所有节点并启动服务(# ceph-deploy mon create-initial)
  • 步骤3:创建共享硬盘并启动osd服务
  • 创建、格式化、挂载磁盘(# ceph-deploy disk zap 主机名:磁盘名...)
  • 创建共享磁盘并启动osd服务(# ceph-deploy osd create 主机名:磁盘名...)

3)使用Ceph分布式系统(块存储)

  • 服务器创建一个共享镜像(# rbd create 镜像名称 --size镜像大小(resize动态调整))
  • 客户端拷贝配置文件和密钥
  • 客户端访问映射共享镜像(# rbd map 镜像名称)

扩展知识1:Ceph--CRUSH

参考链接:http://www.xuxiaopang.com/2016/11/08/easy-ceph-CRUSH/

1.计算PG

首先明确Ceph的一个规定:在Ceph中一切皆对象。不论是视频,文本,照片等一切格式的数据,Ceph统一将其看作是对象,因为追其根源,所有的数据都是二进制数据保存于磁盘上,所以每一份二进制数据都看成一个对象,不以它们的格式来区分他们。

通过用"对象名"区分两个对象。也就是每个不同的对象都有不一样的对象名。于是第一个问题:把一个对象存到一群Server中分几步?这里的一群Server,是由Ceph组织成一个的集群,这个集群由若干的磁盘组成,也就是由若干的OSD组成。于是继续简化问题:把一个对象存到一堆OSD中分几步?

1)Ceph中的逻辑层

Ceph为了保存一个对象,对上构建了一个逻辑层,也就是池(pool),用于保存对象,这个池的翻译很好的解释了pool的特征,如果把pool比喻成一个中国象棋棋盘,那么保存一个对象的过程就类似于把一粒芝麻放置到棋盘上。

Pool再一次进行了细分,即将一个pool划分为若干的PG(归置组 Placement Group),这类似于棋盘上的方格,所有的方格构成了整个棋盘,也就是说所有的PG构成了一个pool。

现在需要解决的问题是,对象怎么知道要保存到哪个PG上,假定这里我们的pool名叫rbd,共有256个PG,给每个PG编个号分别叫做0x0, 0x1, ...0xF, 0x10, 0x11... 0xFE, 0xFF。

要解决这个问题,我们先看看我们拥有什么:①不同的对象名,②不同的PG编号。这里就可以引入Ceph的计算方法了 : HASH。对于对象名分别为bar和foo的两个对象,对他们的对象名进行计算即:

  • HASH('bar') = 0x3E0A4162
  • HASH('foo') = 0x7FE391A0
  • HASH('bar') = 0x3E0A4162

对对象名进行HASH后,得到了一串十六进制输出值,也就是说通过HASH我们将一个对象名转化成了一串数字,那么上面的第一行和第三行是一样的有什么意义? 意义就是对于一个同样的对象名,计算出来的结果永远都是一样的,但是HASH算法的确将对象名计算得出了一个随机数。有了这个输出,我们使用求余数,用随机数除以PG的总数256,得到的余数一定会落在[0x0, 0xFF]之间,也就是这256个PG中的某一个:

  • 0x3E0A4162 % 0xFF ===> 0x62
  • 0x7FE391A0 % 0xFF ===> 0xA0

于是乎,对象bar保存到编号为0x62的PG中,对象foo保存到编号为0xA0的PG中。对象bar永远都会保存到PG 0x62中! 对象foo永远都会保存到PG 0xA0中!

现在又来了一亿个对象,他们也想知道自己会保存到哪个PG中,Ceph说:"自己算"。于是这一亿个对象,各自对自己对象名进行HASH,得到输出后除以PG总数得到的余数就是要保存的PG。求余的好处就是对象数量规模越大,每个PG分布的对象数量就越平均。所以每个对象自有名字开始,他们要保存到的PG就已经确定了。

Ceph不区分对象的真实大小内容以及任何形式的格式,只认对象名。毕竟当对象数达到百万级时,对象的分布从宏观上来看还是平均的。

这里给出更Ceph一点的说明,实际上在Ceph中,存在着多个pool,每个pool里面存在着若干的PG,如果两个pool里面的PG编号相同,Ceph怎么区分呢? 于是乎,Ceph对每个pool进行了编号,比如刚刚的rbd池,给予编号0,再建一个pool就给予编号1,那么在Ceph里,PG的实际编号是由pool_id+.+PG_id组成的,也就是说,刚刚的bar对象会保存在0.62这个PG里,foo这个对象会保存在0.A0这个PG里。其他池里的PG名称可能为1.12f, 2.aa1,10.aa1等。

2)Ceph中的物理层

Ceph里的物理层,对下,也就是若干的服务器上的磁盘,通常,Ceph将一个磁盘看作一个OSD(实际上,OSD是管理一个磁盘的程序),于是物理层由若干的OSD组成,我们的最终目标是将对象保存到磁盘上,在逻辑层里,对象是保存到PG里面的,那么现在的任务就是打通PG和OSD之间的隧道。PG相当于一堆余数相同的对象的组合,PG把这一部分对象打了个包,现在我们需要把很多的包平均的安放在各个OSD上,这就是CRUSH算法所要做的事情:CRUSH计算PG->OSD的映射关系。加上刚刚的对象映射到PG的方法,我们将开篇的两步表示成如下的两个计算公式:

池ID + HASH('对象名') % pg_num ===> PG_ID

CRUSH(PG_ID) ===> OSD

使用HASH代替CRUSH?

在讨论CRUSH算法之前,我们来做一点思考,可以发现,上面两个计算公式有点类似,为何我们不把 CRUSH(PG_ID) ===> OSD 改为 HASH(PG_ID) %OSD_num ===> OSD

可以如下几个由此假设带来的副作用:

  • 如果挂掉一个OSD,OSD_num-1,于是所有的PG % OSD_num的余数都会变化,也就是说这个PG保存的磁盘发生了变化,对这最简单的解释就是,这个PG上的数据要从一个磁盘全部迁移到另一个磁盘上去,一个优秀的存储架构应当在磁盘损坏时使得数据迁移量降到最低,CRUSH可以做到。
  • 如果保存多个副本,我们希望得到多个OSD结果的输出,HASH只能获得一个,但是CRUSH可以获得任意多个。
  • 如果增加OSD的数量,OSD_num增大了,同样会导致PG在OSD之间的胡乱迁移,但是CRUSH可以保证数据向新增机器均匀的扩散

扩展知识2:初识ceph(分布式文件系统)

参考链接:初识ceph(分布式文件系统)_ceph 两大基石-CSDN博客

1)Ceph基本架构图

2)Ceph核心组件:

  • Ceph OSD:全称是Object Storage Device,主要功能包括存储数据,处理数据的复制、恢复、回补、平衡数据分布,并将一些相关数据提供给Ceph Monitor,如Ceph OSD心跳等。
  • Ceph Monitor:Ceph的监控器,主要功能是维护整个集群健康状态,提供一致性的决策,包含Monitor map、OSDmap、PG(Placement Group) map和CRUSH map。
  • Ceph MDS:全称是Ceph Metadata server。主要保存的是Ceph文件系统(File system)的元数据。(Ceph的块存储和对象存储不需要Ceph MDS。Ceph MDS为基于POSIX文件系统的用户提供一些基础命令,如ls,find等命令)

3)Ceph功能特性:

  • **对象存储功能特性:**基于LIBRADOS之上,提供当前流行的RESTful协议的网关,并兼容S3和Swift接口,作为对象存储,可以对接网盘应用以及HLS流媒体应用等,
  • **块存储功能特性:**也基于LIBRADOS之上,通过LIBRBD创建一个块设备,通过QEMU/KVM附加到VM上,作为传统的块设备来用。
  • **文件系统存储功能特性:**是基于RADOS来实现分布式的文件系统,引入了MDS(Metadata server),主要为兼容POSIX文件系统提供元数据,可当做文件系统挂载

补充:Monitor是一个独立部署的daemon进程,可保证自己的高可用。Cluster Map保存了系统的全局信息,包括:

  • ① Monitor Map:包括集群的fsid、所有Monitor的地址和端口、current epoch
  • ② OSD Map:所有OSD的列表,和OSD的状态等
  • ③ MDS Map:所有的MDS的列表和状态

扩展知识3:三种存储类型(特点、优缺点、应用场景)

参考链接:Ceph介绍及原理架构分享 - 简书

1)块存储

  • 典型设备:磁盘阵列,硬盘
  • 主要是将裸磁盘空间映射给主机使用的;

优点:

  • ① 通过Raid与LVM等手段,对数据提供了保护;
  • ② 多块廉价的硬盘组合起来,提高容量;
  • ③ 多块磁盘组合出来的逻辑盘,提升读写效率;

缺点:

  • ① 采用SAN架构组网时,光纤交换机,造价成本高;
  • ② 主机之间无法共享数据;

使用场景:

  • docker容器、虚拟机磁盘存储分配;
  • 日志存储;
  • 文件存储;

2)文件存储

  • 典型设备:FTP、NFS服务器
  • 为了克服块存储文件无法共享的问题,所以在服务器上架设FTP与NFS服务,就是文件存储。

优点:

  • ① 造价低,随便一台机器就可以了;
  • ② 方便文件共享;

缺点:

  • ① 读写速率低;
  • ② 传输速率慢;

使用场景:

  • 日志存储;
  • 有目录结构的文件存储;

3)对象存储

  • 典型设备:内置大容量硬盘的分布式服务器(swift, s3),多台服务器内置大容量硬盘,安装上对象存储管理软件,对外提供读写访问功能。

优点:

  • 具备块存储的读写高速;
  • 具备文件存储的共享等特性;

使用场景: (适合更新变动较少的数据)

  • 图片存储;
  • 视频存储;

小结:

本篇章节为**【第二阶段】CLUSTER-DAY3**的学习笔记,这篇笔记可以初步了解到 Ceph概述、部署Ceph集群、Ceph块存储。除此之外推荐参考相关学习网址:


Tip:毕竟两个人的智慧大于一个人的智慧,如果你不理解本章节的内容或需要相关笔记、视频,可私信小安,请不要害羞和回避,可以向他人请教,花点时间直到你真正的理解

相关推荐
JunLan~1 小时前
Rocky Linux 系统安装/部署 Docker
linux·docker·容器
方竞2 小时前
Linux空口抓包方法
linux·空口抓包
sun0077003 小时前
ubuntu dpkg 删除安装包
运维·服务器·ubuntu
海岛日记3 小时前
centos一键卸载docker脚本
linux·docker·centos
AttackingLin3 小时前
2024强网杯--babyheap house of apple2解法
linux·开发语言·python
吃肉不能购5 小时前
Label-studio-ml-backend 和YOLOV8 YOLO11自动化标注,目标检测,实例分割,图像分类,关键点估计,视频跟踪
运维·yolo·自动化
学Linux的语莫5 小时前
Ansible使用简介和基础使用
linux·运维·服务器·nginx·云计算·ansible
qq_312920115 小时前
docker 部署 kvm 图形化管理工具 WebVirtMgr
运维·docker·容器