3.2. 安装 Red Hat Ceph Storage 集群
将 Ansible 应用与 ceph-ansible
playbook 搭配使用,以安装 Red Hat Ceph Storage 3。
生产用 Ceph 存储集群从至少三个 monitor 主机开始,以及包含多个 OSD 守护进程的三个 OSD 节点。
先决条件
在 Ansible 管理节点上使用 root 帐户安装
ceph-ansible
软件包:yum install ceph-ansible
[root@admin ~]# yum install ceph-ansible
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
流程
从 Ansible 管理节点运行以下命令,除非另有指示。
以 Ansible 用户身份,创建
ceph-ansible-keys
目录,其中 Ansible 存储ceph-ansible
playbook 生成的临时值。mkdir ~/ceph-ansible-keys
[user@admin ~]$ mkdir ~/ceph-ansible-keys
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以 root 用户身份,创建一个指向
/etc/ansible/
目录中的/usr/share/ceph-ansible/group_vars
目录的符号链接:ln -s /usr/share/ceph-ansible/group_vars /etc/ansible/group_vars
[root@admin ~]# ln -s /usr/share/ceph-ansible/group_vars /etc/ansible/group_vars
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 进入
/usr/share/ceph-ansible/
目录:cd /usr/share/ceph-ansible
[root@admin ~]$ cd /usr/share/ceph-ansible
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 为
yml.sample
文件创建新副本:cp group_vars/all.yml.sample group_vars/all.yml cp group_vars/osds.yml.sample group_vars/osds.yml cp site.yml.sample site.yml
[root@admin ceph-ansible]# cp group_vars/all.yml.sample group_vars/all.yml [root@admin ceph-ansible]# cp group_vars/osds.yml.sample group_vars/osds.yml [root@admin ceph-ansible]# cp site.yml.sample site.yml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 编辑复制的文件。
编辑
group_vars/all.yml
文件。下表中列出了要取消注释的最常见必要参数和可选参数。请注意,该表不包含所有参数。重要不要将
cluster: ceph
参数设置为ceph
以外的任何值,因为不支持使用自定义集群名称。Expand 表 3.1. 常规 Ansible 设置 选项 值 必需 备注 ceph_origin
repository
或distro
或local
是
repository
代表 Ceph 将通过一个新的仓库安装。distro
值意味着不会添加单独的存储库文件,您将获得 Linux 发行版本中包含的任何 Ceph 版本。local
值表示将从本地计算机复制 Ceph 二进制文件。ceph_repository_type
cdn
或iso
是
ceph_rhcs_version
3
是
ceph_rhcs_iso_path
ISO 镜像的路径
如果使用 ISO 镜像,为 Yes
monitor_interface
monitor 节点侦听的接口
monitor_interface
、monitoring_address
或monitor_address_block
是必需的monitor_address
monitor 节点侦听的地址
monitor_address_block
Ceph 公共网络的子网
当节点的 IP 地址未知时使用,但已知子网
ip_version
ipv6
如果使用 IPv6 地址,则为
public_network
Ceph 公共网络的 IP 地址和子网掩码,或者对应的 IPv6 地址(若使用 IPv6)
是
cluster_network
Ceph 集群网络的 IP 地址和子网掩码
否,默认为
public_network
configure_firewall
Ansible 将尝试配置适当的防火墙规则
否,将值设为
true
或false
。all.yml
文件的示例如下:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意务必将
ceph_origin
设置为all.yml
文件中的distro
。这样可确保安装过程使用正确的下载存储库。注意将
ceph_rhcs_version
选项设置为3
将引入最新版本的 Red Hat Ceph Storage 3。警告默认情况下,Ansible 会尝试重启已安装但屏蔽的
firewalld
服务,这可能会导致 Red Hat Ceph Storage 部署失败。要临时解决这个问题,请在all.yml
文件中将configure_firewall
选项设置为false
。如果您正在运行firewalld
服务,则不需要在all.yml
文件中使用configure_firewall
选项。如需了解更多详细信息,请参阅
all.yml
文件。编辑
group_vars/osds.yml
文件。下表中列出了要取消注释的最常见必要参数和可选参数。请注意,该表不包含所有参数。重要使用不同的物理设备来安装与安装操作系统的设备不同的 OSD。在操作系统和 OSD 之间共享相同的设备会导致性能问题。
Expand 表 3.2. OSD Ansible 设置 选项 值 必需 备注 osd_scenario
collocated
使用相同的设备进行写入日志记录和键/值数据(BlueStore)或日志(FileStore)和 OSD 数据non-collocated
为使用专用设备,如 SSD 或 NVMe 介质,以存储 write-ahead 日志和键/值数据(BlueStore)或日志数据(FileStore)LVM
使用逻辑卷管理器存储 OSD 数据是
使用
osd_scenario: non-collocated
时,ceph-ansible
期望devices
和dedicated_devices
中的变量数量相匹配。例如,如果您在devices
中指定了 10 个磁盘,则必须在dedicated_devices
中指定 10 个条目。osd_auto_discovery
true
来自动发现 OSD如果使用
osd_scenario: collocated
为 Yes使用
devices
设置时无法使用devices
存储
Ceph 数据
的设备列表Yes 用来指定设备列表
使用
osd_auto_discovery
设置时无法使用。当使用lvm
作为osd_scenario
并设置devices
选项时,ceph-volume lvm batch
模式将创建优化的 OSD 配置。dedicated_devices
存储
ceph 日志
的非并置 OSD 的专用设备列表如果
osd_scenario: non-collocated
,则为 yes应该是非分区的设备
dmcrypt
true
来加密 OSD否
默认值为
false
lvm_volumes
FileStore 或 BlueStore 字典列表
如果使用
osd_scenario: lvm
且存储设备没有使用devices
定义 时为 Yes每一字典必须包含
data
、journal
和data_vg
键。任何逻辑卷或卷组都必须是名称,而不是完整路径。data
和journal
键可以是逻辑卷 (LV) 或分区,但不能将一个日志用于多个data
LV。data_vg
键必须是包含data
LV 的卷组。(可选)journal_vg
键可用于指定包含 journal LV 的卷组(如果适用)。有关各种支持的配置,请参见以下示例。osds_per_device
每个设备要创建的 OSD 数量。
否
默认为
1
osd_objectstore
OSD 的 Ceph 对象存储类型。
否
默认为
bluestore
。另一个选项是filestore
。升级需要。以下是使用三种 OSD 方案 (
collocated
,non-collocated
, 和lvm
) 的osds.yml
文件的示例:如果没有指定,默认的 OSD 对象存储格式为 BlueStore。Collocated
osd_objectstore: filestore osd_scenario: collocated devices: - /dev/sda - /dev/sdb
osd_objectstore: filestore osd_scenario: collocated devices: - /dev/sda - /dev/sdb
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Non-collocated - BlueStore
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此 non-collocated 示例将创建四个 BlueStore OSD,每个设备一个。在本例中,传统的硬盘驱动器(
sda
,sdb
,sdc
,sdd
)用于对象数据,以及固态驱动器(SSD)(/dev/nvme0n1
、/dev/nvme1n1
)用于 BlueStore 数据库和 write-ahead 日志。此配置将/dev/sda
和/dev/sdb
设备与/dev/nvme0n1
设备配对,并将/dev/sdc
和/dev/sdd
设备与/dev/nvme1n1
设备配对。non-collocated - FileStore
Copy to Clipboard Copied! Toggle word wrap Toggle overflow LVM 简单
osd_objectstore: bluestore osd_scenario: lvm devices: - /dev/sda - /dev/sdb
osd_objectstore: bluestore osd_scenario: lvm devices: - /dev/sda - /dev/sdb
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 或者
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用这些简单的配置,
ceph-ansible
使用批处理模式(ceph-volume lvm batch
)来创建 OSD。在第一个场景中,如果
devices
是传统的硬盘驱动器或 SSD,则每个设备会创建一个 OSD。在第二种场景中,当结合了传统的硬盘驱动器和 SSD 时,数据将放置在传统的硬盘驱动器(
sda
、sdb
)上,并且将最大型的 BlueStore 数据库(block.db
)在 SSD(nvme0n1)
上创建。LVM 高级设置
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 或者
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用这些高级场景示例时,必须事先创建卷组和逻辑卷。它们不会由
ceph-ansible
创建。注意如果使用所有 NVMe SSD,请设置
osd_scenario: lvm
和osds_per_device: 4
选项。有关更多信息,请参阅安装指南中的 Configuring OSD Ansible settings for all NVMe Storage(Red Hat Enterprise Linux)或 Configuring OSD Ansible settings for all NVMe Storage(Ubuntu)。如需了解更多详细信息,请参阅
osds.yml
文件中的注释。
编辑位于
/etc/ansible/hosts
的 Ansible 清单文件。记住注释掉示例主机。在
[mons]
部分下添加 monitor 节点:[mons] MONITOR_NODE_NAME1 MONITOR_NODE_NAME2 MONITOR_NODE_NAME3
[mons] MONITOR_NODE_NAME1 MONITOR_NODE_NAME2 MONITOR_NODE_NAME3
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
[osds]
部分下添加 OSD 节点。如果节点有顺序命名,请考虑使用范围:[osds] OSD_NODE_NAME1[1:10]
[osds] OSD_NODE_NAME1[1:10]
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意对于新安装的 OSD,默认的对象存储格式为 BlueStore。
(可选)使用
devices
和dedicated_devices
选项指定 OSD 节点使用的设备。使用逗号分隔的列表列出多个设备。语法
[osds] CEPH_NODE_NAME devices="['DEVICE_1', 'DEVICE_2']" dedicated_devices="['DEVICE_3', 'DEVICE_4']"
[osds] CEPH_NODE_NAME devices="['DEVICE_1', 'DEVICE_2']" dedicated_devices="['DEVICE_3', 'DEVICE_4']"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例
[osds] ceph-osd-01 devices="['/dev/sdc', '/dev/sdd']" dedicated_devices="['/dev/sda', '/dev/sdb']" ceph-osd-02 devices="['/dev/sdc', '/dev/sdd', '/dev/sde']" dedicated_devices="['/dev/sdf', '/dev/sdg']"
[osds] ceph-osd-01 devices="['/dev/sdc', '/dev/sdd']" dedicated_devices="['/dev/sda', '/dev/sdb']" ceph-osd-02 devices="['/dev/sdc', '/dev/sdd', '/dev/sde']" dedicated_devices="['/dev/sdf', '/dev/sdg']"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在没有指定设备时,在
osds.yml
文件中将osd_auto_discovery
选项设置为true
。注意当 OSD 与不同名称使用设备或者其中一个 OSD 上失败时,使用
devices
和dedicated_devices
参数很有用。
另外,如果您想要将主机特定参数用于所有部署( 裸机或在 容器 中),请在
host_vars
目录中创建主机文件,使其包含特定于主机的参数。在
/etc/ansible/host_vars/
目录下,为每个添加到存储集群的每个新 Ceph OSD 节点创建一个新文件:语法
touch /etc/ansible/host_vars/OSD_NODE_NAME
touch /etc/ansible/host_vars/OSD_NODE_NAME
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例
touch /etc/ansible/host_vars/osd07
[root@admin ~]# touch /etc/ansible/host_vars/osd07
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用特定于主机的参数更新 文件。在裸机部署中,您可以在 文件中添加
devices:
和dedicated_devices:
部分。示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
另外,对于所有部署(裸机 或 容器 ),您可以使用
ansible-playbook
创建自定义 CRUSH 层次结构:设置 Ansible 清单文件。使用
osd_crush_location
参数,指定 OSD 主机处于 CRUSH map 的层次结构中的位置。您必须指定至少两种 CRUSH bucket 类型来指定 OSD 的位置,一种 bucket类型
必须是 host。默认情况下,包括root
,datacenter
,room
,row
,pod
,pdu
,rack
,chassis
和host
。语法
[osds] CEPH_OSD_NAME osd_crush_location="{ 'root': ROOT_BUCKET', 'rack': 'RACK_BUCKET', 'pod': 'POD_BUCKET', 'host': 'CEPH_HOST_NAME' }"
[osds] CEPH_OSD_NAME osd_crush_location="{ 'root': ROOT_BUCKET', 'rack': 'RACK_BUCKET', 'pod': 'POD_BUCKET', 'host': 'CEPH_HOST_NAME' }"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例
[osds] ceph-osd-01 osd_crush_location="{ 'root': 'default', 'rack': 'rack1', 'pod': 'monpod', 'host': 'ceph-osd-01' }"
[osds] ceph-osd-01 osd_crush_location="{ 'root': 'default', 'rack': 'rack1', 'pod': 'monpod', 'host': 'ceph-osd-01' }"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
crush_rule_config
和create_crush_tree
参数设置为True
,如果您不想使用默认的 CRUSH 规则,至少创建一个 CRUSH 规则。例如,如果您使用 HDD 设备,请按如下所示编辑参数:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果使用 SSD 设备,请按如下所示编辑参数:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意如果没有部署
ssd
和hdd
OSD,则默认 CRUSH 规则会失败,因为默认规则现在包含类参数
(必须定义)。注意此外,将自定义 CRUSH 层次结构添加到
host_vars
目录中的 OSD 文件,如上面的步骤中所述,使此配置正常工作。使用在
group_vars/clients.yml
文件中创建的crush_rules
来创建pools
。示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 查看树。
ceph osd tree
[root@mon ~]# ceph osd tree
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 验证池。
for i in $(rados lspools);do echo "pool: $i"; ceph osd pool get $i crush_rule;done pool: pool1 crush_rule: HDD
# for i in $(rados lspools);do echo "pool: $i"; ceph osd pool get $i crush_rule;done pool: pool1 crush_rule: HDD
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
对于 裸机 或 容器 的所有部署,打开并编辑 Ansible 清单文件(默认为
/etc/ansible/hosts
文件)。注释掉示例主机。在
[mgrs]
部分下,添加 Ceph Manager (ceph-mgr
) 节点。将 Ceph 管理器守护进程与 monitor 节点并置。[mgrs] <monitor-host-name> <monitor-host-name> <monitor-host-name>
[mgrs] <monitor-host-name> <monitor-host-name> <monitor-host-name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
以 Ansible 用户身份,确保 Ansible 可以访问 Ceph 主机:
ansible all -m ping
[user@admin ~]$ ansible all -m ping
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将以下行添加到
/etc/ansible/ansible.cfg
文件中:retry_files_save_path = ~/
retry_files_save_path = ~/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以
root
用户身份,创建/var/log/ansible/
目录,并为ansible
用户分配适当的权限:mkdir /var/log/ansible chown ansible:ansible /var/log/ansible chmod 755 /var/log/ansible
[root@admin ~]# mkdir /var/log/ansible [root@admin ~]# chown ansible:ansible /var/log/ansible [root@admin ~]# chmod 755 /var/log/ansible
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 编辑
/usr/share/ceph-ansible/ansible.cfg
文件,更新log_path
值,如下所示:log_path = /var/log/ansible/ansible.log
log_path = /var/log/ansible/ansible.log
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
以 Ansible 用户身份,切换到
/usr/share/ceph-ansible/
目录:cd /usr/share/ceph-ansible/
[user@admin ~]$ cd /usr/share/ceph-ansible/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行
ceph-ansible
playbook:ansible-playbook site.yml
[user@admin ceph-ansible]$ ansible-playbook site.yml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意要提高部署速度,请在
ansible-playbook
中使用--forks
选项。默认情况下,ceph-ansible
将 fork 设置为20
。在这个版本中,最多 20 个节点将同时安装。要一次安装最多 30 个节点,请运行ansible-playbook --forks 30 PLAYBOOK 文件
。必须监控管理节点上的资源,以确保它们不会被过度使用。如果是,则减少传递给--forks
的数字。使用 monitor 节点上的 root 帐户,验证 Ceph 集群的状态:
ceph health
[root@monitor ~]# ceph health HEALTH_OK
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
rados
验证群集是否正常运行。在监控节点上,创建一个包含八个 PG 的测试池:
语法
ceph osd pool create <pool-name> <pg-number>
[root@monitor ~]# ceph osd pool create <pool-name> <pg-number>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例
ceph osd pool create test 8
[root@monitor ~]# ceph osd pool create test 8
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建名为
hello-world.txt
的文件:语法
vim <file-name>
[root@monitor ~]# vim <file-name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例
vim hello-world.txt
[root@monitor ~]# vim hello-world.txt
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用对象名称
hello-world
将hello-world.txt
上传到测试池中:语法
rados --pool <pool-name> put <object-name> <object-file>
[root@monitor ~]# rados --pool <pool-name> put <object-name> <object-file>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例
rados --pool test put hello-world hello-world.txt
[root@monitor ~]# rados --pool test put hello-world hello-world.txt
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 从 test 池下载
hello-world
,保存为fetch.txt
:语法
rados --pool <pool-name> get <object-name> <object-file>
[root@monitor ~]# rados --pool <pool-name> get <object-name> <object-file>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例
rados --pool test get hello-world fetch.txt
[root@monitor ~]# rados --pool test get hello-world fetch.txt
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查
fetch.txt
的内容:cat fetch.txt
[root@monitor ~]# cat fetch.txt
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出应该是:
"Hello World!"
"Hello World!"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意除了验证集群状态外,您还可以使用
ceph-medic
实用程序来全面诊断 Ceph 存储群集。请参阅 Red Hat Ceph Storage 3 管理指南中的使用ceph-medic
诊断 Ceph Storage 集群Cluster。