主要内容:
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.com、http://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核心组件及概念介绍(作为参考)
- **Monitor:**一个Ceph集群需要多个Monitor组成的小集群,它们通过Paxos同步数据,用来保存OSD的元数据。
- **OSD:**OSD全称Object Storage Device,也就是负责响应客户端请求返回具体数据的进程。一个Ceph集群一般都有很多个OSD。一般配置成和磁盘一一对应,一块磁盘启动一个OSD进程。
- **MDS:**MDS全称Ceph Metadata Server,是CephFS服务依赖的元数据服务。
- **pool:**是存储对象的逻辑分区,它规定了数据冗余的类型和对应的副本分布策略;支持两种类型:副本(replicated)和 纠删码( Erasure Code)
- **PG:**PG全称Placement Grouops归置组,是一个逻辑的概念,一个PG包含多个对象,是对象的集合,该集合里的所有对象都具有相同的放置策略(相同PG内的对象都会放到相同的硬盘上);PG是 ceph的核心概念,服务端数据均衡和恢复的最小粒度就是PG,引入PG这一层其实是为了更好的分配数据和定位数据。
- **Object:**Ceph最底层的存储单元是Object对象,每个Object包含元数据和原始数据。
- **RADOS:**RADOS全称Reliable Autonomic Distributed Object Store,是Ceph集群的精华,用户实现数据分配、Failover等集群操作。
- **Libradio:**Librados是Rados提供库,因为RADOS是协议很难直接访问,因此上层的RBD、RGW和CephFS都是通过librados访问的,目前提供PHP、Ruby、Java、Python、C和C++支持。
- **CRUSH:**CRUSH是Ceph使用的数据分布算法,类似一致性哈希,让数据分配到预期的地方。
- **RBD:**RBD全称RADOS block device,是Ceph对外提供的块设备服务。
- **RGW:**RGW全称RADOS gateway,是Ceph对外提供的对象存储服务,接口与S3和Swift兼容。
- **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:毕竟两个人的智慧大于一个人的智慧,如果你不理解本章节的内容或需要相关笔记、视频,可私信小安,请不要害羞和回避,可以向他人请教,花点时间直到你真正的理解