第一课 Ceph基础学习-Ceph集群部署和基本使用

第一课 Ceph基础学习-Ceph集群部署和基本使用

文章目录

  • 第一课 Ceph基础学习-Ceph集群部署和基本使用
    • 第一节 存储类型介绍
      • 1.1 DAS介绍
      • 1.2 NAS介绍
      • 1.3 SAN介绍
      • 1.4 对象存储
    • 第二节 Ceph的储存架构
      • 2.1 Ceph的简介
      • 2.2 Ceph的架构
      • 2.3 Ceph的组件介绍
      • 2.4 Ceph的数据写入流程
    • 第三节 Ceph集群部署
      • 3.1 Ceph环境准备
      • 3.2 部署monitor
      • 3.3 部署OSD
      • 3.4 部署monitor高可用
      • 3.5 部署manager高可用
    • 第四节 Ceph集群存储的使用
      • 4.1 块存储的使用
        • 4.1.1 创建资源池
        • 4.1.2 关闭特性
        • 4.1.3 创建RBD
        • 4.1.4 扩容RBD
        • 4.1.5 RBD数据写入流程
        • 4.1.6 Ceph报警排查
      • 4.2 RGW对象存储
        • 4.2.1 对象存储介绍
        • 4.2.2 部署RGW存储网关
        • 4.2.3 创建用户访问对象存储
        • 4.2.4 swift风格的API接口
      • 4.3 CephFS文件存储
        • 4.3.1 CephFS介绍
        • 4.3.2 CephFS部署
        • 4.3.3 使用cephfs

第一节 存储类型介绍

1.1 DAS介绍

  1. DAS:Direct Attached Storage直接附加存储。
  2. 方式:服务器使用SCS或FC协议连接到存储阵列。
  3. 协议类型
    • SCS总线
    • FC光纤
  4. 表现形式:一块有空间大小裸磁盘如/dev/sdb
  5. 优点: 组网简单。成本低廉,第一代
  6. 缺点: 可扩展性有限,不灵活。无法多机共享
  7. 产品举例: 目前很少使用了

1.2 NAS介绍

  1. NAS: Network Attachod Storage网络附加存储
  2. 方式: 服务器使用TCP网络协议连接至文件共享存储
  3. 协议关型 NFS CIFS
  4. 表现形式 映射到存储中一个目录。如/data
  5. 优点:使用简单,通过IP协议实现互访,多机同时共享网个存储
  6. 缺点:性能有限,可靠性不高
  7. 产品举例
    • NFS、samba、GlusterFS存储厂商提供的NAS存储
    • 公有云: AWS EFS、腾讯云CFS、阿里云NAS

1.3 SAN介绍

  1. SAN概念: Storage Area Notwork 储存区域网络
  2. 方式:服务器使用一个存储区域网络IP或FC连接到存储阵列
  3. 协议类型
    • IP-SAN
    • FC-SAN
  4. 表现形式: 一块有空间大小裸磁盘如/dev/sdb
  5. 优点: 性能好,可扩展性强
  6. 缺点: 成本高,尤其是FC存储,需要HBA卡,FC交换机,FC存储
  7. 产品举例
    • isCSI,EMC,NetApp,HP等存储
    • 公有云: AWS EBS,腾讯云CBS,阿里云块存储

1.4 对象存储

  1. 概念:Objoct Storage对象存储 视屏、音频、文本不常修改的
  2. 方式:通过网络使用API访问一个无限扩展的分布式存储系统
  3. 协议类型
    • 兼容于S3风格
    • 原生PUT/GET类型
  4. 表现形式:无限使用的存储空间,通过PUT/GET无限上传和下载
  5. 优点:可扩展性强,使用简单,通过PUT和GET实现上传下载
  6. 缺点:只使用与静态不可编辑文件、无法提供为服务器提供块级别存储
  7. 产品举例
    • HDFS,FastDFS,swift
    • 公有云:Aws S3,腾讯云COS,阿里云OSS

第二节 Ceph的储存架构

2.1 Ceph的简介

  1. 官方文档:https://docs.ceph.com/
    第一课 Ceph基础学习-Ceph集群部署和基本使用_第1张图片
  2. Ceph支持对象存储(视频图片等)、块存储(磁盘挂载)、文件存储(共享目录)。

2.2 Ceph的架构

第一课 Ceph基础学习-Ceph集群部署和基本使用_第2张图片

  1. 对象存储通过RADOSGW进行存储 S3和Swift风格
  2. 块存储通过RBD 和云主机的QEMU和KVM driver对接
  3. 文件存储 CEPH FS通过内核级别的访问方式和SUSE级别的访问方式 进行存储
  4. 除了上面方式我们还可以通过原生的LIBRADOS库去访问我们的RADOS存储。RADOS是Ceph中最核心的东西。

2.3 Ceph的组件介绍

  1. 构成Ceph集群的基础组件,其中包含OSD、Manager、MSD、Monitor
  2. OSD(ceph-osd):object storage daemon,对象存储进程。ceph 管理物理硬盘时,引入了OSD概念,每一块盘都会针对的运行一个OSD进程。换句话说,ceph 集群通过管理 OSD 来管理物理硬盘。OSD 一般功能为:存储数据、维护数据副本、数据恢复、数据再平衡以及对ceph monitor组件提供相关监控信息.
  3. Manager(ceph-mgr):用于收集ceph集群状态、运行指标,比如存储利用率、当前性能指标和系统负载。对外提供 ceph dashboard(ceph ui)和 resetful api。Manager组件开启高可用时,至少2个。
  4. MDS(ceph-mds):Metadata server,元数据服务。为ceph文件系统提供元数据服务(ceph 对象存储和块存储不需要MDS)。为 posix 文件系统用户提供性能良好的基础命令(ls,find等)。
  5. Monitor(ceph-mon):维护集群的状态,包含monitor组件信息,manger 组件信息,osd组件信息,mds组件信息,crush 算法信息。还负责ceph集群的身份验证功能,client在连接ceph集群时通过此组件进行验证。Monitor组件开启高可用时,至少3个。

2.4 Ceph的数据写入流程

  1. 在对象存储中,一切都是扁平化的,并且存储的最小单元为对象(OBJ)。
  2. ceph 在对象存储的基础上提供了更加高级的思想。当对象数量达到了百万级以上,原生的对象存储在索引对象时消耗的性能非常大。ceph因此引入了 placement group (pg)的概念。一个PG就是一组对象的集合。
    第一课 Ceph基础学习-Ceph集群部署和基本使用_第3张图片
  3. obj和pg之间的映射由ceph client计算得出。
  4. 讨论 pg 时,不得不提的另外一个名词:pgp。pgp决定了pg和osd 之间的映射关系。一般将 pgp_num 设置成和 pg_num 一样大小。这里还有一个名词需要提一下,在ceph中会经常见到crush算法。简单来说,crush 算法就是指 ceph 中数据如何存储、读取的过程。由于ceph集群面对许多的独立项目,因此ceph还引入了ceph pool的概念用于划分不同的项目。
  5. ceph pool 是对 ceph 对象的逻辑划分,并不是物理划分。
  6. pg和ceph pool的区别:
    • pg对于用户来说是透明的,只是底层的一种优化方案。
    • ceph pool对于用户来说,就像mysql中的database。

第三节 Ceph集群部署

3.1 Ceph环境准备

  1. 三台机器centos7.9
    | IP | 作用 |
    | :------------: | :----------------: |
    | 192.168.44.137 | ceph01、NTP Server |
    | 192.168.44.138 | ceph02 |
    | 192.168.44.139 | ceph03 |

  2. NTP服务器设置,同步时钟

# NTP SERVER (ntp server 与阿里与ntp时间服务器进行同步)
yum install -y ntp
systemctl start ntpd
systemctl enable ntpd
timedatectl set-timezone Asia/Shanghai
# 将当前的 UTC 时间写入硬件时钟
timedatectl set-local-rtc 0
# 重启依赖于系统时间的服务
systemctl restart rsyslog 
systemctl restart crond
# 这样我们的ntp server自动连接到外网,进行同步 (时间同步完成在IP前面会有一个*号)
ntpq -pn
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
+193.182.111.143 194.58.204.20    2 u   43   64    1  245.826   -7.418  15.035
+119.28.183.184  100.122.36.196   2 u   40   64    1   46.883   -3.472   0.249
-178.215.228.24  36.224.68.195    2 u   39   64    1  231.376   23.300  14.977
*84.16.67.12     .GPS.            1 u   38   64    1  183.543   -0.667   0.299

# NTP Agent (ntp agent同步ntp server时间) 
yum install -y ntp
vim /etc/ntp.conf 
server  192.168.44.137  iburst

systemctl restart ntpd
systemctl enable ntpd
# 等待几分钟出现*号代表同步完成
ntpq -pn

# 各个节点上定时同步 节点添加定时同步任务
crontab -e
*/5 * * * *  /usr/sbin/ntpdate 192.168.44.137

# ntp时间服务器设置完成后在所有节点修改时区以及写入硬件
timedatectl set-timezone Asia/Shanghai
# 将当前的 UTC 时间写入硬件时钟
timedatectl set-local-rtc 0
# 重启依赖于系统时间的服务
systemctl restart rsyslog 
systemctl restart crond

# 查看时间是否一致
date
  1. 设置节点间的免密登录
# 添加host (所有节点)
cat >>/etc/hosts <<EOF
192.168.44.137 ceph-01
192.168.44.138 ceph-02
192.168.44.139 ceph-03
EOF

# ceph01 设置免密 123456为密码
ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa
for i in ceph-01 ceph-02 ceph-03 ;do
expect -c "
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@$i
        expect {
                "*yes/no*" {send "yesr"; exp_continue}
                "*password*" {send "123456r"; exp_continue}
                "*Password*" {send "123456r";}
        } "
d
  1. 所有节点关闭防火墙selinux
systemctl stop firewalld
systemctl disable firewalld
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat
iptables -P FORWARD ACCEPT
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
  1. ceph yum源配置
#配置centos、epeo、ceph源
wget -O /etc/yum.repos.d/CentOS-Base-epel.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
wget -O /etc/yum.repos.d/ceph.repo http://down.i4t.com/ceph/ceph.repo
yum clean all
yum makecache
  1. 安装部署工具ceph-deploy
# ceph-01部署节点安装依赖包以及ceph部署工具ceph-deploy
yum install -y python-setuptools
yum install -y ceph-deploy
# 执行ceph-deploy可以看到ceph的版本
ceph-deploy

3.2 部署monitor

  1. 先运行单节点的monitor
# ceph创建一个配置目录,后面操作需要在这个目录下进行
mkdir -p /root/ceph-deploy
cd /root/ceph-deploy
# 创建monitor ceph-01代表部署monitor节点
ceph-deploy new ceph-01 --public-network 192.168.44.0/24
#参数设置
# --cluster-network 集群对外的网络
# --public-network 集群内通信的网络
#--public-network建议添加,否则后面添加monitor节点会提示错误
# 执行完毕后我们可以看到在/root/ceph-deploy目录会有为我们生成的一些文件
ls /root/ceph-deploy
# ceph.conf       ceph-deploy-ceph.log  ceph.mon.keyring
# ceph配置文件      ceph日志文件       keyring主要做身份验证
# 我们可以根据自身需要修改ceph.conf文件,比如上面创建集群中添加的网络,在这里也可以添加
# 添加ceph时间配置
# 添加允许ceph时间偏移
echo "mon clock drift allowed = 2" >>/root/ceph-deploy/ceph.conf
echo "mon clock drift warn backoff = 30" >>/root/ceph-deploy/ceph.conf

# 在 所有节点 安装ceph相关软件包
yum install -y ceph ceph-mon ceph-mgr ceph-radosgw ceph-mds
#	当然如果你不在乎网络问题,也可以使用官方推荐的安装方式,下面的方式会重新给我们配置yum源,这里不太推荐
# ceph-deploy install ceph-01 ceph-02 ceph-03

# 接下来我们需要初始化monitor
cd /root/ceph-deploy
ceph-deploy mon create-initial
# 需要进入到我们之前创建的ceph目录中, 接下来我们在/root/ceph-deploy下面可以看到刚刚生成的一些文件
[root@ceph01 ceph-deploy]# ll -a
总用量 44
drwxr-xr-x  2 root root   244 916 00:38 .
dr-xr-x---. 6 root root   268 916 00:23 ..
-rw-------  1 root root   113 916 00:38 ceph.bootstrap-mds.keyring
-rw-------  1 root root   113 916 00:38 ceph.bootstrap-mgr.keyring
-rw-------  1 root root   113 916 00:38 ceph.bootstrap-osd.keyring
-rw-------  1 root root   113 916 00:38 ceph.bootstrap-rgw.keyring
-rw-------  1 root root   151 916 00:38 ceph.client.admin.keyring
-rw-r--r--  1 root root   296 916 00:33 ceph.conf
-rw-r--r--  1 root root 15992 916 00:38 ceph-deploy-ceph.log
-rw-------  1 root root    73 916 00:30 ceph.mon.keyring

# 将我们刚刚生成的文件拷贝到所有的节点上 (拷贝完成后就可以使用ceph -s参数)
ceph-deploy admin ceph-01 ceph-02 ceph-03
ceph -s
# 把配置文件和admin密钥分发到各个节点 禁用不安全模式
ceph config set mon auth_allow_insecure_global_id_reclaim false
# 接下来我们执行ceph -s就可以看到已经初始化完毕
ceph -s

# 我们可以看到cluster.health后面的状态为OK 
# 创建 manager daemon (主要用于监控)
# 这里我们只是将ceph-01作为manager daemon节点
ceph-deploy mgr create ceph-01
# 接下来我们在执行ceph -s就会看到有一个刚添加的好的mgr节点
ceph -s

3.3 部署OSD

  1. OSD负责相应客户端请求返回具体数据的进程,一个Ceph集群一般都有很多个OSD
  2. OSD实际上就是存储我们数据的地方,所以我们的服务器需要添加一块硬盘作为数据存储,我这里3台节点都添加10G的数据,一共30G作为演示。
# 查看机器上的块设备 两块盘
lsblk
# 创建osd 添加三台osd集群 节点1执行
cd /root/ceph-deploy/
ceph-deploy osd create ceph-01 --data /dev/sdb
ceph-deploy osd create ceph-02 --data /dev/sdb
ceph-deploy osd create ceph-03 --data /dev/sdb

# 查看ceph osd就可以看到有3台osd节点
ceph -s 
# 注意: 只有health状态为OK,证明集群同步正常
# 我们就把ceph完毕3个osd。并且数据总大小为30G
[root@ceph-01 ceph-deploy]# ceph -s
  cluster:
    id:     82612119-5dbe-4d6b-b481-1ce8827b9ea1
    health: HEALTH_OK

  services:
    mon: 1 daemons, quorum ceph-01 (age 12m)
    mgr: ceph-01(active, since 12m)
    osd: 3 osds: 3 up (since 27s), 3 in (since 27s)

  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0 B
    usage:   3.0 GiB used, 27 GiB / 30 GiB avail
    pgs:

# 同样查看ceph osd的状态
[root@ceph-01 ceph-deploy]# ceph osd tree
ID CLASS WEIGHT  TYPE NAME          STATUS REWEIGHT PRI-AFF
-1       0.02939 root default
-3       0.00980     host hadoop101
 0   hdd 0.00980         osd.0          up  1.00000 1.00000
-5       0.00980     host hadoop102
 1   hdd 0.00980         osd.1          up  1.00000 1.00000
-7       0.00980     host hadoop103
 2   hdd 0.00980         osd.2          up  1.00000 1.00000

# 如果期间我们有需要修改ceph.conf的操作,只需要在ceph-01上修改,使用下面的命令同步到其他节点上
ceph-deploy --overwrite-conf config push ceph-01 ceph-02 ceph-03

3.4 部署monitor高可用

  1. monitor负责保存OSD的元数据,所以monitor当然也需要高可用。 这里的monitor推荐使用奇数节点进行部署,我这里以3台节点部署
# 当添加上3个monitor节点后,monitor会自动进行选举,自动进行高可用
cd /root/ceph-deploy
ceph-deploy mon add ceph-02 --address 192.168.44.138
ceph-deploy mon add ceph-03 --address 192.168.44.139

# monitor节点已经添加成功
ceph -s 
[root@ceph-01 ceph-deploy]# ceph -s
  cluster:
    id:     82612119-5dbe-4d6b-b481-1ce8827b9ea1
    health: HEALTH_OK

  services:
    mon: 3 daemons, quorum ceph-01,ceph-02,ceph-03 (age 111s)
    mgr: ceph-01(active, since 36m)
    osd: 3 osds: 3 up (since 25m), 3 in (since 25m)

  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0 B
    usage:   3.0 GiB used, 27 GiB / 30 GiB avail
    pgs:

# ceph自带的命令,查看monitor选举情况,以及集群的健康状态
ceph quorum_status --format json-pretty

# 查看mon状态
ceph mon stat

# 查看mon详细的状态
ceph mon dump

3.5 部署manager高可用

  1. 扩展manager daemon。Ceph-MGR目前的主要功能是把集群的一些指标暴露给外界使用
  2. mgr集群只有一个节点为active状态,其它的节点都为standby。只有当主节点出现故障后,standby节点才会去接管,并且状态变更为active
# 扩展mgr create后面为ceph节点的名称
cd /root/ceph-deploy
ceph-deploy mgr create ceph-02 ceph-03

# 三个monitor 三个Mgr 三个osd
[root@ceph-01 ceph-deploy]# ceph -s
  cluster:
    id:     82612119-5dbe-4d6b-b481-1ce8827b9ea1
    health: HEALTH_OK

  services:
    mon: 3 daemons, quorum ceph-01,ceph-02,ceph-03 (age 12m)
    mgr: ceph01(active, since 47m), standbys: ceph-02, ceph-03
    osd: 3 osds: 3 up (since 36m), 3 in (since 36m)

  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0 B
    usage:   3.0 GiB used, 27 GiB / 30 GiB avail
    pgs:

第四节 Ceph集群存储的使用

4.1 块存储的使用

4.1.1 创建资源池

  1. 块存储是存储区域网络中使用的一个数据存储类型。在这种类型中,数据以块的形式存储在卷里,卷会挂载到节点上。可以为应用程序提供更大的存储容量,并且可靠性和性能都更高。
  2. RBD协议,也就是Ceph块设备 (Ceph Block Device)。RBD除了可靠性和性能之外,还支持完整和增量式快照,精简的配置,写时复制(copy-on-write)式克隆。并且支持全内存式缓存。
  3. 目前CEPH RBD支持的最大镜像为16EB,镜像可以直接作为磁盘映射到物理裸机,虚拟机或者其他主机使用,KVM和Xen完全支持RBD,VMware等云厂商也支持RBD模式
  4. 创建pool
# 创建资源池Pool 64个pg 和64pgp pg类似目录
ceph osd pool create abcdocker 64 64
# 查看资源池
ceph osd lspools
# 可以通过下面的命令获取到pool详细状态 ceph osd pool get abcdocker 参数
ceph osd pool get abcdocker pg_num
ceph osd pool get abcdocker pgp_num
ceph osd pool get abcdocker size # 三个副本,写一份数据到pool。会有三个副本保证高可用
# 调整pool参数
ceph osd pool set abcdocker size 2

4.1.2 关闭特性

  1. RBD创建和映射, 在创建镜像前我们还需要修改一下features值。在Centos7内核上,rbd很多特性都不兼容,目前3.0内核仅支持layering。所以我们需要删除其他特性
    • layering: 支持分层
    • striping: 支持条带化 v2
    • exclusive-lock: 支持独占锁
    • object-map: 支持对象映射(依赖 exclusive-lock)
    • fast-diff: 快速计算差异(依赖 object-map)
    • deep-flatten: 支持快照扁平化操作
    • journaling: 支持记录 IO 操作(依赖独占锁)
  2. 关闭不支持的特性一种是通过命令的方式修改,还有一种是在ceph.conf中添加rbd_default_features = 1来设置默认 features(数值仅是 layering 对应的 bit 码所对应的整数值)。
  3. features编码如下,例如需要开启layering和striping,rbd_default_features = 3 (1+2)
属性               BIT码
layering             1
striping             2
exclusive-lock       4
object-map           8
fast-diff            16
deep-flatten         32
  1. 动态关闭features
cd /root/ceph-deploy
echo "rbd_default_features = 1" >>ceph.conf
ceph-deploy --overwrite-conf config push ceph-01 ceph-02 ceph-03
# 当然也在rbd创建后手动删除,这种方式设置是临时性,一旦image删除或者创建新的image 时,还会恢复默认值。
rbd feature disable abcdocker/abcdocker-rbd.img deep-flatten
rbd feature disable abcdocker/abcdocker-rbd.img fast-diff
rbd feature disable abcdocker/abcdocker-rbd.img object-map
rbd feature disable abcdocker/abcdocker-rbd.img exclusive-lock
# 需要按照从后往前的顺序,一条条删除

4.1.3 创建RBD

  1. RBD创建就是通过rbd命令来进行创建
# 查看说明
rbd help create
# -p 指定pool的名称
# 创建rbd需要使用key,可以使用-k参数进行指定,我这里已经默认使用了admin的key,所以不需要指定
rbd create -p abcdocker --image abcdocker-rbd.img --size 1G
# -p pool名称
# --image 镜像名称(相当于块设备在ceph名称) --size 镜像大小 (块大小)
# 创建rbd设备还可以通过下面的方式简写 省略-p和--image参数
rbd create  abcdocker/abcdocker-rbd-1.img --size 1G

# 查看rbd
rbd -p abcdocker ls

# 删除rbd 同样,删除rbd也可以简写,或者加入-p和--image
rbd rm abcdocker/abcdocker-rbd-1.img
rbd -p abcdocker ls

# 通过info查看rbd信息
rbd info -p abcdocker --image abcdocker-rbd.img
rbd info abcdocker/abcdocker-rbd.img
  1. 块文件挂载,我们要进行rbd的挂载 (这里不建议分区,如果分区,后续扩容比较麻烦,容易存在丢数据的情况。在分区不够的情况下建议多块rbd)
# 生成了块设备
rbd map abcdocker/abcdocker-rbd.img

# 查看块设备
rbd device list

# 同样通过fdisk命令看到,现在块设备就相当于我们在服务器上插入了一块硬盘,挂载即可使用
fdisk  -l
# 格式化操作
mkfs.ext4 /dev/rbd0
# 挂载使用了
mkdir /mnt/abcdocker
mount /dev/rbd0 /mnt/abcdocker/

cd /mnt/abcdocker/
touch abcdocker
echo "123" >abcdocker
cat abcdocker

4.1.4 扩容RBD

  1. 块存储的扩容RBD扩容, 目前我们的rbd大小为1个G,这里我们演示将它扩展到2G。在不丢数据的情况下
# resize参数进行扩容
rbd resize abcdocker/abcdocker-rbd.img --size 2G

# size大小已经修改为2G,对应的object也已经成了7680
rbd info abcdocker/abcdocker-rbd.img

# 扩容之后我们的设备是已经扩容上去,但是我们的文件系统并没有扩容上,接下来我们需要使用resize2fs对文件系统进行扩容
# 关于resize2fs解释:
# 调整ext2ext3ext4文件系统的大小,它可以放大或者缩小没有挂载的文件系统的大小。如果文件系统已经挂载,它可以扩大文件系统的大小,前提是内核支持在线调整大小
# 此命令的适用范围:RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora。
# 只需要执行resize2fs加上文件系统的地址即可,扩容完毕我们就可以看到/dev/rbd0大小为28G
resize2fs /dev/rbd0

# 查看分区后磁盘
df -h
ls /mnt/abcdocker/
cat /mnt/abcdocker/abcdocker
  1. 对于扩容一般会涉及三方面的内容: 底层存储(rbd resize) 、磁盘分区的扩容 (例如mbr分区) 、Linux文件系统的扩容, 所以这里不建议在rbd块设备进行分区

4.1.5 RBD数据写入流程

  1. 一个文件会切分成很多object,每个object是4M.
  2. 每个object经过hash运算得到落到的pgid
  3. pg通过crush算法最终落到OSD上。
# 2GiB 512个对象 
rbd image 'abcdocker-rbd.img':
        size 2 GiB in 512 objects
        order 22 (4 MiB objects)
        snapshot_count: 0
        id: 5f3d1d05f9ff
        block_name_prefix: rbd_data.5f3d1d05f9ff
        format: 2
        features: layering
        op_features:
        flags:
        create_timestamp: Sat Sep 17 15:39:00 2022
        access_timestamp: Sat Sep 17 15:39:00 2022
        modify_timestamp: Sat Sep 17 15:39:00 2022
# 查看所有object
rados -p abcdocker ls | grep rbd_data.5f3d1d05f9ff
# 查看具体的object
rados -p abcdocker stat rbd_data.5f3d1d05f9ff.0000000000000085

# 看到上面的过程 落在pg 1.23ea9f20 目录上 最终落到[2,1,0]osd上
ceph osd map abcdocker rbd_data.5f3d1d05f9ff.0000000000000085
osdmap e23 pool 'abcdocker' (1) object 'rbd_data.5f3d1d05f9ff.0000000000000085' -> pg 1.23ea9f20 (1.20) -> up ([2,1,0], p2) acting ([2,1,0], p2)

# 查看每个对象的落盘的过程
for i in `rados -p ceph-demo ls |grep rbd_data.5f3d1d05f9ff`;do ceph osd map ceph-demo ${i}; done

# 一共分配了21个对象 84M 
rados -p abcdocker ls | grep rbd_data.5f3d1d05f9ff | wc -l
# 随着容量的使用这个对象空间会不断增长
watch -n 1 'rados -p abcdocker ls| grep rbd_data.5f3d1d05f9ff | wc -l' # 动态监视一下
dd if=/dev/zero of=test.img bs=1M count=1024 # 写一个G数据进去

4.1.6 Ceph报警排查

  1. 查看健康状况详情。
ceph health detail
HEALTH_WARN application not enabled on 1 pool(s)
POOL_APP_NOT_ENABLED application not enabled on 1 pool(s)
    application not enabled on pool 'abcdocker'
    use 'ceph osd pool application enable  ', where <app-name> is 'cephfs', 'rbd', 'rgw', or freeform for custom applications.

# 资源池没有启用起来 把资源池分类 表示出是那种类型的 方便管理
ceph osd pool application enable abcdocker rbd

# 如果我们在创建pool进行初始化后,就不会提示这个报错rbd pool init 
# 当我们初始化后,rbd会将我们的pool修改为rbd格式。 健康状态自然就不会报错
# 设置完毕后,我们通过下面的命令可以看到pool目前的类型属于rbd类型
ceph osd pool application get abcdocker
{
    "rbd": {}
}
  1. 处理完application告警,我们继续查看ceph健康信息。我们发现monitor ceph-01节点有告警,大致意思是ceph-01节点有一个crashed守护进程崩溃了。
ceph health detail
HEALTH_WARN 1 daemons have recently crashed
RECENT_CRASH 1 daemons have recently crashed
    mon.ceph-01 crashed on host ceph-01 at 2020-09-11 12:01:02.351322Z
  1. 官方解释如下
# One or more Ceph daemons has crashed recently, and the crash has not yet been archived (acknowledged) by the administrator. This may indicate a software bug, a hardware problem (e.g., a failing disk), or some other problem.
# 一个或多个Ceph守护进程最近崩溃,管理员尚未存档(确认)崩溃。这可能表示软件错误、硬件问题(例如,磁盘故障)或其他问题。

# 这个报错并不影响我们,我们可以通过下面的命令看到crashed进程 (只要我们其他组件都是正常的,那么这一条就多半是误报。生产环境中处理这个故障还是要根据实际情况进行处理,不可以盲目的删除告警)
  1. 查看crash
ceph crash ls
ceph crash ls-new

# 同时还可以使用查看进程详细信息
ceph crash info [ID]

# 处理这个警告
# 第一种方法 (适合处理单个告警)
ceph crash  archive <ID>

# 第二种方法 (将所有的crashed打包归档)
ceph crash archive-all
ceph crash ls-new

# 再次查看状态就已经恢复
ceph -s

4.2 RGW对象存储

4.2.1 对象存储介绍

  1. 可以理解是一个海量的存储空间,可以通过API在任何时间、任何地点访问对象存储里面的数据。我们常用的阿里云OSS、七牛云存储以及百度网盘、私有网盘等都属于对象存储
  2. Cpeh是一个分布式对象存储系统,通过它的对象网关(object gateway),也就是RADOS网关(radosgw)提供对象存储接口。RADOS网关利用librgw (RADOS网关库)和librados这些库,允许应用程序跟CEPH对象存储建立连接。Ceph通过RESTful API提供可访问且最稳定的多租户对象存储解决方案之一。
  3. RADOS网关提供RESTful接口让用户的应用程序将数据存储到CEPH集群中。RADOS网关接口满足以下特点;
    • 兼容Swift: 这是为了OpenStack Swift API提供的对象存储功能
    • 兼容S3: 这是为Amazon S3 API提供的对象存储功能
    • Admin API: 这也称为管理API或者原生API,应用程序可以直接使用它来获取访问存储系统的权限以及管理存储系统
  4. 除了上述的特点,对象存储还有以下特点
    • 支持用户认证
    • 使用率分析
    • 支持分片上传 (自动切割上传重组)
    • 支持多站点部署、多站点复制
      第一课 Ceph基础学习-Ceph集群部署和基本使用_第4张图片

4.2.2 部署RGW存储网关

  1. 使用ceph对象存储我们需要安装对象存储网关(RADOSGW)
  2. ceph-radosgw软件包我们之前是已经安装过了,这里可以检查一下
# 如果没有安装可以通过yum install ceph-radosgw安装 
rpm -qa|grep ceph-radosgw
yum whatprovides "*bin/ceph-radosgw"

# 部署对象存储网关 这里我使用ceph-01当做存储网关来使用
cd /root/ceph-deploy
ceph-deploy rgw create ceph-01
# 创建完毕后我们可以查看一下,这里rgw只有一个服务器,那就是ceph-01
ceph -s|grep rgw
    rgw: 1 daemon active (ceph-01)
# 并且radosgw监听7480端口
netstat -lntup|grep 7480
curl http://ceph-01:7480

# 接下来我们进行修改一下端口,默认是7480;这里我们将端口修改为80端口
vim /root/ceph-deploy/ceph.conf
[client.rgw.ceph-01]
rgw_frontends = "civetweb port=80"

# client.rgw.[主机名] 这里需要注意修改的主机名
# 还需要注意修改的目录 (这里修改的目录是/root/ceph.conf)
# 修改完毕后,我们将配置分发下去;要让集群的主机都生效
ceph-deploy --overwrite-conf config push ceph-01 ceph-02 ceph-03
# 这里其实只需要复制到rgw网关节点就行,但是为了配置统一,我们将配置文件分发到集群的各个节点
# push到各个机器后并没有生效,push相当于scp。文件没有生效,所以还需要重启rgw
systemctl restart ceph-radosgw.target

# 检查配置 这里我们可以看到80端口对应的服务是radosgw
netstat -lntup|grep 80
# 如果你想让http支持https也是在ceph配置文件中添加参数,具体参考官网https://docs.ceph.com/en/quincy/man/8/radosgw/
[client.rgw.ceph-01]
rgw_frontends = "civetweb port=443"
ssl_certificate=/etc/ceph/keyandcert.pem

4.2.3 创建用户访问对象存储

  1. 创建用户获取网关的凭证。
cd /root/ceph-deploy/
# --uid 指定一个uid名称 --display-name 指定一个全名
radosgw-admin user create --uid ceph-s3-user --display-name "Ceph S3 User Demo abcdocker"
# 账号: QU20SKAX1N9XYPSIJKK2 
# 密码: uiYapPp5QKaQX1lcuXUjq8BLsxKgVCTaxF3H6Q7Y
# 最大只能创建1000个bucket
{
    "user_id": "ceph-s3-user",
    "display_name": "Ceph S3 User Demo abcdocker",
    "email": "",
    "suspended": 0,
    "max_buckets": 1000,
    "subusers": [],
    "keys": [
        {
            "user": "ceph-s3-user",
            "access_key": "QU20SKAX1N9XYPSIJKK2",
            "secret_key": "uiYapPp5QKaQX1lcuXUjq8BLsxKgVCTaxF3H6Q7Y"
        }
    ],
    "swift_keys": [],
    "caps": [],
    "op_mask": "read, write, delete",
    "default_placement": "",
    "default_storage_class": "",
    "placement_tags": [],
    "bucket_quota": {
        "enabled": false,
        "check_on_raw": false,
        "max_size": -1,
        "max_size_kb": 0,
        "max_objects": -1
    },
    "user_quota": {
        "enabled": false,
        "check_on_raw": false,
        "max_size": -1,
        "max_size_kb": 0,
        "max_objects": -1
    },
    "temp_url_keys": [],
    "type": "rgw",
    "mfa_ids": []
}
  1. 这里的key我们已经获取到了,接下来我们使用s3的接口进行访问
# 安装python-bot包
yum install python-boto
# 编写Python sdk脚本
import boto
import boto.s3.connection

access_key = "QU20SKAX1N9XYPSIJKK2"
secret_key = "uiYapPp5QKaQX1lcuXUjq8BLsxKgVCTaxF3H6Q7Y"
conn = boto.connect_s3(
    aws_access_key_id = access_key,
    aws_secret_access_key = secret_key,
    host = '192.168.44.137', port = 80,
    is_secure=False, calling_format = boto.s3.connection.OrdinaryCallingFormat(),
    )
bucket = conn.create_bucket('ceph-s3-bucket')
for bucket in conn.get_all_buckets():
    print "{name}".format(
        name = bucket.name,
        created = bucket.creation_date,
)
#执行脚本
python s3.py
ceph-s3-bucket
# 执行完Python脚本,我们可以看到在pool创建了一个default.rgw.backets.index的索引
ceph osd lspools
  1. 命令行调用, SDK调用方式不太适合运维操作,运维更倾向于命令行操作。下面我们进行命令行操作调用, 这里使用s3cmd工具来进行配置
# 首先我们yum 安装s3cmd
yum install -y s3cmd
# 针对s3cmd我们需要修改一些配置参数
s3cmd --configure

Access Key: QU20SKAX1N9XYPSIJKK2
Secret Key: uiYapPp5QKaQX1lcuXUjq8BLsxKgVCTaxF3H6Q7Y

Use "s3.amazonaws.com" for S3 Endpoint and not modify it to the target Amazon S3.
S3 Endpoint [s3.amazonaws.com]: 192.168.44.137:80 # s3地址

Use "%(bucket)s.s3.amazonaws.com" to the target Amazon S3. "%(bucket)s" and "%(location)s" vars can be used
if the target S3 system supports dns based buckets.
DNS-style bucket+hostname:port template for accessing a bucket [%(bucket)s.s3.amazonaws.com]: 192.168.44.137:80/%(bucket)s # s3访问格式

Use HTTPS protocol [Yes]: no

Test access with supplied credentials? [Y/n] y # 测试验证是否通过
Please wait, attempting to list all buckets...
Success. Your access key and secret key worked fine :-)

Save settings? [y/N] y # 保存设置
Configuration saved to '/root/.s3cfg'


# 需要将signature_v2 改成true
sed -i 's/signature_v2 = False/signature_v2 = True/g' /root/.s3cfg
  1. 3cmd 目前支持两种认真的方式一种是 v2,一种是 v4,而 s3cmd 2.x 版本默认用的是 v4,而 1.x 版本默认用的是 v2,这两种认证方式是有区别的,简单来说就是 v4 除了像 v2,那样需要S3桶的 accesskey 和 secretkey,还需要如 date 等信息来签名,然后放到 http request 的 Header 上,而 s3cmd 2.x 版本支持通过在 .s3cfg 配置文件,增加选项 signature_v2 = True 来修改认证方式,所以说,如果想快速解决这个403的问题,让用户加上这个选项就可以了
  2. s3cmd使用
# 查看bucket
s3cmd ls     
# 创建bucket
s3cmd mb s3://s3cmd-abcdocker-demo   
# 查看s3cmd-abcdocker-demo内容
s3cmd ls s3://ceph-s3-bucket
#目前是空文件
#上传/etc目录到s3中的/etc目录 --recursive 递归上传
s3cmd put /etc/ s3://ceph-s3-bucket/etc/ --recursive
# 如果put提示ERROR: S3 error: 416 (InvalidRange)
# 需要将ceph.conf配置文件进行修改,添加mon_max_pg_per_osd = 1000
# 重启ceph-mon
ceph-deploy --overwrite-conf config push ceph-01 ceph-02 ceph-03
systemctl restart ceph-mon@ceph-01
systemctl restart ceph-mon@ceph-01
systemctl restart ceph-mon@ceph-01
# 查看
s3cmd ls s3://ceph-s3-bucket
s3cmd ls s3://ceph-s3-bucket/etc/

# s3cmd 下载 s3cmd下载的命令和上传的一样,只需要把put改成get即可
s3cmd get s3://ceph-s3-bucket/etc/profile proxy-s3
head proxy-s3

# s3cmd 删除
s3cmd del s3://ceph-s3-bucket/etc/profile
s3cmd ls s3://ceph-s3-bucket/etc/profile
                         
# 删除整个目录,需要添加--recursive递归
s3cmd del s3://ceph-s3-bucket/etc/ --recursive
s3cmd ls s3://ceph-s3-bucket

# 最终我们数据会在pools里面生成
ceph osd lspools
1 abcdocker
2 .rgw.root
3 default.rgw.control
4 default.rgw.meta
5 default.rgw.log
6 default.rgw.buckets.index
7 default.rgw.buckets.data

# 发现上传的文件下面pool index为索引,data为数据
rados -p default.rgw.buckets.data ls
rados -p default.rgw.buckets.index ls

4.2.4 swift风格的API接口

  1. 创建用户
# 创建swift风格的用户https://docs.ceph.com/en/quincy/radosgw/swift/auth/
radosgw-admin user list
# 子账号qnhyn:类型swift uid是上面命令的输出
radosgw-admin user create --subuser="ceph-swift-user:swift" --uid="ceph-swift-user" --display-name="swift user" --key-type=swift --access=full
{
    "user_id": "ceph-swift-user",
    "display_name": "swift user",
    "email": "",
    "suspended": 0,
    "max_buckets": 1000,
    "subusers": [
        {
            "id": "ceph-swift-user:swift",
            "permissions": "full-control"
        }
    ],
    "keys": [],
    "swift_keys": [
        {
            "user": "ceph-swift-user:swift",
            "secret_key": "w2map7avm3gqwRnhCGdqQZDdacoKRW9VnmKMe4WF"
        }
    ],
    "caps": [],
    "op_mask": "read, write, delete",
    "default_placement": "",
    "default_storage_class": "",
    "placement_tags": [],
    "bucket_quota": {
        "enabled": false,
        "check_on_raw": false,
        "max_size": -1,
        "max_size_kb": 0,
        "max_objects": -1
    },
    "user_quota": {
        "enabled": false,
        "check_on_raw": false,
        "max_size": -1,
        "max_size_kb": 0,
        "max_objects": -1
    },
    "temp_url_keys": [],
    "type": "rgw",
    "mfa_ids": []
}

  1. 客户端访问
# 安装swift客户端
yum install python36 -y
pip3 install -i https://pypi.douban.com/simple  python-swiftclient
swift -v
# 登陆查看
swift -A http://192.168.44.137:80/auth -U ceph-swift-user:swift -K "w2map7avm3gqwRnhCGdqQZDdacoKRW9VnmKMe4WF" list
# 定义环境变量
export ST_AUTH=http://192.168.44.137:80/auth
export ST_USER=ceph-swift-user:swift
export ST_KEY=w2map7avm3gqwRnhCGdqQZDdacoKRW9VnmKMe4WF
# 创建swift-demo bucket(swift说明文档中叫container)
swift list
swift post swift-demo
swift list
# 上传文件
swift upload swift-demo /etc/passwd
# 下载文件
swift download swift-demo etc/passwd

4.3 CephFS文件存储

4.3.1 CephFS介绍

  1. 从NAS演化过来的网络存储,

  2. 为什么需要使用CephFS。由于RBD不可以多个主机共享同一块磁盘,出现很多客户端需要写入数据的问题,这时就需要CephFS文件系统
    第一课 Ceph基础学习-Ceph集群部署和基本使用_第5张图片

  3. MDS存储文件的元数据信息,一般由集群组成。

  4. 客户端直接网数据池写数据。

4.3.2 CephFS部署

  1. 安装部署MDS集群,至少需要部署一个METADATA SERVER。它主要负责元数据的数据存储。这里wile保证高可靠性我们部署三个。
# 高可用安装mds
ceph-deploy mds create ceph-01 ceph-02 ceph-03
# 可以看到,已经有mds了,数量为3个,状态为启动等待的状态
ceph -s
# 因为没有文件系统,没法正常选举。所以3个节点状态是启动,但是后面为等待的状态
ceph -s|grep mds
    mds:  3 up:standby
  1. 创建pool,一个Ceph文件系统至少需要连个RADOS池,一个用于数据,一个用于元数据。
    • 对元数据池使用更好的复制级别,因为此池中的任何数据丢失都可能导致整个文件系统无法访问
    • 对元数据池使用SSD等低延迟存储,因为这将直接影响观察到的客户端文件系统操作的延迟。
    • 用于创建文件的数据池是默认数据池,是存储所有inode回溯信息的位置,用于硬链接管理和灾难恢复。因此,在CephFS中创建的所有inode在默认数据池中至少有一个对象。
# 创建存储池,数据data,元数据metadata
ceph osd pool create cephfs_data 64  64    #创建名称为cephfs_data 的pool, pg数量为64
# 通常,元数据池最多有几GB的数据,建议使用比较小的PG数,64或者128常用于大型集群
ceph osd pool create cephfs_metadata 64  64
ceph osd pool ls
  1. 创建文件系统,接下来需要创建文件系统,将刚刚创建的pool关联起来。
#cephfs-abcdocker为文件系统名称
#cephfs_metadata 为元数据的pool
#cephfs_data 为数据pool
ceph fs new cephfs-abcdocker cephfs_metadata cephfs_data

#创建完毕后可以通过下面的命令进行查看
ceph fs ls
# 查看mds状态,已经有一个状态为active,另外2个为standb状态
name: cephfs-abcdocker, metadata pool: cephfs_metadata, data pools: [cephfs_data]

# 再次查看ceph, 发现mds 已经有激活的节点了
ceph -s

4.3.3 使用cephfs

  1. 内核驱动挂载
# 创建挂载点
mkdir /abcdocker
# 执行挂载命令
# ceph-01为mon节点ip,/为挂载/目录  /abcdocker 挂载点地址,name=admin,使用admin用户的权限
mount -t ceph ceph-01:6789:/ /abcdocker -o name=admin
# 这里分配的空间是整个ceph的空间大小
df -h
文件系统                 容量  已用  可用 已用% 挂载点
devtmpfs                 1.9G     0  1.9G    0% /dev
tmpfs                    1.9G     0  1.9G    0% /dev/shm
tmpfs                    1.9G   12M  1.9G    1% /run
tmpfs                    1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/mapper/centos-root   50G  4.2G   46G    9% /
/dev/sda1                2.0G  151M  1.9G    8% /boot
tmpfs                    1.9G   24K  1.9G    1% /var/lib/ceph/osd/ceph-0
tmpfs                    378M     0  378M    0% /run/user/0
192.168.44.137:6789:/    8.5G     0  8.5G    0% /abcdocker
# 我们可以看到,挂载完linux内核会自动加载ceph模块
vi abc.txt
# 在内核中挂载性能会比较高一点,但是有一些场景内核可能不太支持,所以可以使用用户FUSE挂载
lsmod |grep ceph
ceph                  363016  1
libceph               306750  1 ceph
dns_resolver           13140  1 libceph
libcrc32c              12644  2 xfs,libceph
  1. 用户空间FUSE挂载, 用户空间挂载主要使用的是ceph-fuse客户端,我们需要单独安装这个客户端
yum install ceph-fuse -y
# 接下来创建本地的挂载点
mkdir /mnt/abcdocker
# 使用ceph-fuse进行挂载
# client.admin 默认有一个client.admin的用户
# 192.168.44.137:6789 mon地址 (也可以写多个,逗号分隔)
# 如果我们不指定mon,默认找的是/etc/ceph/ceph.conf里面的配置文件
ceph-fuse -n client.admin -m 192.168.44.137:6789 /mnt/abcdocker/
# 挂在完成后我们就可以使用df -h看一下挂载点的状态
df -h
# 可以看到上面的abc.txt文件
cat /mnt/abcdocker/abc.txt

你可能感兴趣的:(Ceph入门和实践,ceph)