Ceph存储

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客户端

Ceph数据分布算法

CRUSH,Controlled Replication Under Scalable Hashing,它表示数据存储的分布式选择算法, ceph 的高性能/高可用就是采用这种算法实现。CRUSH 算法取代了在元数据表中为每个客户端请求进行查找,它通过计算系统中数据应该被写入或读出的位置。CRUSH能够感知基础架构,能够理解基础设施各个部件之间的关系。并且CRUSH保存数据的多个副本,这样即使一个故障域的几个组件都出现故障,数据依然可用。CRUSH 算是使得 ceph 实现了自我管理和自我修复。

补充知识

了解什么是块存储/对象存储/文件系统存储

块存储 : 块存储指在一个RAID(独立磁盘冗余列阵)集中, 一个控制器加入一组磁盘驱动器, 然后提供固定大小的RAID块作为LUN(逻辑单元号)的卷
文件系统存储 : 为了克服文件无法共享的问题, 所以有了文件存储 
对象存储 : 用来描述解决和处理离散单元的方法的通用术语.对象在一个层结构中不会在有层级结构, 是以扩展元数据为特征的

案例一 : 实验环境准备

  • 准备四台KVM虚拟机, 其三台作为存储集群节点,一台安装为客户端,实现如下功能:
    • 创建1台客户端虚拟机
    • 创建3台存储集群虚拟机
    • 配置主机名、IP地址、YUM源
    • 修改所有主机的主机名
    • 配置无密码SSH连接
    • 配置NTP时间同步
    • 创建虚拟机磁盘

实验拓扑图

  • 1台客户端虚拟机
  • 3台存储集群虚拟机

Ceph集群拓扑图

步骤一 : 安装前准备

  1. 物理机(真机)为所有节点配置yum源服务器
	mkdir /var/ftp/ceph
	cd /linux-soft/02
	mount ceph10.iso /var/ftp/ceph
  1. 在Node1操作, 配置无密码连接(包括自己远程也不需要密码)
	ssh-keygen -f /root/.ssh/id_rsa -N ''
	vim nopass.sh
		#!/bin/bash
		for i in {10..13}
		do
			ssh-copy-id 192.168.4.$i
		done
	bash nopass.sh
  1. 修改/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
	# /etc/hosts解析的域名必须与本机主机名一致
	for i in client node1 node2 node3 
	do
		scp /etc/hosts $i:/etc/
	done
  1. 为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
  1. 所有节点主机与真机的NTP服务器同步时间
	# 提示: 真机已经配置为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

  1. 在node1安装部署工具, 学习工具的语法格式
	yum -y install ceph-deploy          # ceph-deploy 是用python写的一个批量化脚本(前提:远程其他主机需无密码)
	ceph-deploy --help
	ceph-deploy mon --help
  1. 创建目录(node1)
	mkdir ceph-cluster						# 随便创建一个目录, 配置后执行ceph-deploy必须在这个目录中
	cd ceph-cluster/

步骤二 : 部署Ceph集群

  1. 给所有节点安装ceph相关软件包(node1)
	for i in node1 node2 node3
	do
		ssh $i "yum -y install ceph-mon ceph-osd ceph-mds ceph-radosgw"
	done
  1. 创建Ceph集群配置, 在Ceph-cluster目录下生成Ceph配置文件(node1)
	# 在ceph.conf配置文件中定义monitor主机是谁
	ceph-deploy new node1 node2 node3 			# new新建一个monitor集群, 由三台机子组成node1 node2 node3
	ls
		ceph.conf  ceph-deploy-ceph.log  ceph.mon.keyring
	cat ceph.conf
		[global]
		fsid = 2ce461c2-0a94-42b7-b502-0ae85bfc2e83 	# 随机ID号
		mon_initial_members = node1, node2, node3 	# 集群成员
		mon_host = 192.168.4.11,192.168.4.12,192.168.4.13 	# 集群成员的IP地址
		auth_cluster_required = cephx 					# 密码占位符
		auth_service_required = cephx 					# 服务端访问需要密码 	x 密码占位符
		auth_client_required = cephx 					# 当客户端访问时需要密码 x 密码占位符
  1. 初始化所有节点的mon服务, 也就是启动mon服务(主机名解析必须对)
	ceph-deploy mon create-initial 			# 实质 : 脚本自动将所有集群成员的配置文件ceph.conf拷贝至/etc/ceph/ 下
  1. 常见错误及解决方法(非必要操作, 有错误可以参考)
	如果提示如下错误信息:
		[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

  1. vdb1 和 vdb2 这两个分区用来做存储服务器的journal缓存盘
	for i in node1 node2 node3
	do
		ssh $i "parted /dev/vdb mklabel gpt" 					# gpt分区
		ssh $i "parted /dev/vdb mkpart primary 1 50%" 		# mkpart 做分区 主分区从 1 开始到 50% (vdb有20G 则这里为10G) 
		ssh $i "parted /dev/vdb mkpart primary 50% 100%"  	# 创建主分区 大小为10G
	done
	# fdisk (mbr, 不支持gpt,交互) 
	# parted (非交互执行, 支持gpt)
  1. 磁盘分区后的默认权限无法让ceph软件对其进行读写操作, 需要修改权限. (node1、node2、node3都需要操作, 这里以node1为例)
	chown ceph.ceph /dev/vdb1 				# 中间 . 或者 : 都行 
	chown ceph.ceph /dev/vdb2
	# 上面的权限修改为临时操作, 重启计算机后, 权限会再次被重置
	# 需要将规则写到配置文件实现永久有效
	# 规则: 如果设备名称为/dev/vdb1 则设备文件的所有者和所有组都设置为ceph
	# 规则: 如果设备名称为/dev/vdb2 则设备文件的所有者和所有组都设置为ceph
	vim /etc/udev/rules.d/70-vdb.rules
		ENV{DEVNAME}=="/dev/vdb1",OWNER="ceph",GROUP="ceph"
		ENV{DEVNAME}=="/dev/vdb2",OWNER="ceph",GROUP="ceph"
  1. 初始化情况磁盘数据(仅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
	# 可以将这些盘写在一行
  1. 创建OSD存储空间(仅node1操作即可)
	ceph-deploy osd create node1:vdc:/dev/vdb1 node1:vdd:/dev/vdb2
	# 创建osd存储设备, vdc为集群提供存储空间, vdb1 提供journal缓存
	# 每个存储设备对应一个缓存设备, 缓存需要SSD, 不需要很大
	ceph-deploy osd create node2:vdc:/dev/vdb1 node2:vdd:/dev/vdb2
	ceph-deploy osd create node3:vdc:/dev/vdb1 node3:vdd:/dev/vdb2
  1. 常见错误及解决方法(非必须操作)
	使用osd create创建OSD存储空间时,如提示下面的错误提示:
	[ceph_deploy][ERROR ] RuntimeError: bootstrap-osd keyring not found; run 'gatherkeys'
	可以使用如下命令修复文件,重新配置ceph的密钥文件:
		ceph-deploy gatherkeys node1 node2 node3

步骤四 : 验证测试

  1. 查看集群状态
	ceph -s
  1. 常见错误(非必须操作)
	如果查看状态包括如下信息
	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集群的块存储功能, 实现以下目标 :
    • 创建块存储镜像
    • 客户端映射镜像
    • 创建镜像快照
    • 使用快照还原数据
    • 使用快照克隆镜像
    • 删除快照与镜像

步骤一 : 创建镜像

  1. 查看存储池(镜像池)(node1)
	ceph osd lspools 
		0 rbd,
  1. 创建镜像、查看镜像(node1)
	rbd create demo-image --image-feature layering --size 10G
	rbd create rbd/jacob --image-feature layering --size 10G
	# 这里的demo-image和jacob为创建的镜像名称, 可以为任意字符
	# 未指定池子, 则默认在rbd池里面
	# --image-feature参数指定我们创建的镜像有哪些功能, layering是开启COW功能
	# 提示: ceph镜像支持很多功能, 但很多是操作系统不支持的, 因此开启layering
	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:

步骤二 : 动态调整

  1. 扩容容量
	rbd resize --size 15G jacob
	rbd info jacob
  1. 缩小容量
	rbd resize	--size 7G jacob --allow-shrink
	rbd info image

步骤三 : 通过KRBD访问

  1. 客户端通过KRBD访问(client)
	# 客户端需要安装ceph-common软件包
	# 拷贝配置文件 (否则不知道集群在哪)
	# 拷贝连接密钥 (否则无连接权限)
	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
  1. 客户端格式化, 挂载分区
	mkfs.xfs /dev/rbd0
	mount /dev/rbd0 /mnt/
	echo "test" > /mnt/test.txt

步骤四 : 创建镜像快照

  1. 查看镜像快照(默认所有镜像都没有快照)node1
	rbd snap ls jacob
  1. 给镜像创建快照
	rbd snap create jacob --snap jacob-snap1
	# 为jacob镜像创建快照, 快照名称为 jacob-snap1
	rbd snap ls jacob
  1. 删除客户端写入的测试文件
	rm -rf /mnt/test.txt
	umount /mnt
  1. 还原快照
	rbd snap rollback jacob --snap jacob-snap1
	# 客户端重新挂载分区
	mount /dev/rbd0 /mnt/
	ls /mnt

步骤五 : 创建快照克隆

  1. 克隆快照
	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
	# 使用jacob镜像的快照jacob-snap1克隆一个新的名称为jacob-clone的镜像
  1. 查看克隆镜像与父镜像快照的关系
	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 				# 则可以删除快照

步骤六 : 其他操作

  1. 客户端撤销磁盘映射
	umount /mnt
	rbd showmapped
		id pool image snap device    
		0  rbd  jacob -    /dev/rbd0
	rbd unmap /dev/rbd0
发布了25 篇原创文章 · 获赞 24 · 访问量 7923

猜你喜欢

转载自blog.csdn.net/qq_40023447/article/details/103603372