ceph 分布式存储部署及管理

ceph介绍

Ceph的架构由多个核心组件组成,这些组件协同工作以提供统一、高可用和可扩展的存储服务。以下是一些主要的Ceph组件及其功能:

  1. MON (Monitor): MON是Ceph集群的监控节点,负责维护集群的状态信息,包括OSD(Object Storage Daemon)和PG(Placement Group)的状态。MON节点通过Quorum机制保证数据的一致性和正确性。
  2. OSD (Object Storage Daemon): OSD是Ceph存储集群的主要工作节点,负责存储和管理实际的数据。每个OSD节点包含一组PG,并负责处理与这些PG相关的数据操作,如写入、读取和复制。
  3. MDS (Metadata Server): MDS是Ceph文件系统(CephFS)的元数据服务器,负责管理和存储文件系统的目录结构和权限等元数据信息。当客户端访问CephFS时,它们首先连接到MDS来获取文件系统的元数据信息。
  4. RGW ( RADOS Gateway): RGW是Ceph的对象存储网关,提供了S3和Swift兼容的接口,使得用户能够通过标准的RESTful API访问存储在Ceph中的对象数据。
  5. CRUSH (Controlled Replication Under Scalable Hashing): CRUSH是一种算法,用于确定数据在Ceph集群中的分布和复制策略。它基于设备的位置、容量和其他属性,动态地计算出数据的最佳存储位置,以实现高效的负载均衡和容错能力。
  6. PG (Placement Group): PG是Ceph中数据分布的基本单位,每个PG包含一组OSD,并负责在一个或多个OSD上存储和复制数据。PG的数量和大小可以根据集群规模进行调整,以优化性能和可靠性。
  7. RBD (RADOS Block Device): RBD是Ceph提供的块存储服务,它可以被格式化为各种文件系统并作为虚拟机的磁盘使用。RBD通过librbd库与客户端应用程序交互。

Ceph的架构设计允许各个组件独立地扩展和运行,从而提供了高度的灵活性和可扩展性。客户端可以通过Ceph的 librados 库或者特定的服务接口(如CephFS、RGW等)与Ceph集群进行交互。

以下是Ceph的简化架构图示:

+-----------------+      +-----------------+      +-----------------+
|     Client      | ---> |     MONitors    | <--- |     OSDs         |
+-----------------+      +-----------------+      +-----------------+
        ^                           |                            |
        |                           v                            |
+-----------------+      +-----------------+      +-----------------+
|     Client      | ---> |     MDS          | <--- |     Metadata     |
+-----------------+      +-----------------+      +-----------------+
        ^                           |                            |
        |                           v                            |
+-----------------+      +-----------------+      +-----------------+
|     Client      | ---> |     RGW          | <--- |     Objects      |
+-----------------+      +-----------------+      +-----------------+

在这个架构中,客户端可以直接与各个服务接口交互,而这些接口又会通过内部的通信协议与Ceph的核心组件进行通信,以完成数据的存储和检索操作。

Ceph的RGW (RADOS Gateway) 和 MDS (Metadata Server) 是两个关键组件,它们分别提供对象存储服务和文件系统服务。

  1. RGW (RADOS Gateway): RGW是Ceph的对象存储网关,它为用户提供了一个RESTful API接口,使得用户能够像使用Amazon S3或OpenStack Swift一样访问存储在Ceph中的对象数据。RGW提供了以下主要功能:
    • 对象存储:RGW允许用户上传、下载、删除和列出存储桶(buckets)以及其中的对象。
    • 访问控制:RGW支持多种身份验证和授权机制,如AWS签名版本4、Keystone等,以控制对存储资源的访问权限。
    • 数据一致性:RGW保证了强一致性,即一旦一个写操作返回成功,该数据就会立即对所有后续读操作可见。
    • 多协议支持:RGW除了支持原生的S3和Swift API外,还支持其他一些兼容的接口,如DFS、NFS等。
  2. MDS (Metadata Server): MDS是Ceph文件系统(CephFS)的元数据服务器,它负责管理和存储CephFS的元数据信息,如目录结构、文件属性和权限等。MDS提供了以下主要功能:
    • 元数据管理:MDS维护文件系统的目录树结构、文件和目录的属性以及权限信息。
    • 文件系统挂载:客户端可以通过NFS、CIFS或者直接通过CephFS客户端库挂载CephFS文件系统。
    • 并发控制:MDS处理并发的文件系统操作,确保数据的一致性和完整性。
    • 高可用性:多个MDS节点可以组成一个活跃/热备集群,以提高元数据服务的可用性和容错能力。

在Ceph架构中,RGW和MDS与其他组件如MONitors和OSDs协同工作,共同提供统一、高可用和可扩展的存储服务。客户端可以根据需要选择使用RGW进行对象存储操作,或者使用MDS进行文件系统操作。这两种服务可以独立部署和扩展,以满足不同的应用场景和性能需求。

PG (Placement Group): PG 是 Ceph 中数据分布和管理的基本单位。每个 PG 负责一部分数据的存储和复制。PG 的数量和大小可以根据集群规模进行调整,以优化性能和可靠性。PG 的主要作用是将数据分割成更小的块,并决定这些块应该存储在哪个 OSD (Object Storage Daemon) 上。

PGP (Placement Group Provisioned): PGP 是为 PG 分配的预留空间或者说是 OSD 组合的数量。当创建一个存储池时,需要指定 PG 和 PGP 的数量。通常情况下,PGP 的数量等于或大于 PG 的数量。

PG 和 PGP 的关系在于数据的分布和冗余策略。每个 PG 都会被映射到一组 OSD 上,这个映射关系由 CRUSH (Controlled Replication Under Scalable Hashing) 算法决定。而 PGP 则决定了不同 OSD 组合的数量,这些组合用于存储 PG 的数据副本。

例如,如果你有一个包含 3 个 OSD 的集群,并且你设置了 2 个副本(即 replication factor 为 2),那么对于每个 PG,你可以有以下两种不同的 OSD 组合(PGP):

  1. OSD1 和 OSD2
  2. OSD1 和 OSD3

在这种情况下,PGP 的数量为 2。Ceph 会根据 CRUSH 算法和数据分布策略,将 PG 映射到这些不同的 OSD 组合上,以实现数据的冗余和负载均衡。

简而言之,PG 是实际存储和管理数据的单元,而 PGP 是为这些 PG 预留的 OSD 组合,用于实现数据的复制和高可用性。在配置 Ceph 存储池时,需要合理设置 PG 和 PGP 的数量,以适应集群的规模和性能需求。

环境

主机名操作系统cpu(核)内存(GB)存储管理平面IP地址址/子网掩码业务平面IP地/子网掩码 | 网关
ceph-masterCentOS Linux release 7.6.1810 (Core)24/dev/sda 40GB192.168.10.80/24192.168.100.80/24 | 192.168.100.1
ceph-node1CentOS Linux release 7.6.1810 (Core)12/dev/sda 40GB;/dev/sdb 50GB192.168.10.81/24192.168.100.81/24 | 192.168.100.1
ceph-node2CentOS Linux release 7.6.1810 (Core)12/dev/sda 40GB;/dev/sdb 50GB192.168.10.82/24192.168.100.82/24 | 192.168.100.1
ceph-node3CentOS Linux release 7.6.1810 (Core)12/dev/sda 40GB;/dev/sdb 50GB192.168.10.83/24192.168.100.83/24 | 192.168.100.1

注:

  • 存储部分 : 控制节点不需要数据盘,不需要sdb
  • 网络部分 :
    • 管理网络:内网,不需要访问业务和外网,集群内部通信,可以理解为一个无网关的内网(VMware 仅主机模式)
    • 业务网络:外网,访问业务或外网,需要网关(VMware Nat网络模式)

ceph分布式存储部署

IP地址及网卡配置

# 1.进入/etc/sysconfig/network-scripts/目录
cd /etc/sysconfig/network-scripts/

# 2.修改配置文件
# ceph-master 
vi ifcfg-ens33
# 添加配置
IPADDR=192.168.100.80  # 业务ip地址
NETMASK=255.255.255.0 # 子网掩码
ONBOOT=yes # 网卡自启
GATEWAY=192.168.100.1 # 业务网关

vi ifcfg-ens37
# 添加配置
IPADDR=192.168.10.80  # 业务ip地址
NETMASK=255.255.255.0 # 子网掩码
ONBOOT=yes # 网卡自启

# ceph-node1
同 ceph-master 注意修改IP地址
# ceph-node2
同 ceph-master 注意修改IP地址
# ceph-node3
同 ceph-master 注意修改IP地址

# 3.重启网络服务
systemctl restart network

主机名配置

# 修改主机名

# ceph-master
hostnamectl set-hostname  ceph-master
# ceph-node
hostnamectl set-hostname  ceph-node1 # node1
hostnamectl set-hostname  ceph-node2 # node2
hostnamectl set-hostname  ceph-node3 # node3

关闭防火墙配置

# 所有节点都执行
systemctl stop firewalld # firewalld 临时关闭
systemctl disable firewalld # 关闭系统自启
setenforce 0 # 零时关闭selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config  # 关闭系统自启

配置/etc/hosts文件

# 配置文件 - 所有节点都执行
echo "192.168.10.80 ceph-master" >>/etc/hosts
echo "192.168.10.81 ceph-node1" >>/etc/hosts
echo "192.168.10.82 ceph-node2" >>/etc/hosts
echo "192.168.10.83 ceph-node3" >>/etc/hosts

# 检查hosts配置 - 所有节点都执行
ping -c2 ceph-master
ping -c2 ceph-node1
ping -c2 ceph-node2
ping -c2 ceph-node3

配置app用户及sudo权限

# 创建用户配置密码 - 所有节点执行
useradd app 
echo "Ceph12#$" | passwd --stdin app

# app 用户添加sudo 权限 - 所有节点执行
egrep "^app.*ALL=\(root\).*NOPASSWD\:ALL" /etc/sudoers || echo "app      ALL=(root)      NOPASSWD:ALL" >>/etc/sudoers # 先筛选(如果app 没有sudo权限),再添加

配置Master节点免密登录

# master节点执行
su - app
ssh-keygen -t rsa -P ''
ssh-copy-id app@ceph-node1
ssh-copy-id app@ceph-node2
ssh-copy-id app@ceph-node3

# 测试 - master节点执行 - app用户下
ssh ceph-node1
ssh ceph-node2
ssh ceph-node3

时间同步配置 (外网环境时)

# centos 7 之前用ntpd 服务实现时间同步,7版本之后使用chrony 时间同步
# 在这儿使用chrony 时间同步
# 可以访问百度及阿里时

# 所有节点执行 - root 用户下执行
vi /etc/chrony.conf 
# 注释掉默认的四个ntp服务器,因为该服务器同步时间略慢
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst

# 
# 格式为:server 服务器ip地址 iburst 
# 添加阿里云的ntp服务器,可以多写几个ntp服务器,防止第一个服务器宕机,备用的其他ntp服务器可以继续进行时间同步
# ip地址为服务器ip地址,iburst代表的是快速同步时间 
#  
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
server ntp3.aliyun.com iburst

# 重启chrony服务 root 用户下执行
systemctl enable --now chronyd
timedatectl set-ntp true					#开启 NTP
timedatectl set-timezone Asia/Shanghai		#设置时区
chronyc -a makestep							#强制同步下系统时钟
timedatectl status							#查看时间同步状态
chronyc sources -v							#查看 ntp 源服务器信息
timedatectl set-local-rtc 0					#将当前的UTC时间写入硬件时钟
 
#重启依赖于系统时间的服务
systemctl restart rsyslog 
systemctl restart crond
 
#关闭无关服务
systemctl disable --now postfix

# 查看同步结果 root 用户下执行
chronyc sources -v

:时间同步配置 (内网环境时),修改ntp同步的服务地址,将ntp1.aliyun.com修改成内网IP地址。

Octopus版本的yum源配置

# 所有节点都执行 

# 备用原repo文件
cd /etc/yum.repos.d/ && mkdir bak_repo && mv *.repo bak_repo/
# 编辑 ceph 15.1.1 yum源
vi /etc/yum.repos.d/ceph.repo

[Ceph]
name=Ceph packages for $basearch
baseurl=https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-15.1.1/el7/$basearch
enabled=1
gpgcheck=0
type=rpm-md

[Ceph-noarch]
name=Ceph noarch packages
baseurl=https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-15.1.1/el7/noarch
enabled=1
gpgcheck=0
type=rpm-md

[ceph-source]
name=Ceph source packages
baseurl=https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-15.1.1/el7/SRPMS/
enabled=1
gpgcheck=0
type=rpm-md

# 系统镜像源
vi /etc/yum.repos.d/CentOS-7-reg.repo

[base]
name=CentOS-$releasever - Base - repo.huaweicloud.com
baseurl=https://repo.huaweicloud.com/centos/$releasever/os/$basearch/
#mirrorlist=https://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
gpgcheck=1
gpgkey=https://repo.huaweicloud.com/centos/RPM-GPG-KEY-CentOS-7
 
#released updates 
[updates]
name=CentOS-$releasever - Updates - repo.huaweicloud.com
baseurl=https://repo.huaweicloud.com/centos/$releasever/updates/$basearch/
#mirrorlist=https://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates
gpgcheck=1
gpgkey=https://repo.huaweicloud.com/centos/RPM-GPG-KEY-CentOS-7
 
#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras - repo.huaweicloud.com
baseurl=https://repo.huaweicloud.com/centos/$releasever/extras/$basearch/
#mirrorlist=https://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras
gpgcheck=1
gpgkey=https://repo.huaweicloud.com/centos/RPM-GPG-KEY-CentOS-7
 
#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus - repo.huaweicloud.com
baseurl=https://repo.huaweicloud.com/centos/$releasever/centosplus/$basearch/
#mirrorlist=https://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus
gpgcheck=1
enabled=0
gpgkey=https://repo.huaweicloud.com/centos/RPM-GPG-KEY-CentOS-7

# yum 生成缓存
yum clean all && yum makecache

安装ceph

# 所有节点都执行

# 安装ceph需要的基础包
yum install epel-release   -y
yum install lttng-ust -y

# 安装ceph
yum install ceph ceph-radosgw -y

管理节点部署

# 管理节点部署
# yum 安装必要部署包
yum install epel-release   -y
yum install lttng-ust -y
yum install ceph-deploy  python-setuptools python2-subprocess32 ceph-common 

创建集群

mkdir /home/app/ceph-cluster

部署MON组件

# 管理节点 - root 用户
cd /home/app/ceph-cluster

su - app
# 管理节点 - app 用户
ceph-deploy new ceph-master --cluster-network 192.168.10.0/24  --public-network 192.168.100.0/24 #mon节点,可以写第一个,也可以写多个
ceph-deploy install --no-adjust-repos ceph-master ceph-node1 ceph-node2 ceph-node3 # 将本地主机上的 Ceph 安装脚本和配置文件复制到目标主机。 # 在目标主机上安装必要的依赖软件包。# 根据 --no-adjust-repos 参数的设置,可能需要手动确认系统的软件源是否正确配置。# 从正确的软件源安装 Ceph 软件包。
ceph-deploy mon create-initial #这一步其实是在生成keyring文件 在master设备上面用 app 用户执行,初始化mon
ceph-deploy admin ceph-master ceph-node1 ceph-node2 ceph-node3 #将配置和client.admin秘钥环推送到远程主机。
ceph-deploy --overwrite-conf config push ceph-master ceph-node1 ceph-node2 ceph-node3 # 向所有 mon 节点同步配置,确保所有 mon 节点上的 ceph.conf 内容必须一致

sudo setfacl -m u:app:r /etc/ceph/ceph.client.admin.keyring

# 其余node节点 - root 用户
setfacl -m u:app:r /etc/ceph/ceph.client.admin.keyring #ceph.client.admin.keyring文件是 ceph命令行 所需要使用的keyring文件 #不管哪个节点,只要需要使用cephadm用户执行命令行工具,这个文件就必须要让app用户拥有访问权限,就必须执行这一步 #这一步如果不做,ceph命令是无法在非sudo环境执行的。

部署MGR组件

su - app
# 管理节点 - app 用户
ceph-deploy mgr create ceph-master

cd /home/app/ceph-cluster
sudo cp ./{ceph.client.admin.keyring,ceph.conf} /etc/ceph # 同步配置文件到/etc/ceph目录下
ceph -s # 查看集群状态

部署OSD节点

su - app
#管理节点 - app用户
cd /home/app/ceph-cluster
ceph-deploy disk list ceph-master ceph-node1 ceph-node2 ceph-node3 # 查看各个几点磁盘状态,相当于fdisk -l
ceph-deploy osd create ceph-node1 --data /dev/sdb # 创建osd使用的磁盘,sdb不需要格式化
ceph-deploy osd create ceph-node2 --data /dev/sdb # 创建osd使用的磁盘,sdb不需要格式化
ceph-deploy osd create ceph-node3 --data /dev/sdb # 创建osd使用的磁盘,sdb不需要格式化
ceph osd tree # 查看磁盘及主机对应关系
ceph -s 检查主机的

集群状态检查及集群异常处理

su - app
# 管理节点 - app 用户
ceph -s # 查看集群状态
ceph health # 检查集群健康状态
ls /usr/lib/systemd/system/ceph*.target # 查看ceph相关的服务
systemctl restart ceph-mgr.target # 重启mgr服务
ceph osd status    #查看 osd 状态,需部署 mgr 后才能执行
rados df # 查看 osd 状态
ceph osd df    #查看 osd 容量,需部署 mgr 后才能执行
#节点查询状态
ssh root@node01 systemctl status ceph-osd@0
ssh root@node02 systemctl status ceph-osd@1
ssh root@node03 systemctl status ceph-osd@2



# 异常处理
1、ceph health 时报wring 存在缺失pecan包时,使用以下命令
# root用户下
pip3 install pecan werkzeug
systemctl restart ceph-mgr.target
systemctl restart ceph-mon.target

2、ceph health出现osd down时,到对应节点重启osd服务,
# 管理节点检查存在异常的磁盘及对应主机
su - app
ceph osd tree # 查看down的磁盘及对应主机

# 磁盘异常节点主机上
# root用户下
systemctl restart ceph-osd.target
回管理节点检查,如果还未正常,请自查资料

3、ceph health 时报1 slow ops, oldest one blocked for 39 sec, mon.ceph-master has slow ops
# 管理节点root用户
chronyc -a makestep
systemctl  restart  ceph-mon.target


#如果是利旧的硬盘,则需要先擦净(删除分区表)磁盘(可选,无数据的新硬盘可不做)
# 管理节点
su - app 
cd /home/app/ceph-cluster
ceph-deploy disk zap ceph-node1 /dev/sdb
ceph-deploy disk zap ceph-node2 /dev/sdb
ceph-deploy disk zap ceph-node3 /dev/sdb

存储客户端配置(可选)

yum源配置:

# 备用原repo文件
cd /etc/yum.repos.d/ && mkdir bak_repo && mv *.repo bak_repo/
# 编辑 ceph 15.1.1 yum源
vi /etc/yum.repos.d/ceph.repo

[Ceph]
name=Ceph packages for $basearch
baseurl=https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-15.1.1/el7/$basearch
enabled=1
gpgcheck=0
type=rpm-md

[Ceph-noarch]
name=Ceph noarch packages
baseurl=https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-15.1.1/el7/noarch
enabled=1
gpgcheck=0
type=rpm-md

[ceph-source]
name=Ceph source packages
baseurl=https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-15.1.1/el7/SRPMS/
enabled=1
gpgcheck=0
type=rpm-md

# 系统镜像源
vi /etc/yum.repos.d/CentOS-7-reg.repo

[base]
name=CentOS-$releasever - Base - repo.huaweicloud.com
baseurl=https://repo.huaweicloud.com/centos/$releasever/os/$basearch/
#mirrorlist=https://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
gpgcheck=1
gpgkey=https://repo.huaweicloud.com/centos/RPM-GPG-KEY-CentOS-7
 
#released updates 
[updates]
name=CentOS-$releasever - Updates - repo.huaweicloud.com
baseurl=https://repo.huaweicloud.com/centos/$releasever/updates/$basearch/
#mirrorlist=https://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates
gpgcheck=1
gpgkey=https://repo.huaweicloud.com/centos/RPM-GPG-KEY-CentOS-7
 
#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras - repo.huaweicloud.com
baseurl=https://repo.huaweicloud.com/centos/$releasever/extras/$basearch/
#mirrorlist=https://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras
gpgcheck=1
gpgkey=https://repo.huaweicloud.com/centos/RPM-GPG-KEY-CentOS-7
 
#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus - repo.huaweicloud.com
baseurl=https://repo.huaweicloud.com/centos/$releasever/centosplus/$basearch/
#mirrorlist=https://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus
gpgcheck=1
enabled=0
gpgkey=https://repo.huaweicloud.com/centos/RPM-GPG-KEY-CentOS-7

# yum 生成缓存
yum clean all && yum makecache

ceph客户端配置:

yum install -y python-setuptools   ceph-common

集群管理

# 管理节点操作
su - app && cd /home/app/ceph-cluster/
# 添加mon节点:
ceph-deploy mon add ceph-node1
# 查看mon的quorum状态
ceph quorum_status --format json-pretty 

# 删除mon节点
ceph-deploy mon remove ceph-node1

# 添加mgr节点 mgr是无状态的
ceph-deploy mgr create ceph-node1

# 踢出mgr节点
ceph mgr module disable ceph-node1 --force
ceph orch host rm ceph-node1 # 这将从 Ceph 集群中禁用指定的 MGR 模块并从 Orchestrator 中删除该节点

# 以上操作,所有对应的节点的mgr 、 mon节点服务都需要重新启动
ls /usr/lib/systemd/system/ceph*.target # 查看ceph相关的服务
systemctl restart ceph-mgr.target
systemctl restart ceph-mon.target


# osd操作按正常创建即可
ceph-deploy osd create ceph-node1 --data /dev/sdb # 创建osd使用的磁盘,sdb不需要格式化
# osd删除 1 节点磁盘。osd.0
ceph osd out 0
ceph osd dump | grep 0 # 检查osd状态

# 从集群中删除 OSD 节点
ceph osd crush remove 0 
ceph auth del osd.0
ceph orch apply osd --remove ceph-node1 

#(可选)在所有剩余的 OSD 节点上,编辑 /etc/ceph/ceph.conf 文件,移除要删除的 OSD 节点的相关配置行。

资源池 Pool 管理

# 进入用户ceph集群环境
su - app
cd /home/app/ceph-cluster/

# 1、创建资源池pool
ceph osd pool create mypool 64 64  #创建一个 Pool 资源池,其名字为 mypool,PGs 数量设置为 64,设置 PGs 的同时还需要设置 PGP(通常PGs和PGP的值是相同的):PG (Placement Group),pg 是一个虚拟的概念,用于存放 object,PGP(Placement Group for Placement purpose),相当于是 pg 存放的一种 osd 排列组合

# 3、查看资源池pool
ceph osd lspools #查看集群 Pool 信息
ceph osd pool ls #查看集群 Pool 信息
rados lspools #查看集群 Pool 信息

ceph osd pool get mypool size # 查看资源池副本的数量

ceph osd pool get mypool pg_num #查看 PG 和 PGP 数量
ceph osd pool get mypool pgp_num #查看 PG 和 PGP 数量


# 3、修改资源池pool
#修改 pg_num 和 pgp_num 的数量为 128
ceph osd pool set mypool pg_num 128
ceph osd pool set mypool pgp_num 128

ceph osd pool get mypool pg_num #查看 PG 和 PGP 数量
ceph osd pool get mypool pgp_num #查看 PG 和 PGP 数量


#修改 Pool 副本数量为 2
ceph osd pool set mypool size 2
ceph osd pool get mypool size

# 修改 Pool 默认副本数量为 2
vi ceph.conf
......
osd_pool_default_size = 2
ceph-deploy --overwrite-conf config push ceph-master ceph-node1 ceph-node2 ceph-node3 # 向所有 mon 节点同步配置,确保所有 mon 节点上的 ceph.conf 内容必须一致


# 4、删除资源池pool

------------------------------------------------------------------------------------------
> 注意:在某些情况下,由于安全原因,Ceph 可能会禁止删除存储池。如果你遇到 "Error EPERM: pool deletion is disabled" 的错误,你需要在 Ceph 配置中启用存储池删除权限。这通常涉及到在 Ceph Monitor 节点上设置 mon_allow_pool_delete 参数为 true。

# 1、登录到 Ceph Monitor 节点。
# 2、编辑 Ceph 配置文件 /home/app/ceph-cluster/ceph.conf:
su - app
cd /home/app/ceph-cluster/
vi ceph.conf
# 3、在配置文件中找到或添加以下行,并将值设置为 true:
[mon]
mon_allow_pool_delete = true
# 4、保存并关闭配置文件。
# 5、将配置文件推送到各个节点
ceph-deploy --overwrite-conf config push ceph-master ceph-node1 ceph-node2 ceph-node3 # 向所有 mon 节点同步配置,确保所有 mon 节点上的 ceph.conf 内容必须一致
# 6、重新加载 Ceph 配置以应用更改:
systemctl restart ceph-mon.target # 所有节点都执行
------------------------------------------------------------------------------------------
# 删除语法
ceph osd pool delete <pool-name> <pool-name> --yes-i-really-really-mean-it
------------------------------------------------------------------------------------------

ceph osd pool rm mypool mypool --yes-i-really-really-mean-it # 执行删除 Pool 命令

存储管理

块存储(RBD - Rados Block Device)

创建 RBD 块存储及挂载

语法:

# 创建 RBD 存储池:
ceph osd pool create <pool-name> <pg-num> <pgp-num>
# 在 RBD 存储池中创建映像:
rbd create --size <size-in-GB> <image-name> --pool=<pool-name>
# 将 RBD 映像映射到客户端节点:
rbd map <image-name> --pool=<pool-name>
# 在客户端节点上格式化和挂载 RBD 映像:
mkfs.ext4 /dev/rbd/<mapped-image-name>
mkdir /mnt/<mount-point>
mount /dev/rbd/<mapped-image-name> /mnt/<mount-point>


# <size-in-GB> 是你想要创建的 RBD 映像的大小(以 GB 为单位)。
# <image-name> 是你想要为 RBD 映像指定的名称。
# <pool-name> 是你想要在其中创建 RBD 映像的现有存储池名称。

示例:

管理节点部分:
su - app && cd /home/app/ceph-cluster/
# 创建RBD存储池
ceph osd pool create rbd 128 128
rados lspools
# 在 RBD 存储池中创建映像:
rbd create --size 5GB image --pool=rbd
# 或 rbd create --size 5GB image --pool=rbd --image-feature layering
# --image-feature layering: 启用 layering 功能。layering 是 RBD 的一项特性,允许在现有映像之上创建增量层,这对于快照和克隆操作非常有用。

# 创建可访问用户(可选)
ceph auth get-or-create client.rbd_linux_mount mon 'profile rbd' osd 'profile rbd pool=rbd' mgr 'profile rbd pool=rbd' # 用户名称为lient.rbd_linux_mount 授权pool为rbd
ceph auth get-or-create client.rbd_linux_mount -o ceph.client.rbd_linux_mount.keyring  # 导出信息为文件 

#列出所有镜像
rbd list

客户端挂载配置:

# 客户端主机操作 
# 前提 : 客户端工具已部署,见   存储客户端配置

scp ceph-master:/home/app/ceph-cluster/ceph.conf /etc/ceph/ # 复制集群文件到客户端主机
scp ceph-master:/home/app/ceph-cluster/ceph.client.admin.keyring /etc/ceph/ # 以集群admin用户密钥验证挂载时 (危险,建议生产用户隔离)
# 可访问用户(可选)
scp ceph-master:/home/app/ceph-cluster/ceph.client.rbd_linux_mount.keyring /etc/ceph/

ceph -s # 验证是否连接集群

rbd list --id  image -p rbd # 检查是否可以获取到rbd信息

rbd map image # 客户端访问映射服务器的image共享镜像

rbd showmapped    #查看磁盘名和共享镜像名称的对应关系

mkfs.xfs /dev/rbd0        #格式化,xfs(可以格式化其他格式)

mkdir /data01 # 创建客户端 mount-point

mount /dev/rbd0 /data01/        #挂载(可以挂载到任意目录)

echo "test1" > /data01/test.txt #测试写入数据

cat /data01/test.txt            #查看数据

echo "/dev/rbd0 /data01                    xfs    defaults        0 0" >> /etc/fstab # 设置开机自动挂载

修改 RBD 块存储

语法:

# 扩展 RBD 映像的大小:
rbd resize <image-name> --pool=<pool-name> --size <new-size-in-GB>
# 设置或修改 RBD 映像的元数据标签:
rbd label set <image-name> --pool=<pool-name> <key>=<value>

示例:

rbd resize image --pool=rbd --size 15G # 扩容到15G
rbd resize image --pool=rbd --size 3G --allow-shrink    #allow(允许),shrink(缩小)

rbd label set image --pool=rbd --label environment=production # 为 "image" 映像设置一个名为 "environment"、值为 "production" 的标签
# 或 rbd label set image --pool=rbd environment=production 

删除 RBD 块存储

语法:

#  删除 RBD 映像
rbd rm <image-name> --pool=<pool-name>
# 其中 <image-name> 是你想要删除的 RBD 映像的名称,<pool-name> 是该映像所在的存储池名称。

示例:

rbd rm image --pool=rbd # 删除image镜像

文件存储(CephFS)

创建 CephFS 文件系统及挂载

语法:

# 创建 RBD 存储池:
ceph osd pool create <pool-name> <pg-num> <pgp-num>
# 创建 CephFS 文件系统:
ceph fs new <filesystem-name> <metadata-pool-name> <data-pool-name>
# 挂载 CephFS 文件系统到客户端节点:
mount -t ceph <mon-ip-or-hostname>:<path-to-keyring-file>:/ <mount-point> -o name=<client-name>,secret=<client-secret>

示例:

文件系统需要至少2个池

        - 一个池用于存储数据

        - 一个池用于存储元数据
###############################################################        
ceph osd pool create cephfs_data 64 64 # 创建存储池,共享池的名称为cephfs_data,对应有64个PG,64个PGP
ceph osd pool create cephfs_metadata 64 64 # 创建存储池,共享池的名称为cephfs_metadata,对应有64个PG,64个PGP
ceph osd lspools #查看存储池
ceph fs new cephfs cephfs_metadata cephfs_data # cephfs是名称,名称可以任意,注意,先写metadata池,再写data池、fs文件系统 注意: 默认,一个pool只能创建1个文件系统,多余的会报错
ceph mds stat # 查看Cephfs状态
ceph fs ls # 查看cephfs文件系统
ceph fs status cephfs # 查看cephfs状态
ceph fs dump # cephfs 详情
ceph mon dump # ceph mon服务的地址和接口 后续挂载需要时使用

# 创建可访问用户(可选)
ceph auth get-or-create client.cephfs_linux_mount mon 'allow r' mds 'allow rw' osd 'allow rwx pool=cephfs_data' # 用户名称为lient.cephfs_linux_mount 授权pool为cephfs_data
ceph auth get client.cephfs_linux_mount # 查看cephfs_linux_mount用户权限
ceph auth get-or-create client.cephfs_linux_mount -o ceph.client.cephfs_linux_mount.keyring  # 导出信息为文件 

客户端挂载配置:

mkdir /mnt/cephfs
scp ceph-master:/home/app/ceph-cluster/ceph.client.admin.keyring /etc/ceph/ # 以集群admin用户密钥验证挂载时 (危险,建议生产用户隔离)
mount -t ceph 192.168.100.80:6789:/ /mnt/cephfs -o name=admin,secret=`awk 'NR==2 {print $3}' /etc/ceph/ceph.client.admin.keyring`
# 或 mount -t ceph 192.168.100.80:6789:/ /mnt/cephfs -o name=admin,secretfile='/etc/ceph/ceph.client.admin.keyring'

# 配置可访问用户(可选)
scp ceph-master:/home/app/ceph-cluster/ceph.client.cephfs_linux_mount.keyring /etc/ceph/
mount -t ceph 192.168.100.80:6789:/ /mnt/cephfs -o name=cephfs_linux_mount,secret=`awk 'NR==2 {print $3}' /etc/ceph/ceph.client.cephfs_linux_mount.keyring`
# 或 mount -t ceph 192.168.100.80:6789:/ /mnt/cephfs -o name=cephfs_linux_mount,secretfile='/etc/ceph/ceph.client.cephfs_linux_mount.keyring'

#注意:-t(type)指定文件系统类型,文件系统类型为ceph
# -o(option)指定mount挂载命令的选项,选项包括name账户名和secret密码
# 192.168.100.80为MON节点的IP(不是MDS节点),6789是MON服务的端口号
# admin是用户名,secret是秘钥
# 秘钥可以在/etc/ceph/ceph.client.admin.keyring中

修改 CephFS 文件系统

语法:


# 修改文件系统的元数据池:
ceph fs set <filesystem-name> metadata_pool <new-metadata-pool-name>
# 修改文件系统的数据池:
ceph fs set <filesystem-name> data_pools <new-data-pool-name>

# <filesystem-name> 是你想要创建的 CephFS 文件系统的名称。
# <data-pool-name> 是用于存储 CephFS 数据的现有存储池名称。
# <metadata-pool-name> 是用于存储 CephFS 元数据的现有存储池名称。

示例:

ceph fs set cephfs metadata_pool cephfs_metadata_new # 修改文件系统的元数据池
ceph fs set cephfs metadata_pool cephfs_data # 修改文件系统的数据池

删除 CephFS 文件系统

语法:

ceph fs rm <filesystem-name> --yes-i-really-really-mean-it

# 其中 <filesystem-name> 是你想要删除的 CephFS 文件系统的名称。 注意:删除文件系统操作是不可逆的,所有与该文件系统关联的数据都将被永久删除。在执行此操作之前,请确保你不再需要任何与该文件系统相关联的数据。

示例:

ceph fs rm cephfs --yes-i-really-really-mean-it

对象存储(RGW - RADOS Gateway)

初始化 RADOS 对象存储

步骤:

# 安装 RGW
# 使用 ceph-deploy:
ceph-deploy rgw create <rgw-node>
# 其中 <rgw-node> 是你想要部署 RGW 的节点名称。

# 配置 RGW:
# 编辑 Ceph 配置文件 /home/app/ceph-cluster/ceph.conf,确保包含以下部分:
[global]
fsid = <your-fsid>
mon_initial_members = <mon-hostname-or-ip>
mon_host = <mon-hostname-or-ip>

[client.radosgw.gateway]
keyring = /etc/ceph/radosgw.keyring
log_file = /var/log/ceph/radosgw.log
rgw_frontends = "civetweb port=8080"

# 替换 <your-fsid>、<mon-hostname-or-ip> 为你的实际值。


# 创建 RGW 用户和密钥:
# 在 Ceph 管理节点上,创建一个用于 RGW 的用户和密钥:
ceph auth get-or-create client.radosgw.gateway mon 'allow rwx' osd 'allow rwx' -o /etc/ceph/radosgw.keyring

# 在部署 RGW 的节点上,启动 RGW 服务:
systemctl start radosgw
# 设置开机启动:
systemctl enable radosgw
# 检查 RGW 服务是否已成功启动:
systemctl status radosgw

示例:

ceph-deploy rgw create ceph-node1 ceph-node2 ceph-node3  # 已初始化,可不操作 # 其中 <rgw-node> 是你想要部署 RGW 的节点名称。

vi /home/app/ceph-cluster/ceph.conf  # 编辑配置文件,添加rgw部分配置
[global]
fsid = 29ec3429-e970-472a-9af0-07f8ff66990c
public_network = 192.168.100.0/24
cluster_network = 192.168.10.0/24
mon_initial_members = ceph-master
mon_host = 192.168.100.80
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx

# pool_size
osd_pool_default_size = 2

[mon]
mon_allow_pool_delete = true


[client.radosgw.gateway]
keyring = /etc/ceph/radosgw.keyring
log_file = /var/log/ceph/radosgw.log
rgw_frontends = "civetweb port=8080

ceph-deploy --overwrite-conf config push ceph-master ceph-node1 ceph-node2 ceph-node3 # 向所有 mon 节点同步配置,确保所有 mon 节点上的 ceph.conf 内容必须一致

# 创建 RGW 用户和密钥:
# 在 Ceph 管理节点上,创建一个用于 RGW 的用户和密钥:
ceph auth get-or-create client.radosgw.gateway mon 'allow rwx' osd 'allow rwx' -o /etc/ceph/radosgw.keyring

# 在部署 RGW 的节点上,启动 RGW 服务:
systemctl start radosgw
# 设置开机启动:
systemctl enable radosgw
# 检查 RGW 服务是否已成功启动:
systemctl status radosgw

创建 RGW 对象存储

语法:

# 安装 RGW
ceph-deploy rgw create <rgw-node> # 已初始化,可不操作
# 其中 <rgw-node> 是你想要部署 RGW 的节点名称。

# 创建用户:
radosgw-admin user create --uid=<user-id> --display-name=<user-name> --email=<email-address>
# 其中:
# <user-id> 是你想要为用户指定的唯一标识符。
# <user-name> 是用户可见的显示名称。
# <email-address> 是用户的电子邮件地址。

# 创建桶:
radosgw-admin bucket create --bucket=<bucket-name> --uid=<user-id>
# 其中 <bucket-name> 是你想要创建的桶的名称,<user-id> 是该桶所属的用户的 ID。

示例:


# 创建用户:
radosgw-admin user create --uid=rgw_test_user --display-name=rgw_user1
# 其中:
# <user-id> 是你想要为用户指定的唯一标识符。
# <user-name> 是用户可见的显示名称。

radosgw-admin bucket create --bucket=rgw_1 --uid=<user-id>

修改 RGW 对象存储

# 修改用户属性:
radosgw-admin user modify --uid=<user-id> [--display-name=<new-display-name>] [--email=<new-email-address>] [...other-options]
# 修改桶属性:
radosgw-admin bucket modify --bucket=<bucket-name> [--uid=<new-user-id>] [--policy=<new-policy>] [...other-options]

删除 RGW 对象存储

语法:

# 删除用户:
radosgw-admin user rm --uid=<user-id>
# 删除桶:
radosgw-admin bucket rm --bucket=<bucket-name> [--purge-data] [--force]
# 注意:--purge-data 和 --force 选项分别用于删除桶中的所有数据并强制删除正在使用的桶。

示例:

# 创建用户:
radosgw-admin user rm --uid=rgw_test_user
# 其中:
# <user-id> 是你想要为用户指定的唯一标识符。
# <user-name> 是用户可见的显示名称。

radosgw-admin bucket rm --bucket=rgw_1
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值