ceph 基础架构

Ceph 存储集群至少需要一个 Ceph Monitor 和两个 OSD 守护进程。而运行 Ceph 文件系统客户端时,则必须要有元数据服务器( Metadata Server )。
image.png

Ceph 把客户端数据保存为存储池内的对象。通过使用 CRUSH 算法, Ceph 可以计算出哪个归置组(PG)应该持有指定的对象(Object),然后进一步计算出哪个 OSD 守护进程持有该归置组。 CRUSH 算法使得 Ceph 存储集群能够动态地伸缩、再均衡和修复。

Ceph OSDs

Ceph OSD 守护进程( Ceph OSD )的功能是存储数据,处理数据的复制、恢复、回填、再均衡,并通过检查其他OSD 守护进程的心跳来向 Ceph Monitors 提供一些监控信息。当 Ceph 存储集群设定为有2个副本时,至少需要2个 OSD 守护进程,集群才能达到 active+clean 状态( Ceph 默认有3个副本,但你可以调整副本数)。

Monitors

Ceph Monitor维护着展示集群状态的各种图表,包括监视器图、 OSD 图、归置组( PG )图、和 CRUSH 图。 Ceph 保存着发生在Monitors 、 OSD 和 PG上的每一次状态变更的历史信息(称为 epoch )。

MDSs

Ceph 元数据服务器( MDS )。为 Ceph 文件系统存储元数据(也就是说,Ceph 块设备和 Ceph 对象存储不使用MDS )。元数据服务器使得 POSIX 文件系统的用户们,可以在不对 Ceph 存储集群造成负担的前提下,执行诸如 ls、find 等基本命令。

ceph-mds 是 Ceph 分布式文件系统的元数据服务器守护进程。一或多个 ceph-mds 例程协作着管理文件系统的命名空间、协调到共享 OSD 集群的访问。一张图看懂mds是怎么回事

image.png

其他组件

  • PG:PG 全称 Placement Grouops,是一个逻辑的概念,一个 PG 包含多个 OSD。引入 PG 这一层其实是为了更好的分配数据和定位数据。
  • RADOS:RADOS 全称 Reliable Autonomic Distributed Object Store,是 Ceph 集群的精华,用户实现数据分配、Failover 等集群操作。
  • RBD:RBD 全称 RADOS block device,是 Ceph 对外提供的块设备服务。
  • RGW:RGW 全称 RADOS gateway,是 Ceph 对外提供的对象存储服务,接口与 S3 和 Swift 兼容。
  • CephFS:CephFS 全称 Ceph File System,是 Ceph 对外提供的文件系统服务。
  • Pool:Pool是一个抽象的存储池,它是PG之上的一层逻辑。它规定了数据冗余的类型以及对应的副本分布策略。目前实现了两种pool类型:replicated类型和Erasure Code类型。
    • (1) 一个pool由多个PG构成,一个PG只能属于一个POOL
    • (2) 同一个Pool中的PG具有相同的类型,比如,如Pool为副本类型,则Pool中所有的PG都是多副本的
    • 简单来说,pool就是ceph存储数据时的逻辑分区
  • PG是OSD之上的一层逻辑,可视其为一个逻辑概念。从名字可理解PG是一个放置策略组,它是对象的集合,该集合里的所有对象都具有相同的放置策略:对象的副本都分布在相同的OSD列表上。
    关系说明:
    • (1) PG有主从之分,对于多副本而言,一个PG的主从副本分布在不同的OSD上;
    • (2) 一个对象只能属于一个PG,一个PG包含很多个对象
    • (3) 一个PG对应于一个OSD列表,PG的所有对象对存放在对应的OSD列表上
    • 这里的对象是rados object,而非用户对象

关系图

image.png

基础环境

规划

节点IP数据盘(OSD)角色
ceph1192.168.50.128MON、MDS、PROM、GRAFANA
ceph2192.168.50.129/dev/sdbOSD
ceph3192.168.50.130/dev/sdbOSD

关闭防火墙

systemctl stop firewalld.service
systemctl disable firewalld.service
firewall-cmd --state

关闭 selinux

sed -i '/^SELINUX=.*/c SELINUX=disabled' /etc/selinux/config
sed -i 's/^SELINUXTYPE=.*/SELINUXTYPE=disabled/g' /etc/selinux/config
grep --color=auto '^SELINUX' /etc/selinux/config
setenforce 0
reboot

设置主机名

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

配置 hosts

vim /etc/hosts

192.168.50.128 ceph1
192.168.50.129 ceph2
192.168.50.130 ceph3

添加软件源

添加Octopus版本的yum源(v15)

vim /etc/yum.repos.d/ceph.repo

[Ceph]
name=Ceph packages for $basearch
baseurl=https://mirrors.aliyun.com/ceph/rpm-octopus/el8/$basearch
enabled=1
gpgcheck=0
type=rpm-md

[Ceph-noarch]
name=Ceph noarch packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-octopus/el8/noarch
enabled=1
gpgcheck=0
type=rpm-md

[ceph-source]
name=Ceph source packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-octopus/el8/SRPMS
enabled=1
gpgcheck=0
type=rpm-md

添加 pacific 版本的yum源(v16)

[Ceph]
name=Ceph $basearch
baseurl=https://mirrors.aliyun.com/ceph/rpm-pacific/el8/$basearch
enabled=1
gpgcheck=0

[Ceph-noarch]
name=Ceph noarch
baseurl=https://mirrors.aliyun.com/ceph/rpm-pacific/el8/noarch
enabled=1
gpgcheck=0

[Ceph-source]
name=Ceph SRPMS
baseurl=https://mirrors.aliyun.com/ceph/rpm-pacific/el8/SRPMS
enabled=1
gpgcheck=0

安装最新版本源

其实这里最简单的方法就是使用最新版本 cephadm 添加软件源,然后更改为镜像地址即可

./cephadm add-repo --release octopus
sed -i 's#download.ceph.com#mirrors.aliyun.com/ceph#' /etc/yum.repos.d/ceph.repo
dnf makecache

更换系统源(可选)

系统yum源更换成阿里源,并更新yum文件缓存

wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo

sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo

yum clean all && yum makecache

安装epel库

yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
sed -i 's|^#baseurl=https://download.fedoraproject.org/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*

安装基础软件

dnf install net-tools wget vim bash-completion lrzsz unzip zip -y
dnf install python3 

podman

podman 下载镜像经常出问题,建议选择docker,两者装一即可

dnf install podman

配置 podman 镜像加速
原配置文件备份:

cp /etc/containers/registries.conf /etc/containers/registries.conf.bak

修改配置文件内容如下:

unqualified-search-registries = ["docker.io"]

[[registry]]
prefix = "docker.io"
location = "hub-mirror.c.163.com"

[[registry.mirror]]
prefix = "docker.io"
location = "hub-mirror.c.163.com"

docker

wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo

sudo sed -i 's+download.docker.com+mirrors.cloud.tencent.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

yum install docker-ce docker-ce-cli containerd.io

systemctl start docker.service
systemctl enable docker.service

vim /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"]
}

systemctl restart docker


# ceph 安装
## 安装 cephadm
### yum 安装
每台节点
```bash
dnf install cephadm

curl 安装

curl --silent --remote-name --location https://github.com/ceph/ceph/raw/octopus/src/cephadm/cephadm
chmod +x cephadm
./cephadm install

创建 ceph 新集群

cephadm bootstrap --mon-ip 192.168.50.128

登录 dashboard

https://192.168.50.128:8443/
账号和密码在之前 bootstrap 命令的输出中,首次登录要更改密码

将ceph命令映射到本地

cephadm install ceph-common

查看集群状态

ceph status

ceph health

添加新服务器进ceph集群

这里要注意目标主机是否开启密码登录,如果没有开启,无法复制

ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph2
ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph3

ceph orch host add ceph2
ceph orch host add ceph3

配置文件复制

scp /etc/ceph/ceph.conf root@ceph2:/etc/ceph/
scp /etc/ceph/ceph.conf root@ceph3:/etc/ceph/

scp /etc/ceph/ceph.client.admin.keyring root@ceph2:/etc/ceph/
scp /etc/ceph/ceph.client.admin.keyring root@ceph3:/etc/ceph/

添加 OSD 角色(服务)到集群

这里会很慢,感觉应该是镜像下载的原因,等就得了。

ceph orch daemon add osd ceph1:/dev/sdb
ceph orch daemon add osd ceph2:/dev/sdb
ceph orch daemon add osd ceph3:/dev/sdb

# 添加别的角色也是类似的操作,比如添加一个 mon
ceph orch daemon add mon ceph2:192.168.122.200/24

创建一个文件系统卷

# 可以先创建两个 Pool,如果不创建的话,会默认创建的
# ceph osd pool create testfs.data # 用于保存数据
# ceph osd pool create testfs.meta # 用于保存元数据
 
# 创建一个文件系统卷 testfs
# 下面命令中的 testfs.meta testfs.data 不指定就会创建默认名称是
# cephfs.testfs.meta 和 cephfs.testfs.data 的 Pool
# 如果上面创建了别的名字的 Pool ,这里也是可以用的,指定 Pool 名称就是
ceph fs volume create testfs # testfs.meta testfs.data
 
# 查看一下当前的文件系统卷有哪些
ceph fs volume ls
[
    {
        "name": "testfs"
    }
]

创建完成之后,添加一个 mds (元数据)服务

# 设置一下副本数量
ceph orch apply mds testfs --placement="3 ceph1 ceph2 ceph3"
 
# 在节点 ceph-mon1 上添加 mds 服务
ceph orch daemon add mds testfs ceph-mon1
 
# 查看一下文件系统状态
ceph fs status testfs
testfs - 0 clients
======
RANK    STATE              MDS            ACTIVITY   DNS    INOS   DIRS   CAPS  
 0    reconnect  testfs.ceph-mon1.hypudc               0      0      0      0   
       POOL           TYPE     USED  AVAIL  
cephfs.testfs.meta  metadata  64.0k  18.9G  
cephfs.testfs.data    data       0   12.6G  
MDS version: ceph version 17.0.0-2904-g116ef525 (116ef52566c5fb8f7621439218fb492595e2d85a) quincy (dev)

使用命令 ceph mds stat 查看下 mds 服务状态

ceph mds stat
testfs:1 cephfs:1 {cephfs:0=cephfs.ceph-mon1.komjhm=up:active,testfs:0=testfs.ceph-mon1.hypudc=up:active}

重新看一下集群状态,我这里因为创建了两个文件系统和 mds ,所以下面有的显示了两个的状态。

ceph -s
  cluster:
    id:     be48dd3a-983d-11eb-b776-525400648899
    health: HEALTH_WARN
            insufficient standby MDS daemons available
            clock skew detected on mon.ceph-osd1
            Degraded data redundancy: 22/66 objects degraded (33.333%), 13 pgs degraded, 224 pgs undersized
            OSD count 2 < osd_pool_default_size 3
 
  services:
    mon: 2 daemons, quorum ceph-mon1,ceph-osd1 (age 97m)
    mgr: ceph-mon1.nabssq(active, since 26h)
    mds: 2/2 daemons up
    osd: 2 osds: 2 up (since 85m), 2 in (since 86m)
 
  data:
    volumes: 2/2 healthy
    pools:   4 pools, 224 pgs
    objects: 22 objects, 2.3 KiB
    usage:   13 MiB used, 40 GiB / 40 GiB avail
    pgs:     22/66 objects degraded (33.333%)
             211 active+undersized
             13  active+undersized+degraded
 
  io:
    client:   409 B/s rd, 0 op/s rd, 0 op/s wr
 
  progress:
    Global Recovery Event (22m)
      [............................]

在客户端机器挂载 cephfs

先在客户端机器上安装 ceph-common,软件安装包在离线安装包里面有。
然后直接使用下面的命令进行挂载操作即可:

# 创建挂载点目录,我这里创建两个,把前面创建的两个 fs 都挂载上
mkdir /mnt/testfs
mkdir /mnt/cephfs
 
# 使用 mount.ceph 进行挂载,使用的相关参数等可以  man mount.ceph 进行查看
#     secret 参数的值来自于 /etc/ceph/ceph.client.admin.keyring 文件内
#     fs 用于指定使用那个 cephfs
#     
mount -t ceph :/ /mnt/testfs -o name=admin,secret=AQCJs25gjmpIBBAAdbmFcI+nfdd9rfsa+zW78g==,fs=testfs
# 指定任意一个 MON 节点的 IP 都可以,也可以指定多个,用 , 分隔
mount -t ceph 192.168.122.200:6789:/ cephfs -o name=admin,secret=AQCJs25gjmpIBBAAdbmFcI+nfdd9rfsa+zW78g==,fs=cephfs
 
# 挂载后使用 df 命令查看下
df -h
文件系统                容量  已用  可用 已用% 挂载点
.... 多余的删掉了....
192.168.122.103:6789:/   12G  2.4G  9.3G   21% /mnt/cephfs
192.168.122.200:6789:/   11G  1.7G  9.3G   15% /mnt/testfs

多参数和挂载示例还是通过 man mount.ceph 进行查询比较好。

使用 ceph fs dump 命令查看一下 cephfs 的状况。

ceph fs dump
dumped fsmap epoch 16
e16
enable_multiple, ever_enabled_multiple: 1,1
compat: compat={},rocompat={},incompat={1=base v0.20,2=client writeable ranges,3=default file layouts on dirs,4=dir inode in separate object,5=mds uses versioned encoding,6=dirfrag is stored in omap,8=no anchor table,9=file layout v2,10=snaprealm v2}
legacy client fscid: 1
 
Filesystem 'testfs' (1)
fs_name testfs
epoch   16
flags   12
created 2021-04-09T09:28:18.089566+0000
modified        2021-04-12T03:08:34.919957+0000
tableserver     0
root    0
session_timeout 60
session_autoclose       300
max_file_size   1099511627776
required_client_features        {}
last_failure    0
last_failure_osd_epoch  35
compat  compat={},rocompat={},incompat={1=base v0.20,2=client writeable ranges,3=default file layouts on dirs,4=dir inode in separate object,5=mds uses versioned encoding,6=dirfrag is stored in omap,8=no anchor table,9=file layout v2,10=snaprealm v2}
max_mds 1
in      0
up      {0=14646}
failed
damaged
stopped
data_pools      [2]
metadata_pool   1
inline_data     disabled
balancer
standby_count_wanted    1
[mds.testfs.ceph-mon1.hypudc{0:14646} state up:active seq 58769 join_fscid=1 addr [v2:192.168.122.103:6804/1724461665,v1:192.168.122.103:6805/1724461665]]
 
 
Filesystem 'cephfs' (2)
fs_name cephfs
epoch   14
flags   12
created 2021-04-09T09:40:15.916424+0000
modified        2021-04-09T09:50:45.474894+0000
tableserver     0
root    0
session_timeout 60
session_autoclose       300
max_file_size   1099511627776
required_client_features        {}
last_failure    0
last_failure_osd_epoch  0
compat  compat={},rocompat={},incompat={1=base v0.20,2=client writeable ranges,3=default file layouts on dirs,4=dir inode in separate object,5=mds uses versioned encoding,6=dirfrag is stored in omap,8=no anchor table,9=file layout v2,10=snaprealm v2}
max_mds 1
in      0
up      {0=24235}
failed
damaged
stopped
data_pools      [3]
metadata_pool   4
inline_data     disabled
balancer
standby_count_wanted    0
[mds.cephfs.ceph-mon1.komjhm{0:24235} state up:active seq 3 join_fscid=2 addr [v2:192.168.122.103:6802/4112730485,v1:192.168.122.103:6803/4112730485]]

ceph 常用命令

# 修改 public_network
ceph config set mon public_network 172.16.2.0/24

# 添加标签
ceph orch host label add ceph135 mon

# 添加 host
ceph orch host add ceph136

# 根据标签部署 mon 服务
ceph orch apply mon label:mon

# 验证 osd 部署情况
ceph osd df

# 查看集群状态
ceph -s

注意

如果 public_network 没有设置正确,会造成 mon 服务无法创建完成。
如果集群中设计两个网段,可以用逗号隔开分开设置。

ceph config set mon public_network 172.16.16.0/20,172.16.0.0/20

参考

CentOS8使用cephadm部署和配置Ceph Octopus
https://blog.csdn.net/get_set/article/details/108092248

cephadm
https://raw.githubusercontent.com/ceph/ceph/octopus/src/cephadm/cephadm

K8S 六种存储解决方案的性能比较测试
https://www.codercto.com/a/69103.html

K8s & K3s 集群中持久化存储方案选型
https://www.cnblogs.com/vpc123/articles/14397807.html

终于有人把Ceph分布式存储讲清楚了!
https://zhuanlan.zhihu.com/p/165374802

Ceph实现DockerSwarm集群共享存储的尝试
https://segmentfault.com/a/1190000023292938

Ceph 分布式存储使用指南
https://blog.51cto.com/u_12639039/2582089

Ceph性能测试(RBD、CephFS、NFS、Cache Tier)
https://blog.csdn.net/get_set/article/details/108092302

Cephfs & Ceph RBD 在k8s中的适用场景讨论及数据库性能压测
https://blog.csdn.net/ywq935/article/details/82895732