分布式存储概述
数据分为元数据和数据
元数据即是文件的属性信息,元数据就是有一种路由机制,即当客户端或者应用程序产生的客户端数据被写入到分布式存储系统的时候,会有一个服务(NameNode)提供文件元数据的路由功能,即告诉应用程序去哪个服务器去请求文件内容,然后再有(DataNode)提供数据的读写请求及数据的高可用功能。
- 传统的分布式存
- 块存储:需要格式化,将文件保存到磁盘上
- 文件存储:提供数据存储的接口,是由操作系统针对块存储的应用,即由操作系统提供存储接口,应用程序通过调用操作系统将文件保存到块存储进程持久化
- 对象存储:也称为基于对象的存储,其中的文件被拆分成多个部分并散布在多个存储服务器,在对象存储中数据会被分解为称为"对象"的离散单元,并保存在单个存储库中,而不是作为文件夹中的文件或服务器上的块来保存,对象存储需要一个简单的HTTP应用编程接口(API),以供大多数客户端(各种语言)使用
ceph分布式存储
- Ceph是一个开源的分布式存储系统,包括对象存储、块设备、文件系统。
- Ceph是一个对象(object)式存储系统,它把每一个待管理的数据流(文件登数据)切分为一到多个固定大小(默认4M)的对象数据,并以其为原子单元(原子是构成元素的最小单元)完成数据的读写。
- 对象数据的底层存储服务是由多个存储主机(host)组成的存储集群,该集群也被称之为RADOS(reliable automatic distributed object store)存储集群,即可靠的、自动化的、分布式的对象存储系统。librados是RADOS存储集群的API,支持C/C++/JAVA/python/ruby/php等编程语言客户端。
ceph架构
Pool:存储池、分区,存储池的大小取决于底层的存储空间。
PG(placement group):一个pool内部可以有多个PG存在,pool和PG都是抽象的逻辑概念,一个pool中有多少个PG可以通过公式计算。
OSD(Object Storage Daemon):每一块磁盘叫做osd,多个osd组成一个主机
存储文件过程:
第一步:把文件对象映射给PG
第二步:把文件对象映射给OSD
第三步:通过OSD写入到硬盘
监视器mon维护OSD和PG的集群状态
ceph集群角色
Intro to Ceph — Ceph Documentation
http://docs.ceph.org.cn/start/intro/
ceph集群的组成部分
若干的Ceph OSD(对象存储守护程序)
至少需要一个Ceph Monitors监视器(1,3,5,7,9...)
两个或以上的Ceph管理器manages,运行ceph文件系统客户端时,还需要高可用的Ceph Metadata Server(文件系统元数据服务器)
RADOS cluster:由多台host存储服务器组成的ceph集群
OSD(Object Storage Daemon):每台存储服务器的磁盘组成的存储空间
Mon(Monitor):ceph的监视器,维护OSD和PG的集群状态,一个ceph集群至少要有一个mon,可以是1,3,5,7等这样的奇数个。
Mgr(Manager):负责跟踪运行时指标和Ceph集群的当前状态,包括存储利用率,当前性能指标和系统复制等。
Monitor(ceph-mon):ceph监视器
在一个主机上运行的一个守护进程,用于维护集群状态映射(maintains maps of the cluster state),比如ceph集群中有多少存储池、每个存储池有多少个PG以及存储池和PG的映射关系等,monitor map,manager map,the OSD map,and the CRUSH map,这些映射是Ceph守护程序相互协调所需的关键集群状态,此外监视器还复制管理守护程序和客户端之间的身份验证(认证使用cephX协议)。通常至少需要三个监视器才能实现冗余和高可用性。
Managers(ceph-mgr)的功能
在一个主机上运行的一个守护进程,Ceph Manager守护程序(ceph-mgr)负责跟踪运行时指标和Ceph集群的当前状态,包括存储利用率,当前性能指标和系统负载。Ceph Manager守护程序还托管基于python的模块来管理和公共ceph集群信息。包括基于web的ceph仪表盘和REST API。高可用性通常至少需要两个管理器。
Ceph OSDs(对象存储守护程序ceph-osd)
提供存储数据,一个磁盘就是一个OSD,因此一个服务器的OSD不能超过磁盘的总数,OSD用于处理ceph集群数据复制,恢复,重新平衡,并通过检查其他Ceph OSD守护程序的心跳来向Ceph监视器和管理器提供一些监视信息。通常至少需要3个Ceph OSD才能实现冗余和高可用性。
MDS(ceph 元数据服务器,ceph-mds)
代表ceph文件系统(NFS/CIFS)存储元数据,(即Ceph块设备和Ceph对象存储不使用MDS)
CRUSH算法简介
controllers replication under scalable hashing #可控的、可复制的、可伸缩的一致性hash算法
Ceph使用CURSH算法来存放和管理数据,它是Ceph的智能数据分发机制。Ceph使用CRUSH算法来准确计算数据应该被保存到哪里,以及应该从哪里读取和保存元数据不同的是CRUSH按需计算元数据,因此它就消除了对中心式的服务器/网关的需求,它使得Ceph客户端能够计算出元数据,该过程也称为CRUSH查找,然后和OSD直接通信。
- 如果式把对象直接映射到OSD之上会导致对象与OSD的对应关系过于紧密和耦合,当OSD由于故障发生变更时将会对整个ceph集群产生影响。
- ceph将一个对象映射到RADOS集群的时候分为两步走:首先使用一致性hash算法将对象名称映射到PG,然后将PG ID基于CRUSH算法映射到OSD即可查到对象
- 以上两个过程都是以"实时计算"的方式完成,而没有使用传统的查询数据与块设备的对应表的方式,这样有效避免了组件的"中心化"问题,也解决了查询新能和冗余问题。使得ceph集群扩展不在受查询的性能限制
- 这个实时计算操作使用的就是CRUSH算法
- Controllers replication under scalable hashing #可控的、可复制的、可伸缩的一致性hash算法
- CRUSH时一种分布式算法,类似于一致性hash算法,用于为RADOS存储集群控制数据的分配
部署ceph集群
http://docs.ceph.org.cn/install/manual-deployment/ #简要部署过程
部署方式
ceph-ansible:https://github.com/ceph/ceph-ansible #python
ceph-salt:GitHub - ceph/ceph-salt: Deploy Ceph clusters using cephadm #python
ceph-container:GitHub - ceph/ceph-container: Docker files and images to run Ceph in containers #shell
ceph-chef:https://github.com/ceph/ceph-chef #Ruby
ceph-deploy:GitHub - ceph/ceph-deploy: Deploy Ceph with minimal infrastructure, using just SSH access #python
- ceph-deploy是一个ceph官方维护的基于ceph-deploy命令行部署ceph集群的工具,基于ssh执行sudo权限的shell命令以及一些python脚本实现ceph集群的部署和管理维护。
- ceph-deploy只用于部署和管理ceph集群,客户端需要访问ceph,需要部署客户端工具。
服务器准备
- 四台服务器作为ceph集群OSD存储服务器,每台服务器支持两个网络,public网络用于客户端访问,cluster网络用于集群管理及数据同步
- 三台服务器作为ceph集群Mon监视服务器,每台服务器可以和ceph集群的cluster网络通信
- 两台ceph-mgr管理节点,可以和ceph集群的cluster网络通信
- 一台服务器用于部署ceph集群即安装ceph-deploy
- 创建一个普通用户,能够通过sudo执行特权命令,配置主机名解析,ceph集群依赖于主机名,关闭各服务器防火墙、selinux
ceph-deploy节点:172.20.22.22
mon节点:172.20.22.25、172.20.22.26、172.20.22.27
mgr节点:172.20.22.25、172.20.22.28
stor节点:172.20.22.25、172.20.22.26、172.20.22.27、172.20.22.28
部署RADOS集群
阿里云开源镜像站资源目录 #阿里云镜像仓库
Index of /ceph/ #网易镜像仓库
Index of /ceph/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror #清华大学镜像源
以下示例以centos7.9的系统为例:
部署前提:
- 各服务器时间同步
- 各服务器关闭selinux和防火墙
- 各服务器配置域名解析
配置yum仓库
各节点配置ceph yum仓库和epel源
####各节点配置ceph yum仓库
# wget https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-mimic/el7/noarch/ceph-release-1-1.el7.noarch.rpm
# rpm -qpl ceph-release-1-1.el7.noarch.rpm
/etc/yum.repos.d/ceph.repo
# rpm -ivh ceph-release-1-1.el7.noarch.rpm
# ls -lrt /etc/yum.repos.d/ceph.repo
-rw-r--r--. 1 root root 535 5月 5 2018 /etc/yum.repos.d/ceph.repo
# cat /etc/yum.repos.d/ceph.repo
[ceph]
name=Ceph packages for $basearch
baseurl=https://mirrors.aliyun.com/ceph/rpm-mimic/el7/$basearch
enabled=1
priority=2
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
[ceph-noarch]
name=Ceph noarch packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-mimic/el7/noarch
enabled=1
priority=2
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
[ceph-source]
name=Ceph source packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-mimic/el7/SRPMS
enabled=0
priority=2
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
创建ceph用户
推荐使用指定的普通用于部署和运行ceph集群普通用户只要能以非交互式执行sudo命令执行一些特权命令即可,新版的ceph-depoly可以指定包含root在内只要可以执行sudo命令的用户。
在ceph-deploy节点、mon节点和mgr节点创建ceph用户
###添加ceph用户
# useradd ceph && echo "123456" | passwd --stdin ceph
###配置ceph用户以sudo执行特权命令
# echo "ceph ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
#配置免密钥登录
在ceph-deploy节点配置允许以非交互的方式登录到各ceph node/mon/mgr节点,即在ceph-deploy节点生成密钥对,然后分发公钥到各被管理节点
[ceph@ceph-deploy ~]# su - ceph
[ceph@ceph-deploy ~]$ ssh-keygen -t rsa -P ''
[ceph@ceph-deploy ~]$ ssh-copy-id -i .ssh/id_rsa.pub ceph@localhost
[ceph@ceph-deploy ~]$ scp -rp .ssh ceph@stor01:/home/ceph/
[ceph@ceph-deploy ~]$ scp -rp .ssh ceph@stor02:/home/ceph/
[ceph@ceph-deploy ~]$ scp -rp .ssh ceph@stor03:/home/ceph/
[ceph@ceph-deploy ~]$ scp -rp .ssh ceph@stor04:/home/ceph/
配置主机名解析
# cat /etc/hosts
172.20.22.22 ceph-deploy.ilinux.io ceph-deploy
172.20.22.25 mon01.ilinux.io mon01 stor01.ilinux.io stor01
172.20.22.26 mon02.ilinux.io mon02 stor02.ilinux.io stor02
172.20.22.27 mon03.ilinux.io mon03 stor03.ilinux.io stor03
172.20.22.28 stor04.ilinux.io stor04
安装ceph部署工具
在ceph部署服务器安装部署工具ceph-deploy
[ceph@ceph-deploy ~]$ sudo yum install ceph-deploy python-setuptools python2-subprocess32 -y
初始化mon节点
在ceph-deploy节点初始化mon节点
[ceph@ceph-deploy ~]# su - ceph
[ceph@ceph-deploy ~]$ mkdir ceph-cluster
[ceph@ceph-deploy ~]$ cd ceph-cluster
[ceph@ceph-deploy ~]$ ceph-deploy --help
new:开始部署一个新的ceph存储集群,并生成cluster.conf集群配置文件和keyring认证文件
install:在远程主机上安装ceph相关的软件包,可以通过--release指定安装的版本
rgw:管理RGW守护程序(RADOSGW,对象存储网关)
mgr:管理MGR守护程序(ceph-mgr,Ceph Manager DaemonCeph管理器守护程序)
mds:管理MDS守护程序(ceph Metadata Server,ceph源数据服务器)
mon:管理MON守护程序(ceph-mon,ceph监视器)
gatherkeys:从指定获取提供新节点的验证keys,这些keys会在添加新的MON/OSDD/MD加入的时候使用
disk:管理远程主机磁盘
osd:在远程主机准备数据磁盘,即将指定远程主机的指定磁盘添加ceph集群作为osd使用
repo:远程主机仓库管理
admin:推送ceph集群配置文件和client.admin认证文件到远程主机
config:将ceph.conf配置文件推送到远程主机或从远程主机拷贝
uninstall:从远端主机删除安装包
purgedata:从/var/lib/ceph删除ceph数据,会删除/etc/ceph下的内容
purge:删除远端主机的安装包和所有数据
forgetkeys:从本地主机删除所有的验证keyring,包括clinet.admin,monitor,bootstrap等认证文件
pkg:管理远端主机的安装包
calamari:安装并配置一个calamari web节点,calamari是一个web监控平台
####初始化mon节点
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy new --cluster-network 192.168.22.0/24 --public-network 172.20.22.0/24 mon01
###验证初始化
[ceph@ceph-deploy ceph-cluster]$ ls -lrt
总用量 12
-rw-------. 1 ceph ceph 73 4月 27 10:10 ceph.mon.keyring #用于ceph mon节点内部通讯认证的密钥环文件
-rw-rw-r--. 1 ceph ceph 3805 4月 27 10:10 ceph-deploy-ceph.log #初始化日志
-rw-rw-r--. 1 ceph ceph 261 4月 27 10:10 ceph.conf #自动生成的配置文件
[ceph@ceph-deploy ceph-cluster]$ cat ceph.conf
[global]
fsid = dcf765fc-02d4-4e5a-9c90-8fdb240fa2e8 #ceph的集群ID
public_network = 172.20.22.0/24
cluster_network = 192.168.22.0/24
mon_initial_members = mon01 #可以用逗号做分割添加多个mon节点
mon_host = 172.20.22.25
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
初始化ceph存储节点
####初始化过程,此过程会在指定的ceph node节点按照串行的方式逐个服务器安装epel源和ceph源并安装ceph ceph-radosgw
[root@mon01 ~]# yum install -y ceph ceph-radosgw
[root@mon02 ~]# yum install -y ceph ceph-radosgw
[root@mon03 ~]# yum install -y ceph ceph-radosgw
[root@stor04 ~]# yum install -y ceph ceph-radosgw
####初始化
[ceph@ceph-deploy ~]# su - ceph
[ceph@ceph-deploy ~]$ cd ceph-cluster
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy install --no-adjust-repos --nogpgcheck mon01 mon02 mon03 stor04
配置mon节点并收集密钥
通过读取当前目录下的ceph.conf配置文件初始化mon节点
[ceph@ceph-deploy ~]# su - ceph
[ceph@ceph-deploy ~]$ cd ceph-cluster
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy mon create-initial
[ceph@ceph-deploy ceph-cluster]$ ls -lrt
总用量 56
-rw-------. 1 ceph ceph 73 4月 27 10:10 ceph.mon.keyring
-rw-rw-r--. 1 ceph ceph 261 4月 27 10:10 ceph.conf
-rw-------. 1 ceph ceph 151 4月 27 11:26 ceph.client.admin.keyring
-rw-------. 1 ceph ceph 113 4月 27 11:26 ceph.bootstrap-mds.keyring
-rw-------. 1 ceph ceph 113 4月 27 11:26 ceph.bootstrap-mgr.keyring
-rw-------. 1 ceph ceph 113 4月 27 11:26 ceph.bootstrap-osd.keyring
-rw-------. 1 ceph ceph 113 4月 27 11:26 ceph.bootstrap-rgw.keyring
-rw-rw-r--. 1 ceph ceph 26531 4月 27 11:26 ceph-deploy-ceph.log
###验证mon节点,验证在指定节点已经自动配置并启动了ceph-mon服务,兵器在初始化当前目录会生成一些bootstrap ceph mds/mgr/osd/rgw的keyring认证文件
[root@mon01 ~]# ps -ef | grep ceph-mon
ceph 25279 1 0 11:26 ? 00:00:00 /usr/bin/ceph-mon -f --cluster ceph --id mon01 --setuser ceph --setgroup ceph
分发admin密钥
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy admin mon01 mon02 mon03 stor04
###ceph节点验证密钥,到node节点验证key文件
[root@mon01 ~]# ls -lrt /etc/ceph/
total 12
-rw-r--r--. 1 root root 92 Apr 24 2020 rbdmap
-rw-------. 1 root root 0 Apr 27 11:26 tmpT5RzRo
-rw-r--r--. 1 root root 261 Apr 27 11:43 ceph.conf
-rw-------. 1 root root 151 Apr 27 11:43 ceph.client.admin.keyring
###认证文件的属主和属组为了安全考虑,默认设置为root用户和root组
[root@mon01 ~]# setfacl -m u:ceph:rw /etc/ceph/ceph.client.admin.keyring
[root@mon02 ~]# setfacl -m u:ceph:rw /etc/ceph/ceph.client.admin.keyring
[root@mon03 ~]# setfacl -m u:ceph:rw /etc/ceph/ceph.client.admin.keyring
[root@stor04 ~]# setfacl -m u:ceph:rw /etc/ceph/ceph.client.admin.keyring
部署ceph-mgr节点
mgr节点需要读取ceph的配置文件,即/etc/ceph目录中的配置文件
###初始化ceph-mgr节点
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy mgr create mon01
###验证ceph-mgr节点
[root@mon01 ~]# ps -ef | grep ceph-mgr
ceph 25962 1 0 14:46 ? 00:00:02 /usr/bin/ceph-mgr -f --cluster ceph --id mon01 --setuser ceph --setgroup ceph
ceph-deploy管理ceph集群
在ceph-deploy节点配置系统环境,方便后期可以执行ceph管理命令
[ceph@ceph-deploy ceph-cluster]$ sudo yum install -y ceph-common
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy admin ceph-deploy
[root@ceph-deploy ~]# setfacl -m u:ceph:rw /etc/ceph/ceph.client.admin.keyring
##测试ceph命令
[root@ceph-deploy ~]# setfacl -m u:ceph:rw /etc/ceph/ceph.client.admin.keyring
[ceph@ceph-deploy ceph-cluster]$ ceph -s
cluster:
id: dcf765fc-02d4-4e5a-9c90-8fdb240fa2e8
health: HEALTH_WARN
OSD count 0 < osd_pool_default_size 3
services:
mon: 1 daemons, quorum mon01
mgr: mon01(active)
osd: 0 osds: 0 up, 0 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 0 B used, 0 B / 0 B avail
pgs:
准备OSD节点
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy disk list mon01
###使用ceph0deploy disk zap擦除各ceph node的ceph数据磁盘
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy disk zap mon01 /dev/vdb
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy disk zap mon01 /dev/vdc
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy disk zap mon01 /dev/vdd
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy disk zap mon02 /dev/vdb
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy disk zap mon02 /dev/vdc
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy disk zap mon02 /dev/vdd
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy disk zap mon03 /dev/vdb
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy disk zap mon03 /dev/vdc
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy disk zap mon03 /dev/vdd
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy disk zap stor04 /dev/vdb
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy disk zap stor04 /dev/vdc
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy disk zap stor04 /dev/vdd
####添加OSD
####bluestore,默认为bluestore
# ceph-deploy osd create {node} --data /path/to/data --block-db /path/to/db-device
# ceph-deploy osd create {node} --data /path/to/data --block-wal /path/to/wal-device
# ceph-deploy osd create {node} --data /path/to/data --block-db /path/to/db-device --block-wal /path/to/wal-device
####使用filestore的数据和文件系统的日志路径
# ceph-deploy osd create {node} --filestore --data /path/to/data --journal /path/to/journal
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy osd create -h
#添加OSD
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy osd create mon01 --data /dev/vdb
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy osd create mon01 --data /dev/vdc
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy osd create mon01 --data /dev/vdd
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy osd create mon02 --data /dev/vdb
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy osd create mon02 --data /dev/vdc
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy osd create mon02 --data /dev/vdd
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy osd create mon03 --data /dev/vdb
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy osd create mon03 --data /dev/vdc
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy osd create mon03 --data /dev/vdd
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy osd create stor04 --data /dev/vdb
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy osd create stor04 --data /dev/vdc
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy osd create stor04 --data /dev/vdd
#设置OSD服务开机自启动
[ceph@mon01 ~]# systemctl enable ceph-osd@0 ceph-osd@1 ceph-osd@2
[ceph@mon02 ~]# systemctl enable ceph-osd@3 ceph-osd@4 ceph-osd@5
[ceph@mon02 ~]# systemctl enable ceph-osd@6 ceph-osd@7 ceph-osd@8
[ceph@stor04 ~]# systemctl enable ceph-osd@9 ceph-osd@10 ceph-osd@11
验证ceph集群
[ceph@ceph-deploy ceph-cluster]$ ceph -s
cluster:
id: dcf765fc-02d4-4e5a-9c90-8fdb240fa2e8
health: HEALTH_OK
services:
mon: 1 daemons, quorum mon01
mgr: mon01(active)
osd: 12 osds: 12 up, 12 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 12 GiB used, 348 GiB / 360 GiB avail
pgs:
扩展ceph集群实现高可用
扩展ceph-mon节点
ceph-mon是原生具备自选举以实现高可用机制的ceph服务,节点数量通常是奇数
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy mon add mon02
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy mon add mon03
#验证ceph-mon状态
[ceph@ceph-deploy ceph-cluster]$ ceph quorum_status
[ceph@ceph-deploy ceph-cluster]$ ceph quorum_status --format json-pretty
####验证ceph集群状态
[ceph@ceph-deploy ceph-cluster]$ ceph -s
cluster:
id: dcf765fc-02d4-4e5a-9c90-8fdb240fa2e8
health: HEALTH_WARN
too few PGs per OSD (8 < min 30)
services:
mon: 3 daemons, quorum mon01,mon02,mon03
mgr: mon01(active)
osd: 12 osds: 12 up, 12 in
data:
pools: 1 pools, 32 pgs
objects: 0 objects, 0 B
usage: 12 GiB used, 348 GiB / 360 GiB avail
pgs: 32 active+clean
扩展mgr节点
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy mgr create stor04
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy admin stor04
###查看集群状态
[ceph@ceph-deploy ceph-cluster]$ ceph -s
cluster:
id: dcf765fc-02d4-4e5a-9c90-8fdb240fa2e8
health: HEALTH_WARN
too few PGs per OSD (8 < min 30)
services:
mon: 3 daemons, quorum mon01,mon02,mon03
mgr: mon01(active), standbys: stor04
osd: 12 osds: 12 up, 12 in
data:
pools: 1 pools, 32 pgs
objects: 0 objects, 0 B
usage: 12 GiB used, 348 GiB / 360 GiB avail
pgs: 32 active+clean
测试上传与下载数据
$ ceph -h #一个更底层的命令
$ rados -h
####创建pool
[ceph@ceph-deploy ceph-cluster]$ ceph osd pool create mypool 32 32
pool 'mypool' created
###查看已经创建的pool
[ceph@ceph-deploy ceph-cluster]$ ceph osd pool ls
mypool
[ceph@ceph-deploy ceph-cluster]$ rados lspools
mypool
###上传文件
[ceph@ceph-deploy ceph-cluster]$ rados put day.jpg /usr/share/backgrounds/day.jpg -p mypool
###列出文件
[ceph@ceph-deploy ceph-cluster]$ rados ls -p mypool
day.jpg
###查看文件信息
ceph osd map命令可以获取到存储池中数据对象的具体位置信息
[ceph@ceph-deploy ceph-cluster]$ ceph osd map mypool day.jpg
osdmap e52 pool 'mypool' (1) object 'day.jpg' -> pg 1.a15eeea3 (1.3) -> up ([1,6,10], p1) acting ([1,6,10], p1) ###表示文件放在了存储池为1的a15eeea3的PG上,在线的OSD编号1,6,10,主OSD为1,活动的OSD1,6,10,表示数据放在了3个副本,具体是ceph的crush算法计算出三份数据保存在哪些OSD
###下载文件
[ceph@ceph-deploy ceph-cluster]$ sudo rados get day.jpg --pool=mypool /opt/my.jpg
[ceph@ceph-deploy ceph-cluster]$ ls -lrt /opt/my.jpg
-rw-r--r--. 1 root root 961243 4月 27 21:12 /opt/my.jpg
###删除文件
[ceph@ceph-deploy ceph-cluster]$ rados rm day.jpg --pool=mypool
[ceph@ceph-deploy ceph-cluster]$ rados ls --pool=mypool
部署ceph-mds
ceph FS即ceph filesystem可以实现文件系统共享功能,客户端通过ceph协议挂载并使用ceph集群作为数据存储服务器。
Ceph FS需要运行Meta Data Service(MDS)服务,其守护进程为ceph-mds,ceph-mds进程管理与cephFS上存储的文件相关的元数据,并协调对ceph存储集群的访问
部署MDS服务
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy mds create mon02
###验证MDS服务
MDS服务目前还无法正常使用,需要为MDS创建存储池用于保存MDS数据
#当前为备用状态,需要分配pool才可以使用
[ceph@ceph-deploy ceph-cluster]$ ceph mds stat
, 1 up:standby
创建CephFS metadata和data存储池
使用CephFS之前需要事先与集群中创建一个文件系统,并为其分别指定元数据和数据相关的存储池,如下命令将创建名为mycephfs的文件系统,它使用cephfs-metadata作为元数据存储池,使用cephfs-data为数据存储池
#保存metadata的pool
[ceph@ceph-deploy ceph-cluster]$ ceph osd pool create cephfs-metadata 32 32
pool 'cephfs-metadata' created
#保存data的pool
[ceph@ceph-deploy ceph-cluster]$ ceph osd pool create cephfs-data 128 128
pool 'cephfs-data' created
[ceph@ceph-deploy ceph-cluster]$ ceph -s
cluster:
id: dcf765fc-02d4-4e5a-9c90-8fdb240fa2e8
health: HEALTH_OK
services:
mon: 3 daemons, quorum mon01,mon02,mon03
mgr: mon01(active), standbys: stor04
osd: 12 osds: 12 up, 12 in
rgw: 1 daemon active
data:
pools: 9 pools, 352 pgs
objects: 231 objects, 114 MiB
usage: 12 GiB used, 348 GiB / 360 GiB avail
pgs: 352 active+clean
创建cephFS并验证
# ceph fs new <fs_name> <metadata> <data> {--force} {--allow-dangerous-metadata-overlay}
[ceph@ceph-deploy ceph-cluster]$ ceph fs new mycephfs cephfs-metadata cephfs-data
new fs with metadata pool 8 and data pool 9
[ceph@ceph-deploy ceph-cluster]$ ceph fs ls
name: mycephfs, metadata pool: cephfs-metadata, data pools: [cephfs-data ]
[ceph@ceph-deploy ceph-cluster]$ ceph fs status mycephfs
mycephfs - 0 clients
========
+------+--------+-------+---------------+-------+-------+
| Rank | State | MDS | Activity | dns | inos |
+------+--------+-------+---------------+-------+-------+
| 0 | active | mon02 | Reqs: 0 /s | 10 | 13 |
+------+--------+-------+---------------+-------+-------+
+-----------------+----------+-------+-------+
| Pool | type | used | avail |
+-----------------+----------+-------+-------+
| cephfs-metadata | metadata | 2286 | 108G |
| cephfs-data | data | 0 | 108G |
+-----------------+----------+-------+-------+
+-------------+
| Standby MDS |
+-------------+
+-------------+
MDS version: ceph version 13.2.10 (564bdc4ae87418a232fc901524470e1a0f76d641) mimic (stable)
#验证cephFS服务状态,现已经转变为活动状态
[ceph@ceph-deploy ceph-cluster]$ ceph mds stat
mycephfs-1/1/1 up {0=mon02=up:active}
挂载cephFS
在客户端挂载mon节点的6789端口
[root@ceph-client ~]# yum install epel-release
[root@ceph-client ~]# yum install -y ceph-common
#从部署服务器同步认证文件
[ceph@ceph-deploy ceph-cluster]$ scp ceph.conf ceph.client.admin.keyring root@172.20.21.175:/etc/ceph
[ceph@ceph-deploy ceph-cluster]$ cat ceph.client.admin.keyring
[client.admin]
key = AQDdt2hi0keRHxAADTc2jz1Y0ZHbj0fiqh9uXw==
caps mds = "allow *"
caps mgr = "allow *"
caps mon = "allow *"
caps osd = "allow *"
#client挂载
[root@ceph-client ~]# mkdir /data/mysql
[root@ceph-client ~]# mount -t ceph 172.20.22.25:6789:/ /data/mysql -o name=admin,secret=AQDdt2hi0keRHxAADTc2jz1Y0ZHbj0fiqh9uXw==
[root@ceph-client ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 899M 0 899M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 9.5M 901M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/mapper/centos-root 17G 3.2G 14G 19% /
/dev/sda1 1014M 200M 815M 20% /boot
tmpfs 182M 0 182M 0% /run/user/0
172.20.22.25:6789:/ 109G 0 109G 0% /data/mysql
块设备RBD
RBD(RADOS Block Devices)即为块存储的一种,RBD通过librbd库与OSD进行交互,RBD为KVM等虚拟机化技术和云服务提供高性能和无限可扩展性的存储后端,这些系统依赖于libvirt和QEMU实用程序与RBD进行集成,客户端基于librbd库即可将RADOS存储集群用作块设备,用于rbd的存储池需要事先启用rbd功能并进行初始化。
创建RBD
###创建存储池命令格式
$ ceph osd pool create <poolname> pg_num pgp_num {replicated|erasure}
#创建存储池,指定pg和pgp的数量,pgp用于在pg故障时归档pg的数据,因此pgp通常等于pg的值
[ceph@ceph-deploy ~]$ ceph osd pool create myrdb1 64 64
pool 'myrdb1' created
#对存储池启用RBD功能
[ceph@ceph-deploy ~]$ ceph osd pool application enable myrdb1 rbd
enabled application 'rbd' on pool 'myrdb1'
#通过RBD命令对存储池初始化
[ceph@ceph-deploy ~]$ rbd pool init -p myrdb1
创建并验证img
rbd存储池并不能直接用于块设备,而是需要事先在其中按需创建映像(image),并把映像文件作为块设备使用,rbd命令可用于创建、查看及删除块设备,以及克隆映像、创建快照、将映像回滚到快照和查看快照等管理操作
[ceph@ceph-deploy ~]$ rbd create myimg1 --size 5G --pool myrdb1
#由于centos内核较低无法挂载使用,因此只开启部分特性,除了layering其他特性需要高版本内核支持
[ceph@ceph-deploy ~]$ rbd create myimg2 --size 2G --pool myrdb1 --image-format 2 --image-feature layering
#列出指定的pool中所有的img
[ceph@ceph-deploy ~]$ rbd ls --pool myrdb1
myimg1
myimg2
#查看指定rdb的信息
[ceph@ceph-deploy ~]$ rbd --image myimg1 --pool myrdb1 info
[ceph@ceph-deploy ~]$ rbd --image myimg2 --pool myrdb1 info
客户端使用块存储
#查看当前ceph状态
[ceph@ceph-deploy ~]$ ceph -s
cluster:
id: dcf765fc-02d4-4e5a-9c90-8fdb240fa2e8
health: HEALTH_OK
services:
mon: 3 daemons, quorum mon01,mon02,mon03
mgr: mon01(active), standbys: stor04
osd: 12 osds: 12 up, 12 in
data:
pools: 3 pools, 160 pgs
objects: 7 objects, 405 B
usage: 12 GiB used, 348 GiB / 360 GiB avail
pgs: 160 active+clean
[ceph@ceph-deploy ~]$ ceph df
GLOBAL:
SIZE AVAIL RAW USED %RAW USED
360 GiB 348 GiB 12 GiB 3.36
POOLS:
NAME ID USED %USED MAX AVAIL OBJECTS
mypool 1 0 B 0 108 GiB 0
myrdb1 2 405 B 0 108 GiB 7
#客户端安装ceph-common
[root@ceph-client ~]# yum install epel-release
[root@ceph-client ~]# yum install -y ceph-common
#从部署服务器同步认证文件
[ceph@ceph-deploy ceph-cluster]$ scp ceph.conf ceph.client.admin.keyring root@172.20.21.175:/etc/ceph
#客户端映射img
[root@ceph-client ~]# rbd -p myrdb1 map myimg2
/dev/rbd0
#客户端验证RBD
[root@ceph-client ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─centos-root 253:0 0 17G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sr0 11:0 1 1024M 0 rom
rbd0 252:0 0 2G 0 disk
#客户端格式化磁盘并挂载使用
[root@ceph-client ~]# mkfs.xfs -f /dev/rbd0
[root@ceph-client ~]# mount /dev/rbd0 /mnt
[root@ceph-client ~]# dd if=/dev/zero of=/mnt/file bs=1M count=100
#ceph验证数据
[ceph@ceph-deploy ~]$ ceph df
GLOBAL:
SIZE AVAIL RAW USED %RAW USED
360 GiB 348 GiB 12 GiB 3.44
POOLS:
NAME ID USED %USED MAX AVAIL OBJECTS
mypool 1 0 B 0 108 GiB 0
myrdb1 2 102 MiB 0.09 108 GiB 41