一、ceph介绍

1、ceph起源

Ceph项目最早起源于Sage就读博士期间的工作(最早的成果于2004年发表),并随后贡献给开源社区。在经过了数年的发展之后,目前已得到众多云计算厂商的支持并被广泛应用。RedHat及OpenStack都可与Ceph整合以支持虚拟机镜像的后端存储。但是在2014年OpenStack火爆的时候、Ceph并不被很多人所接受。当时Ceph并不稳定(Ceph发布的第四个版本 Dumpling v0.67),而且架构新颖,复杂,当时人们对Ceph在生产落地如何保障数据的安全,数据的一致性存在怀疑

随着OpenStack的快速发展,给Ceph的发展注入了强心剂,越来越多的人使用Ceph作为OpenStack的底层共享存储,Ceph在中国的社区也蓬勃发展起来。近两年OpenStack火爆度不及当年,借助于云原生尤其是Kubernetes技术的发展,作为底层存储的基石,Ceph再次发力,为Kubernets有状态化业务提供了存储机制的实现。

2、ceph基础

ceph是一个开源的分布式存储系统,支持对象存储,快存储,文件系统。
ceph把每一个待管理的数据流切分为一个到多个固定大小(默认4M)的对象数据,并以原子单元完成数据的读写
对象数据的底层存储服务是有多个主机组成的存储集群,该集群为RADOS,该集群的librados是存储集群的API,支持c/c++/java/python/ruby/php/go

ceph部署和使用详细教程_云计算

3、ceph组件

1、ceph mon用于维护集群状态,如集群有多少个存储池有多少个pg,及存储池和pg的映射关系,这些信息是集群互相协调的关键信息,同时还负责管理客户端到管理守护进程之间身份认证,cephmon通常需要有多个节点实现高可用架构。

2、ceph mgr负责监控集群运行指标和集群状态,如存储使用率,系统负载,cephmgr内有多种组件如ceph-dashboard仪表盘组件。

3、ceph osd是ceph集群提供存储数据,一个磁盘就是一个osd守护进程,ceph集群中的数据存储,平衡,恢复都是有osd实现,cephosd通过向cephmon上报心跳信息告知ceph集群此osd是否可用。cephosd是ceph集群存储数据组件需要多个节点实现高可用性。

4、ceph mds,提供ceph集群文件系统,对象存储和快存储不需要ceph mds.

5、cephdeploy,通过cephdeploy执行ceph各种命令行工具:rados,ceph,rbd, 该节点有admin账户只对管理员开放。

4、ceph数据存储架构

ceph部署和使用详细教程_sed_02

Ceph中一切皆对象,不管是RBD块存储接口,RGW对象存储接口还是文件存储CephFS接口,其存储如到Ceph中的数据均可以看作是一个对象,一个文件需要切割为多个对象(object),然后将object存储到OSD中。

这些切割后的对象怎么选择到对应的OSD存储节点呢,这需要依赖于Ceph的智能调度算法CRUSH,通过CRUSH算法将对象调度到合适的OSD节点上,不管是客户端还是OSD,均使用CRUSH算法来计算对象在集群中OSD的位置信息,同时保障object的副本能落到合适的OSD节点上。

ceph部署和使用详细教程_sed_03

1、文件切割成4M大小的数据对象
2、数据对象通过hash算法找到存储池中的pg
3、在通过crush算法找到pg映射的osd
4、pg中的主osd将对象写入到磁盘
5、主osd将数据同步给备份osd,并等到备份osd写完后返回确认消息
6、主osd将写完信息告知客户端

二、基础环境准备,系统CentOS 7.9

1、测试服务器各节点资源分配详情

ceph部署和使用详细教程_ceph_04

2、修改主机名

hostnamectl set-hostname ceph1
hostnamectl set-hostname ceph2
hostnamectl set-hostname ceph3



#配置主机名和IP及HOSTS解析 
cat > /etc/hosts << EOF
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

20.0.1.115 cephmgr
# 外部访问的IP网段 public network = 20.0.1.0/24
20.0.1.116 ceph1
20.0.1.117 ceph2
20.0.1.118 ceph3

# 集群IP网段 cluster network = 192.168.1.0/24
192.168.1.70 ceph1
192.168.1.71 ceph2
192.168.1.72 ceph3

EOF

3、配置阿里云yum

#添加访问互联路由
cat > /etc/resolv.conf <<EOF
nameserver 114.114.114.114
nameserver 8.8.8.8
EOF

cat /etc/resolv.conf

# ssh连接Linux比较慢
#sed -i "s|#UseDNS yes|UseDNS no|" /etc/ssh/sshd_config
#sed -i "s|GSSAPIAuthentication yes|GSSAPIAuthentication no|" /etc/ssh/sshd_config


# 备份默认yum源并配置阿里yum源
mkdir -p /etc/yum.repos.d/bak
mv /etc/yum.repos.d/*repo /etc/yum.repos.d/bak

curl -o /etc/yum.repos.d/CentOS-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 安装EPEL源
curl -o /etc/yum.repos.d/epel-7.repo http://mirrors.aliyun.com/repo/epel-7.repo


#wget http://mirrors.aliyun.com/repo/Centos-7.repo  -P /etc/yum.repos.d/
#wget http://mirrors.aliyun.com/repo/epel-7.repo -P /etc/yum.repos.d/


#加载yum
yum clean all &&   yum makecache


#CentOS7使用/etc/rc.d/rc.local设置开机自动启动
chmod +x /etc/rc.d/rc.local

#安装依赖包
yum -y install vim net-tools lrzsz unzip gcc telnet wget sshpass ntpdate ntp curl

4、关闭防火墙,时间同步,内核参数优化

#防火墙
#设置防火墙为 Iptables 并设置空规则
systemctl  stop firewalld  &&  systemctl  disable firewalld

yum -y install iptables-services  &&  systemctl  start iptables  &&  systemctl  enable iptables  &&  iptables -F  &&  service iptables save



#关闭 SELINUX,关闭swap分区
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

#时间同步
timedatectl set-timezone Asia/Shanghai
date

yum -y install chrony
systemctl enable chronyd
systemctl start chronyd.service
sed -i -e '/^server/s/^/#/' -e '1a server ntp.aliyun.com iburst' /etc/chrony.conf
systemctl restart chronyd.service
sleep 3
timedatectl

#内核参数优化
echo 'vm.swappiness = 0' >> /etc/sysctl.conf
echo 'kernel.pid_max = 4194303' >> /etc/sysctl.conf
sysctl -p

#重启
sync
reboot

5、ceph版本 Mimic 13版

Mimic版的yum源配置文件如下: Mimic 13版
vim /etc/yum.repos.d/ceph.repo

[Ceph]
name=Ceph packages for $basearch
baseurl=http://mirrors.aliyun.com/ceph/rpm-mimic/el7/$basearch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc

[Ceph-noarch]
name=Ceph noarch packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-mimic/el7/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc

[ceph-source]
name=Ceph source packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-mimic/el7/SRPMS
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc

6、免密配置

#root免密
ssh-keygen -t rsa -P ''



for i in  ceph1 ceph2 ceph3; do ssh-copy-id root@$i; done
 

#验证免密
for i in  ceph1 ceph2 ceph3; do ssh root@$i hostname; done

三、ceph搭建

1、在所有节点上部署基础软件包

在所有节点上执行

mkdir -p /home/cephadm/ceph-cluster
cd /home/cephadm/ceph-cluster

#加载yum
yum clean all &&   yum makecache

# 更新yum源
yum update -y
# 安装工具包、python-setuptools一定要安装、不然会报错的

yum install -y  conntrack ipset jq iptables curl sysstat libseccomp  socat git python-setuptools


# 安装ceph-deploy部署工具
yum install ceph-deploy -y


yum install ceph ceph-radosgw -y


yum install ceph-mgr-dashboard ceph-mon ceph-radosgw ceph-mds ceph-mgr ceph-osd ceph-common -y


#校验版本
ceph-deploy --version

2、部署Mon节点

在管理节点执行

cd /home/cephadm/ceph-cluster

#mon节点,可以写第一个,也可以写多个


#--cluster-network 为集群内部地址,  --public-network 为外部可以调用地址
ceph-deploy new ceph1 ceph2 ceph3 --cluster-network 192.168.1.0/24 --public-network 20.0.1.0/24


#新增配置

cat >>  /home/cephadm/ceph-cluster/ceph.conf << EOF
################################################
# 设置pool池默认分配数量
osd pool default size = 2
# 容忍更多的时钟误差
mon clock drift allowed = 1
mon clock drift warn backoff = 10
# 允许删除pool
mon_allow_pool_delete = true
[mgr]
# 开启WEB仪表盘
mgr modules = dashboard
################################################
EOF



#如果不指明--no-adjust-repos这个选项,即便你提前配置了阿里云的yum源,它也会改成ceph官方的那个yum源
ceph-deploy install --no-adjust-repos ceph1 ceph2 ceph3


#使用--overwrite-conf来覆盖配置
ceph-deploy --overwrite-conf config push ceph1 ceph2 ceph3


#生成keyring秘钥文件
ceph-deploy mon create-initial




#将配置和client.admin秘钥环推送到远程主机。
#每次更改ceph的配置文件,都可以用这个命令推送到所有节点上
ceph-deploy admin ceph1 ceph2 ceph3

3、Mgr

L版本之后Ceph,必须要有一个mgr节点,所以我们在管理节点执行:

cd /home/cephadm/ceph-cluster

ceph-deploy mgr create ceph1

cp -R /home/cephadm/ceph-cluster/{ceph.client.admin.keyring,ceph.conf} /etc/ceph/


# 集群每一个节点授权
chmod +r /etc/ceph/ceph.client.admin.keyring

4、OSD

在管理节点上以cephadm用户执行,列出osd节点上的所有可用磁盘

cd /home/cephadm/ceph-cluster


#要以cephadm用户在~/ceph-cluster/目录下执行
ceph-deploy disk list ceph1 ceph2 ceph3

清空osd节点上用来作为osd设备的磁盘

#注意,这里其实是在执行清空命令,执行错了就麻烦大了,全盘清空
ceph-deploy disk zap ceph1 /dev/sdb /dev/sdc
ceph-deploy disk zap ceph2 /dev/sdb /dev/sdc
ceph-deploy disk zap ceph3 /dev/sdb /dev/sdc

单个磁盘创建OSD

ceph-deploy osd create ceph1 --data /dev/sdb
ceph-deploy osd create ceph2 --data /dev/sdb
ceph-deploy osd create ceph3 --data /dev/sdb

多个磁盘创建OSD

#ceph-deploy osd create {node} --data /path/to/data --block-db /path/to/db-device --block-wal /path/to/wal-device
#创建OSD时,将OSD的三类数据都分开存放——Object Data Blobs、SST文件、wal文件
#--data选项指定的是Object Data存放的硬盘
#--block-db选项指定的是SST文件
#--block-wal选项指定的是wal文件


#For bluestore, optional devices can be used::

#    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
#
# 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



#帮助命令
ceph-deploy osd --help


#// 创建osd存储设备,sdc提供存储空间,sdb提供缓存
ceph-deploy osd create ceph1 --filestore --data /dev/sdc --journal /dev/sdb
ceph-deploy osd create ceph2 --filestore --data /dev/sdc --journal /dev/sdb
ceph-deploy osd create ceph3 --filestore --data /dev/sdc --journal /dev/sdb

查看集群状态

ceph -s
#到这一步其实已经基本能用了
#我们来试一下

报错
解决办法:
禁用不安全模式

[root@ceph_03 ~]# ceph config set mon auth_allow_insecure_global_id_reclaim false
[root@ceph_03 ~]# ceph -s
  cluster:
    id:     ad221cc4-2af0-4050-8de5-316455b3cb10
    health: HEALTH_OK
 
  services:
    mon: 1 daemons, quorum ceph_01 (age 6m)
    mgr: ceph_01(active, since 6m)
    osd: 9 osds: 9 up (since 4m), 9 in (since 4m)
 
  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0 B
    usage:   9.0 GiB used, 60 GiB / 69 GiB avail
    pgs:

5、启用dashboard

#提醒:目前 mgr 功能模块可能还存在选举问题,如果多mgr 节点都开启,
#可能会出现web页面取不到数据,建议只开启一个mgr节点服务,然后关闭其他节点mgr服务

cd /home/cephadm/ceph-cluster

# 启用dashboard
ceph mgr module enable dashboard

#生成签名
ceph dashboard create-self-signed-cert


mkdir -p /home/cephadm/ceph-cluster/mgr-dashboard/


#生成密钥
cd /home/cephadm/ceph-cluster/mgr-dashboard
openssl req -new -nodes -x509 -subj "/O=IT/CN=ceph-mgr-dashboard" -days 3650 -keyout dashboard.key -out dashboard.crt -extensions v3_ca






#设置ip与PORT
ceph config set mgr mgr/dashboard/server_addr 20.0.1.116
ceph config set mgr mgr/dashboard/server_port 18843

#关闭https
ceph config set mgr mgr/dashboard/ssl false


#设置管理用户密码
ceph dashboard set-login-credentials admin admin


########################################################################
##如果设置用户名密码错误,执行下面
#设置用户名为admin, 密码为admin。

echo "admin" > /tmp/ceph-password.txt
ceph dashboard ac-user-create  admin -i /tmp/ceph-password.txt

########################################################################


#启动dashboard
ceph mgr module disable dashboard 
ceph mgr module enable dashboard


#查看服务器信息
ceph mgr services

6、创建 MDS

要使用CephFS,我们首先需要在集群中部署MDS节点,MDS节点是负责CephFS原数据存储的,我们通过ceph-deploy部署MDS,很容易实现目标要求

cd /home/cephadm/ceph-cluster

ceph-deploy mds create ceph1 ceph2 ceph3

7、CephFS部署

#创建pool池
#注:通常在创建 pool 之前,需要覆盖默认的 pg_num,官方推荐:
#*少于 5 个 OSD 时可把 pg_num 设置为 128
#*OSD 数量在 5 到 10 个时,可把 pg_num 设置为 512
#*OSD 数量在 10 到 50 个时,可把 pg_num 设置为 4096
#*OSD 数量大于 50 时,你得理解权衡方法、以及如何自己计算 pg_num 取值
#*自己计算 pg_num 取值时可借助 pgcalc 工具。

#Total PGs=(OSDs * 100)/ pool size

#Total PGs=(200 * 100)/ 3 ≈6667
#单个 pool 的 PG 计算如下:
#有 100 个 osd,3 副本,5 个 pool
#Total PGs =100*100/3=3333
#每个 pool 的 PG=3333/5=512,那么创建 pool 的时候就指定 pg 为 512

cd /home/cephadm/ceph-cluster
# 创建存储池,数据data,元数据metadata
# 通常,元数据池最多有几GB的数据,建议使用比较小的PG数,64或者128常用于大型集群

#创建存储池,指定pg和pgp的数量, pgp是对存在于pg的数据进行组合存储,pgp通常等于pg的值
# 在master执行 创建数据Data Pool
ceph osd pool create cephfs_data 128 128

#  在master执行 创建元数据Metadata Pool
ceph osd pool create cephfs_metadata 64 64

#cephfs为文件系统名称
#cephfs_metadata 为元数据的pool
#cephfs_data 为数据pool
ceph fs new cephfs cephfs_metadata cephfs_data


#创建完毕后可以通过下面的命令进行查看
ceph fs ls


#查看 mds 节点状态
ceph mds stat
#cephfs-1/1/1 up  {0=ceph2=up:active}, 2 up:standby
#active 是活跃的,另 1 个是处于热备份的状态

ceph df 

#查看所有的osd池
#ceph osd pool ls  

#删除osd池
#ceph osd pool rm 01rw_rbp 01rw_rbp --yes-i-really-really-mean-it

8、cephfs使用

1. 测试机器 安装 ceph 客户端

yum install epel-release -y

yum install https://mirrors.aliyun.com/ceph/rpm-octopus/el7/noarch/ceph-release-1-1.el7.noarch.rpm -y

yum install ceph-fuse ceph-common -y

2.生成秘钥,拷贝秘钥

#查看
ceph fs ls

cd /home/cephadm/ceph-cluster

#生成秘钥
ceph auth add client.cephfs mon 'allow r' mds 'allow rw' osd 'allow rwx pool=cephfs-data'

#查看秘钥
ceph auth get client.cephfs

#复制秘钥到指定文件
cd /home/cephadm/ceph-cluster
ceph auth get client.cephfs -o ceph.client.cephfs.keyring
ceph auth print-key client.cephfs > cephfs.key

#对比秘钥
cd /home/cephadm/ceph-cluster
cat ceph.client.cephfs.keyring
cat cephfs.key 

#同步客户端认证文件
cd /home/cephadm/ceph-cluster
scp ceph.client.cephfs.keyring  cephfs.key root@ceph1:/etc/ceph/
scp ceph.client.cephfs.keyring  cephfs.key root@ceph2:/etc/ceph/
scp ceph.client.cephfs.keyring  cephfs.key root@ceph3:/etc/ceph/

#拷贝给挂载服务器
scp  ceph.conf ceph.client.cephfs.keyring  cephfs.key root@20.0.1.115:/etc/ceph/

3.内核空间挂载 ceph-fs,推荐使用内核模块挂载

客户端挂载有两种方式, 一是内核空间一是用户空间, 内核空间挂载需要内核支持 ceph 模块, 用户空间挂载需要安装 ceph-fuse

mkdir -p /cephfs-data


echo "AQDKPexjJxr6LRAAI3QUn69j8QZOAPYTLf/CKw==" > /etc/ceph/cephfs.key


mount -t ceph 20.0.1.116:6789,20.0.1.117:6789,20.0.1.118:6789:/ /cephfs-data -o name=cephfs,secretfile=/etc/ceph/cephfs.key


#开机挂载 
echo "20.0.1.116:6789,20.0.1.117:6789,20.0.1.118:6789:/ /cephfs-data ceph defaults,name=cephfs,secretfile=/etc/ceph/cephfs.key,_netdev 0 0" >> /etc/fstab

cat /etc/fstab

4.用户空间挂载 ceph-fs

如果内核本较低而没有 ceph 模块, 那么可以安装 ceph-fuse 挂载, 但是推荐使用内核模块挂载

ceph1服务器执行

#ceph1服务器执行 ,同步认证及配置文件
cd /home/cephadm/ceph-cluster
scp ceph.conf ceph.client.cephfs.keyring  cephfs.key root@20.0.1.115:/etc/ceph/

客户端执行

#客户端执行通过 ceph-fuse 挂载 ceph 
mkdir /data
ceph-fuse --name client.cephfs -m 20.0.1.116:6789,20.0.1.117:6789,20.0.1.118:6789 /data




#开机挂载 
echo "none /data fuse.ceph ceph.id=cephfs,ceph.conf=/etc/ceph/ceph.conf,_netdev,defaults 0 0" >> /etc/fstab 

cat /etc/fstab

9、RBD块存储

前面我们提到过、Ceph是一个统一(unified)存储,在单个集群上提供了三中存储接入能力:

  • RBD块存储:RADOS BLOCK DEVICE,即RADOS块设备,提供裸设备的能力,映射到操作系统是一块磁盘;
  • RGW对象存储:RADOS GateWay,即存储对象网关,提供无限存储接入能力,提供上传PUT下载GET接口;
  • CephFS文件存储:Ceph FileSystem,即Ceph文件系统,提供文件共享存储能力,映射到操作系统是一个目录

1、RBD块存储使用

客户端执行

# 查看内核是否支持使用RBD
modprobe rbd
#如果有错误信息说明内核不支持,那你就先去升级一下内核


lsmod | grep rbd
#rbd                    83728  0 
#libceph               301687  1 rbd

ceph1服务器执行

#创建存储池,指定pg和pgp的数量, pgp是对存在于pg的数据进行组合存储,pgp通常等于pg的值
# 创建存储池
ceph osd pool create myrbd1 128 128


#对存储池启用 RBD 功能
ceph osd pool application enable myrbd1 rbd

#通过 RBD 命令对存储池初始化
rbd pool init -p myrbd1 

#查看当前的PG值
ceph osd pool get myrbd1 pg_num


#手动设置pg数量
#ceph osd pool set myrbd1 pg_num 128


#创建块设备镜像
#要想把块设备加入某节点,你得先在 Ceph 存储集群中创建一个镜像,使用下列命令:
#rbd create --size {megabytes} {pool-name}/{image-name} -m mon节点的ip地址
#如果创建镜像时不指定存储池,它将使用默认的 rbd 存储池
#新增10G
rbd create --size 10G myrbd1/test1

# 查看myrbd1的信息
rbd ls myrbd1

# 查看镜像的信息
rbd info myrbd1/test1

#这里需要注意size的大小,这个大小可以超过你实际pool的大小,这个叫做瘦分配(即精简配置),也叫超卖和按需分配。
#创建块之后可以通过指令来动态的更改。
rbd resize  --size 50G myrbd1/test1 --allow-shrink
#注:ceph块设备镜像是精简配置,只有在你开始写入数据时它们才会占用物理空间

2、映射块设备

映射进内核操作之前,首先查看内核版本, 2.x及之前的内核版本需手动调整format为1, 4.x之前要关闭object-map, fast-diff, deep-flatten功能才能成功映射到内核,这里使用的是centos7.5,内核版本3.10。

#ceph1服务器执行 ,同步认证及配置文件

cd /home/cephadm/ceph-cluster
scp *  cephfs.key root@20.0.1.115:/etc/ceph/

客户端要确定ceph-common包要安装:

[root@client ~]# yum -y install ceph-common

[root@client ~]# rbd feature disable myrbd1/test1 object-map fast-diff deep-flatten exclusive-lock
 
[root@client ~]# rbd map myrbd1/test1
/dev/rbd0
[root@client ~]# ls /dev/rbd0 
/dev/rbd0
#可以看见在/dev下创建了一个叫rbd0的设备文件

# 创建挂载点
mkdir /cephrbd

# 格式化磁盘
mkfs.xfs /dev/rbd0

# 挂载
mount /dev/rbd0 /cephrbd/


df -hT

# 测试写入数据
dd if=/dev/zero of=/cephrbd/file bs=100M count=1

df -hT


#删除数据
rm -fr /cephrbd/file

#删除完成的数据只是标记为已经被删除,但是不会从块存储立即清空,
#因此在删除完成后使用 ceph df 查看并没有回收空间
rados df



#但是后期可以使用此空间, 如果需要立即在系统层回收空间, 需要执行以下命令:
fstrim -v /cephrbd/

3、创建快照并测试回滚

# 创建了一个test1快照,快照的名字叫做mysnap
[root@client ~]# rbd snap create --snap mysnap myrbd1/test1
 
# 首先删除文件
rm -rf /cephrbd/file 
# 取消挂载
umount /dev/rbd0 

#查看进程占用
fuser -m /dev/rbd0
#/dev/rbd0:           10438c

ps aux | grep 10438

kill -9 10438


#回滚
rbd snap rollback myrbd1/test1@mysnap
#Rolling back to snapshot: 100% complete...done.

# 查看挂在信息
df -hT

# 在挂载
mount /dev/rbd0 /cephrbd/

# 查看文件
ll /cephrbd/

# 查看挂在信息
df -hT

4、模板与克隆

# 查看块设备的format(format必须为2)
[root@client ~]# rbd info myrbd1/test1
rbd image 'test1':
	size 100GiB in 25600 objects
	order 22 (4MiB objects)
	block_name_prefix: rbd_data.196d76b8b4567
	format: 2
	features: layering
	flags: 
	create_timestamp: Wed Jul  6 17:11:01 2022
 
如果不是format 2 可以创建时指定
# rbd create myrbd1/test1 --size 102400 --image-format 2
 
 
# 创建克隆前,把快照保存起来,不然会出错

[root@client ~]# rbd snap protect myrbd1/test1@mysnap
 
可以使用rbd snap unprotect myrbd1/test1@mysnap去掉这个保护,但是这样的话就 不能克隆了
 
 
# 克隆块设备
# 卸载挂载点
[root@client ~]# umount /dev/rbd0 

fuser -m /dev/rbd0

kill -9 

#克隆设备
[root@client ~]# rbd clone myrbd1/test1@mysnap myrbd1/test2
 
# 查看rbd
[root@client ~]# rbd ls myrbd1
test1
test2
如上看到rbd这个池上有两个块设备了,一个是原来的test1,一个是通过test1的镜像模板克隆出来的test2。
# 内核映射块设备
[root@client ~]# rbd map myrbd1/test2
/dev/rbd2
 
# 挂载克隆的块设备
[root@client ~]# mkdir /cephrbd1
[root@client ~]# mount /dev/rbd1 /cephrbd1/
[root@client ~]# ls /cephrbd1/
file
因为是克隆test1,test1上有文件系统,所以test2也有文件系统,直接挂载使用就可以
 
 
# 查看克隆的块设备
 
[root@client ~]# rbd info myrbd1/test2
rbd image 'test2':
	size 100GiB in 25600 objects
	order 22 (4MiB objects)
	block_name_prefix: rbd_data.196ee6b8b4567
	format: 2
	features: layering
	flags: 
	create_timestamp: Wed Jul  6 17:53:15 2022
	parent: rbd/test1@mysnap
	overlap: 100GiB
 
这个时候的test2还是依赖test1的镜像mysnap,如test1的mysnap被删除test2也不能够使用了,要想独立出去,就必须将父镜像的信息合并flatten到子镜像中

拥有独立克隆的块设备

独立克隆的块设备
拍平克隆映像:
克隆出来的映像仍保留了对父快照的引用。要从子克隆删除这些到父快照的引用,你可以把快照的信息复制给子克隆,也就是“拍平”它。拍平克隆镜像的时间随快照尺寸增大而增加。要删除快照,必须先拍平子镜像。
因为拍平的镜像包含了快照的所有信息,所以拍平的映像占用的存储空间会比分层克隆要大。
 
 
[root@client ~]# rbd flatten myrbd1/test2
Image flatten: 100% complete...done.
 
[root@client ~]# rbd info myrbd1/test2
rbd image 'test2':
	size 100GiB in 25600 objects
	order 22 (4MiB objects)
	block_name_prefix: rbd_data.196ee6b8b4567
	format: 2
	features: layering
	flags: 
	create_timestamp: Wed Jul  6 17:53:15 2022
 
# 删除镜像
# 去掉镜像test1的保护
root@client ~]# rbd snap unprotect myrbd1/test1@mysnap
# 删除镜像test1
[root@client ~]# rbd snap rm myrbd1/test1@mysnap
Removing snap: 100% complete...done.
# 查看test1的快照
[root@client ~]# rbd snap ls myrbd1/test1

10、RGW对象存储,搭建和使用

1、部署RGW

# 进去admin-node目录
cd /home/cephadm/ceph-cluster

# 部署RGW
ceph-deploy rgw create ceph1 ceph2 ceph3

2、修改配置

cat >> /home/cephadm/ceph-cluster/ceph.conf <<EOF


#num_threads:最大并发连接数,默认为50,根据需求调整,通常在生产集群环境中此值应该更大。
#request_timeout_ms:发送与接收超时时长,以ms为单位,默认为30000。

[client.rgw.ceph1]
rgw_host = ceph1
rgw_frontends = "civetweb port=80 num_threads=500 request_timeout_ms=60000"

[client.rgw.ceph2]
rgw_host = ceph2
rgw_frontends = "civetweb port=80 num_threads=500 request_timeout_ms=60000"

[client.rgw.ceph3]
rgw_host = ceph3
rgw_frontends = "civetweb port=80 num_threads=500 request_timeout_ms=60000"

EOF

3、分发配置

# 进去admin-node目录
cd /home/cephadm/ceph-cluster

# 配置文件分发
ceph-deploy --overwrite-conf config push ceph1
ceph-deploy --overwrite-conf config push ceph2
ceph-deploy --overwrite-conf config push ceph3



#配置文件分发完成之后,我们重启 ceph1 2 3的ceph-radosgw.target服务,
#此时cephnode-02 和 cephnode-03 的RGW也将会监听到80端口上:
# 重启radosgw服务
systemctl restart ceph-radosgw.target

# 查看radosgw服务端口状态
netstat -anltp | grep radosgw

#查看默认 radosgw 的存储池信息:
radosgw-admin zone get --rgw-zone=default --rgw-zonegroup=default

4、查看对象存储池的存储策略、副本数量、pgp和pg的数量

ceph osd pool get default.rgw.meta crush_rule

ceph osd pool get default.rgw.meta size

 
ceph osd pool get default.rgw.meta pgp_num

 
ceph osd pool get default.rgw.meta pg_num

5、RGW集群 Keeplived+Haproxy+VIP

ceph部署和使用详细教程_ceph_05

1、 Keeplived搭建配置
1、在ceph1和ceph2和ceph3节点上安装keeplived
yum install -y keepalived
mv /etc/keepalived/keepalived.conf{,.bak_2023-02-15}
2、ceph1和ceph2和ceph3配置文件。
cat >/etc/keepalived/keepalived.conf<<EOF
! Configuration File for keepalived
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 193.168.44.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
vrrp_script chk_haproxy {
    script "killall -0 haproxy"
    interval 2
    weight -2
}
vrrp_instance VI_1 {
    state MASTER
    interface ens160 # 网卡名
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        20.0.1.113 # VIP
    }
    track_script {
    chk_haproxy
    }
}
EOF
3、 启动服务
#开机自启
systemctl enable keepalived

systemctl restart keepalived
systemctl status keepalived


# 测试 
curl http://20.0.1.113:8080

ip a |grep 113
2、 Haproxy代理RGW
1、接下来安装haproxy,在ceph1和ceph2和ceph3上执行
yum install -y haproxy
2、覆盖ceph1和ceph2和ceph3配置,

具体配置参数根据需求修改,需要修改ip和hostname

cat >/etc/haproxy/haproxy.cfg<<EOF
global
log         127.0.0.1 local2
chroot      /var/lib/haproxy
pidfile     /var/run/haproxy.pid
maxconn     4000
user        haproxy
group       haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
mode                    http
log                     global
option                  httplog
option                  dontlognull
option http-server-close
option forwardfor       except 127.0.0.0/8
option                  redispatch
retries                 3
timeout http-request    10s
timeout queue           1m
timeout connect         10s
timeout client          1m
timeout server          1m
timeout http-keep-alive 10s
timeout check           10s
maxconn                 3000
frontend  http_web *:8080
mode http
default_backend          rgw
backend rgw
balance     roundrobin
mode http
server  ceph1 20.0.1.116:80
server  ceph2 20.0.1.117:80
server  ceph3 20.0.1.118:80
EOF
3、重启ceph-01和ceph-02和ceph-03上的haproxy
systemctl enable haproxy


systemctl restart haproxy

systemctl status haproxy

curl 20.0.1.113:8080

#参考文献

6、Ceph对象存储:创建(RGW)用户

# 进去admin-node目录
cd /home/cephadm/ceph-cluster


# 查看所有用户:
radosgw-admin user list

# 创建用户——例如这里的Jerry:
radosgw-admin user create --uid='jerry' --display-name='hello jerry'

# 查看用户Jerry的详细信息:
radosgw-admin user info --uid=jerry

客户端安装

yum install  s3cmd -y

配置完整过程

[root@cephmgr ~]# 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: X0T9CHPVVC6DBM6LNLEC
Secret Key: z1AB4bKvcd5O6C5jfzBwcUcxeq7cvfMRM7CasXxr
Default Region [US]:

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

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]: 20.0.1.113:8080/%(bucket)s

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: X0T9CHPVVC6DBM6LNLEC
Secret Key: z1AB4bKvcd5O6C5jfzBwcUcxeq7cvfMRM7CasXxr
Default Region: US
S3 Endpoint: 20.0.1.113:8080
DNS-style bucket+hostname:port template for accessing a bucket: 20.0.1.113:8080/%(bucket)s
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] y
Please wait, attempting to list all buckets...
Success. Your access key and secret key worked fine :-)

Now verifying that encryption works...
Not configured. Never mind.

Save settings? [y/N] y
Configuration saved to '/root/.s3cfg'
[root@cephmgr ~]#



    Access Key:创建用户时生成的Access Key。
    Secret Key:创建用户时生成的Secret Key。
    Default Region:选择区域,默认为US,本环境没有区域,通常用于云环境,所以这里默认即可。
    S3 Endpoint:输入Endpoit的地址,域名+端口,这里使用http,所以需要使用oss.gogen.cn:80。
    DNS-style bucket+hostname:port template for accessing a bucket:这里的DNS样式,格式为%(bucket)s.oss.gogen.cn:80。也就是bucket.hostname:port的模式样式。
    Encryption password:加密的密码,这里没有,直接回车留空。
    Path to GPG program:这里是加密需要用到的程序包,默认Linux客户端已经安装。
    Use HTTPS protocol:是否使用HTTPS,默认为使用,不使用输入No。如果使用证书需要为可信任证书,否则无法使用。比如Endpoint的域名为oss.gogen.cn,那么需要申请一个*.oss.gogen.cn的泛域名证书。
    HTTP Proxy server name:代理服务器名称,这里没有代理服务器,默认留空。
    New settings:配置信息确认。
    Test access with supplied credentials:是否进行访问测试,默认为Y。
    Save settings:如果测试成功会有些提示,是否将配置信息保存到文件,默认在/root/.s3cfg。后面在使用s3cmd命令的时候会自动从此目录读取配置,后续也可以对这里直接进行修改。

主要步骤如下

# 查看用户Jerry的详细信息:
radosgw-admin user info --uid=jerry

 #           "user": "jerry",
 #           "access_key": "X0T9CHPVVC6DBM6LNLEC",
 #           "secret_key": "z1AB4bKvcd5O6C5jfzBwcUcxeq7cvfMRM7CasXxr"

# 配置s3cmd客户端工具(按照提示一步步走下去即可)
s3cmd --configure

使用s3cmd工具创建bucket,上传、下载文件,具体过程如下

# 过程遇到的一个小问题(ERROR: S3 error: 403 (SignatureDoesNotMatch))—— 由于直接使用的是IP地址而为使用域名:修改版本启用V2,如下方法解决一下:
sed -i '/signature_v2/s/False/True/g' /root/.s3cfg

# 创建bucket:
s3cmd mb s3://mybucket

# 上传文件:
s3cmd put /etc/passwd s3://mybucket/

# 下载文件:
s3cmd get s3://mybucket/passwd /opt/

#删除文件
s3cmd del s3://mybucket/passwd

# 查看:
s3cmd ls
s3cmd la
s3cmd ls s3://mybucket

#上传下载失败将 /etc/ceph/ceph.conf 下的 mon_max_pg_per_osd = 1000设置的大一些,重启


#参考博客https://blog.51cto.com/u_15127534/4381614

四、ceph常用命令

1、服务相关

- systemctl status ceph\*.service ceph\*.target  #查看所有服务
- systemctl stop ceph\*.service ceph\*.target  #关闭所有服务
- systemctl start ceph.target   #启动服务
- systemctl stop ceph-osd\*.service  # 关闭所有osd服务
- systemctl stop ceph-mon\*.service  #关闭所有mon服务
- systemctl start ceph-osd@{id}  #启动单个osd服务
- systemctl start ceph-mon@{hostname} #启动单个mon服务
- systemctl start ceph-mds@{hostname} #启动单个mds服务

2、查看

- ceph -help #查看命令帮助
- ceph -s #查看状态
- ceph osd pool set rbd pg_num 1024   # 修改pg_num数量
- ceph osd pool set rbd pgp_num 1024   # 修改pgp_num数量
- ceph osd tree  #查看osd树列表
- ceph osd pool ls  #查看所有的osd池
- ceph --admin-daemon /var/run/ceph/ceph-osd.0.asok config show  # 查看指定的osd运行中的所有参数
- rados df   #查看储存池使用情况
- rados -p rbd ls |sort  
- ceph osd pool get rbd pg_num 
- ceph osd pool get rbd pgp_num 
- ceph osd pool set rbd pg_num 1024
- ceph osd pool set rbd pgp_num 1024

3、rbd相关

rbd create image1 --size 60G	
     # 默认在rbd pool下创建一个名为image1, 大小为1G的image,等同于
     rbd create rbd/image1 --size 60G --image-format 2
 
rbd list	
    # 列出所有的块设备image
 
rbd info image1	
    # 查看某个具体的image的信息。例如:
  
rbd feature disable image1 exclusive-lock, object-map, fast-diff, deep-flatten
     # 关掉image1的一些feature
 
rbd map image1	
     #把test_image块设备映射到操作系统,
     例如:h$ sudo rbd map image1
               /dev/rbd0
 
rbd showmapped	
     #显示已经映射的块设备,
     例如:$ rbd showmapped
              id pool image  snap device
              0  rbd  image1 -    /dev/rbd0
 
rbd unmap image1	#取消映射
 
rbd rm image	    #删除一个rbd image

4、rodos相关

rados lspools	            #查看ceph 集群的pool
rados mkpool <pool-name>	#创建名为<pool-name>的ceph pool
rados ls	                #列出叫rbd的pool里的objects

5、清除ceph相关配置

停止所有进程: 
systemctl stop ceph\*.service ceph\*.target

卸载所有ceph程序:
ceph-deploy uninstall [{ceph-node}]

删除ceph相关的安装包:
ceph-deploy purge {ceph-node} [{ceph-data}]

例如:ceph-deploy purge node4

删除ceph相关的配置:
ceph-deploy purgedata {ceph-node} [{ceph-data}]

删除key:
ceph-deploy forgetkeys

卸载ceph-deploy管理:
yum -y remove ceph-deploy

参考博客https://blog.z0ukun.com/?p=2765