1.3. Ceph OSD
当 Red Hat Ceph Storage 集群启动并运行时,您可以在运行时将 OSD 添加到存储集群中。
Ceph OSD 通常包含一个 ceph-osd
守护进程,用于一个存储驱动器及其在一个节点中的相关日志。如果节点有多个存储驱动器,则为每个驱动器映射一个 ceph-osd
守护进程。
红帽建议定期检查集群的容量,以查看它是否达到其存储容量的上限。当存储集群达到其 近 full
比率时,请添加一个或多个 OSD 来扩展存储集群的容量。
当您要减少 Red Hat Ceph Storage 集群或替换硬件的大小时,您也可以在运行时删除 OSD。如果节点有多个存储驱动器,您可能需要删除该驱动器的 ceph-osd
守护进程之一。通常,最好检查存储集群的容量,以确定您是否到达其容量的上端。确保在删除 OSD 时,存储集群不是其 接近的全满比率
。
不要让存储集群在添加 OSD 前达到 满
比率。在存储集群达到 接近的全满比率
后发生的 OSD 失败可能会导致存储集群超过 满
比率。Ceph 会阻止写入访问权限来保护数据,直到解决存储容量问题。在不考虑首先对 满
比率的影响的情况下,不要移除 OSD。
1.3.1. Ceph OSD 节点配置
Ceph OSD 及其支持硬件应该类似于使用 OSD 的池的存储策略。Ceph 更倾向于在池间统一硬件,以实现一致的性能配置集。为获得最佳性能,请考虑采用相同类型或大小的驱动器的 CRUSH 层次结构。如需了解更多详细信息,请参阅 存储策略指南。
如果添加了 dissimilar 大小驱动器,则需要相应地调整其权重。将 OSD 添加到 CRUSH map 时,请考虑新 OSD 的权重。硬盘容量大约增加 40%,因此较新的 OSD 节点可能比存储集群中的旧节点更大的硬盘驱动器,即它们可能具有更高的权重。
在进行新的安装前,请参阅《 红帽企业 Linux 或 Ubuntu 安装指南》中的安装 Red Hat Ceph Storage 的要求 章节。
1.3.2. 将容器 OSD ID 映射到驱动器
有时需要确定容器化的 OSD 正在使用哪个驱动器。例如,如果 OSD 出现问题,您可能需要了解它用来验证驱动器状态的驱动器。另外,对于非容器化 OSD,您引用 OSD ID 以启动和停止它,但要启动和停止容器化 OSD,您必须引用它所使用的驱动器。
先决条件
- 在容器化环境中运行的红帽 Ceph 存储集群。
-
具有对容器主机的
root
访问权限。
步骤
查找容器名称。例如,要识别与
osd.5
关联的驱动器,请在运行osd.5
的容器节点上打开一个终端,然后运行docker ps
来列出所有容器:示例
[root@ceph3 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3a866f927b74 registry.access.redhat.com/rhceph/rhceph-3-rhel7:latest "/entrypoint.sh" About an hour ago Up About an hour ceph-osd-ceph3-sdd 91f3d4829079 registry.access.redhat.com/rhceph/rhceph-3-rhel7:latest "/entrypoint.sh" 22 hours ago Up 22 hours ceph-osd-ceph3-sdb 73dfe4021a49 registry.access.redhat.com/rhceph/rhceph-3-rhel7:latest "/entrypoint.sh" 7 days ago Up 7 days ceph-osd-ceph3-sdf 90f6d756af39 registry.access.redhat.com/rhceph/rhceph-3-rhel7:latest "/entrypoint.sh" 7 days ago Up 7 days ceph-osd-ceph3-sde e66d6e33b306 registry.access.redhat.com/rhceph/rhceph-3-rhel7:latest "/entrypoint.sh" 7 days ago Up 7 days ceph-mgr-ceph3 733f37aafd23 registry.access.redhat.com/rhceph/rhceph-3-rhel7:latest "/entrypoint.sh" 7 days ago Up 7 days ceph-mon-ceph3
使用
docker exec
对来自上一输出中的任何 OSD 容器名称运行ceph-volume lvm 列表
:示例
[root@ceph3 ~]# docker exec ceph-osd-ceph3-sdb ceph-volume lvm list ====== osd.5 ======= [journal] /dev/journals/journal1 journal uuid C65n7d-B1gy-cqX3-vZKY-ZoE0-IEYM-HnIJzs osd id 1 cluster fsid ce454d91-d748-4751-a318-ff7f7aa18ffd type journal osd fsid 661b24f8-e062-482b-8110-826ffe7f13fa data uuid SlEgHe-jX1H-QBQk-Sce0-RUls-8KlY-g8HgcZ journal device /dev/journals/journal1 data device /dev/test_group/data-lv2 devices /dev/sda [data] /dev/test_group/data-lv2 journal uuid C65n7d-B1gy-cqX3-vZKY-ZoE0-IEYM-HnIJzs osd id 1 cluster fsid ce454d91-d748-4751-a318-ff7f7aa18ffd type data osd fsid 661b24f8-e062-482b-8110-826ffe7f13fa data uuid SlEgHe-jX1H-QBQk-Sce0-RUls-8KlY-g8HgcZ journal device /dev/journals/journal1 data device /dev/test_group/data-lv2 devices /dev/sdb
从这一输出中,您可以看到
osd.5
与/dev/sdb
关联。
1.3.3. 使用 Ansible 添加具有相同磁盘拓扑的 Ceph OSD
对于具有相同磁盘拓扑的 Ceph OSD,Ansible 将添加与使用 /usr/share/ceph-ansible/group_vars/osds
文件的 devices:
部分中指定的相同 OSD 节点相同的 OSD 数量。
新的 Ceph OSD 节点与 OSD 的其余部分相同。
先决条件
- 一个正在运行的 Red Hat Ceph Storage 集群。
- 请参阅《 红帽企业 Linux 或 Ubuntu 安装指南》中的安装红帽 Ceph 存储 章节的要求。
-
有到新节点的
root
访问权限。 - 与存储集群中其他 OSD 节点相同的 OSD 数据驱动器数量。
步骤
在
[osds]
部分的/etc/ansible/hosts
文件中添加 Ceph OSD 节点:示例
[osds] ... osd06 $NEW_OSD_NODE_NAME
验证 Ansible 能否访问 Ceph 节点:
[user@admin ~]$ ansible all -m ping
进入 Ansible 配置目录:
[user@admin ~]$ cd /usr/share/ceph-ansible
将
add-osd.yml
文件复制到/usr/share/ceph-ansible/
目录中:[user@admin ceph-ansible]$ sudo cp infrastructure-playbooks/add-osd.yml .
为 Ceph 的正常或容器化部署运行 Ansible playbook:
[user@admin ceph-ansible]$ ansible-playbook add-osd.yml
注意在添加 OSD 时,如果 playbook 与
PG 没有报告为 active+clean
,请在all.yml
文件中配置以下变量来调整重试和延迟:# OSD handler checks handler_health_osd_check_retries: 50 handler_health_osd_check_delay: 30
1.3.4. 使用具有不同磁盘拓扑的 Ansible 添加 Ceph OSD
对于具有不同磁盘拓扑的 Ceph OSD,可以通过两种方法将新的 OSD 节点添加到现有的存储集群中。
先决条件
- 一个正在运行的 Red Hat Ceph Storage 集群。
- 请参阅《 红帽企业 Linux 或 Ubuntu 安装指南》中的安装红帽 Ceph 存储 章节的要求。
-
有到新节点的
root
访问权限。
步骤
第一方法
在
[osds]
部分下,将新的 Ceph OSD 节点添加到/etc/ansible/hosts
文件中:示例
[osds] ... osd06 $NEW_OSD_NODE_NAME
在
/etc/ansible/host_vars/
目录下,为每个新 Ceph OSD 节点创建一个新文件:Syntax
touch /etc/ansible/host_vars/$NEW_OSD_NODE_NAME
示例
[root@admin ~]# touch /etc/ansible/host_vars/osd07
编辑新文件,并将
devices:
和dedicated_devices:
部分添加到 文件中。在每个部分下,添加一个-
、空格,然后是此 OSD 节点的块设备名称的完整路径:示例
devices: - /dev/sdc - /dev/sdd - /dev/sde - /dev/sdf dedicated_devices: - /dev/sda - /dev/sda - /dev/sdb - /dev/sdb
验证 Ansible 是否可以访问所有 Ceph 节点:
[user@admin ~]$ ansible all -m ping
将目录改为 Ansible 配置目录:
[user@admin ~]$ cd /usr/share/ceph-ansible
将
add-osd.yml
文件复制到/usr/share/ceph-ansible/
目录中:[user@admin ceph-ansible]$ sudo cp infrastructure-playbooks/add-osd.yml .
运行 Ansible playbook:
[user@admin ceph-ansible]$ ansible-playbook add-osd.yml
第二方法
将新 OSD 节点名称添加到
/etc/ansible/hosts
文件中,并使用devices
和dedicated_devices
选项,指定不同的磁盘拓扑:示例
[osds] ... osd07 devices="['/dev/sdc', '/dev/sdd', '/dev/sde', '/dev/sdf']" dedicated_devices="['/dev/sda', '/dev/sda', '/dev/sdb', '/dev/sdb']"
验证 Ansible 是否可以访问所有 Ceph 节点:
[user@admin ~]$ ansible all -m ping
将目录改为 Ansible 配置目录:
[user@admin ~]$ cd /usr/share/ceph-ansible
将
add-osd.yml
文件复制到/usr/share/ceph-ansible/
目录中:[user@admin ceph-ansible]$ sudo cp infrastructure-playbooks/add-osd.yml .
运行 Ansible playbook:
[user@admin ceph-ansible]$ ansible-playbook add-osd.yml
1.3.5. 使用命令行界面添加 Ceph OSD
以下是手动添加 OSD 到 Red Hat Ceph Storage 的高级别工作流:
-
安装
ceph-osd
软件包并创建新的 OSD 实例 - 准备并挂载 OSD 数据和日志驱动器
- 将新 OSD 节点添加到 CRUSH map
- 更新所有者和组权限
-
启用并启动
ceph-osd
守护进程
ceph-disk
命令已弃用。ceph-volume
命令现在是从命令行界面部署 OSD 的首选方法。目前,ceph-volume
命令只支持 lvm
插件。红帽将在本指南中将两个命令作为参考提供示例,以便存储管理员有时间将依赖 ceph-disk
的任何自定义脚本转换为 ceph-volume
。
有关使用 ceph-volume
命令的更多信息,请参见《红帽 Ceph 存储管理指南》。
对于自定义存储集群名称,在 ceph
和 ceph-osd
命令中使用 --cluster $CLUSTER_NAME
选项。
先决条件
- 一个正在运行的 Red Hat Ceph Storage 集群。
- 请参阅《 红帽企业 Linux 或 Ubuntu 安装指南》中的安装红帽 Ceph 存储 章节的要求。
-
有到新节点的
root
访问权限。
步骤
启用 Red Hat Ceph Storage 3 OSD 软件存储库。
Red Hat Enterprise Linux
[root@osd ~]# subscription-manager repos --enable=rhel-7-server-rhceph-3-osd-els-rpms
Ubuntu
[user@osd ~]$ sudo bash -c 'umask 0077; echo deb https://customername:customerpasswd@rhcs.download.redhat.com/3-updates/Tools $(lsb_release -sc) main | tee /etc/apt/sources.list.d/Tools.list' [user@osd ~]$ sudo bash -c 'wget -O - https://www.redhat.com/security/fd431d51.txt | apt-key add -'
创建
/etc/ceph/
目录:# mkdir /etc/ceph
在新 OSD 节点上,从其中一个 Ceph Monitor 节点上复制 Ceph 管理密钥环和配置文件:
Syntax
scp $USER_NAME@$MONITOR_HOST_NAME:/etc/ceph/$CLUSTER_NAME.client.admin.keyring /etc/ceph scp $USER_NAME@$MONITOR_HOST_NAME:/etc/ceph/$CLUSTER_NAME.conf /etc/ceph
示例
[root@osd ~]# scp root@node1:/etc/ceph/ceph.client.admin.keyring /etc/ceph/ [root@osd ~]# scp root@node1:/etc/ceph/ceph.conf /etc/ceph/
在新的 Ceph OSD 节点上安装
ceph-osd
软件包:Red Hat Enterprise Linux
[root@osd ~]# yum install ceph-osd
Ubuntu
[user@osd ~]$ sudo apt-get install ceph-osd
决定您要并置日志还是将专用日志用于新的 OSD。
注意需要
--filestore
选项。对于带有并置日志的 OSD:
Syntax
[root@osd ~]# ceph-disk --setuser ceph --setgroup ceph prepare --filestore /dev/$DEVICE_NAME
示例
[root@osd ~]# ceph-disk --setuser ceph --setgroup ceph prepare --filestore /dev/sda
对于带有专用日志的 OSD:
Syntax
[root@osd ~]# ceph-disk --setuser ceph --setgroup ceph prepare --filestore /dev/$DEVICE_NAME /dev/$JOURNAL_DEVICE_NAME
或
[root@osd ~]# ceph-volume lvm prepare --filestore --data /dev/$DEVICE_NAME --journal /dev/$JOURNAL_DEVICE_NAME
示例
[root@osd ~]# ceph-disk --setuser ceph --setgroup ceph prepare --filestore /dev/sda /dev/sdb
[root@osd ~]# ceph-volume lvm prepare --filestore --data /dev/vg00/lvol1 --journal /dev/sdb
设置
noup
选项:[root@osd ~]# ceph osd set noup
激活新的 OSD:
Syntax
[root@osd ~]# ceph-disk activate /dev/$DEVICE_NAME
或
[root@osd ~]# ceph-volume lvm activate --filestore $OSD_ID $OSD_FSID
示例
[root@osd ~]# ceph-disk activate /dev/sda
[root@osd ~]# ceph-volume lvm activate --filestore 0 6cc43680-4f6e-4feb-92ff-9c7ba204120e
将 OSD 添加到 CRUSH map:
Syntax
ceph osd crush add $OSD_ID $WEIGHT [$BUCKET_TYPE=$BUCKET_NAME ...]
示例
[root@osd ~]# ceph osd crush add 4 1 host=node4
注意如果您指定多个存储桶,该命令将将 OSD 放置到最具体的存储桶中,它将 OSD 移到您指定的其它存储桶中。
注意您还可以手动编辑 CRUSH map。请参阅 Red Hat Ceph Storage 3 的存储策略指南中的 编辑 CRUSH map 部分。
重要如果仅指定 root bucket,则 OSD 将直接附加到 root,但 CRUSH 规则期望 OSD 在主机 bucket 内。
取消设置
noup
选项:[root@osd ~]# ceph osd unset noup
为新创建的目录更新所有者和组权限:
Syntax
chown -R $OWNER:$GROUP $PATH_TO_DIRECTORY
示例
[root@osd ~]# chown -R ceph:ceph /var/lib/ceph/osd [root@osd ~]# chown -R ceph:ceph /var/log/ceph [root@osd ~]# chown -R ceph:ceph /var/run/ceph [root@osd ~]# chown -R ceph:ceph /etc/ceph
如果您使用带有自定义名称的集群,请在适当的文件中添加以下行:
Red Hat Enterprise Linux
[root@osd ~]# echo "CLUSTER=$CLUSTER_NAME" >> /etc/sysconfig/ceph
Ubuntu
[user@osd ~]$ sudo echo "CLUSTER=$CLUSTER_NAME" >> /etc/default/ceph
将
$CLUSTER_NAME
替换为自定义集群名称。要确保新 OSD
已启动
并准备好接收数据,请启用并启动 OSD 服务:Syntax
systemctl enable ceph-osd@$OSD_ID systemctl start ceph-osd@$OSD_ID
示例
[root@osd ~]# systemctl enable ceph-osd@4 [root@osd ~]# systemctl start ceph-osd@4
1.3.6. 使用 Ansible 删除 Ceph OSD
有时,您可能需要缩减 Red Hat Ceph Storage 集群的容量。要使用 Ansible 从 Red Hat Ceph Storage 集群中删除 OSD,并根据使用了哪个 OSD 方案,运行 shrink-osd.yml
或 shrink-osd-ceph-disk.yml
playbook。如果 osd_scenario
设置为 collocated
或 non-collocated
,则使用 shrink-osd-ceph-disk.yml
playbook。如果 osd_scenario
设置为 lvm
,则使用 shrink-osd.yml
playbook。
从存储集群中移除 OSD 将销毁该 OSD 中包含的所有数据。
先决条件
- 正在运行的红帽 Ceph 存储,由 Ansible 部署。
- 正在运行的 Ansible 管理节点。
- 对 Ansible 管理节点的根级别访问权限.
步骤
更改到
/usr/share/ceph-ansible/
目录。[user@admin ~]$ cd /usr/share/ceph-ansible
-
将 Ceph 监控节点上的
/etc/ceph/
中的 admin 密钥环复制到包含您要删除的 OSD 的节点。 将适当的 playbook 从
infrastructure-playbooks
目录复制到当前目录。[root@admin ceph-ansible]# cp infrastructure-playbooks/shrink-osd.yml .
或
[root@admin ceph-ansible]# cp infrastructure-playbooks/shrink-osd-ceph-disk.yml .
对于 裸机或容器部署 , 请运行适当的 Ansible playbook:
Syntax
ansible-playbook shrink-osd.yml -e osd_to_kill=$ID -u $ANSIBLE_USER
或
ansible-playbook shrink-osd-ceph-disk.yml -e osd_to_kill=$ID -u $ANSIBLE_USER
替换:
-
带有 OSD ID 的
$ID
。要移除更多 OSD,请用逗号分隔 OSD ID。 -
$ANSIBLE_USER
,名称为 Ansible 用户
示例
[user@admin ceph-ansible]$ ansible-playbook shrink-osd.yml -e osd_to_kill=1 -u user
或
[user@admin ceph-ansible]$ ansible-playbook shrink-osd-ceph-disk.yml -e osd_to_kill=1 -u user
-
带有 OSD ID 的
验证 OSD 是否已成功移除:
[root@mon ~]# ceph osd tree
1.3.7. 使用命令行界面删除 Ceph OSD
从存储集群中移除 OSD 涉及更新 cluster map、移除其身份验证密钥、从 OSD map 中删除 OSD,并从 ceph.conf
文件中删除 OSD。如果节点有多个驱动器,您可能需要重复这个过程为每个驱动器删除 OSD。
先决条件
- 一个正在运行的 Red Hat Ceph Storage 集群。
-
有足够的 OSD,以便存储集群没有处于
接近满
比率。 -
具有对 OSD 节点的
root
访问权限。
步骤
禁用并停止 OSD 服务:
Syntax
systemctl disable ceph-osd@$OSD_ID systemctl stop ceph-osd@$OSD_ID
示例
[root@osd ~]# systemctl disable ceph-osd@4 [root@osd ~]# systemctl stop ceph-osd@4
OSD 停止后,它
将被关闭
。从存储集群中移除 OSD:
Syntax
ceph osd out $OSD_ID
示例
[root@osd ~]# ceph osd out 4
重要OSD 超时后,Ceph 将开始重新平衡数据并将其复制到存储集群中的其他 OSD 中。红帽建议在继续下一步前等待存储集群变为
active+clean
。要观察数据迁移,请运行以下命令:[root@monitor ~]# ceph -w
从 CRUSH map 移除 OSD,使其不再接收数据。
Syntax
ceph osd crush remove $OSD_NAME
示例
[root@osd ~]# ceph osd crush remove osd.4
注意您还可以解译 CRUSH map,从设备列表中删除 OSD,将设备作为主机存储桶中的项目删除,或者移除主机存储桶。如果它位于 CRUSH map 中,并且计划移除主机,然后重新编译 map 并设置它。详情请参阅 存储策略指南。
删除 OSD 身份验证密钥:
Syntax
ceph auth del osd.$OSD_ID
示例
[root@osd ~]# ceph auth del osd.4
删除 OSD:
Syntax
ceph osd rm $OSD_ID
示例
[root@osd ~]# ceph osd rm 4
编辑存储集群的配置文件(默认为
/etc/ceph/ceph.conf
),并删除 OSD 条目(如果存在):示例
[osd.4] host = $HOST_NAME
-
如果手动添加 OSD,则移除对
/etc/fstab
文件中的 OSD 的引用。 将更新后的配置文件复制到存储集群中所有其他节点的
/etc/ceph/
目录中。Syntax
scp /etc/ceph/$CLUSTER_NAME.conf $USER_NAME@$HOST_NAME:/etc/ceph/
示例
[root@osd ~]# scp /etc/ceph/ceph.conf root@node4:/etc/ceph/
1.3.8. 使用命令行界面替换日志
当日志和数据设备位于同一物理设备中时,替换日志的步骤(例如,使用 osd_scenario: 并置
)需要替换整个 OSD。但是,在日志位于数据设备的独立物理设备(例如,使用 osd_scenario: non-collocated
)的 OSD 上,您可以替换日志设备。
先决条件
- 一个正在运行的 Red Hat Ceph Storage 集群。
- 新分区或存储设备。
步骤
将集群设置为
noout
以防止回填:[root@osd1 ~]# ceph osd set noout
停止将更改日志的 OSD:
[root@osd1 ~]# systemctl stop ceph-osd@$OSD_ID
清除 OSD 上的日志:
[root@osd1 ~]# ceph-osd -i $OSD_ID --flush-journal
删除旧的日志分区以防止分区 UUID 与新分区冲突:
sgdisk --delete=$OLD_PART_NUM -- $OLD_DEV_PATH
- 替换
-
$OLD_PART_NUM
,分区号为旧日志设备。 -
$OLD_DEV_PATH
带有到旧日志设备的路径。
-
示例
[root@osd1 ~]# sgdisk --delete=1 -- /dev/sda
在新设备上创建新日志分区。这个
sgdisk
命令会自动使用下一个可用的分区号:sgdisk --new=0:0:$JOURNAL_SIZE -- $NEW_DEV_PATH
- 替换
-
$JOURNAL_SIZE
带有适合环境的日志大小,如10240M
。 -
NEW_DEV_PATH
,其路径指向用于新日志的设备的路径。
-
注意日志的最小大小为 5 GB。通常不需要 10 GB 的值。如需更多详细信息,请联系红帽支持。
示例
[root@osd1 ~]# sgdisk --new=0:0:10240M -- /dev/sda
在新分区中设置正确的参数:
sgdisk --change-name=0:"ceph journal" --partition-guid=0:$OLD_PART_UUID --typecode=0:45b0969e-9b03-4f30-b4c6-b4b80ceff106 --mbrtogpt -- $NEW_DEV_PATH
- 替换
-
$OLD_PART_UUID
带有相关 OSD 的journal_uuid
文件中的 UUID。例如,对于 OSD0,
使用/var/lib/ceph/osd/ceph-0/journal_uuid
中的 UUID。 -
NEW_DEV_PATH
,其路径指向用于新日志的设备的路径。
-
示例
[root@osd1 ~]# sgdisk --change-name=0:"ceph journal" --partition-guid=0:a1279726-a32d-4101-880d-e8573bb11c16 --typecode=0:097c058d-0758-4199-a787-ce9bacb13f48 --mbrtogpt -- /dev/sda
运行上述
sgdisk
命令后,新日志分区已准备好用于 Ceph,并且可以在其上创建日志。重要由于
sgdisk
的限制导致无法正确创建分区,所以无法将此命令与分区创建结合使用。创建新日志:
[root@osd1 ~]# ceph-osd -i $OSD_ID --mkjournal
启动 OSD:
[root@osd1 ~]# systemctl start ceph-osd@$OSD_ID
删除 OSD 上的
noout
标志:[root@osd1 ~]# ceph osd unset noout
确认日志与正确的设备关联:
[root@osd1 ~]# ceph-disk list
1.3.9. 观察数据迁移
当您向 CRUSH map 添加或删除 OSD 时,Ceph 将放置组迁移到新的或现有 OSD 来重新平衡数据。
先决条件
- 一个正在运行的 Red Hat Ceph Storage 集群。
- 最近添加或删除 OSD。
步骤
观察数据迁移:
[root@monitor ~]# ceph -w
-
观察放置组状态从
active+clean
更改为active,一些降级对象
,最后在迁移完成时为active+clean
。 -
要退出实用程序,请按
Ctrl + C
。