持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情
分布式存储
1、需要一个存放元数据的节点,此节点叫做:Name Node
2、然后后端多个服务器就是存储数据的,此众多节点叫做:Data Node
3、无论是存数据,还是放数据都是现在Name Node中存放元数据,然后在将要存放的数据,分块存储在每一个Data Node上。
那现在想个问题:
- 如果Name Data节点宕机了怎么办?
那就完犊子了。因此我们需要做Name Data高可用,但是我们元数据是高密集但I/O量小的数据,一般的元数据也就是几十K。这个元数据包含了任何文件/数据的信息,因此只要访问数据都是要先访问元数据,因此为了高性能,高效的访问,它们通常需要在内存中,因此内存空间非常消耗,但是一旦Name Node宕机了,所有的元数据都没了,那就玩完了。因此需要通过某种机制将元数据信息存储在持久化存储上。
Ceph
1、Ceph是分部署存储系统,并且它是一个对象(Object)式存储系统。
何为对象存储,简单的来说,它是直接存放在磁盘上的,和文件存储不同的,文件存储需要基于文件系统之上进行存储,而且文件系统之上分为Node(用来存放元数据的),和data(用来存放数据的)。但是对象存储不一样,它是把每一个需要存储的数据流(例如一个文件)切分为多个固定大小的对象数据,而每一个对象数据里面直接包含了数据元信息和数据本身,也就是说不在分node(所以部分)和data(数据部分)
2、接着Ceph的定义说,Ceph会把每一个待每一个需要存储的数据流(例如一个文件)切分为多个固定大小的对象数据,并以其为原子单元完成数据存取。而且在Ceph之上每一个对象就是最基础的原子管理单元。类似于Kubernetes中的Pod。
3、对象数据的底层存储服务是由多个主机(Host)组成的集群,该集群也被称为RADOS(Reliable Automatic Distributed Object Store)存储集群,即可靠、自动化、分布式对象存储系统。
RADOS是一个底层存储服务,它由自身的API接口提供服务,此API叫做:"librados"。它支持C,C++,Java,Python,Ruby,PHP等编程语言。
现在我们来想个问题:在传统的分布式存储系统中,比如文件存储,是需要同一个Name Node节点用来存放数据元信息的,那一但存放的元信息多了,就需要上亿台服务器要访问此Name Node节点来获取数据元信息,那这样Name Node就会成为整个存储系统的瓶颈。
因此Ceph就是用来解决这个问题的,Ceph中有个CRUSH算法,它根据数据中么讴歌信息进行hash算法去寻找数据,比如:根据数据的名称,计算出hash值,当需要获取该数据时,由名字计算出hash值,然后找到对应的hash值,从而获取数据。
5、所以从根本来讲Ceph的核心就是在底层由一个叫做RADOS存储集群。这个RADOS集由多个节点组成。这个存储集群,它的存储服务只是一个API,那这就麻烦了,只是个API我想挂载访问咋办?我想存储文件咋办?那只有写程序调用API,来实现。那我会写,所以Ceph也有相应的解决办法。
Ceph基于librados接口,又虚拟化出三个虚拟接口
CEPHFS接口:将RADOS提供的存储空间变为文件系统的,提供用户(client)取挂载使用的,和NFS类似。
RBD:用户调用librbd内核模块,librbd调用RBD接口,来实现。将RADOS提供的存储空间模拟成一个一个的块设备使用的。每一个块设备就是一个image,它就相当于一个磁盘一样,可以分区、格式化、挂载使用。
RADOSGW:它是一个更抽象的,能够跨会联网使用的对象存储,那它和我们刚刚学习的Ceph自己内部的对象有区别。Ceph内部的对象是固定大小的存储块,而且通常在Ceph集群中使用,它是基于ROC协议使用的。而互联网上的云存储这是基于REST ful API接口提供的,而且每一个文件都是一个对象,并且文件大小各不相同。
因此说Ceph是提供的文件存储,块存储,云存储的集合。
因此无论是RADOSGW 还是RBD后者CEPHFS都是Ceph的客户端。
Ceph工作机制
底层由RADOS存储服务,它内部有多个各节点组织起来成为一个存储集群。这些存储集群上通常需要运行一些服务,或者说守护进程以确保这每一个主机上所提供的存储空间可用。
当一个文件需要存储了,由Ceph,由Ceph分割为固定大小的对象,交给底层的某个主机,那这个对象存在主机的那个地方呢?答案:本地的文件系统上。
所以每一个节点都应该有个磁盘,而且这个磁盘需要已经创建好了分区,完成了格式化,已经有了文件系统。并且这个格式化的类型必须为XFS格式的,Ceph唯一支持这一个。这个就有个问题:要存储的文件被分为对象之后又需要存进本地文件系统中了,那存入文件系统中又要分数据元信息和数据。那这种性能会有受影响的。
注:如果想把存放的对象,存放在文件系统中,必须需要XFS格式的文件系统。并且,此对象本身数据直接放在XFS文件系统中,而对象还有元数据,这个元数据放在XFS文件系统里面有个叫做"levelDB"元数据存储容器里面。levelDB也是以key:value存放的,是由谷歌研发。
所以后来Ceph版本换个方式:就可以直接使用磁盘来存放分割好了的一个又一个的对象。那对象本身是存放好了,但是对象的元数据存放在哪呢?在裸磁盘中也有个LevelDB(后来FaceBook将其改为Ro'c'ksDB),用来存放对象的元数据,但是别忘了,现在对象处于的存储设备是个裸设备,默认是不支持存数元数据的,因为FaceBook团队又在LevelDB上开发个文件系统:BlueFS。这样就完美解决了及存放了对象数据本身,又存放了对象的元数据。
如下图:
但是无论使用那个存储设备去存储
综上所述:RADOS是真正把多个节点组织为一个集群并利用对方的存储空间整和成一个更大存储空间,从而提供分布式存储服务。
主机提供的存储空间是如何被调用的?以及存储空间是如何被管理的?
1、OSD:对象存储设备,实际上就是主机中的一个磁盘,每一个磁盘就叫做OSD。每一个OSD对应一个守护进程,一个守护进程管理一个OSD。
2、mon host:集群元数据监视器,它以守护进程的方式运行在每个节点上,用来管理整个集群的和。比如:它可以统计RADOS Cluster中有多少个节点,每一个节点有多少个OSD?,每一个OSD是否健康?等等。它持有整个集群的运行图或运行状态。这个也叫做元数据,是集群元数据,不是文件元数据。因此这个节点非常重要,可以做高可用。同时它也负责认证,比如:底层各个主机的访问,客户端和主机的访问等都需要认证
3、那我们想要监控整个RADOS集群,就需要向mon主机做很多查询才能获得这些数据。我们知道Zabbix要想监控某个服务,要需要周期性的采集指标数据。而mon每一次读取数据都是实时查询的,这中实时查询代价很高,因此mon不适合频繁的周期性采集数据这种操作。但是我就想监控RADOS集群,那该怎么?
所以Ceph新版本,引入一个新组件:mgr(manager)
4、mgr:它专门维护查询的类的操作,它以守护进程的方式运行在每个节点上。它把很多的查询操作按照自己内部空闲的方式缓存下来,然后提供。
那如何将文件存入集群呢?
RADOS将存储空间划分一个一个pool(存储池)这个存储池的大小和底层的存储空间有关。
pool中有多个PG(归置组)。pool个PG都是抽象的概念。
1、首先通过某一类RADOS客户端来接入RADOS。
2、这是CRUSH算法的第一步:把存储对象映射给PG。在即将存储OSD中时,需要向Pool申请,我们要把对象的名字一致性的做哈希运算(这是CRUSH算法的第一步),计算完之后归属于某个PG上,这样某一个对象就归属于某一个PG了。这一步具体就是
那CRUSH算法第二部:把PG映射给合适的OSD
管理节点(Admin Host)
Ceph是个分布式集群,为了方便管理和维护集群,我们通常需要有个管理节点,这个会使我们的工作站,为了安全工作站只能自己用,但是集群人员也许不止一个。我们都可以用这个管理节点去管理集群,这个管理节点能联系到每一个工作节点,比如:用于提供存储设备的节点,mon,mgr节点等。具体的联系就是通过控制其余节点的守护进程来完成一系列的操作。
以下是Ceph最常见的架构图:
其中OSD Host最少有三个,mon:实验环境1个即可,生产环境最少有3个,mgr:实验环境可有可无,生产环境至少2个以上。
1、Ceph的常用管理接口是一组命令行工具程序,例如:rados,ceph,rbd等命令,管理员可以从某个特定的mon节点执行管理操作,但也有人更倾向于使用管理节点。
2、事实上,专用的管理节点,有助于在Ceph相关的程序升级或硬件维护期间为管理员提供一套完整的、独立的并隔离与存储集群之外的操作环境,从而避免因重启或意外中断而导致维护操作一行中断。
3、那么在安装完Ceph集群后,要想使用RBD,只要在客户端上安装rbd内核模块即可,如果需要使用文件系统,在集群上部署MDS守护进程,如果想使用RADOSGW,需要部署radosgw守护进程。
一个Object中包含哪些信息?
ID:Object ID,便于集群内部引用。
Binary Data:对象存储的内容。
Metadata:对象元数据(Key:Value)。
部署Ceph集群
选择Ceph部署工具
由于Ceph的部署有一定的麻烦,因此选用一个部署工具可以帮助我们部署:
- Ceph-Deploy #最原生的部署工具,它借助于SSH,sudo,Python 模块来部署。相当于部署K8S时的kubeadm
- Ceph-ansible #最完善的部署方式
- Ceph-chef
- puppet-Ceph
部署说明:我们以Ceph-deploy的方式进行部署,我们只将安装包在admin-host节点上安装,由admin-host基于ssh控制众多stor节点进行相应的配置,因此admin-host要ssh无密钥登陆到stor节点。
当然我们也需要在amdin-host中部署client,用来测试客户端访问是否正常。
节点和网络规划
1、一共四台节点,一台用于Admin-Host节点,其余三台用于部署OSD-Host。
2、每一个节点有两块网卡,一个用于接收客户端请求(Public Network),其余的用于集群内部通信(Cluster Network)。
其中Public Network是必须的,Cluster Network是可选的。
3、实验表格
| 主机 | Public Network | Cluster Network | 磁盘数量 | 部署组件 |
|---|---|---|---|---|
| admin-host | 192.168.9.10(MAT) | 192.168.20.10(only) | 2个,每个20G | 用于管理 |
| stor01 | 192.168.9.20 | 192.168.20.20 | 2个,每个20G | stor+mon |
| stor02 | 192.168.9.30 | 192.168.20.30 | 2个,每个20G | stor+mon |
| stor03 | 192.168.9.40 | 192.168.20.40 | 2个,每个20G | stor+mon |
可以看到每一个节点有2个磁盘,因此OSD一共有8个。
Ceph版本
Ceph的版本是以字母顺序发行的,也可以是数字表示,a就是第一版,b就是第二版...
- 官方主页: ceph.com
关闭Iptables,firewalld,Selinux
systemctl stop firewalld
systemctl disable firewalld
iptables -F
iptables -X
iptables -Z
/usr/sbin/iptable-save
setenforce 0
getenforce
sed -i s/SELINUX=enforcing/SELINUX=disabled/g /etc/selinux/config
域名解析
192.168.20.10 admin-host
192.168.20.20 stor01
192.168.20.30 stor02
192.168.20.40 stor03
时钟同步
以admin-host为时间校准器
1、admin-host的配置
[root@admin-host ~]# yum install -y chrony
[root@admin-host ~]# vi /etc/chrony.conf
server admin-host iburst
allow 192.168.20.0/24
local stratum 10
[root@admin-host ~]# systemctl restart chronyd
[root@admin-host ~]# systemctl enable chronyd
root@admin-host ~]# chronyc sources
210 Number of sources = 1
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* admin-host 10 6 17 4 +91ns[-7903ns] +/- 18us
2、stor节点配置
[root@stor01 ~]# yum install -y chrony
[root@stor01 ~]# vi /etc/chrony.conf
server admin-host iburst
[root@stor01 ~]# systemctl restart chronyd
[root@stor01 ~]# systemctl enable chronyd
[root@stor01 ~]# chronyc sources
210 Number of sources = 1
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* admin-host 11 6 17 45 +7070ns[ +223us] +/- 641us
3、直接多行注释
sed -i "71,82s/^/#/" filename
:3,6s/^/#/
准备Yum仓库配置文件
Ceph官方的仓库路径为:download.ceph.com,但毕竟是国外的yum仓库,不方便,这里使用阿里云镜像仓库。
这里使用和m版本部署。
阿里云地址:mirrors.aliyun.com/ceph
在admin-host节点上操作:
1、安装Ceph相关yum仓库
[root@admin-host ~]# rpm -ivh https://mirrors.aliyun.com/ceph/rpm-mimic/el7/noarch/ceph-release-1-1.el7.noarch.rpm
2、安装epel相关yum仓库
[root@admin-host ~]# yum install -y epel-release
创建部署Ceph的特定用户账号
我们前面也说了,我们要使用ceph-admin的主机基于ssh协议经由ceph-deploy来控制stor节点来完成安装和设定。因此我们需要用到某个用户登陆到目标节点去操作,这个用户可以可以随便设定,当使用root用户不安全,因此我们要使用普通用户,且此用户需要拥有无密码使用sudo命令的权限,以便在安装软件及生成配置文件的过程无需中断配置。在较新版本ceph-deploy也支持用"--username"选项提供可无密码使用sudo命令的用户名(包括root,比建议使用)。
另外ceph-deploy --username 命令时,指定的用户需要能够通过SSH协议自动认证并连接到个ceph节点,以免ceph-deploy命令在配置中途需要用户输入密码。
在各个Ceph节点创建新用户(包括admin-host)
1、在所有节点上操作,创建用户并赋予密码
[root@admin-host ~]# useradd cephadm && echo "cephadm" | passwd --stdin cephadm
Changing password for user cephadm.
passwd: all authentication tokens updated successfully.
2、在所有节点上操作,确保这些节点新创建的用户cephadm,都有无密码运行sudo命令的权限
[root@admin-host ~]# vi /etc/sudoers.d/cephadm
cephadm ALL=(root) NOPASSWD: ALL
#测试
[root@admin-host ~]# su cephadm
[cephadm@admin-host root]$ sudo -l #不需要密钥即可
配置用户基于密钥的ssh认证
在admin-host(管理节点)上生成公私钥,将公钥传至每个stor节点,实现无密码登录。
注意:先切换至cephadm用户,在生成密钥。
[root@admin-host ~]# su - cephadm
[cephadm@admin-host ~]$ ssh-keygen -t rsa -P '' #-t rsa,指定某个算法,-P ''无密码
[cephadm@admin-host ~]$ ssh-copy-id -i .ssh/id_rsa.pub cephadm@localhost #先把公钥给自己一份,这样连接自己也不用密码了。
#小写p,传输后保留文件的原始属性,r传目录
[cephadm@admin-host ~]$ scp -rp .ssh/ cephadm@stor01:/home/cephadm/
[cephadm@admin-host ~]$ scp -rp .ssh/ cephadm@stor02:/home/cephadm/
[cephadm@admin-host ~]$ scp -rp .ssh/ cephadm@stor03:/home/cephadm/
在管理节点安装ceph-deploy
Ceph存储集群的部署过程可通过管理节点使用ceph-deploy全程进行,但前提是在管理节点安装ceph-deploy及其依赖的程序包:
[root@admin-host ~]# yum update
[root@admin-host ~]# yum install -y ceph-deploy python-setuptools python2-subprocess32
部署RADOS存储集群
初始化RADOS集群
1、首先在管理节点上以cephadm用户创建集群相关的配置文件目录
[cephadm@admin-host ~]$ mkdir ceph-cluster #这个目录将会存放集群中所有的生成配置信息。
[cephadm@admin-host ~]$ cd ceph-cluster/
2、初始化第一个MON节点,准备集群,注意:这一步是创建、初始化mon(集群监视器)的。
初始化第一个mon节点的命令:ceph-deploy new init-node(mon节点所在的IP),在本实验中stor01即为第一个mon节点名称,其名称必须与节点当前实际使用的主机名称一致,运行如下命令:
#初始化操作,可以在命令中指令网络,也可以在配置文件中修改网络,
[cephadm@admin-host ceph-cluster]$ ceph-deploy new --cluster-network 192.168.20.0/24 --public-network 192.168.9.0/24 stor01
[ceph_deploy.conf][DEBUG ] found configuration file at: /home/cephadm/.cephdeploy.conf
[ceph_deploy.cli][INFO ] Invoked (2.0.1): /bin/ceph-deploy new --cluster-network 192.168.20.0/24 --public-network 192.168.9.0/24 stor01
[ceph_deploy.cli][INFO ] ceph-deploy options:
[ceph_deploy.cli][INFO ] username : None
[ceph_deploy.cli][INFO ] func : <function new at 0x7f666810cd70>
[ceph_deploy.cli][INFO ] verbose : False
[ceph_deploy.cli][INFO ] overwrite_conf : False
[ceph_deploy.cli][INFO ] quiet : False
[ceph_deploy.cli][INFO ] cd_conf : <ceph_deploy.conf.cephdeploy.Conf instance at 0x7f66678847a0>
[ceph_deploy.cli][INFO ] cluster : ceph
[ceph_deploy.cli][INFO ] ssh_copykey : True
[ceph_deploy.cli][INFO ] mon : ['stor01']
[ceph_deploy.cli][INFO ] public_network : 192.168.9.0/24
[ceph_deploy.cli][INFO ] ceph_conf : None
[ceph_deploy.cli][INFO ] cluster_network : 192.168.20.0/24
[ceph_deploy.cli][INFO ] default_release : False
[ceph_deploy.cli][INFO ] fsid : None
[ceph_deploy.new][DEBUG ] Creating new cluster named ceph
[ceph_deploy.new][INFO ] making sure passwordless SSH succeeds
[stor01][DEBUG ] connected to host: admin-host
[stor01][INFO ] Running command: ssh -CT -o BatchMode=yes stor01
[stor01][DEBUG ] connection detected need for sudo
[stor01][DEBUG ] connected to host: stor01
[stor01][DEBUG ] detect platform information from remote host
[stor01][DEBUG ] detect machine type
[stor01][DEBUG ] find the location of an executable
[stor01][INFO ] Running command: sudo /usr/sbin/ip link show
[stor01][INFO ] Running command: sudo /usr/sbin/ip addr show
[stor01][DEBUG ] IP addresses found: [u'192.168.20.20', u'192.168.9.20']
[ceph_deploy.new][DEBUG ] Resolving host stor01
[ceph_deploy.new][DEBUG ] Monitor stor01 at 192.168.9.20
[ceph_deploy.new][DEBUG ] Monitor initial members are ['stor01']
[ceph_deploy.new][DEBUG ] Monitor addrs are [u'192.168.9.20']
[ceph_deploy.new][DEBUG ] Creating a random mon key...
[ceph_deploy.new][DEBUG ] Writing monitor keyring to ceph.mon.keyring...
[ceph_deploy.new][DEBUG ] Writing initial config to ceph.conf...
#检测一下
[cephadm@admin-host ceph-cluster]$ echo $?
0
#可以看到初始化完成后生成三个文件:
[cephadm@admin-host ceph-cluster]$ ll
total 12
-rw-rw-r--. 1 cephadm cephadm 262 Apr 29 02:11 ceph.conf #主配置文件
-rw-rw-r--. 1 cephadm cephadm 3287 Apr 29 02:11 ceph-deploy-ceph.log #日志文件
-rw-------. 1 cephadm cephadm 73 Apr 29 02:11 ceph.mon.keyring #各节点内部通信用到的密钥环,它是用来做认证的。
#查看ceph.conf文件的配置
[cephadm@admin-host ceph-cluster]$ vi ceph.conf
[global]
fsid = abe6ba38-b9f1-44ce-a707-96dd689a1359
public_network = 192.168.9.0/24
cluster_network = 192.168.20.0/24
mon_initial_members = stor01
mon_host = 192.168.9.20 #可以看到mon_host默认就分配到了public network网络了,所以说mon是以客户端方式去管理集群的,它不需要通过cluster network网络管理集群。
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
3、安装Ceph集群
ceph-deploy命令可以能够以远程的方式连入Ceph集群各个节点完成程序包安装等操作,命令格式如下:
ceph-deploy install [{ceph-node1 ceph-node2...}]
(1)因此若将stor01,stor02,stor03节点配置为Ceph的集群节点,则执行如下命令:
[cephadm@admin-host ceph-cluster]$ ceph-deploy install stor01 stor02 stor03
(2)提示:以上安装集群方式虽然方便,但是相对来说较慢,我们也可以逐个在存储节点上进行手动安装:
注:以下操作在每个存储节点上操作:
#先安装ceph的Yum仓库
[root@stor01 ~]# rpm -ivh https://mirrors.aliyun.com/ceph/rpm-mimic/el7/noarch/ceph-release-1-1.el7.noarch.rpm
#安装epel源
[root@stor01 ~]# yum install -y epel-release
#安装ceph程序
[root@stor01 ~]# yum install -y ceph ceph-radosgw #ceph-radosgw程序包使用的时候在安装也行
同样的操作在stor02,stor03节点上做操作
在每个存储节点上安装完成后,当我们在admin-host节点上在运行ceph-deploy install stor01 stor02 stor03命令时,还会在重新做一遍刚才我们做的操作,因为ceph-deploy的一些操作是特定的。好在ceph-deploy install有个子命令:--no-adjust-repos,可以根据本地的软件包接着安装。
以下操作在admin-host上操作并且在cephadm用户的ceph-cluster目录下进行:
[cephadm@admin-host ceph-cluster]$ ceph-deploy install --no-adjust-repos stor01 stor02 stor03
##装包的时候不更改yum源
#如果不指明这个选项,即便你提前配置了阿里云的yum源,它也会改成ceph官方的那个yum源
#下面直截取一个节点的信息
root@stor03's password:
root@stor03's password:
[stor03][DEBUG ] connected to host: stor03
[stor03][DEBUG ] detect platform information from remote host
[stor03][DEBUG ] detect machine type
[ceph_deploy.install][INFO ] Distro info: CentOS Linux 7.5.1804 Core
[stor03][INFO ] installing Ceph on stor03
[stor03][INFO ] Running command: yum clean all
[stor03][DEBUG ] Loaded plugins: fastestmirror
[stor03][DEBUG ] Cleaning repos: Ceph Ceph-noarch base ceph-source epel extras updates
[stor03][DEBUG ] Cleaning up everything
[stor03][DEBUG ] Maybe you want: rm -rf /var/cache/yum, to also free up space taken by orphaned data from disabled or removed repos
[stor03][DEBUG ] Cleaning up list of fastest mirrors
[stor03][INFO ] Running command: yum -y install ceph ceph-radosgw
[stor03][DEBUG ] Loaded plugins: fastestmirror
[stor03][DEBUG ] Determining fastest mirrors
[stor03][DEBUG ] * base: mirrors.tuna.tsinghua.edu.cn
[stor03][DEBUG ] * epel: mirrors.tuna.tsinghua.edu.cn
[stor03][DEBUG ] * extras: mirrors.aliyun.com
[stor03][DEBUG ] * updates: mirrors.aliyun.com
[stor03][DEBUG ] Package 2:ceph-13.2.10-0.el7.x86_64 already installed and latest version
[stor03][DEBUG ] Package 2:ceph-radosgw-13.2.10-0.el7.x86_64 already installed and latest version
[stor03][DEBUG ] Nothing to do
[stor03][INFO ] Running command: ceph --version
[stor03][DEBUG ] ceph version 13.2.10 (564bdc4ae87418a232fc901524470e1a0f76d641) mimic (stable)
4、激活mon节点,并收集所有密钥:
[cephadm@admin-host ceph-cluster]$ ceph-deploy mon create-initial
#检测,因为在上面我们指定的mon节点时stor01节点,如果上述命令执行的对,那我们应该可以在stor01上面查看到有关mon守护进程的信息:
[root@stor01 ~]# ps -aux
...
ceph 3473 0.1 0.8 471536 32024 ? Ssl 03:07 0:00 /usr/bin/ceph-mon -f --cluster ceph --id stor01 --setuser ceph --se
...
#可以看到有多出来几个.keyring文件,keyring文件是用于做认证的,bootstrap表示我们引导启动整个集群用到的认证,(密钥),可以看到引导启用了mds,mgr,osd,rgw,其中ceph.client.admin.keyring是客户端管理员的密钥,它拥用使用整个ceph集群所有操作的权限。简单的来说就是用户的一些命令操作通过此密钥认证来管理ceph集群。现在它在stor01上,admin-host节点上,那么admmin-host可以操控整个Ceph集群,如果想使stor01节点也能操作Ceph集群,需要把这个密钥和ceph.conf一起scp到stor01节点上即可。
[cephadm@admin-host ceph-cluster]$ ll
total 52
-rw-------. 1 cephadm cephadm 113 Apr 29 03:07 ceph.bootstrap-mds.keyring
-rw-------. 1 cephadm cephadm 113 Apr 29 03:07 ceph.bootstrap-mgr.keyring
-rw-------. 1 cephadm cephadm 113 Apr 29 03:07 ceph.bootstrap-osd.keyring
-rw-------. 1 cephadm cephadm 113 Apr 29 03:07 ceph.bootstrap-rgw.keyring
-rw-------. 1 cephadm cephadm 151 Apr 29 03:07 ceph.client.admin.keyring
-rw-rw-r--. 1 cephadm cephadm 262 Apr 29 02:11 ceph.conf
-rw-rw-r--. 1 cephadm cephadm 24417 Apr 29 03:07 ceph-deploy-ceph.log
-rw-------. 1 cephadm cephadm 73 Apr 29 02:11 ceph.mon.keyring
5、将认证密钥和配置文件scp到其它的存储节点上,让其它的存储节点也具有管理Ceph集群的功能:
[cephadm@admin-host ceph-cluster]$ ceph-deploy admin stor01 stor02 stor03
#检测:
在stor02节点上查看
[root@stor02 ~]# ll /etc/ceph/
total 12
-rw-------. 1 root root 151 Apr 29 03:23 ceph.client.admin.keyring #可以看到已经传送过来了。
-rw-r--r--. 1 root root 262 Apr 29 03:23 ceph.conf
-rw-r--r--. 1 root root 92 Apr 23 2020 rbdmap
-rw-------. 1 root root 0 Apr 29 03:23 tmpo64b5y
但是,我们可以看到ceph.client.admin.keyring文件的权限,只有root用户可读可写,其它用户没有任何权限,我们说我们要使用cephadm这个用户在ceph集群中工作,因此我们需要给cephadm设置权限:
这里可以用acl的方式设定:
以下命令操作在stor01,stoe02,stor03节点上使用root用户操作,
[root@stor01 ~]# setfacl -m u:cephadm:rw /etc/ceph/ceph.client.admin.keyring
[root@stor02 ~]# setfacl -m u:cephadm:rw /etc/ceph/ceph.client.admin.keyring
[root@stor03 ~]# setfacl -m u:cephadm:rw /etc/ceph/ceph.client.admin.keyring
6、配置manager(mgr)节点,启动ceph-mgr进程(仅L版本+)
下main来部署mger服务,这个mgr生产环境至少2个,这里实验环境就部署一个,mgr随意部署在任何存储节点都行,这里部署在stor03节点上吧:
[cephadm@admin-host ceph-cluster]$ ceph-deploy mgr create stor03
检测,查看stor03节点上,是否有mgr守护进程:
[root@stor03 ~]# ps -aux
...
ceph 6005 1.7 2.3 724632 90540 ? Ssl 03:34 0:01 /usr/bin/ceph-mgr -f --cluster ceph --id stor03 --setuser ceph --se
...
拿到这个地方Ceph集群还没有OSD,但是集群的整个框架已经部署起来了,此时Ceph有:1个mon,一个mgr。
有一个mon,一个mgr就可以成为集群了。
那我们可以校验一下整个集群的健康状态:
此时不能用ceph-deploy命令了,要使用ceph客户端命令,但是由于admin-host没有安装ceph客户端,因此无法使用,这是有两种方法:
- 在stor01,stor02,stor03任一节点上进行查看,因为它们安装了ceph客户端工具
- 在admin-host节点上安装一个ceph客户端工具
这里采用在admin-host节点安装Ceph客户端工具的方法:
#使用root用户安装:
[root@admin-host ~]# yum install ceph-common
#使用cephadm用户检测
[cephadm@admin-host ceph-cluster]$ ceph -s
2022-04-29 03:49:32.630 7f46ba91d700 -1 auth: unable to find a keyring on /etc/ceph/ceph.client.admin.keyring,/etc/ceph/ceph.keyring,/etc/ceph/keyring,/etc/ceph/keyring.bin,: (2) No such file or directory
2022-04-29 03:49:32.630 7f46ba91d700 -1 monclient: ERROR: missing keyring, cannot use cephx for authentication
[errno 2] error connecting to the cluster
#但是可以看到报错了,大概意思是没有找到/etc/ceph/ceph.keyring认证密钥,查找原因:原来是集群的配置文件和客户端认证密钥没有传到本机的/etc/ceph/目录下,因此我们可以cp一下:
#cp客户端配置文件和认证密钥:
[cephadm@admin-host ceph-cluster]$ ceph-deploy admin admin-host
[root@admin-host ~]# setfacl -m u:cephadm:rw /etc/ceph/ceph.client.admin.keyring #当然上面也说到了,默认这个文件只有root用户可读,可写,因此还需要加入cephadm用户的权限
#再次检测
[cephadm@admin-host ceph-cluster]$ ceph -s
cluster:
id: abe6ba38-b9f1-44ce-a707-96dd689a1359
health: HEALTH_WARN #这个是警告,主要是因为我们没有osd,这个是要不是error就行
OSD count 0 < osd_pool_default_size 3
services:
mon: 1 daemons, quorum stor01 #mon我们安装一个
mgr: stor03(active) #mgr我们安装一个
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:
#也可以这样检测:
[cephadm@admin-host ceph-cluster]$ ceph health
HEALTH_WARN OSD count 0 < osd_pool_default_size 3
因此下面我们要创建OSD
向RADOS集群中添加OSD
说过OSD真正存储对象数据的存储引擎有两种:
- File Storage(文件存储)
- Blue Storage (块存储)
其中Blue Storage的性能比File Storage的性能至少快一倍
注:在L版本以后默认使用的都是Blue Storage
1、列出OSD节点上可用磁盘信息:
[cephadm@admin-host ceph-cluster]$ ceph-deploy disk list stor01
2、清除磁盘信息
在管理节点上使用ceph-deploy命令擦除计划专用于OSD磁盘上的所有分区表和数据以便用于OSD。
[cephadm@admin-host ceph-cluster]$ ceph-deploy disk zap stor01 /dev/sdb #清除stor01节点上的/dev/sdb磁盘
#注意:千万别清除错了。
注:若设备上此前有数据,则可能需要在相应节点上以root用户使用:
ceph-volume lvm zap --destory {DEVICE}命令进行
3、添加OSD
早期版本的Ceph-deploy命令支持在将添加OSD的过程分为两步骤:准备OSD和激活OSD,但新版本中,此种操作已经废除,添加OSD的步骤只能由命令"ceph-deploy osd create {node} --date {data-disk}",一次完成,并且默认使用BlueStorage。
(1)如下命令即可分别吧stor01、stor02、stor03上的设备/dev/sdb添加为OSD:
#我们先来查查ceph-deploy osd命令的用法:
For bluestore, optional devices can be used:: #采用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
#--data 存放对象数据的磁盘,--block-db 用来存放对象文件的元数据信息的,--block-wal是用来存放--block-db的日志信息的,也就是记录有关元信息的日志。由于我们这里就只有一个sdb,所以三种信息全部存放在一起。
For filestore, the journal must be specified, as well as the objectstore::
ceph-deploy osd create {node} --filestore --data /path/to/data --journal /path/to/journal #如果采用filestore,--data 存放数据的磁盘,--journal 存放文件日志的磁盘
(2)开始添加OSD
[cephadm@admin-host ceph-cluster]$ ceph-deploy osd create --data /dev/sdb stor01
[cephadm@admin-host ceph-cluster]$ ceph-deploy osd create --data /dev/sdb stor02
[cephadm@admin-host ceph-cluster]$ ceph-deploy osd create --data /dev/sdb stor02
#此时再查看ceph集群信息
[cephadm@admin-host ceph-cluster]$ ceph -s
cluster:
id: abe6ba38-b9f1-44ce-a707-96dd689a1359
health: HEALTH_OK #已经OK了
services:
mon: 1 daemons, quorum stor01
mgr: stor03(active)
osd: 3 osds: 3 up, 3 in #有三个OSD投入使用了
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 3.0 GiB used, 57 GiB / 60 GiB avail #等信息
pgs:
#下面吧/dev/sdc设备添加为OSD,和上面一样的步骤
[cephadm@admin-host ceph-cluster]$ ceph-deploy osd create --data /dev/sdc stor01
那至此Ceph集群搭建hh,但是现在mon节点只有一个,mgr节点也只有一个,文件系统(CephFS)还没有就绪,mds还没有就绪。radosgw接口也没有就绪。
从RADOS集群中移除OSD的方法
Ceph集群中一个OSD通常对应于一个设备,且对应于一个专用的守护进程,在某OSD设备出现故障,或管理员处于管理之需确实要移除特定的OSD设备时,需要先停止相关的守护进程,而后在进行移除操作。对于L版本一起以后的版本来说,停止和移除命令的格式分别如下所示:
- 停用设备:ceph osd out {osd-num}(osd的编号)
- 停止进程:sudo systemctl stop ceph-osd@{osd-num}
- 移除设备:ceph osd purage {id} --yes-i-really-mean-it()这是一个选项
并且类似于如下的OSD配置信息存在于ceph.conf配置文件中,管理员在删除OSD之后手动将其删除:
[osd.1]
host={hostname}
测试上传/下载数据对象
1、存取数据时,客户端必须首先连接至RADOS集群上某存储池,而后根据对象名称相关的CRUSH算法完成数据对象寻址。于是为了测试集群的数据存取功能,这里首先创建一个测试的存储池mypool,并设定其PG数量为16个。
创建pool:
#创建pool
[cephadm@admin-host ceph-cluster]$ ceph osd pool create mypool 16 16
pool 'mypool' created
#查看pool
[cephadm@admin-host ceph-cluster]$ ceph osd pool ls
mypool
#查看pool
[cephadm@admin-host ceph-cluster]$ rados lspools
mypool
2、将测试文件上传至存储池中,例如下面的"rados put"命令将/etc/issue文件上传至mypool存储池中,对象名称依然保留为文件名issue,而"rados ls"命令可以列出指定存储池中的数据对象。
现在我们没有可利用的接口,比如:没有跨设备的接口,没有对象接口(),没有文件系统接口,因此我只能使用原始的API接口,实现数据存储。好在ceph提供个命令,ceph put,这put操作就是调用了原始的API接口。
[cephadm@admin-host ceph-cluster]$ rados put day.jpg /usr/share/backgrounds/day.jpg -p mypool
[cephadm@admin-host ceph-cluster]$ rados ls -p mypool
day.jpg
而"ceph osd map"命令可以获取到存储池中数据对象的具体位置信息:
[cephadm@admin-host ceph-cluster]$ ceph osd map mypool day.jpg
osdmap e28 pool 'mypool' (1) object 'day.jpg' -> pg 1.a15eeea3 (1.3) -> up ([3,1,2], p3) acting ([3,1,2], p3)
#mypool池存储一个对象"day.jpg",对象存在于pg中,那个pg--->编号1.a15eeea3,1是存储池的编号,后面的是pg的编号,当前对象处于可访问状态下的OSD编号:3,1,2,为啥有三个编号?因为一个对象文件可以放三分,一个主两个备份,它们分别在编号为3,1,2的OSD上,这个是由CRUSH算法计算得出的,acting表示pg之下所有映射到的OSD都处于活动状态。
删除数据对象,"rados rm"命令是较为常见的一种方式:
[cephadm@admin-host ceph-cluster]$ rados rm day.jpg -p mypool
删除Pool,默认此操作是禁用的,需要将"mon_allow_pool_delete"字段写入进ceph.conf配置文件中
[cephadm@admin-host ceph-cluster]$ ceph osd pool rm mypool my pool --yes-i-really-really-mean-it
Error EPERM: pool deletion is disabled; you must first set the mon_allow_pool_delete config option to true before you can destroy a pool
扩展Ceph集群
扩展监视器(mon)节点
1、只能怪以下命令添加mon节点:
[cephadm@admin-host ceph-cluster]$ ceph-deploy mon add stor02
[cephadm@admin-host ceph-cluster]$ ceph-deploy mon add stor03
#查看
ceph -s
[cephadm@admin-host ceph-cluster]$ ceph -s
cluster:
id: abe6ba38-b9f1-44ce-a707-96dd689a1359
health: HEALTH_WARN
too few PGs per OSD (8 < min 30)
services:
mon: 3 daemons, quorum stor01,stor02,stor03
mgr: stor03(active)
osd: 6 osds: 6 up, 6 in
data:
pools: 1 pools, 16 pgs
objects: 0 objects, 0 B
usage: 6.0 GiB used, 114 GiB / 120 GiB avail
pgs: 16 active+clean
也可以:
[cephadm@admin-host ceph-cluster]$ ceph quorum_status --format json-pretty #由于ceph quorum_status命令输入的是json格式,不易于观看,因此转换--format json-pretty,就是转换格式,转为跟美观的json合适,也就是json-pretty
{
"election_epoch": 14,
"quorum": [ #反映了mon的成员,因为我们前前后后一共添加了3个mon
0,
1,
2
],
"quorum_names": [ #具体mon的名称
"stor01",
"stor02",
"stor03"
],
"quorum_leader_name": "stor01",
"monmap": {
"epoch": 3,
"fsid": "abe6ba38-b9f1-44ce-a707-96dd689a1359",
"modified": "2022-04-29 06:26:44.851474",
"created": "2022-04-29 03:07:49.242469",
"features": {
"persistent": [
"kraken",
"luminous",
"mimic",
"osdmap-prune"
],
"optional": []
},
"mons": [
{
"rank": 0,
"name": "stor01",
"addr": "192.168.9.20:6789/0",
"public_addr": "192.168.9.20:6789/0"
},
{
"rank": 1,
"name": "stor02",
"addr": "192.168.9.30:6789/0",
"public_addr": "192.168.9.30:6789/0"
},
{
"rank": 2,
"name": "stor03",
"addr": "192.168.9.40:6789/0",
"public_addr": "192.168.9.40:6789/0"
}
]
}
}
扩展mgr节点
一条命令即可
[cephadm@admin-host ceph-cluster]$ ceph-deploy mgr create stor02
#查看
[cephadm@admin-host ceph-cluster]$ ceph -s
cluster:
id: abe6ba38-b9f1-44ce-a707-96dd689a1359
health: HEALTH_WARN
too few PGs per OSD (8 < min 30)
services:
mon: 3 daemons, quorum stor01,stor02,stor03
mgr: stor03(active), standbys: stor02 #stor03是正在使用的,stor02是备用
osd: 6 osds: 6 up, 6 in
data:
pools: 1 pools, 16 pgs
objects: 0 objects, 0 B
usage: 6.0 GiB used, 114 GiB / 120 GiB avail
pgs: 16 active+clean
Ceph存储集群的访问接口
为了方便客户端的使用,Ceph提供了基于librados接口的三种接口:
- CephFS(提供文件系统存储)
- RBD(提供块存储)
- Radosgw(提供基于Http的对象存储)
Ceph块设备接口(RBD)
Ceph块设备,也称为RADOS块设备(简称RBD),是一种基于RADOS存储系统支持超配(thin-provisioned)、可 伸缩的条带化数据存储系统,它通过librbd库与OSD进行交互。RBD为KVM等虚拟化技术和云OS(如OpenStack和 CloudStack)提供高性能和无限可扩展性的存储后端,这些系统依赖于libvirt和QEMU实用程序与RBD进行集成。 客户端基于librbd库(其实就是Linux内核模块)即可将RADOS存储集群用作块设备,不过,用于rbd的存储池需要事先启用rbd功能并进行初始 化。例如,下面的命令创建一个名为rbddata的存储池,在启用rbd功能后对其进行初始化:
#创建一个Pool,名称为rbddata,并且设置PG数量为64
[cephadm@admin-host ceph-cluster]$ ceph osd pool create rbddata 64
pool 'rbddata' created
#针对rbddata存储池开启rbd功能
[cephadm@admin-host ceph-cluster]$ ceph osd pool application enable rbddata rbd
#对rbddata存储池初始化
[cephadm@admin-host ceph-cluster]$ rbd pool init -p rbddata
不过,rbd存储池并不能直接用于块设备,而是需要事先在其中按需创建映像(image),并把映像文件作为块设备 使用。rbd命令可用于创建、查看及删除块设备相关的映像(image),以及克隆映像、创建快照、将映像回滚到快 照和查看快照等管理操作。例如,下面的命令能够创建一个名为img1的映像:
[cephadm@admin-host ceph-cluster]$ rbd create img1 --size 1024 --pool rbddata #大小为1G的image
映像的相关的信息则可以使用“rbd info”命令获取:
[cephadm@admin-host ceph-cluster]$ rbd --image img1 --pool rbddata info
rbd image 'img1':
size 1 GiB in 256 objects
order 22 (4 MiB objects)
id: 379e6b8b4567
block_name_prefix: rbd_data.379e6b8b4567
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Fri Apr 29 07:59:01 2022
在客户端主机上,用户通过内核级的rbd驱动识别相关的设备,即可对其进行分区、创建文件系统并挂载使用。
启用radosgw接口
RGW并非必须的接口,仅在需要用到与S3和Swift兼容的RESTful接口时才需要部署RGW实例,相关的命令为“cephdeploy rgw create {gateway-node}”。例如,下面的命令用于把stor03部署为rgw主机:
[cephadm@admin-host ceph-cluster]$ ceph-deploy rgw create stor03
[stor03][INFO ] Running command: sudo systemctl start ceph-radosgw@rgw.stor03
[stor03][INFO ] Running command: sudo systemctl enable ceph.target
[ceph_deploy.rgw][INFO ] The Ceph Object Gateway (RGW) is now running on host stor03 and default port 7480
#现在可以在stor03节点上,查看7480端口
tcp LISTEN 0 128 *:7480 *:* users:(("radosgw",pid=2189,fd=43))
默认情况下,RGW实例监听于TCP协议的7480端口7480,需要自定义时,可以通过在运行RGW的节点上编辑其主配置 文件ceph.conf进行修改,相关参数如下所示:
[root@stor03 ~]# vi /etc/ceph/ceph.conf
[client]
rgw_frontends = "civetweb port=8080"
而后需要重启相关的服务,重启服务的时候在stor03节点上重启,也就是说在那个节点部署的rgw,就在那个节点重启,并且是以root用户执行操作。命令格式为“systemctl restart ceph-radosgw@rgw.{node-name}”,例如重启stor03上 的RGW,可以以root用户运行如下命令:
[root@stor03 ~]# systemctl restart ceph-radosgw@rgw.stor03 #这个格式就看创建rgw时输出的信息
[root@stor03 ~]# systemctl status ceph-radosgw@rgw.stor03
RGW会在rados集群上生成包括如下存储池的一系列存储池:
[cephadm@admin-host ceph-cluster]$ ceph osd pool ls
mypool
rbddata
.rgw.root
default.rgw.control
default.rgw.meta
default.rgw.log
RGW提供的是REST接口,客户端通过http与其进行交互,完成数据的增删改查等管理操作。
启用文件系统(CephFS)接口
CephFS需要至少运行一个元数据服务器(MDS)守护进程(ceph-mds),此进程管理与CephFS上存储的文件相关 的元数据,并协调对Ceph存储集群的访问。因此,若要使用CephFS接口,需要在存储集群中至少部署一个MDS实 例。“ceph-deploy mds create {ceph-node}”命令可以完成此功能,例如,在stor01上启用MDS:
为啥需要MDS?因为只要往文件系统中存入信息,就需要有一部分空间存放对象数据本身的元信息的,而MDS服务就是用来协调这个事情的。
创建个MDS在stor01节点上
[cephadm@ceph-admin ceph-cluster]$ ceph-deploy mds create stor01
[stor01][INFO ] Running command: sudo ceph --cluster ceph --name client.bootstrap-mds --keyring /var/lib/ceph/bootstrap-mds/ceph.keyring auth get-or-create mds.stor01 osd allow rwx mds allow mon allow profile mds -o /var/lib/ceph/mds/ceph-stor01/keyring
[stor01][INFO ] Running command: sudo systemctl enable ceph-mds@stor01
[stor01][WARNIN] Created symlink from /etc/systemd/system/ceph-mds.target.wants/ceph-mds@stor01.service to /usr/lib/systemd/system/ceph-mds@.service.
[stor01][INFO ] Running command: sudo systemctl start ceph-mds@stor01
[stor01][INFO ] Running command: sudo systemctl enable ceph.target
#最后两行就是负责MDS守护进程的启动和开机自启的命令,当然重启也一样。
查看MDS的相关状态可以发现,刚添加的MDS处于Standby模式:
[cephadm@admin-host ceph-cluster]$ ceph mds stat
, 1 up:standby #带使用状态,因为还没有文件系统被创建
使用CephFS之前需要事先于集群中创建一个文件系统,并为其分别指定元数据和数据相关的存储池。下面创建一个 名为cephfs的文件系统用于测试,它使用cephfs-metadata为元数据存储池,使用cephfs-data为数据存储池:
#创建个存储池,用于存放数据的存储池
[cephadm@admin-host ceph-cluster]$ ceph osd pool create cephfs-metadata 64
pool 'cephfs-metadata' created
#创建个存储池,用于存放元数据的存储池
[cephadm@admin-host ceph-cluster]$ ceph osd pool create cephfs-data 64
pool 'cephfs-data' created
#创建个文件系统:cepgfs,
[cephadm@admin-host ceph-cluster]$ ceph fs new cephfs cephfs-metadata cephfs-data
new fs with metadata pool 7 and data pool 8
而后即可使用如下命令“ceph fs status ”查看文件系统的相关状态,例如:
[cephadm@admin-host ceph-cluster]$ ceph fs status cephfs #查看文件系统的状态
cephfs - 0 clients
======
+------+--------+--------+---------------+-------+-------+
| Rank | State | MDS | Activity | dns | inos |
+------+--------+--------+---------------+-------+-------+
| 0 | active | stor01 | Reqs: 0 /s | 10 | 13 |
+------+--------+--------+---------------+-------+-------+
+-----------------+----------+-------+-------+
| Pool | type | used | avail |
+-----------------+----------+-------+-------+
| cephfs-metadata | metadata | 2286 | 35.9G |
| cephfs-data | data | 0 | 35.9G |
+-----------------+----------+-------+-------+
+-------------+
| Standby MDS |
+-------------+
+-------------+
MDS version: ceph version 13.2.10 (564bdc4ae87418a232fc901524470e1a0f76d641) mimic (stable)
#查看mds服务的状态:
[cephadm@admin-host ceph-cluster]$ ceph mds stat
cephfs-1/1/1 up {0=stor01=up:active}
#查看整体Ceph集群的状态
[cephadm@admin-host ceph-cluster]$ ceph -s
cluster:
id: abe6ba38-b9f1-44ce-a707-96dd689a1359
health: HEALTH_OK
services:
mon: 3 daemons, quorum stor01,stor02,stor03
mgr: stor03(active), standbys: stor02
mds: cephfs-1/1/1 up {0=stor01=up:active}
osd: 6 osds: 6 up, 6 in
rgw: 1 daemon active
data:
pools: 8 pools, 240 pgs
objects: 214 objects, 3.5 KiB
usage: 6.1 GiB used, 114 GiB / 120 GiB avail
pgs: 240 active+clean
随后,客户端通过内核中的cephfs文件系统接口即可挂载使用cephfs文件系统,或者通过FUSE接口与文件系统进行 交互。