3.2. 安装 Red Hat Ceph Storage 集群
将 Ansible 应用与 ceph-ansible
playbook 搭配使用,以安装 Red Hat Ceph Storage 3。
生产用 Ceph 存储集群从至少三个 monitor 主机开始,以及包含多个 OSD 守护进程的三个 OSD 节点。
先决条件
在 Ansible 管理节点上使用 root 帐户安装
ceph-ansible
软件包:[root@admin ~]# yum install ceph-ansible
流程
从 Ansible 管理节点运行以下命令,除非另有指示。
以 Ansible 用户身份,创建
ceph-ansible-keys
目录,其中 Ansible 存储ceph-ansible
playbook 生成的临时值。[user@admin ~]$ mkdir ~/ceph-ansible-keys
以 root 用户身份,创建一个指向
/etc/ansible/
目录中的/usr/share/ceph-ansible/group_vars
目录的符号链接:[root@admin ~]# ln -s /usr/share/ceph-ansible/group_vars /etc/ansible/group_vars
进入
/usr/share/ceph-ansible/
目录:[root@admin ~]$ cd /usr/share/ceph-ansible
为
yml.sample
文件创建新副本:[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
编辑复制的文件。
编辑
group_vars/all.yml
文件。下表中列出了要取消注释的最常见必要参数和可选参数。请注意,该表不包含所有参数。重要不要将
cluster: ceph
参数设置为ceph
以外的任何值,因为不支持使用自定义集群名称。表 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
文件的示例如下:ceph_origin: distro ceph_repository: rhcs ceph_repository_type: cdn ceph_rhcs_version: 3 monitor_interface: eth0 public_network: 192.168.0.0/24
注意务必将
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 之间共享相同的设备会导致性能问题。
表 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
Non-collocated - BlueStore
osd_objectstore: bluestore osd_scenario: non-collocated devices: - /dev/sda - /dev/sdb - /dev/sdc - /dev/sdd dedicated_devices: - /dev/nvme0n1 - /dev/nvme0n1 - /dev/nvme1n1 - /dev/nvme1n1
此 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
osd_objectstore: filestore osd_scenario: non-collocated devices: - /dev/sda - /dev/sdb - /dev/sdc - /dev/sdd dedicated_devices: - /dev/nvme0n1 - /dev/nvme0n1 - /dev/nvme1n1 - /dev/nvme1n1
LVM 简单
osd_objectstore: bluestore osd_scenario: lvm devices: - /dev/sda - /dev/sdb
或者
osd_objectstore: bluestore osd_scenario: lvm devices: - /dev/sda - /dev/sdb - /dev/nvme0n1
使用这些简单的配置,
ceph-ansible
使用批处理模式(ceph-volume lvm batch
)来创建 OSD。在第一个场景中,如果
devices
是传统的硬盘驱动器或 SSD,则每个设备会创建一个 OSD。在第二种场景中,当结合了传统的硬盘驱动器和 SSD 时,数据将放置在传统的硬盘驱动器(
sda
、sdb
)上,并且将最大型的 BlueStore 数据库(block.db
)在 SSD(nvme0n1)
上创建。LVM 高级设置
osd_objectstore: filestore osd_scenario: lvm lvm_volumes: - data: data-lv1 data_vg: vg1 journal: journal-lv1 journal_vg: vg2 - data: data-lv2 journal: /dev/sda data_vg: vg1
或者
osd_objectstore: bluestore osd_scenario: lvm lvm_volumes: - data: data-lv1 data_vg: data-vg1 db: db-lv1 db_vg: db-vg1 wal: wal-lv1 wal_vg: wal-vg1 - data: data-lv2 data_vg: data-vg2 db: db-lv2 db_vg: db-vg2 wal: wal-lv2 wal_vg: wal-vg2
使用这些高级场景示例时,必须事先创建卷组和逻辑卷。它们不会由
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
在
[osds]
部分下添加 OSD 节点。如果节点有顺序命名,请考虑使用范围:[osds] OSD_NODE_NAME1[1:10]
注意对于新安装的 OSD,默认的对象存储格式为 BlueStore。
(可选)使用
devices
和dedicated_devices
选项指定 OSD 节点使用的设备。使用逗号分隔的列表列出多个设备。语法
[osds] CEPH_NODE_NAME devices="['DEVICE_1', 'DEVICE_2']" dedicated_devices="['DEVICE_3', 'DEVICE_4']"
示例
[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.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
示例
[root@admin ~]# touch /etc/ansible/host_vars/osd07
使用特定于主机的参数更新 文件。在裸机部署中,您可以在 文件中添加
devices:
和dedicated_devices:
部分。示例
devices: - /dev/sdc - /dev/sdd - /dev/sde - /dev/sdf dedicated_devices: - /dev/sda - /dev/sdb
另外,对于所有部署(裸机 或 容器 ),您可以使用
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-01 osd_crush_location="{ 'root': 'default', 'rack': 'rack1', 'pod': 'monpod', 'host': 'ceph-osd-01' }"
将
crush_rule_config
和create_crush_tree
参数设置为True
,如果您不想使用默认的 CRUSH 规则,至少创建一个 CRUSH 规则。例如,如果您使用 HDD 设备,请按如下所示编辑参数:crush_rule_config: True crush_rule_hdd: name: replicated_hdd_rule root: root-hdd type: host class: hdd default: True crush_rules: - "{{ crush_rule_hdd }}" create_crush_tree: True
如果使用 SSD 设备,请按如下所示编辑参数:
crush_rule_config: True crush_rule_ssd: name: replicated_ssd_rule root: root-ssd type: host class: ssd default: True crush_rules: - "{{ crush_rule_ssd }}" create_crush_tree: True
注意如果没有部署
ssd
和hdd
OSD,则默认 CRUSH 规则会失败,因为默认规则现在包含类参数
(必须定义)。注意此外,将自定义 CRUSH 层次结构添加到
host_vars
目录中的 OSD 文件,如上面的步骤中所述,使此配置正常工作。使用在
group_vars/clients.yml
文件中创建的crush_rules
来创建pools
。示例
copy_admin_key: True user_config: True pool1: name: "pool1" pg_num: 128 pgp_num: 128 rule_name: "HDD" type: "replicated" device_class: "hdd" pools: - "{{ pool1 }}"
查看树。
[root@mon ~]# ceph osd tree
验证池。
# for i in $(rados lspools);do echo "pool: $i"; ceph osd pool get $i crush_rule;done pool: pool1 crush_rule: HDD
对于 裸机 或 容器 的所有部署,打开并编辑 Ansible 清单文件(默认为
/etc/ansible/hosts
文件)。注释掉示例主机。在
[mgrs]
部分下,添加 Ceph Manager (ceph-mgr
) 节点。将 Ceph 管理器守护进程与 monitor 节点并置。[mgrs] <monitor-host-name> <monitor-host-name> <monitor-host-name>
以 Ansible 用户身份,确保 Ansible 可以访问 Ceph 主机:
[user@admin ~]$ ansible all -m ping
将以下行添加到
/etc/ansible/ansible.cfg
文件中:retry_files_save_path = ~/
以
root
用户身份,创建/var/log/ansible/
目录,并为ansible
用户分配适当的权限:[root@admin ~]# mkdir /var/log/ansible [root@admin ~]# chown ansible:ansible /var/log/ansible [root@admin ~]# chmod 755 /var/log/ansible
编辑
/usr/share/ceph-ansible/ansible.cfg
文件,更新log_path
值,如下所示:log_path = /var/log/ansible/ansible.log
以 Ansible 用户身份,切换到
/usr/share/ceph-ansible/
目录:[user@admin ~]$ cd /usr/share/ceph-ansible/
运行
ceph-ansible
playbook:[user@admin ceph-ansible]$ ansible-playbook site.yml
注意要提高部署速度,请在
ansible-playbook
中使用--forks
选项。默认情况下,ceph-ansible
将 fork 设置为20
。在这个版本中,最多 20 个节点将同时安装。要一次安装最多 30 个节点,请运行ansible-playbook --forks 30 PLAYBOOK 文件
。必须监控管理节点上的资源,以确保它们不会被过度使用。如果是,则减少传递给--forks
的数字。使用 monitor 节点上的 root 帐户,验证 Ceph 集群的状态:
[root@monitor ~]# ceph health HEALTH_OK
使用
rados
验证群集是否正常运行。在监控节点上,创建一个包含八个 PG 的测试池:
语法
[root@monitor ~]# ceph osd pool create <pool-name> <pg-number>
示例
[root@monitor ~]# ceph osd pool create test 8
创建名为
hello-world.txt
的文件:语法
[root@monitor ~]# vim <file-name>
示例
[root@monitor ~]# vim hello-world.txt
使用对象名称
hello-world
将hello-world.txt
上传到测试池中:语法
[root@monitor ~]# rados --pool <pool-name> put <object-name> <object-file>
示例
[root@monitor ~]# rados --pool test put hello-world hello-world.txt
从 test 池下载
hello-world
,保存为fetch.txt
:语法
[root@monitor ~]# rados --pool <pool-name> get <object-name> <object-file>
示例
[root@monitor ~]# rados --pool test get hello-world fetch.txt
检查
fetch.txt
的内容:[root@monitor ~]# cat fetch.txt
输出应该是:
"Hello World!"
注意除了验证集群状态外,您还可以使用
ceph-medic
实用程序来全面诊断 Ceph 存储群集。请参阅 Red Hat Ceph Storage 3 管理指南中的使用ceph-medic
诊断 Ceph Storage 集群Cluster。