Ceph概述
基础知识
什么是分布式文件系统
* 分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连
* 分布式文件系统的设计基于客户机/服务器模式
常用分布式文件系统
* Lustre
* Hadoop
* FastDFS
* Ceph
* GlusterFS
什么是Ceph
Ceph是一个分布式文件系统 具有高扩展、高可用、高性能的特点 Ceph可以提供对象存储 、块存储、文件系统存储 Ceph可以提供PB级别的存储空间(PB->TB->GB) 1024G*1024G = 1048576G 软件定义存储(SoftWare Defined Storage)作为存储行业的一大发展趋势, 已经越来越受到市场的认可 帮助文档
Ceph组件
OSDs
存储设备 Ceph默认有三副本, 保障数据安全、可用. 因此生产环境下要求OSD最少三台 主要功能是存储数据、复制数据、平衡数据、恢复数据等,与其它OSD间进行心跳检查等, 并将一些变化情况上报给Ceph Monitor 一般情况下一块硬盘对应一个OSD,由OSD来对硬盘存储进行管理,当然一个分区也可以成为一个OSD Ceph OSD的架构实现由物理磁盘驱动器、Linux文件系统和Ceph OSD服务组成 伴随OSD的还有一个概念叫做Journal盘,一般写数据到Ceph集群时,都是先将数据写入到Journal盘中,然后每隔一段时间比如5秒再将Journal盘中的数据刷新到文件系统中 一般为了使读写时延更小,Journal盘都是采用SSD,一般分配10G以上 Monitors
集群监控组件 Ceph有过半原则(必须保障集群超过一半的机器可用), 因此生产环境下要求Monitors最少要求三台 功能: 绘制集群地图(map) 几台主机组成OSD存储主机的IP分布是什么, 共享的哪个存储磁盘 用户访问Monitor后, 就将map下载下来在内存中临时存储. 因此map下载后, 用户就不用访问Monitor RadosGateway(RGW)
MDSs
存放文件系统的元数据(对象存储和块存储不需要该组件) Client
Ceph数据分布算法
CRUSH,Controlled Replication Under Scalable Hashing,它表示数据存储的分布式选择算法, ceph 的高性能/高可用就是采用这种算法实现。CRUSH 算法取代了在元数据表中为每个客户端请求进行查找,它通过计算系统中数据应该被写入或读出的位置。CRUSH能够感知基础架构,能够理解基础设施各个部件之间的关系。并且CRUSH保存数据的多个副本,这样即使一个故障域的几个组件都出现故障,数据依然可用。CRUSH 算是使得 ceph 实现了自我管理和自我修复。
补充知识
了解什么是块存储/对象存储/文件系统存储
块存储 : 块存储指在一个RAID(独立磁盘冗余列阵)集中, 一个控制器加入一组磁盘驱动器, 然后提供固定大小的RAID块作为LUN(逻辑单元号)的卷
文件系统存储 : 为了克服文件无法共享的问题, 所以有了文件存储
对象存储 : 用来描述解决和处理离散单元的方法的通用术语.对象在一个层结构中不会在有层级结构, 是以扩展元数据为特征的
案例一 : 实验环境准备
准备四台KVM虚拟机, 其三台作为存储集群节点,一台安装为客户端,实现如下功能:
创建1台客户端虚拟机 创建3台存储集群虚拟机 配置主机名、IP地址、YUM源 修改所有主机的主机名 配置无密码SSH连接 配置NTP时间同步 创建虚拟机磁盘
实验拓扑图
步骤一 : 安装前准备
物理机(真机)为所有节点配置yum源服务器
mkdir /var/ftp/ceph
cd /linux-soft/02
mount ceph10.iso /var/ftp/ceph
在Node1操作, 配置无密码连接(包括自己远程也不需要密码)
ssh-keygen -f /root/.ssh/id_rsa -N ''
vim nopass.sh
for i in { 10.. 13}
do
ssh-copy-id 192.168.4.$i
done
bash nopass.sh
修改/etc/hosts并同步到所有主机, 在node1上进行
vim /etc/hosts
.. . .. .
192.168.4.10 client
192.168.4.11 node1
192.168.4.12 node2
192.168.4.13 node3
for i in client node1 node2 node3
do
scp /etc/hosts $i :/etc/
done
为node1配置YUM源,并同步到所有主机
vim /etc/yum.repos.d/ceph.repo
[ 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
yum repolist
for i in client node1 node2 node3
do
scp /etc/yum.repos.d/ceph.repo $i :/etc/yum.repos.d/
done
所有节点主机与真机的NTP服务器同步时间
vim /etc/chrony.conf
.. . .. .
server 192.168.4.254 iburst
.. . .. .
for i in client node1 node2 node3
do
scp /etc/chrony.conf $i :/etc/
ssh $i "systemctl restart chronyd"
done
步骤二 : 准备存储磁盘
真机上为每个虚拟机(除client)加3块20G磁盘(可用命令或者图形virt-manager直接添加)
案例二 : 部署Ceph集群
沿用案例一 , 部署Ceph集群服务器, 实现以下目标:
安装部署工具ceph-deploy 创建ceph集群 准备日志磁盘分区 创建OSD存储空间 查看ceph状态, 验证
步骤一 : 安装部署软件ceph-deploy
在node1安装部署工具, 学习工具的语法格式
yum -y install ceph-deploy
ceph-deploy --help
ceph-deploy mon --help
创建目录(node1)
mkdir ceph-cluster
cd ceph-cluster/
步骤二 : 部署Ceph集群
给所有节点安装ceph相关软件包(node1)
for i in node1 node2 node3
do
ssh $i "yum -y install ceph-mon ceph-osd ceph-mds ceph-radosgw"
done
创建Ceph集群配置, 在Ceph-cluster目录下生成Ceph配置文件(node1)
ceph-deploy new node1 node2 node3
ls
ceph.conf ceph-deploy-ceph.log ceph.mon.keyring
cat ceph.conf
[ global]
fsid = 2ce461c2-0a94-42b7-b502-0ae85bfc2e83
mon_initial_members = node1, node2, node3
mon_host = 192.168.4.11,192.168.4.12,192.168.4.13
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
初始化所有节点的mon服务, 也就是启动mon服务(主机名解析必须对)
ceph-deploy mon create-initial
常见错误及解决方法(非必要操作, 有错误可以参考)
如果提示如下错误信息:
[node1][ERROR ] admin_socket: exception getting command descriptions: [Error 2] No such file or directory
解决方案如下(在node1操作):
先检查自己的命令是否是在ceph-cluster目录下执行的!!!!如果确认是在该目录下执行的create-initial命令,依然报错,可以使用如下方式修复。
vim ceph.conf # 在文件最后追加以下内容
public_network = 192.168.4.0/24
修改后重新推送配置文件
ceph-deploy --overwrite-conf config push node1 node2 node3
步骤三 : 创建OSD
vdb1 和 vdb2 这两个分区用来做存储服务器的journal缓存盘
for i in node1 node2 node3
do
ssh $i "parted /dev/vdb mklabel gpt"
ssh $i "parted /dev/vdb mkpart primary 1 50%"
ssh $i "parted /dev/vdb mkpart primary 50% 100%"
done
磁盘分区后的默认权限无法让ceph软件对其进行读写操作, 需要修改权限. (node1、node2、node3都需要操作, 这里以node1为例)
chown ceph.ceph /dev/vdb1
chown ceph.ceph /dev/vdb2
vim /etc/udev/rules.d/70-vdb.rules
ENV{ DEVNAME} == "/dev/vdb1" ,OWNER= "ceph" ,GROUP= "ceph"
ENV{ DEVNAME} == "/dev/vdb2" ,OWNER= "ceph" ,GROUP= "ceph"
初始化情况磁盘数据(仅node1操作即可)
ceph-deploy disk zap node1:vdc node1:vdd
ceph-deploy disk zap node2:vdc node2:vdd
ceph-deploy disk zap node3:vdc node3:vdd
创建OSD存储空间(仅node1操作即可)
ceph-deploy osd create node1:vdc:/dev/vdb1 node1:vdd:/dev/vdb2
ceph-deploy osd create node2:vdc:/dev/vdb1 node2:vdd:/dev/vdb2
ceph-deploy osd create node3:vdc:/dev/vdb1 node3:vdd:/dev/vdb2
常见错误及解决方法(非必须操作)
使用osd create创建OSD存储空间时,如提示下面的错误提示:
[ceph_deploy][ERROR ] RuntimeError: bootstrap-osd keyring not found; run 'gatherkeys'
可以使用如下命令修复文件,重新配置ceph的密钥文件:
ceph-deploy gatherkeys node1 node2 node3
步骤四 : 验证测试
查看集群状态
ceph -s
常见错误(非必须操作)
如果查看状态包括如下信息
health:HEALTH_WARN
clock skew detected on node2, node3…
clock skew表示时间不同步
解决方法 : 先将所有主机的时间都使用NTP时间同步
ceph要求所有主机的时差不能超过0.05s, 否则就会提示WARN
如果状态还是失败, 可以尝试执行如下命令, 重启ceph服务 :
systemctl restart ceph\*.service ceph\*.target
案例三 : 创建Ceph块存储
沿用前面案例, 使用Ceph集群的块存储功能, 实现以下目标 :
创建块存储镜像 客户端映射镜像 创建镜像快照 使用快照还原数据 使用快照克隆镜像 删除快照与镜像
步骤一 : 创建镜像
查看存储池(镜像池)(node1)
ceph osd lspools
0 rbd,
创建镜像、查看镜像(node1)
rbd create demo-image --image-feature layering --size 10G
rbd create rbd/jacob --image-feature layering --size 10G
rbd list
rbd info demo-image
rbd image 'demo-image' :
size 10240MB in 2560 objects
order 22 ( 4096 kB objects)
block_name_prefix: rbd_data.1049238e1f29
format: 2
features: layering
flags:
步骤二 : 动态调整
扩容容量
rbd resize --size 15G jacob
rbd info jacob
缩小容量
rbd resize --size 7G jacob --allow-shrink
rbd info image
步骤三 : 通过KRBD访问
客户端通过KRBD访问(client)
yum -y install ceph-common
scp 192.168.4.11:/etc/ceph/ceph.conf /etc/ceph/
scp 192.168.4.11:/etc/ceph/ceph.client.admin.keyring /etc/ceph/
rbd map jacob
lsblk
rbd showmapped
id pool image snap device
0 rbd jacob - /dev/rbd0
客户端格式化, 挂载分区
mkfs.xfs /dev/rbd0
mount /dev/rbd0 /mnt/
echo "test" > /mnt/test.txt
步骤四 : 创建镜像快照
查看镜像快照(默认所有镜像都没有快照)node1
rbd snap ls jacob
给镜像创建快照
rbd snap create jacob --snap jacob-snap1
rbd snap ls jacob
删除客户端写入的测试文件
rm -rf /mnt/test.txt
umount /mnt
还原快照
rbd snap rollback jacob --snap jacob-snap1
mount /dev/rbd0 /mnt/
ls /mnt
步骤五 : 创建快照克隆
克隆快照
rbd snap protect jacob --snap jacob-snap1
rbd snap rm jacob --snap jacob-snap1
rbd clone jacob --snap jacob-snap1 jacob-clone --image-feature layering
查看克隆镜像与父镜像快照的关系
rbd info jacob-clone
rbd image 'jacob-clone' :
size 15360 MB in 3840 objects
order 22 ( 4096 kB objects)
block_name_prefix: rbd_data.105e238e1f29
format: 2
features: layering
flags:
parent: rbd/jacob@jacob-snap1
overlap: 15360 MB
rbd flatten jacob-clone
rbd info jacob-clone
rbd image 'jacob-clone' :
size 15360 MB in 3840 objects
order 22 ( 4096 kB objects)
block_name_prefix: rbd_data.105e238e1f29
format: 2
features: layering
flags:
rbd snap unprotect jacob --snap jacob-snap1
rbd snap rm jacob --snap jacob-snap1
步骤六 : 其他操作
客户端撤销磁盘映射
umount /mnt
rbd showmapped
id pool image snap device
0 rbd jacob - /dev/rbd0
rbd unmap /dev/rbd0