一、Ceph介绍

        在过去几年中,数据存储需求急剧增长。研究表明,大型组织中的数据正以每年40%到60%的速度增长,许多公司每年的数据都翻了一番。国际数据公司(IDC)的分析师估计,到2000年,全球共有54.4 exabytes 的数据。到2007年,这 一数字达到295艾字节,到2020年,全球预计将达到44 zettabytes。传统的存储系统无法管理这样的数据增长;我们需 要一个像Ceph这样的系统,它是分布式的,可扩展的,最重要的是,在经济上是可行的。Ceph是专门为处理当今和 未来的数据存储需求而设计的

1ZB=1024EB 1EB=1024PB 1PB=1024TB

(1) 软件定义存储 -SDS

        SDS是减少存储基础设施的TCO(总体成本)所需要的。除了降低存储成本外,SDS还可以提供灵活性、可伸缩性和可靠性。Ceph是一种真正的SDS;它运行在没有厂商锁定的普通硬件上。与传统的存储系统(硬件与软件结合在一起)不同, 在SDS中,您可以从任何制造商中自由选择硬件,也可以根据自己的需要自由设计异构硬件解决方案。Ceph在此硬件 之上的软件定义存储提供了您需要的所有,并将负责所有事情,从软件层提供了所有企业存储特性。

(2)云存储

        目前已经和开源云架构 OpenStack 结合起来,成为 Openstack后端存储的标配,并且又同时支持用于 kubernetes 动态存储

        Ceph提供了出色的性能、巨大的可伸缩性、强大的功能和灵活性。它摆脱昂贵的专有存储。Ceph确实是一个企业级的存储解决方案,可以在普通硬件上运行;这是一个低成本但功能丰富的存储系统。Ceph的通用存储系统提供块存储、文 件存储和对象存储,使客户可以随心所欲地使用存储。

Ceph 正在快速发展和改进,目前发布了十三个版本,每个长期版本都有一个名称,该名称遵循字母顺序发行。Ceph 的吉祥物是章鱼。

Ceph Luminous(二)_对象存储

二、Ceph架构
2.1 Ceph组件

Ceph monitors(MON):Ceph监视器通过保存集群状态的映射来跟踪整个集群的健康状况

Ceph对象存储设备(OSD): 一旦应用程序向Ceph集群发出写操作,数据就以对象的形式存储在OSD中。这是Ceph集群中存储实际用户数据的惟一组件,通常,一个OSD守护进程绑定到集群中的一个物理磁盘。因此,通常来说,Ceph集群中物理磁盘的总数与在每个物理磁盘上存储用户数据的OSD守护进程 的总数相同。

Ceph metadata server (MDS): MDS跟踪文件层次结构,仅为Ceph FS文件系统存储元数据

RADOS: RADOS对象存储负责存储这些对象,而不管它们的数据类型如何。RADOS层确保数据始终保持一致。为此,它执行数据复制、故障检测和恢复,以及跨集群节点的数据迁移和再平衡

Librados: librados库是一种访问RADOS的方便方法,支持PHP、Ruby、Java、Python、C和c++编程语言。它为Ceph存储集群(RADOS)提供了本机接口,并为其他服务提供了基础,如RBD、RGW和CephFS,这些服务构建 在librados之上。librados还支持从应用程序直接访问RADOS,没有HTTP开销。

RBD:提供持久块存储,它是瘦配置的、可调整大小的,并在多个osd上存储数据条带。RBD服务被构建为一个在librados之上的本机接口

RGW:RGW提供对象存储服务。它使用librgw (Rados网关库)和librados,允许应用程序与Ceph对象存储建立连接。RGW提供了与Amazon S3和OpenStack Swift兼容的RESTful api接口。

CephFS: Ceph文件系统提供了一个符合posix标准的文件系统,它使用Ceph存储集群在文件系统上存储用户数据。与RBD和RGW一样,CephFS服务也作为librados的本机接口实现

Ceph manager: Ceph manager守护进程(Ceph -mgr)是在Kraken版本中引入的,它与monitor守护进程一起运行,为外部监视和管理系统提供额外的监视和接口

Ceph Luminous(二)_块设备_02

三、Ceph部署

Ceph Luminous(二)_数据_03

环境准备补充:
环境配置脚本:
https://raw.githubusercontent.com/aishangwei/ceph-demo/master/ceph-deploy/pre_all_node.sh

1.如果是创建用户来部署ceph,环境变量用来export
useradd ${username}
echo "${passwd}" | passwd --stdin ${username}
echo "${username} ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/${username}
chmod 0440 /etc/sudoers.d/${username}

2.如果有防火墙
#firewall-cmd --znotallow=public --add-port=6789/tcp --permanent
#firewall-cmd --znotallow=public --add-port=6800-7100/tcp --permanent
#firewall-cmd --reload
#firewall-cmd --znotallow=public --list-all

3.ceph源站地址
wget -O /etc/yum.repos.d/ceph.repo https://raw.githubusercontent.com/aishangwei/ceph-demo/master/ceph-deploy/ceph.repo

3.1 使用ceph-deploy部署集群

# 之前部署我采用yum直接安装,原因是网络不好
# 安装依赖包
yum install -y ceph-deploy python-pip

# 部署节点
ceph-deploy new master node1 node2
# 网络不好可以用yum命令代替:yum install ceph ceph-radosgw -y

# cat ceph.conf
public_network = 192.168.10.0/24
cluster_network = 192.168.1.0/24

# 安装monitor节点
ceph-deploy mon create-initial
# 将信息拷贝到各个节点
ceph-deploy admin master node1 node2

# 配置osd
for dev in /dev/sdb /dev/sdc /dev/sdd
do
ceph-deploy disk zap master $dev
ceph-deploy osd create master --data $dev
ceph-deploy disk zap node1 $dev
ceph-deploy osd create node1 --data $dev
ceph-deploy disk zap node2 $dev
ceph-deploy osd create node2 --data $dev
done

#部署mgr,L版以后才需要部署
ceph-deploy mgr create master node1 node2

# 开启dashboard模块,用UI查看
ceph mgr module enable dashboard
curl http://IP:7000

3.2 安装ceph块存储客户端

Ceph块设备,以前称为RADOS块设备,为客户机提供可靠的、分布式的和高性能的块存储磁盘。RADOS块设备利用librbd库并以顺序的形式在Ceph集群中的多个osd上存储数据块。RBD是由Ceph的RADOS层支持的,因此每个块设备 都分布在多个Ceph节点上,提供了高性能和优异的可靠性。RBD有Linux内核的本地支持,这意味着RBD驱动程序从 过去几年就与Linux内核集成得很好。除了可靠性和性能之外,RBD还提供了企业特性,例如完整和增量快照、瘦配 置、写时复制克隆、动态调整大小等等。RBD还支持内存缓存,这大大提高了其性能:

Ceph Luminous(二)_块设备_04

任何普通的Linux主机(RHEL或基于debian的)都可以充当Ceph客户机。客户端通过网络与Ceph存储集群交互以存储或检索用户数据。Ceph RBD支持已经添加到Linux主线内核中,从2.6.34和以后的版本开始。

# 创建ceph块客户端用户名和密码
[root@master ceph]# ceph auth get-or-create client.rbd mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=rbd' | tee ./ceph.client.rbd.keyring
# 将秘钥传送到客户端,客户端目录可以手动创建
[root@master ceph]# scp ceph.client.rbd.keyring node3:/etc/ceph/

# 检查是否符合块设备环境要求
uname -r
modprobe rbd
echo $?

# 安装ceph客户端
wget -O /etc/yum.repos.d/ceph.repo https://raw.githubusercontent.com/aishangwei/ceph-demo/master/ceph-deploy/ceph.repo
yum install -y ceph
# 将ceph.conf配置文件拷贝至node3
[root@node3 ceph]# cat ceph.conf
[global]
fsid = 960a81c9-337e-4424-bc26-d7d544dc5ff5
public_network = 192.168.10.0/24
cluster_network = 192.168.1.0/24
mon_initial_members = master
mon_host = 192.168.10.10
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx

osd_pool_default_min_size = 2
osd_pool_default_size = 3
mon_clock_drift_allowed = 5
osd_pool_default_crush_rule = 0
osd_crush_chooseleaf_type =1

[root@node3 ceph]# ceph -s --name client.rbd
cluster:
id: 960a81c9-337e-4424-bc26-d7d544dc5ff5
health: HEALTH_OK

services:
mon: 1 daemons, quorum master
mgr: master(active)
osd: 5 osds: 5 up, 5 in

data:
pools: 1 pools, 128 pgs
objects: 3 objects, 19B
usage: 5.03GiB used, 95.0GiB / 100GiB avail
pgs: 128 active+clean

io:
client: 0B/s rd, 0op/s rd, 0op/s wr

3.3 客户端创建块设备及映射---硬盘切割并挂载

# (1)创建块设备
# 默认创建块设备,会直接创建在 rbd 池中,但使用 deploy 安装后,该rbd池并没有创建
# 创建池和块
ceph osd lspools # 查看集群存储池
ceph osd pool create rbd 128 # 128 为 place group 数量,由于我们后续测试,也需要更多的pg,所以这里设置为128
确定 pg_num 取值是强制性的,因为不能自动计算。下面是几个常用的值:
• 少于 5 个 OSD 时可把 pg_num 设置为 128
• OSD 数量在 510 个时,可把 pg_num 设置为 512
• OSD 数量在 1050 个时,可把 pg_num 设置为 4096
• OSD 数量大于 50 时,你得理解权衡方法、以及如何自己计算 pg_num 取值

# 客户端创建块设备
[root@node3 ceph]# rbd create rbd1 --size 10240 --name client.rbd
[root@node3 ceph]# rbd ls -p rbd --name client.rbd
rbd1
[root@node3 ceph]# rbd --image rbd1 info --name client.rbd
rbd image 'rbd1':
size 10GiB in 2560 objects
order 22 (4MiB objects)
block_name_prefix: rbd_data.10a36b8b4567
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
flags:
create_timestamp: Tue Aug 16 10:21:09 2022

# (2)映射块设备
# 映射到客户端,应该会报错
rbd map --image rbd1 --name client.rbd
• layering: 分层支持
• exclusive-lock: 排它锁定支持对
• object-map: 对象映射支持(需要排它锁定(exclusive-lock))
• deep-flatten: 快照平支持(snapshot flatten support)
• fast-diff: 在client-node1上使用krbd(内核rbd)客户机进行快速diff计算(需要对象映射),我们将无法在CentOS内核3.10
上映射块设备映像,因为该内核不支持对象映射(object-map)、深平(deep-flatten)和快速diff(fast-diff)(在内核4.9中引
入了支持)。为了解决这个问题,我们将禁用不支持的特性,有几个选项可以做到这一点:
1)动态禁用
rbd feature disable rbd1 exclusive-lock object-map deep-flatten fast-diff --name client.rbd
2) 创建RBD镜像时,只启用 分层特性。
rbd create rbd2 --size 10240 --image-feature layering --name client.rbd
3)ceph 配置文件中禁用
rbd_default_features = 1

# 我们这里动态禁用
[root@node3 ceph]# rbd feature disable rbd1 exclusive-lock object-map deep-flatten fast-diff --name client.rbd
[root@node3 ceph]# rbd map --image rbd1 --name client.rbd
/dev/rbd0
# rbd1映射到rbd0上了
[root@node3 ceph]# rbd showmapped --name client.rbd
id pool image snap device
0 rbd rbd1 - /dev/rbd0
[root@node3 ceph]# 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
sr0 11:0 1 973M 0 rom
rbd0 252:0 0 10G 0 dis

# 创建文件系统并挂载
[root@node3 ceph]# mkfs.xfs /dev/rbd0
root@node3 ceph]# mkdir /db/ceph-disk1 -p
[root@node3 ceph]# mount /dev/rbd0 /db/ceph-disk1
[root@node3 ceph]# df -h /db/ceph-disk1/
文件系统 容量 已用 可用 已用% 挂载点
/dev/rbd0 10G 33M 10G 1% /db/ceph-disk1
# 写入数据测试
[root@node3 ceph]# dd if=/dev/zero of=/db/ceph-disk1/file1 count=100 bs=1M
# 做成服务,开机自动挂载
wget -O /usr/local/bin/rbd-mount https://raw.githubusercontent.com/aishangwei/ceph-demo/master/client/rbd-mount
# 修改rbd-mount中keyring为对应名称,挂载位置
chmod +x /usr/local/bin/rbd-mount
[root@node3 ceph]# wget -O /etc/systemd/system/rbd-mount.service https://raw.githubusercontent.com/aishangwei/ceph-demo/master/client/rbd-mount.service
[root@node3 ceph]# systemctl daemon-reload
[root@node3 ceph]# systemctl enable rbd-mount.service
# 测试
[root@node3 ceph]# umount /db/ceph-disk1
[root@node3 ceph]# systemctl start rbd-mount.service

3.4 部署ceph对象存储

        作为文件系统的磁盘,操作系统不能直接访问对象存储。相反,它只能通过应用程序级别的API访问。Ceph是一种分布式对象存储系统,通过Ceph对象网关提供对象存储接口,也称为RADOS网关(RGW)接口,它构建在Ceph RADOS层之 上。RGW使用librgw (RADOS Gateway Library)和librados,允许应用程序与Ceph对象存储建立连接。RGW为应用程序提 供了一个RESTful S3 / swift兼容的API接口,用于在Ceph集群中以对象的形式存储数据。Ceph还支持多租户对象存储, 可以通过RESTful API访问。此外,RGW还支持Ceph管理API,可以使用本机API调用来管理Ceph存储集群。

       librados软件库非常灵活,允许用户应用程序通过C、c++、Java、Python和PHP绑定直接访问Ceph存储集群。Ceph对象存储还具有多站点功能,即为灾难恢复提供解决方案

Ceph Luminous(二)_对象存储_05

        对于生产环境,建议在物理专用机器上配置RGW;如果对象存储工作负载不大,可以考虑将监视器机器作为rgw节点使用。RGW是一个独立的服务,它从外部链接到Ceph集群,并向客户端提供对象存储访问,在生产环境中,建议运行多个RGW实例,由负载均衡屏蔽

Ceph Luminous(二)_块设备_06

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

# 部署
[root@master ceph]# ceph-deploy rgw create master node1 node2
[root@master ceph]# netstat -ntlp | grep 7480
tcp 0 0 0.0.0.0:7480 0.0.0.0:* LISTEN 62762/radosgw
# 如果想改成配置80端口
vi /etc/ceph/ceph.conf
…….
[client.rgw.node1]
rgw_frontends = "civetweb port=80"
# 修改完成重启服务
systemctl restart ceph-radosgw@node1.service

# 创建池,为对象存储做服务
wget https://raw.githubusercontent.com/aishangwei/ceph-demo/master/ceph-deploy/rgw/pool
wget https://raw.githubusercontent.com/aishangwei/ceph-demo/master/ceph-deploy/rgw/create_pool.sh
[root@master ceph]# cat pool
.rgw
.rgw.root
.rgw.control
.rgw.gc
.rgw.buckets
.rgw.buckets.index
.rgw.buckets.extra
.log
.intent-log
.usage
.users
.users.email
.users.swift
.users.uid

[root@master ceph]# cat create_pool.sh
#!/bin/bash

PG_NUM=250
PGP_NUM=250
SIZE=3

for i in `cat /data/ceph/pool`
do
ceph osd pool create $i $PG_NUM
ceph osd pool set $i size $SIZE
done

for i in `cat /data/ceph/pool`
do
ceph osd pool set $i pgp_num $PGP_NUM
done

[root@master ceph]# chmod +x create_pool.sh
[root@master ceph]# ./create_pool.sh
Error ERANGE: pg_num 250 size 3 would mean 1980 total pgs, which exceeds max 1500 (mon_max_pg_per_osd 250 * num_in_osds 6)
Error ENOENT: unrecognized pool '.rgw.control'
# pg总共能使用的1500个,之前创建池使用了128,pool池中有14个
[root@master ceph]# ceph pg stat
410 pgs: 410 active+clean; 114MiB data, 6.39GiB used, 114GiB / 120GiB avail; 0B/s rd, 0op/s

#查看当前osd状态
[root@master ceph]# ceph osd dump | grep pool
# 删除池
[root@master ceph]# ceph osd lspools # 查看pool池
1 rbd,2 .rgw.root,3 default.rgw.control,4 default.rgw.meta,5 default.rgw.log,6 .rgw,
# 只允许当前客户端执行删除操作,所以所有节点直接修改 /etc/ceph/ceph.conf
[mon]
mon allow pool delete = true
# 所有节点运行
systemctl restart ceph-mon.target
# 删除poold
[root@master ceph]# cat delete_pool.sh
#!/bin/bash

PG_NUM=30
PGP_NUM=30
SIZE=3

for i in `cat /data/ceph/pool`
do
ceph osd pool delete $i $i --yes-i-really-really-mean-it
done

# 将脚本都改成PG_NUM/PGP_NUM=30个,防止后面还有需要
[root@master ceph]# ./delete_pool.sh
# 设置允许最大 Objects 数量为 100
ceph osd pool set-quota test-pool max_objects 100

# 设置允许最大容量限制为 10GB
ceph osd pool set-quota test-pool max_bytes $((10 * 1024 * 1024 * 1024))

# 取消配额限制只需要把对应值设为 0 即可

# pool重命名
ceph osd pool rename test-pool test-pool-new
[root@master ceph]# ceph osd pool create rbd 50
pool 'rbd' created
#脚本修改create_pool.sh
PG_NUM=50
PGP_NUM=50
SIZE=3
[root@master ceph]# ./create_pool.sh
[root@master ceph]# ceph osd lspools
3 default.rgw.control,4 default.rgw.meta,5 default.rgw.log,7 rbd,8 .rgw,9 .rgw.root,10 .rgw.control,11 .rgw.gc,12 .rgw.buckets,13 .rgw.buckets.index,14 .rgw.buckets.extra,15 .log,16 .intent-log,17 .usage,18 .users,19 .users.email,20 .users.swift,21 .users.uid,
# 测试是否能访问ceph集群
[root@master ceph]# cp /var/lib/ceph/radosgw/ceph-rgw.master/keyring /data/ceph/
[root@master ceph]# ceph -s -k keyring --name client.rgw.master
cluster:
id: 960a81c9-337e-4424-bc26-d7d544dc5ff5
health: HEALTH_OK

services:
mon: 1 daemons, quorum master
mgr: master(active)
osd: 6 osds: 6 up, 6 in
rgw: 3 daemons active

data:
pools: 18 pools, 494 pgs
objects: 183 objects, 0B
usage: 6.09GiB used, 114GiB / 120GiB avail
pgs: 494 active+clean

io:
client: 101KiB/s rd, 0B/s wr, 101op/s rd, 67op/s wr

3.5 使用S3 API访问Ceph对象存储

# 创建radosgw用户
[root@master ceph]# radosgw-admin user create --uid=radosgw --display-name="Radosgw"
{
"user_id": "radosgw",
"display_name": "Radosgw",
"email": "",
"suspended": 0,
"max_buckets": 1000,
"auid": 0,
"subusers": [],
"keys": [
{
"user": "radosgw",
"access_key": "K4G0JGBPIUF4H3C6L9FQ",
"secret_key": "d7BVtXpNvwJaKKPDfHqXDkQzOJKNz2dbRkpE8e6k"
}
],
注意:请把 access_key 和 secret_key 保存下来 ,如果忘记可使用:radosgw-admin user info --uid= --display-name=

# 安装s3cmd客户端
[root@node3 ceph]# yum install s3cmd -y
[root@node3 ceph]# s3cmd --configure
[root@node3 ceph]# s3cmd --configure

Enter new values or accept defaults in brackets with Enter.
Refer to user manual for detailed description of all options.

Access key and Secret key are your identifiers for Amazon S3. Leave them empty for using the env variables.
Access Key: K4G0JGBPIUF4H3C6L9FQ
Secret Key: d7BVtXpNvwJaKKPDfHqXDkQzOJKNz2dbRkpE8e6k
Default Region [US]: ZH

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

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]:

Encryption password is used to protect your files from reading
by unauthorized persons while in transfer to S3
Encryption password:
Path to GPG program [/usr/bin/gpg]:

When using secure HTTPS protocol all communication with Amazon S3
servers is protected from 3rd party eavesdropping. This method is
slower than plain HTTP, and can only be proxied with Python 2.7 or newer
Use HTTPS protocol [Yes]: no

On some networks all internet access must go through a HTTP proxy.
Try setting it here if you can't connect to S3 directly
HTTP Proxy server name:

New settings:
Access Key: K4G0JGBPIUF4H3C6L9FQ
Secret Key: d7BVtXpNvwJaKKPDfHqXDkQzOJKNz2dbRkpE8e6k
Default Region: US
S3 Endpoint: s3.amazonaws.com
DNS-style bucket+hostname:port template for accessing a bucket: %(bucket)s.s3.amazonaws.com
Encryption password:
Path to GPG program: /usr/bin/gpg
Use HTTPS protocol: False
HTTP Proxy server name:
HTTP Proxy server port: 0

Test access with supplied credentials? [Y/n] n

Save settings? [y/N] y
Configuration saved to '/root/.s3cfg'
#  编辑 .s3cfg 文件,修改 host_base 和 host_bucket
bucket_location = US
host_base = master.ceph.com:7480
host_bucket = %(bucket)s.master.ceph.com:7480

# 创建桶并放入文件
[root@node3 ceph]# s3cmd mb s3://first-bucket
ERROR: S3 error: 416 (InvalidRange)
解决方法:
在ceph.conf中增加mon_max_pg_per_osd值增加到300以上就行
mon_max_pg_per_osd = 300
ceph-deploy --overwrite-conf config push master node1 node2 node3
systemctl restart ceph-mon.target

# 解决上面问题后
s3cmd mb s3://first-bucket # 创建bucket
s3cmd ls # 查看拥有的bucket
s3cmd put /etc/hosts s3://first-bucket # 上传文件至first-bucket
s3cmd get s3://first-bucket/hosts # 下载文件到本地
s3cmd ls s3://first-bucket # 查看first-bucket中有哪些文件
s3cmd rb s3://three-bucket # 删除bucket
s3cmd la # 列出所有bucket中所有文件,一般不要用
s3cmd del s3://first-bucket/hosts #删除文件

3.6 使用Swift API访问对象存储

# 创建 swift api 子用户随便哪个节点都行
注意:请把 secret_key 保存下来 ,如果忘记可使用:radosgw-admin user info --uid ...
[root@master ceph]# radosgw-admin subuser create --uid=radosgw --subuser=radosgw:swift --access=full
{
"user_id": "radosgw",
"display_name": "Radosgw",
"email": "",
"suspended": 0,
"max_buckets": 1000,
"auid": 0,
"subusers": [
{
"id": "radosgw:swift",
"permissions": "full-control"
}
],
"keys": [
{
"user": "radosgw",
"access_key": "K4G0JGBPIUF4H3C6L9FQ",
"secret_key": "d7BVtXpNvwJaKKPDfHqXDkQzOJKNz2dbRkpE8e6k"
}
],
"swift_keys": [
{
"user": "radosgw:swift",
"secret_key": "bJe7C1tZI7CDgNy5ESAULXuFRdVIQX04d0wmo3JK"
}
],
[root@node3 ceph]# yum install python3-pip -y
[root@node3 ceph]# pip3 install --upgrade python-swiftclient
[root@master ceph]# radosgw-admin user info --uid=radosgw # 查看信息
[root@node3 ceph]# swift -A http://master.ceph.com:7480/auth/1.0 -U radosgw:swift -K bJe7C1tZI7CDgNy5ESAULXuFRdVIQX04d0wmo3JK list
first-bucket
[root@node3 ceph]# swift -A http://master.ceph.com:7480/auth/1.0 -U radosgw:swift -K bJe7C1tZI7CDgNy5ESAULXuFRdVIQX04d0wmo3JK post second-bucket
[root@node3 ceph]# swift -A http://master.ceph.com:7480/auth/1.0 -U radosgw:swift -K bJe7C1tZI7CDgNy5ESAULXuFRdVIQX04d0wmo3JK list
first-bucket
second-bucket
[root@node3 ceph]# s3cmd ls
2022-08-16 06:21 s3://first-bucket
2022-08-16 06:57 s3://second-bucket

3.7 通过内核驱动和FUSE客户端挂载Ceph FS

---挂载的目录内容操作同步

# 在Linux内核2.6.34和以后的版本中添加了对Ceph的本机支持。下面命令需要先看3.9生成的ceph.client.cephfs.keyring
ceph auth get-or-create client.cephfs mon 'allow r' mds 'allow r, allow rw path=/' osd 'allow rw pool=cephfs_data' -o ceph.client.cephfs.keyring
--name=cephfs 用户名,挂载的时候需要用到
[root@master ceph]# ceph auth get-key client.cephfs
AQDeRvtiTL/1HBAAJw011chcoWhLZD6r6f8zhA==
# 挂载硬盘
[root@node3 ceph]# mount -t ceph master:6789:/ /db/cephfs -o name=cephfs,secret=AQDeRvtiTL/1HBAAJw011chcoWhLZD6r6f8zhA==
# 这个42G的大小是怎么来的,我还没找原因,如果谁有,请下面回复下
[root@node3 ceph]# df -h /db/cephfs/
文件系统 容量 已用 可用 已用% 挂载点
192.168.10.10:6789:/ 42G 0 42G 0% /db/cephfs

# 创建文件,将key单独放置在一个文件
[root@node3 ceph]# vi cephfskey
1HBAAJw011chcoWhLZD6r6f8zhA==
[root@node3 ceph]# umount /db/cephfs/
[root@node3 ceph]# mount -t ceph master:6789:/ /db/cephfs -o name=cephfs,secretfile=/etc/ceph/cephfskey
[root@node3 ceph]# df -h /db/cephfs
文件系统 容量 已用 可用 已用% 挂载点
192.168.10.10:6789:/ 42G 0 42G 0% /db/cephfs

# 做成开机启动
echo "master:6789:/ /db/cephfs ceph name=cephfs,secretfile=/etc/ceph/cephfskey,_netdev,noatime 0 0" >> /etc/fstab
[root@node3 ceph]# umount /db/cephfs
[root@node3 ceph]# mount /db/cephfs
[root@node3 ceph]# dd if=/dev/zero of=/db/cephfs/file2 bs=1M count=1024> /db/cephfs/file2
可以写入,可以创建文件
[root@node3 cephfs]# ls /db/cephfs
aa file2
# 在node2上也进行挂载
[root@master ceph]# scp ceph.client.cephfs.keyring node2:/etc/ceph/
[root@node2 ceph]# ceph auth get-key client.cephfs > cehpfskey
[root@node2 ceph]# mount -t ceph master:6789:/ /db/cephfs -o name=cephfs,secretfile=/etc/ceph/cehpfskey
[root@node2 ceph]# ls /db/cephfs/
aa file2
# 操作node3和node2 /db/cephfs文件夹,会同步

Ceph文件系统由LINUX内核本地支持;但是,如果您的主机在较低的内核版本上运行,或者您有任何应用程序依赖项,
您总是可以使用FUSE客户端让Ceph挂载Ceph FS。
# 安装软件包
rpm -qa |grep -i ceph-fuse // yum -y install ceph-fuse
umount /db/cephfs
[root@node3 ceph]# ceph-fuse --keyring /etc/ceph/ceph.client.cephfs.keyring --name client.cephfs -m master:6789 /db/cephfs
ceph-fuse[2208]: starting ceph client
2022-08-16 16:01:28.539408 7f8639709240 -1 init, newargv = 0x563a87ca53e0 newargc=9
ceph-fuse[2208]: starting fuse
[root@node3 ceph]# df -lh /db/cephfs
文件系统 容量 已用 可用 已用% 挂载点
ceph-fuse 42G 1.0G 41G 3% /db/cephfs
# 添加开机启动,删除之前的
echo "id=cephfs,keyring=/etc/ceph/ceph.client.cephfs.keyring /db/cephfs fuse.ceph defaults 0 0 _netdev" >> /etc/fstab
注:因为 keyring文件包含了用户名,所以fstab不需要指定用了

[root@node3 ceph]# umount /db/cephfs
[root@node3 ceph]# mount /db/cephfs
2022-08-16 16:04:43.817324 7f0e4ae56240 -1 init, newargv = 0x55ae92fbe310 newargc=11ceph-fuse[2275]: starting ceph client
ceph-fuse[2275]: starting fuse
# 如果是多次挂载,导致挂载不上提示ceph-fuse[8600]: ceph mount failed with (110) Connection timed out
# 解决方法:重启mds服务 systemctl restart ceph-mds.target
# 操作node2进行挂载,操作目录node3中也会改变

3.8 部署Ceph文件存储

        Ceph文件系统提供了任何大小的符合posix标准的分布式文件系统,它使用Ceph RADOS存储数据。要实现Ceph文件系统,您需要一个正在运行的Ceph存储集群和至少一个Ceph元数据服务器(MDS)来管理其元数据并使其与数据分离, 这有助于降低复杂性和提高可靠性。下图描述了Ceph FS的架构视图及其接口

Ceph Luminous(二)_块设备_07

        libcephfs库在支持其多个客户机实现方面发挥着重要作用。它具有本机Linux内核驱动程序支持,因此客户机可以使用本机文件系统安装,例如,使用mount命令。它与SAMBA紧密集成,支持CIFS和SMB。Ceph FS使用cephfuse模块扩 展到用户空间(FUSE)中的文件系统。它还允许使用libcephfs库与RADOS集群进行直接的应用程序交互。作为Hadoop HDFS的替代品,Ceph FS越来越受欢迎。

        只有Ceph FS才需要Ceph MDS;其他存储方法的块和基于对象的存储不需要MDS服务。Ceph MDS作为一个守护进程运行,它允许客户机挂载任意大小的POSIX文件系统。MDS不直接向客户端提供任何数据;数据服务仅由OSD完成。

# 部署cephfs,启动了mds服务
[root@master ceph]# ceph-deploy mds create node2
注意:查看输出,应该能看到执行了哪些命令,以及生成的keyring

[root@master ceph]# ceph osd pool create cephfs_data 128
pool 'cephfs_data' created
[root@master ceph]# ceph osd pool create cephfs_metadata 30
pool 'cephfs_metadata' created
[root@master ceph]# ceph fs new cephfs cephfs_metadata cephfs_data
new fs with metadata pool 25 and data pool 24

[root@master ceph]# ceph mds stat
cephfs-1/1/1 up {0=node2=up:active}
[root@master ceph]# ceph osd pool ls
default.rgw.control
default.rgw.meta
default.rgw.log
rbd
.rgw
.rgw.root
.rgw.control
.rgw.gc
.rgw.buckets
.rgw.buckets.index
.rgw.buckets.extra
.log
.intent-log
.usage
.users
.users.email
.users.swift
.users.uid
default.rgw.buckets.index
default.rgw.buckets.data
cephfs_data
cephfs_metadata
[root@master ceph]# ceph fs ls
name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]

# 创建用户
[root@master ceph]# ceph auth get-or-create client.cephfs mon 'allow r' mds 'allow r, allow rw path=/' osd 'allow rw pool=cephfs_data' -o ceph.client.cephfs.keyring
[root@master ceph]# scp ceph.client.cephfs.keyring node3:/etc/ceph/
[root@node3 ceph]# cat ceph.client.cephfs.keyring
[client.cephfs]
key = AQDeRvtiTL/1HBAAJw011chcoWhLZD6r6f8zhA==

3.9 将Ceph FS导出为NFS服务器

        网络文件系统(Network Filesystem, NFS)是最流行的可共享文件系统协议之一,每个基于unix的系统都可以使用它。不理解Ceph FS类型的基于unix的客户机仍然可以使用NFS访问Ceph文件系统。要做到这一点,我们需要一个NFS服 务器,它可以作为NFS共享重新导出Ceph FS。NFS- ganesha是一个在用户空间中运行的NFS服务器,使用libcephfs支 持Ceph FS文件系统抽象层(FSAL)。

#安装软件:nfs-ganesha-2.3
[root@node2 ~]# cat /etc/yum.repos.d/nfs-ganesha.repo
[nfs-ganesha]
name=nfs-ganesha
baseurl=http://us-west.ceph.com/nfs-ganesha/rpm-V2.3-stable/luminous/x86_64/
enabled=1
gpgcheck=0

[root@node2 ~]# yum install -y nfs-utils nfs-ganesha
[root@node2 ~]# systemctl start rpcbind && systemctl enable rpcbind

# 修改配置文件
vi /etc/ganesha/ganesha.conf
EXPORT
{
Export_Id = 11;
Path = "/";
Pseudo = "/";
Protocols = 3;
Access_Type = RW;
Squash = No_Root_Squash;
Sectype = "none";
FSAL {
Name = CEPH;
}
}
# 通过提供Ganesha.conf 启动NFS Ganesha守护进程
[root@node2 ganesha]# ganesha.nfsd -f /etc/ganesha/ganesha.conf -L /var/log/ganesha.log -N NIV_DEBUG
# 没启动过来,没查,低版本
showmount -e

# 客户端挂载
[root@node3 ceph]# yum install -y nfs-utils
[root@node3 ceph]# mkdir /mnt/cephnfs
[root@node3 ceph]# mount -o rw noatime node2:/dev/cephnfs

3.10 将Ceph FS 导出为NFS服务器(新版)

下载地址:http://download.ceph.com/nfs-ganesha/rpm-V2.7-stable/luminous/x86_64/

wget http://download.ceph.com/nfs-ganesha/rpm-V2.7-stable/luminous/x86_64/libntirpc-1.7.1-0.1.el7.x86_64.rpm
wget http://download.ceph.com/nfs-ganesha/rpm-V2.7-stable/luminous/x86_64/nfs-ganesha-ceph-2.7.1-0.1.el7.x86_64.rpm
wget http://download.ceph.com/nfs-ganesha/rpm-V2.7-stable/luminous/x86_64/nfs-ganesha-2.7.1-0.1.el7.x86_64.rpm

[root@node1 ~]# yum install libntirpc-1.7.1-0.1.el7.x86_64.rpm
[root@node1 ~]# yum install nfs-ganesha-2.7.1-0.1.el7.x86_64.rpm
[root@node1 ~]# yum install nfs-ganesha-ceph-2.7.1-0.1.el7.x86_64.rpm

[root@node1 ganesha]# systemctl start rpcbind
[root@node1 ganesha]# systemctl enable rpcbind
[root@node1 ganesha]# systemctl start rpc-statd.service

# 配置nfs-ganesha
参考:https://github.com/nfs-ganesha/nfs-ganesha/blob/next/src/config_samples/ceph.conf
EXPORT
{
Export_Id = 1234;
Path = "/";
Pseudo = "/cephfs";
NFS_Protocols = "4";
Access_Type = RW;
Squash = no_root_squash;
SecType = sys;

FSAL {
Name = CEPH;
User_Id = cephfs;
Secret_Access_Key = "AQDeRvtiTL/1HBAAJw011chcoWhLZD6r6f8zhA=="
}
}
# Secret_Access_Key和User_Id 如果在集群上可以不要这2个,如果不在需要获取
[root@node1 ganesha]# ceph auth list
[root@node1 ganesha]# systemctl start nfs-ganesha && systemctl enable nfs-ganesha
[root@node1 ganesha]# showmount -e
Export list for node1:

# 客户端设置
[root@node3 ceph]# yum install -y nfs-utils
[root@node3 ceph]# mount -t nfs -o nfsvers=4.1,noauto,soft,sync,proto=tcp node1:/ /db/cephnfs
[root@node3 cephnfs]# mount | grep cephnfs
node1:/ on /db/cephnfs type nfs4 (rw,relatime,sync,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,soft,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.10.13,local_lock=none,addr=192.168.10.11)

3.11 Dashboard报警处理

# 1.发现有一个pool没有启动
[root@master ceph]# ceph -s
cluster:
id: 960a81c9-337e-4424-bc26-d7d544dc5ff5
health: HEALTH_WARN
application not enabled on 1 pool(s)

[root@master ceph]# 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 '.rgw.root'
use 'ceph osd pool application enable <pool-name> <app-name>', where <app-name> is 'cephfs', 'rbd', 'rgw', or freeform for custom applications.
[root@master ceph]# ceph osd pool application enable .rgw.root rgw
enabled application 'rgw' on pool '.rgw.root'

# 2.mds不能启动
[root@master ceph]# ceph status
cluster:
id: 960a81c9-337e-4424-bc26-d7d544dc5ff5
health: HEALTH_WARN
1 filesystem is degraded

services:
mon: 1 daemons, quorum master
mgr: master(active)
mds: cephfs-1/1/1 up {0=node2=up:reconnect(laggy or crashed)}
osd: 8 osds: 8 up, 8 in
rgw: 2 daemons active

data:
pools: 22 pools, 668 pgs
objects: 475 objects, 1.00GiB
usage: 11.2GiB used, 149GiB / 160GiB avail
pgs: 668 active+clean
# 原因:机器意外重启导致虚拟机MDS出现问题
# 解决方法1:如果对应的节点ceph-mds.target不能启动的话,删除该节点MDS,然后重新部署
1.先检查服务器时间是否对
2.删除mds
[root@node1 ~]# systemctl stop ceph-mds.target
[root@node1 ~]# ceph mds fail 1
[root@master ceph]# ceph-deploy mds create node1

3.12 cephfs删除
停止所有进程:sudo stop ceph-all
卸载所有 ceph 程序:ceph-deploy uninstall [{ceph-node}]
删除 ceph 相关的安装包:ceph-deploy purge {ceph-node} [{ceph-data}]
删除 ceph 相关的配置:ceph-deploy purgedata {ceph-node} [{ceph-data}]
删除 key:ceph-deploy forgetkeys

yum -y remove ceph-deploy