Ceph 部署

551 阅读14分钟

Ceph 部署

安装方式:

docs.ceph.com/en/latest/i…

  1. Cephadm
  2. Rook
  3. Manual

一、安装ceph

手动安装方式

docs.ceph.com/en/latest/i…

1.1 获取安装包

docs.ceph.com/en/latest/i…

docs.ceph.com/en/latest/i…

获取安装包的方式:

  1. Cephadm
  2. 手动配置软件仓库
  3. 手动下载软件包

1.1.1 cephadm

docs.ceph.com/en/latest/i…

# 下载 cephadm 脚本
curl --silent --remote-name --location \
"https://github.com/ceph/ceph/raw/quincy/src/cephadm/cephadm"chmod +x cephadm
​
# 配置指定版本名称的软件仓库
./cephadm add-repo --release nautilus
​
# Octopus (15.2.0) 以上的版本,可以指定版本号
./cephadm add-repo --version 15.2.1
​
# 如果是开发版本
./cephadm add-repo --dev my-branch
​
# 安装工具包
./cephadm install ceph-common
​
​

1.1.2 手动配置软件仓库

docs.ceph.com/en/latest/i…

# 配置apt源
sed -r -e 's#archive.ubuntu.com#mirrors.cloud.tencent.com#g' \
-e 's#security.ubuntu.com#mirrors.cloud.tencent.com#g' \
/etc/apt/sources.list.curtin.old
​
​
​
# 添加验证key
wget -q -O- 'https://download.ceph.com/keys/release.asc' | sudo apt-key add -
wget -q -O- 'http://mirrors.ustc.edu.cn/ceph/keys/release.asc' | sudo apt-key add -
wget -q -O- 'http://mirrors.cloud.tencent.com/ceph/keys/release.asc' | sudo apt-key add -
​
​
​
# 添加软件仓库
# https://download.ceph.com/debian-{release-name}
# https://download.ceph.com/debian-{version}
# https://docs.ceph.com/en/latest/releases/general/#ceph-releases-general
# x.2.z - stable/bugfix releases (for users)
# 镜像源
# https://docs.ceph.com/en/latest/install/mirrors
# http://mirrors.ustc.edu.cn/ceph/# {codename}
lsb_release -sc
​
sudo apt-add-repository 'deb https://download.ceph.com/debian-quincy/ {codename} main'
​
sudo apt-add-repository "deb http://mirrors.ustc.edu.cn/ceph/debian-17.2.5/  $(lsb_release -sc) main"
​
sudo apt-add-repository "deb http://mirrors.cloud.tencent.com/ceph/debian-17.2.5/  $(lsb_release -sc) main"# 早期版本的linux发行版
echo deb https://download.ceph.com/debian-quincy/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list
​
# 早期版本的ceph版本
# {codename} 
# ceph {release-name}
lsb_release -sc
sudo apt-add-repository 'deb https://download.ceph.com/debian-{release-name}/ {codename} main'# 早期版本linux发行版
echo deb https://download.ceph.com/debian-{release-name}/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list
​
​

1.1.3 手动下载安装包

docs.ceph.com/en/latest/i…

# {release} ceph release
# {version} ceph version
# {distro} linux codename lsb_release -sc
# {arch} CPU arch
​
wget -q https://download.ceph.com/debian-{release}/pool/main/c/ceph/ceph_{version}{distro}_{arch}.deb
​
​

1.2 安装ceph

docs.ceph.com/en/latest/i…

docs.ceph.com/en/latest/i…

1.2.1 安装存储集群

# 配置好软件源后
sudo apt-get update && sudo apt-get install ceph ceph-mds
​

1.2.2 为虚拟化提供块存储设备

docs.ceph.com/en/latest/i…

1.3 部署ceph集群

docs.ceph.com/en/latest/i…

docs.ceph.com/en/latest/i…

在节点上安装好 ceph 软件包后,可以手动部署存储集群

ceph集群至少需要一个 monitor

与对象存储集群副本一样多的OSD

1.3.1 主机规划

节点IP
ceph01172.16.10.41monitor,manager,osd
ceph02172.16.10.42osd
ceph03172.16.10.43osd

1.3.2 引导初始化 monitor

引导初始化 monitor

Monitor 部署还为整个集群设置了重要的标准

  • 池的副本数量
  • 每个 OSD 的归置组数量
  • 心跳间隔
  • 是否需要身份验证等

Unique Identifier

fsid 是集群的唯一标识符,代表 Ceph 存储集群主要用于 Ceph 文件系统的文件系统 ID。

Cluster Name

Ceph 集群有一个集群名称,它是一个没有空格的简单字符串。不同的集群分不同的名称。

Monitor Name

集群中的每个监视器实例都有一个唯一的名称。

通常是主机名称(建议每个主机一个Ceph Monitor,并且不建议Ceph OSD守护程序与Ceph Monitor 部署在一台主机上)hostname -s

Monitor Map

引导初始 Monitor 需要生成Monitor map。

map 包含:

  • fsid
  • 集群名称(或使用默认值)
  • 至少一个主机名及其 IP 地址

Monitor Keyring

Monitor通过密钥相互通信。

必须生成一个带有Monitor的密钥,并在引导初Monitor 时使用。

Administrator Keyring

要使用 ceph CLI 工具,必须有一个 client.admin 用户。

必须生成admin用户和keyring,还必须将client.admin用户添加到monitor keyring

上述要求并不意味着创建 Ceph 配置文件

建议创建 Ceph 配置文件并使用 fsid、mon initial members和 mon host 等设置。

您也可以在运行时获取和设置所有 Monitor 设置。

Ceph 配置文件可能只包含那些覆盖默认值的设置。

在 Ceph 配置文件中维护这些设置可以更轻松地维护您的集群。

# 配置文件目录
ls /etc/ceph
​
# 配置文件
vim /etc/ceph/ceph.conf
​
[global]
# # {UUID} uuidgen
# fsid = {UUID}
fsid = a7f64266-0894-4f1e-a635-d0aeaca0e993
​
# mon initial members = {hostname}[,{hostname}]
mon initial members = mon-node1
​
# mon host = {ip-address}[,{ip-address}]
mon host = 192.168.0.1# 常见 ceph 配置
[global]
fsid = {cluster-id}
mon initial members = {hostname}[, {hostname}]
mon host = {ip-address}[, {ip-address}]
public network = {network}[, {network}]
cluster network = {network}[, {network}]
auth cluster required = cephx
auth service required = cephx
auth client required = cephx
osd journal size = {n}
osd pool default size = {n}  # 一个对象些n次
osd pool default min size = {n} # 在降级状态下写入n 个副本
osd pool default pg num = {n}
osd pool default pgp num = {n}
osd crush chooseleaf type = {n}
​
[global]
fsid = 478b622e-1a00-4179-975f-a8abbd679f4b
mon initial members = ceph01
mon host = 172.16.10.41
public network = 172.16.10.0/24
auth cluster required = cephx
auth service required = cephx
auth client required = cephx
osd journal size = 1024
osd pool default size = 3
osd pool default min size = 2
osd pool default pg num = 128
osd pool default pgp num = 128
osd crush chooseleaf type = 1
​
​
# 生成密钥文件
sudo ceph-authtool \
--create-keyring /etc/ceph/ceph.mon.keyring \
--gen-key -n mon. \
--cap mon 'allow *'
​
# 配置admin 用户
sudo ceph-authtool \
--create-keyring /etc/ceph/ceph.client.admin.keyring \
--gen-key -n client.admin \
--cap mon 'allow *' \
--cap osd 'allow *' \
--cap mds 'allow *' \
--cap mgr 'allow *'
​
# 生成bootstrap-osd 密钥
sudo ceph-authtool \
--create-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring \
--gen-key -n client.bootstrap-osd \
--cap mon 'profile bootstrap-osd' \
--cap mgr 'allow r'
​
# 添加admin,bootstrap-osd 密钥到 ceph.mon.keyring
sudo ceph-authtool /etc/ceph/ceph.mon.keyring \
--import-keyring /etc/ceph/ceph.client.admin.keyring
​
sudo ceph-authtool /etc/ceph/ceph.mon.keyring \
--import-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring
​
sudo chown ceph:ceph /etc/ceph/ceph.mon.keyring
​
# 生成 monitor map 
monmaptool --create \
--add {hostname} {ip-address} \
--fsid {uuid} /tmp/monmap
​
monmaptool --create \
--add ceph01 172.16.10.41 \
--fsid 478b622e-1a00-4179-975f-a8abbd679f4b \
/etc/ceph/monmap
​
# 在monitor主机上创建一个默认数据目录(或多个目录)
# https://docs.ceph.com/en/latest/rados/configuration/mon-config-ref/#data
sudo mkdir /var/lib/ceph/mon/{cluster-name}-{hostname}
sudo -u ceph mkdir /var/lib/ceph/mon/ceph-ceph01
​
# 使用monitor map和密钥环填充monitor守护程序。
sudo -u ceph ceph-mon [--cluster {cluster-name}] \
--mkfs -i {hostname} --monmap /tmp/monmap \
--keyring /tmp/ceph.mon.keyring
​
sudo -u ceph ceph-mon \
--mkfs -i ceph01 --monmap /etc/ceph/monmap \
--keyring /etc/ceph/ceph.mon.keyring
​
# 启动 monitor
sudo systemctl start ceph-mon@mon-node1
sudo systemctl start ceph-mon@ceph01
sudo systemctl enable ceph-mon@ceph01
​
​
# 确保为 ceph-mon 打开防火墙端口
sudo firewall-cmd --zone=public --add-service=ceph-mon
sudo firewall-cmd --zone=public --add-service=ceph-mon --permanent
​
# 验证monitor是否正在运行
sudo ceph -s
​
cluster:
  id:     a7f64266-0894-4f1e-a635-d0aeaca0e993
  health: HEALTH_OK
​
services:
  mon: 1 daemons, quorum mon-node1
  mgr: mon-node1(active)
  osd: 0 osds: 0 up, 0 in
​
data:
  pools:   0 pools, 0 pgs
  objects: 0 objects, 0 bytes
  usage:   0 kB used, 0 kB / 0 kB avail
  pgs:
  
# 应该会看到一个运行状况错误,表明归置组处于非活动状态
# 添加 OSD 并启动它们,归置组健康错误应该会消失。
​
​

1.3.3 管理器守护程序配置(Manager)

在运行 ceph-mon 守护进程的每个节点上,还应该设置一个 ceph-mgr 守护进程。

docs.ceph.com/en/latest/m…

# 为守护进程创建一个身份验证密钥
# $name manager 名称
name=$HOSTNAME
name=ceph01
ceph auth get-or-create mgr.$name \
mon 'allow profile mgr' \
osd 'allow *' \
mds 'allow *' > keyring 
​
# 将该密钥作为名为 keyring 的文件放入 mgr 数据路径中,
#  cluster "ceph"
#  mgr $name "foo"
# /var/lib/ceph/mgr/ceph-foo
# /var/lib/ceph/mgr/ceph-foo/keyring
sudo -u ceph mkdir -p /var/lib/ceph/mgr/ceph-ceph01
sudo -u ceph vi /var/lib/ceph/mgr/ceph-ceph01/keyring
​
# 启动 ceph-mgr 守护进程
ceph-mgr -i $name
ceph-mgr -i ceph01
​
sudo systemctl start ceph-mgr@ceph01
sudo systemctl enable --now ceph-mgr@ceph01
sudo systemctl status ceph-mgr@ceph01
​
​
# 通过查看 ceph status 的输出来检查 mgr 是否已启动
ceph status
​
## mgr active: $name
​
​

管理器是一个新的守护进程,需要新的 CephX 功能

从旧版本的 Ceph 升级集群,或使用默认的安装/部署工具,管理客户端应该会自动获得此功能

如果使用其他的工具,则在调用某些 ceph 集群命令时可能会出现 EACCES 错误

通过修改用户功能将 "mgr allow *" 节添加到客户端的 cephx 功能

docs.ceph.com/en/latest/r…

ceph auth get client.john
ceph auth caps client.john mon 'allow r' osd 'allow rw pool=liverpool'
ceph auth caps client.paul mon 'allow rw' osd 'allow rwx pool=liverpool'
ceph auth caps client.brian-manager mon 'allow *' osd 'allow *'
​
​

高可用性

通常,在每台运行 ceph-mon 守护程序的主机上设置一个 ceph-mgr 以实现相同级别的可用性。

默认情况下,首先出现的 ceph-mgr 实例将被monitor激活, 其他将成为备用。

ceph-mgr 守护进程之间没有仲裁要求。

如果活动守护进程超过 mon_mgr_beacon_grace 时间未能向monitor 发送信标,那么它将被备用守护进程替换。

如果要抢占故障转移,可以使用 ceph mgr fail 将 ceph-mgr 守护进程显式标记为失败。

性能和可扩展性

所有的 mgr 模块共享一个缓存,可以通过 ceph config set mgr mgr_ttl_cache_expire_seconds 启用。

当有 500+ osd 或 10k+ pgs 时,建议启用 10 秒 TTL 的缓存,因为内部结构可能会增加大小,请求大型结构时导致延迟问题。

可以运行 ceph daemon mgr.${MGRNAME} perf dump 来检索 mgr 模块的性能计数器。

在 mgr.cache_hit 和 mgr.cache_miss 中,可以找到 mgr 缓存的 hit/miss 率。

使用模块

使用命令 ceph mgr module ls 查看哪些模块可用,哪些当前已启用。

使用 ceph mgr module ls --format=json-pretty 查看禁用模块的详细元数据。

分别使用命令 ceph mgr module enable 和 ceph mgr module disable 启用或禁用模块。

要查看这些模块的地址,使用命令 ceph mgr services

集群第一次启动时,它使用 mgr_initial_modules 设置来覆盖要启用的模块。

在集群的剩余生命周期中,此设置将被忽略:仅将其用于引导。

模块池

管理器创建一个池供其模块使用来存储状态。

此池的名称是 .mgr(前导 . 表示保留的池名称)。

调用模块命令

在模块实现命令行钩子的地方,这些命令可以作为普通的 Ceph 命令访问。

Ceph 会自动将模块命令合并到标准 CLI 界面中,并将它们适当地路由到模块。

ceph <command | help>

配置项

docs.ceph.com/en/latest/m…

1.3.4 添加OSDs

docs.ceph.com/en/latest/i…

运行初始monitor 后,需要添加 OSD。

在您有足够的 OSD 来处理对象的副本数量之前,您的集群无法达到 active + clean 状态。

例如:osd pool default size = 2 需要至少两个 OSD

启动monitor 后,集群有一个默认的 CRUSH map,CRUSH map没有任何 Ceph OSD 守护进程映射到 Ceph 节点。

1.3.4.1 使用快捷工具

Ceph 提供了 ceph-volume 实用程序,它可以准备逻辑卷、磁盘或分区以供 Ceph 使用。

ceph-volume 实用程序通过增加索引来创建 OSD ID。

此外,ceph-volume 会为你将新的 OSD 添加到主机下的 CRUSH 映射中。

执行 ceph-volume -h 获取 CLI 详细信息。

ceph-volume 实用程序自动执行以下长格式的步骤。

要使用简短程序创建前两个 OSD,请为每个 OSD 执行以下操作:

BLUESTORE

创建OSD

# 从monitor节点(mon-node1)复制 /var/lib/ceph/bootstrap-osd/ceph.keyring 
# 到osd node (osd-node1) /var/lib/ceph/bootstrap-osd/ceph.keyring 
# ssh {osd node}
# sudo ceph-volume lvm create --data {data-path}
​
scp -3 root@mon-node1:/var/lib/ceph/bootstrap-osd/ceph.keyring root@osd-node1:/var/lib/ceph/bootstrap-osd/ceph.keyring
​
ssh osd-node1
sudo ceph-volume lvm create --data /dev/hdd1
sudo ceph-volume lvm create --data /dev/sdb
sudo ceph-volume lvm create --data /dev/sdc

或者,创建过程可以分为两个阶段(准备和激活):

# 准备 osd
ssh {osd node}
sudo ceph-volume lvm prepare --data {data-path} {data-path}
​
ssh osd-node1
sudo ceph-volume lvm prepare --data /dev/hdd1
​
# 准备好后,需要准备好的 OSD 的 ID 和 FSID 用于激活
# 可以通过列出当前服务器中的 OSD 来获得:
sudo ceph-volume lvm list
​
# 激活OSD
sudo ceph-volume lvm activate {ID} {FSID}
sudo ceph-volume lvm activate 0 a7f64266-0894-4f1e-a635-d0aeaca0e993
​
​

文件存储

# 创建OSD
ssh {osd node}
sudo ceph-volume lvm create --filestore --data {data-path} --journal {journal-path}
​
ssh osd-node1
sudo ceph-volume lvm create --filestore --data /dev/hdd1 --journal /dev/hdd2
​
# 创建过程也可以分成两步(准备和激活)
# 准备OSD
ssh {node-name}
sudo ceph-volume lvm prepare --filestore --data {data-path} --journal {journal-path}
​
ssh osd-node1
sudo ceph-volume lvm prepare --filestore --data /dev/hdd1 --journal /dev/hdd2
​
# 激活
sudo ceph-volume lvm list
sudo ceph-volume lvm activate --filestore {ID} {FSID}
sudo ceph-volume lvm activate --filestore 0 a7f64266-0894-4f1e-a635-d0aeaca0e993
​

1.3.4.2 手动创建

在没有任何帮助实用程序的情况下,创建一个 OSD 并将其添加到集群和 CRUSH 映射中,过程如下:

# root身份连接 osd-node01
ssh {node-name}
sudo bash
​
# UUID
UUID=$(uuidgen)
​
# 为 OSD 生成 cephx 密钥。
OSD_SECRET=$(ceph-authtool --gen-print-key)
​
# 创建OSD
# 机器上存在 client.bootstrap-osd 键
#  /var/lib/ceph/bootstrap-osd/ceph.keyring
# 在存在该密钥的不同主机上以 client.admin 身份执行此命令。
ID=$(echo "{"cephx_secret": "$OSD_SECRET"}" | \
ceph osd new $UUID -i - \
-n client.bootstrap-osd -k /var/lib/ceph/bootstrap-osd/ceph.keyring)
​
# 也可以在 JSON 中包含一个 crush_device_class 属性来设置一个不同于默认值的初始类
# 基于自动检测设备类型的SSD或HDD# 在新 OSD 上创建默认目录
mkdir /var/lib/ceph/osd/ceph-$ID# 如果 OSD 用于 OS 驱动器以外的驱动器,请准备好与 Ceph 一起使用,并将其挂载到刚刚创建的目录中。
mkfs.xfs /dev/{DEV}
mount /dev/{DEV} /var/lib/ceph/osd/ceph-$ID# 将密钥写入 OSD 密钥环文件。
ceph-authtool --create-keyring /var/lib/ceph/osd/ceph-$ID/keyring \
--name osd.$ID --add-key $OSD_SECRET# 初始化OSD data目录
ceph-osd -i $ID --mkfs --osd-uuid $UUID# 修复所有权
chown -R ceph:ceph /var/lib/ceph/osd/ceph-$ID# 将 OSD 添加到 Ceph 后,该 OSD 就在您的配置中。
# 但是,它还没有运行。您必须先启动新的 OSD,然后它才能开始接收数据。
systemctl enable ceph-osd@$ID
systemctl start ceph-osd@$ID
systemctl status ceph-osd@$ID
​
systemctl enable ceph-osd@12
systemctl start ceph-osd@12
​
ceph -s
​
ceph osd tree
​

1.3.5 移除OSD

docs.ceph.com/en/latest/r…

# 从集群中移出 osd
ceph osd tree
ceph osd out {osd-num}
ceph osd out 0
ceph osd out 1
ceph osd out 2
​
​
# 观察pg数据平衡
ceph -w
​
# 停止osd服务
ssh {osd-host}
sudo systemctl stop ceph-osd@{osd-num}
sudo systemctl stop ceph-osd@0
sudo systemctl stop ceph-osd@1
sudo systemctl stop ceph-osd@2# 移除osd
ceph osd purge {id} --yes-i-really-mean-it
ceph osd purge 0 --yes-i-really-mean-it
ceph osd purge 1 --yes-i-really-mean-it
ceph osd purge 2 --yes-i-really-mean-it
​
ssh {admin-host}
cd /etc/ceph
vim ceph.conf
​
[osd.1]
host = {hostname}
​
# 旧版本
ceph osd crush remove {name}
ceph auth del osd.{osd-num}
​
ceph osd rm {osd-num}
#for example
ceph osd rm 1

二、使用

2.1 cephfs

2.1.1 添加 MDS

docs.ceph.com/en/latest/i…

在以下说明中,{id}是一个任意名称,例如机器的主机名。

# 创建 MDS数据目录
mkdir -p /var/lib/ceph/mds/{cluster-name}-{id}
mkdir -p /var/lib/ceph/mds/ceph-ceph01
​
# 创建MDS密钥
ceph-authtool --create-keyring /var/lib/ceph/mds/{cluster-name}-{id}/keyring \
--gen-key -n mds.{id}
​
ceph-authtool --create-keyring /var/lib/ceph/mds/ceph-ceph01/keyring \
--gen-key -n mds.ceph01
​
sudo ceph auth get-or-create mds.ceph01 \
mon 'profile mds' \
mgr 'profile mds' \
mds 'allow *' \
osd 'allow *' > /var/lib/ceph/mds/ceph-ceph01/keyring
​
# 导入密钥,设置权限
ceph auth add mds.{id} \
osd "allow rwx" \
mds "allow *" \
mon "allow profile mds" \
-i /var/lib/ceph/mds/{cluster}-{id}/keyring
​
ceph auth add mds.ceph01 \
osd "allow rwx" \
mds "allow *" \
mon "allow profile mds" \
-i /var/lib/ceph/mds/ceph-ceph01/keyring
​
# 设置密钥权限
chown -R ceph.ceph ceph-ceph01
chown ceph /var/lib/ceph/mds/ceph-ceph01/keyring
​
# 添加到ceph.conf 配置
[mds.{id}]
host = {id}
​
vi /etc/ceph/ceph.conf
[mds.ceph01]
host = ceph01
​
# 启动MDS
ceph-mds --cluster {cluster-name} -i {id} -m {mon-hostname}:{mon-port} [-f]
​
sudo systemctl start ceph-mds@${id}
sudo systemctl start ceph-mds@ceph01
​
# 删除MDS
# 先创建一个替代的MDS
sudo systemctl stop ceph-mds@${id}
sudo rm -rf /var/lib/ceph/mds/ceph-${id}
​
​
# 报错
mds.-1.0 ERROR: failed to authenticate: (22) Invalid argument
# 然后确保在全局部分的 ceph.conf 中没有设置密钥环
# 将其移至客户端部分
# 或添加特定于此 mds 守护程序的密钥环设置
# 并验证您在MDS数据目录中看到相同的密钥,而Ceph auth获取MDS。{id}输出。

2.1.2 cephfs

默认只能有一个文件系统

ceph fs flag set enable_multiple true 可以使用多个文件系统

创建pool

一个 Ceph 文件系统至少需要两个 RADOS 池

一个用于数据,一个用于元数据

计划这些池时有重要的考虑:

建议为元数据池配置至少 3 个副本,因为此池中的数据丢失会导致整个文件系统无法访问。

配置 4个不会是极端的,特别是因为元数据池的容量要求相当适中。

建议元数据池使用最快的可行低延迟存储设备(NVMe、Optane 或至少 SAS/SATA SSD),因为这将直接影响客户端文件系统操作的延迟

用于创建文件系统的数据池是“默认”数据池,也是存储所有inode回溯信息的位置,用于硬链接管理和灾难恢复。

因此,所有 CephFS 的 inode 在默认数据池中至少有一个对象。

如果为文件系统数据计划了纠删码池,最好将默认配置为复制池,以提高更新回溯时的小对象写入和读取性能。

另外,可以添加另一个纠删码数据池(另请参阅纠删码),该数据池可用于目录和文件的整个层次结构(另请参阅文件布局)。

docs.ceph.com/en/latest/r…

ceph osd pool create cephfs_data 64 replicated
ceph osd pool create cephfs_metadata 64 replicated
​

元数据池通常最多保存几 GB 的数据

因此,通常建议使用较小的 PG 数。 64 或 128 在实践中通常用于大型集群。

创建文件系统

ceph fs new <fs_name> <metadata> <data> [--force] [--allow-dangerous-metadata-overlay] [<fscid:int>] [--recover]
​
ceph fs new cephfs cephfs_metadata cephfs_data 
​

指定数据池为默认数据池,设置后不可更改。

不鼓励将 EC 池用于默认数据池

# 
ceph fs new cephfs cephfs_metadata cephfs_data
ceph fs ls
name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]


创建文件系统后,MDS 将能够进入活动状态

# 
ceph mds stat
cephfs-1/1/1 up {0=a=up:active}
​

添加数据池

# 
ceph osd pool create cephfs_data02 64 replicated
ceph fs add_data_pool cephfs cephfs_data02
ceph fs ls
​
​
mkdir /mnt/cephfs/myssddir
setfattr -n ceph.dir.layout.pool -v cephfs_data02 /mnt/cephfs/myssddir

常用命令

docs.ceph.com/en/latest/c…

# 
ceph fs new <file system name> <metadata pool name> <data pool name>
ceph fs ls
# 限制容量大小
ceph fs set <fs name> max_file_size <size in bytes> 
​
# 强制 mds 与文件系统关联
ceph config set mds.ceph01 mds_join_fs cephfs
​

2.1.3 挂载cephfs

先决条件

客户端具有 Ceph 配置文件的副本。

有权访问 MDS 的 CephX 用户的密钥环。

为客户端主机生成一个最小的 conf 文件并将其放置在标准位置

#
ceph fs authorize <fs_name> client.<client_id> <path-in-cephfs> rw
ceph fs authorize cephfs_a client.foo / r /bar rw
ceph fs authorize cephfs_a client.foo /bar rw
​
ceph-fuse -n client.<client_id> <mount-path> -r *directory_to_be_mounted*
​
ceph-fuse -n client.foo mnt -r /bar
​
​
# on client host
mkdir -p -m 755 /etc/ceph
ssh {user}@{mon-host} "sudo ceph config generate-minimal-conf" | sudo tee /etc/ceph/ceph.conf
​
chmod 644 /etc/ceph/ceph.conf
​

创建 CephX 用户并获取其密钥

ssh {user}@{mon-host} "sudo ceph fs authorize cephfs client.foo / rw" | sudo tee /etc/ceph/ceph.client.foo.keyring
​
ceph fs authorize cephfs client.fsa / rw > /etc/ceph/ceph.client.fsa.keyring
​
chmod 600 /etc/ceph/ceph.client.foo.keyring
​

Mount CephFS

使用内核驱动挂载cephfs

docs.ceph.com/en/latest/m…

# 挂载助手
stat /sbin/mount.ceph
​
# 
mount -t ceph {device-string}={path-to-mounted} {mount-point} -o {key-value-args} {other-args}
​
mkdir /mnt/mycephfs
mount -t ceph <name>@<fsid>.<fs_name>=/ /mnt/mycephfs
# name 是用来挂载 CephFS 的 CephX 用户的用户名
# fsid 是 ceph 集群的 FSID,可以使用 ceph fsid 命令找到。
# fs_name 是要挂载的文件系统# 内核驱动需要 MON 的套接字和 CephX 用户的密钥,
mount -t ceph cephuser@b3acfc0d-575f-41d3-9c91-0e7ed3dbb3fa.cephfs=/ -o mon_addr=192.168.0.1:6789,secret=AQATSKdNGBnwLhAAnNDKnH65FmVKpXZJVasUeQ==
​
​
# 使用挂载助手时,监控主机和 FSID 是可选的。 
# mount.ceph 助手通过查找和读取 ceph conf 文件自动计算出这些细节,
mount -t ceph cephuser@.cephfs=/ -o secret=AQATSKdNGBnwLhAAnNDKnH65FmVKpXZJVasUeQ==
​
# 隐藏密钥
mount -t ceph cephuser@.cephfs=/ /mnt/mycephfs -o secretfile=/etc/ceph/cephuser.secret
​
mount -t ceph fsa@.cephfs=/ /mnt/fsa -o secretfile=/etc/ceph/fsa.secret
​
# 多个 mon 节点用/分隔
mount -t ceph cephuser@.cephfs=/ /mnt/mycephfs \
-o mon_addr=192.168.0.1:6789/192.168.0.2:6789,secretfile=/etc/ceph/cephuser.secret
​
​
​
​
# 如果 CephX 被禁用,您可以省略任何与凭证相关的选项,用户名不能省略
mount -t ceph cephuser@.cephfs=/ /mnt/mycephfs
​
# 挂载子目录
mount -t ceph cephuser@.cephfs=/ /mnt/mycephfs
​
# 解除挂载,在执行此命令之前,请确保您不在文件系统目录中
umount /mnt/mycephfs
​
# 持久挂载
# /etc/fstab
{name}@.{fs_name}=/ {mount}/{mountpoint} ceph [mon_addr={ipaddress},secret=secretkey|secretfile=/path/to/secretfile],[{mount.options}]  {fs_freq}  {fs_passno}
​
cephuser@.cephfs=/ /mnt/ceph ceph mon_addr=192.168.0.1:6789,noatime,_netdev 0 0
​
​

Mount CephFS as FUSE

ceph-fuse 是挂载 CephFS 的另一种方式

#
ceph-fuse {mountpoint} {options}
​
mkdir /mnt/mycephfs
ceph-fuse --id foo /mnt/mycephfs
# 或者
ceph-fuse -n client.foo /mnt/mycephfs
​
# 密钥
ceph-fuse --id foo -k /path/to/keyring /mnt/mycephfs
​
# 指定mon
ceph-fuse --id foo -m 192.168.0.1:6789 /mnt/mycephfs
​
# 挂载子目录
ceph-fuse --id foo -r /path/to/dir /mnt/mycephfs
​
# 挂载指定名称的fs,可以在ceph.conf中配置client_fs
ceph-fuse --id foo --client_fs mycephfs2 /mnt/mycephfs2
​
# 解除挂载
umount /mnt/mycephfs
​
# 持久挂载
# /etc/fstab
#DEVICE PATH       TYPE      OPTIONS
none    /mnt/mycephfs  fuse.ceph ceph.id={user-ID}[,ceph.conf={path/to/conf.conf}],_netdev,defaults  0 0
​
none    /mnt/mycephfs  fuse.ceph ceph.id=myuser,_netdev,defaults  0 0
none    /mnt/mycephfs  fuse.ceph ceph.id=myuser,ceph.conf=/etc/ceph/foo.conf,_netdev,defaults  0 0
none    /mnt/mycephfs  fuse.ceph ceph.id=myuser,ceph.client_mountpoint=/path/to/dir,_netdev,defaults  0 0
​
​
systemctl start ceph-fuse@/mnt/mycephfs.service
systemctl enable ceph-fuse.target
systemctl enable ceph-fuse@-mnt-mycephfs.service

Mount CephFS on Windows

docs.ceph.com/en/latest/c…

ceph-dokan 可用于在 Windows 上挂载 CephFS 文件系统。

它利用 Dokany,一个允许在用户空间实现文件系统的 Windows 驱动程序,非常类似于 FUSE。

# 
ceph-dokan.exe -c c:\ceph.conf -l x
​
mkdir -Force C:\mnt\mycephfs2
ceph-dokan.exe --mountpoint C:\mnt\mycephfs2 --client_fs mycephfs2
​
ceph-dokan -l y --root-path /a
​
# 如果设置了 -o --removable 标志,则挂载将显示在 Get-Volume 结果中:
Get-Volume -FriendlyName "Ceph*" | `
        Select-Object -Property @("DriveLetter", "Filesystem", "FilesystemLabel")
​
​
​
ceph-dokan --help
​
ceph-dokan --id foo -l x
ceph-dokan --name client.foo -l x
​
# 取消挂载
ceph-dokan.exe unmap -l x
​
# NSSM
# 重启之后自动挂载
​
​
​

使用 ceph fs set-default 命令控制客户端挂载时将看到哪个文件系统

2.1.4 向文件系统添加数据池

docs.ceph.com/en/latest/c…

在您可以将池与 CephFS 一起使用之前,您必须将其添加到元数据服务器。

#
ceph fs add_data_pool cephfs cephfs_data_ssd
ceph fs ls  
.... data pools: [cephfs_data cephfs_data_ssd ]
​

然后,您可以更新 CephFS 中目录的布局以使用您添加的池:

#
mkdir /mnt/cephfs/myssddir
setfattr -n ceph.dir.layout.pool -v cephfs_data_ssd /mnt/cephfs/myssddir
​

使用带有 CEPHFS 的纠删码池。

只要启用了覆盖,您就可以将纠删码池用作 CephFS 数据池,具体操作如下:

#
ceph osd pool set my_ec_pool allow_ec_overwrites true

2.2 ceph块设备

Ceph 块设备是精简配置的、可调整大小的,并将数据分条存储在多个 OSD 上。 Ceph 块设备利用 RADOS 功能,包括快照、复制和强一致性。 Ceph 块存储客户端通过内核模块或 librbd 库与 Ceph 集群通信。

2.2.1创建存储池

docs.ceph.com/en/latest/r…

副本形式

# 计算一个 pool设置多少个pg
# https://old.ceph.com/pgcalc/
​
​
ceph osd lspools
​
# 创建池
ceph osd pool create {pool-name} [{pg-num} [{pgp-num}]] [replicated] \
[crush-rule-name] [expected-num-objects]
     
ceph osd pool create {pool-name} [{pg-num} [{pgp-num}]]   erasure \
[erasure-code-profile] [crush-rule-name] [expected_num_objects] [--autoscale-mode=<on,off,warn>]
​
ceph osd pool create demo02 64 replicated
​
# 关联到应用 rgw, cephfs, rbd
ceph osd pool application enable {pool-name} {application-name} 
ceph osd pool application enable demo02 rbd
​
# 设置容量
ceph osd pool set-quota {pool-name} [max_objects {obj-count}] [max_bytes {bytes}]
ceph osd pool set-quota demo02 max_bytes $((4<<30)) # 4G# 删除一个池
ceph osd pool delete {pool-name} [{pool-name} --yes-i-really-really-mean-it]
ceph osd pool delete demo02 --yes-i-really-really-mean-it
​
# crush 规则
# 用户权限
# 重命名
ceph osd pool rename {current-pool-name} {new-pool-name}
​
# 仓库池信息
rados df 
ceph osd pool stats [{pool-name}]
ceph osd pool stats  demo02
​
# pool 快照
ceph osd pool mksnap {pool-name} {snap-name}
​
# 删除快照
ceph osd pool rmsnap {pool-name} {snap-name}
​
# 设置pool属性
ceph osd pool set {pool-name} {key} {value}
ceph osd pool get {pool-name} {key}
​
# 设置副本数
ceph osd pool set {poolname} size {num-replicas}
ceph osd pool set data size 3
​
ceph osd pool set data min_size 2
ceph osd dump | grep 'replicated size'
​
​

纠删码形式

# 至少3台主机
ceph osd pool create ecpool erasure
​
echo ABCDEFGHI | rados --pool ecpool put NYAN -
rados --pool ecpool get NYAN -
​
ceph osd erasure-code-profile get default
​
​

2.2.2 初始化池及创建镜像

# 把存储池初始化为rbd可用
rbd pool init <pool-name>
rbd pool init demo02
​
# 创建一个挂载rbd的用户
ceph auth get-or-create client.{ID} mon 'profile rbd' osd 'profile {profile name} [pool={pool-name}][, profile ...]' mgr 'profile rbd [pool={pool-name}]'
​
​
ceph auth get-or-create client.qemu \
mon 'profile rbd' \
osd 'profile rbd pool=vms, profile rbd-read-only pool=images' \
mgr 'profile rbd pool=images'
​
ceph auth get-or-create client.rbda \
mon 'profile rbd' \
osd 'profile rbd pool=demo02' \
mgr 'profile rbd pool=demo02' > /etc/ceph/ceph.client.rdba.keyring
​
# 创建块镜像
rbd create --size {megabytes} {pool-name}/{image-name} # 单位M
rbd create --size $((4*1024)) demo02/img01
​
# 查看块设备
rbd ls {poolname}
rbd ls demo02
​
rbd trash ls {poolname}
rbd trash ls demo02
​
# 查看镜像信息
rbd info {pool-name}/{image-name}
rbd info demo02/img01
​
# 扩容 容量要比原来大
rbd resize --size 2048 demo02/img01 
​
# 删除镜像
rbd rm {pool-name}/{image-name}
​
rbd trash mv {pool-name}/{image-name}
rbd trash rm {pool-name}/{image-id}
rbd trash restore {pool-name}/{image-id}
​
​

2.2.3 挂载块设备镜像

# 
rbd list demo02
sudo rbd device map {pool-name}/{image-name} --id {user-name}
​
sudo rbd device map demo02/img01 --id rbda
​
sudo rbd device map rbd/myimage --id admin --keyring /path/to/keyring
sudo rbd device map rbd/myimage --id admin --keyfile /path/to/file
​
rbd device list
​
sudo rbd device unmap demo02/img01 # 指定镜像
sudo rbd device unmap /dev/rbd0 # 指定挂载位置
sudo rbd device unmap /dev/rbd/demo02/img01 
​

2.2.4 挂载块设备镜像到文件系统

# 格式化
mkfs.xfs /dev/rbd/demo02/img01
​
# 挂载
mkdir /mnt/rbd-demo02-img01
mount  /dev/rbd/demo02/img01 /mnt/rbd-demo02-img01
df -hT
​
​

2.3 对象存储

2.4 管理面板

docs.ceph.com/en/latest/m…

# 开启dashboard服务
ceph mgr module enable dashboard
​
# 禁用ssl
ceph config set mgr mgr/dashboard/ssl false# 密码文件
mkdir -p /etc/ceph/dashboard
vi /etc/ceph/dashboard/admin
​
nIE5gp5o@7wu
​
​
# 添加dashboard 用户
ceph dashboard ac-user-create <username> -i <file-containing-password> administrator
​
ceph dashboard ac-user-create admin -i /etc/ceph/dashboard/admin administrator
​
# 浏览器访问
# http://172.16.10.41:8080

三、 问题处理

lihaijing.gitbooks.io/ceph-handbo…

# 1 monitors have not enabled msgr2
ceph mon enable-msgr2
​
# mon is allowing insecure global_id reclaim
ceph config set mon auth_allow_insecure_global_id_reclaim false# Module 'cephadm' has failed dependency: loading asyncssh library:No module named 'asyncssh'
pip3 install asyncssh
​
​
# remapped状态
# 检查具体卡remapped的PG信息,对应的OSD为88,48,18,其中88是主OSD
ceph pg dump |grep remapped
ceph osd tree
ceph osd crush class ls# #ceph.conf
osd_class_update_on_start = false# 单节点集群 ceph.conf
osd crush chooseleaf type = 0
​
# 8 stray daemon(s) not managed by cephadm
# 3 stray host(s) with 8 daemon(s) not managed by cephadm
ceph -s
ceph health detail
ceph orch host ls
​
​
# 2 mgr modules have recently crashed#  AttributeError("module 'asyncssh' has no attribute 'SSHClientConnectionOptions'")
pip3 install asyncssh
​
#
wget 'https://bootstrap.pypa.io/get-pip.py'
python3 get-pip.py
pip install -U pyOpenSSL
​
​