Red Hat Training
A Red Hat training course is available for Red Hat Ceph Storage
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-ansibleplaybook 生成的临时值。[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_originrepository或distro或local是
repository代表 Ceph 将通过一个新的仓库安装。distro值意味着不会添加单独的存储库文件,您将获得 Linux 发行版本中包含的任何 Ceph 版本。local值表示将从本地计算机复制 Ceph 二进制文件。ceph_repository_typecdn或iso是
ceph_rhcs_version3是
ceph_rhcs_iso_pathISO 镜像的路径
如果使用 ISO 镜像,为 Yes
monitor_interfacemonitor 节点侦听的接口
monitor_interface、monitoring_address或monitor_address_block是必需的monitor_addressmonitor 节点侦听的地址
monitor_address_blockCeph 公共网络的子网
当节点的 IP 地址未知时使用,但已知子网
ip_versionipv6如果使用 IPv6 地址,则为
public_networkCeph 公共网络的 IP 地址和子网掩码,或者对应的 IPv6 地址(若使用 IPv6)
是
cluster_networkCeph 集群网络的 IP 地址和子网掩码
否,默认为
public_networkconfigure_firewallAnsible 将尝试配置适当的防火墙规则
否,将值设为
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_scenariocollocated使用相同的设备进行写入日志记录和键/值数据(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_discoverytrue来自动发现 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应该是非分区的设备
dmcrypttrue来加密 OSD否
默认值为
falselvm_volumesFileStore 或 BlueStore 字典列表
如果使用
osd_scenario: lvm且存储设备没有使用devices定义 时为 Yes每一字典必须包含
data、journal和data_vg键。任何逻辑卷或卷组都必须是名称,而不是完整路径。data和journal键可以是逻辑卷 (LV) 或分区,但不能将一个日志用于多个dataLV。data_vg键必须是包含dataLV 的卷组。(可选)journal_vg键可用于指定包含 journal LV 的卷组(如果适用)。有关各种支持的配置,请参见以下示例。osds_per_device每个设备要创建的 OSD 数量。
否
默认为
1osd_objectstoreOSD 的 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和hddOSD,则默认 CRUSH 规则会失败,因为默认规则现在包含类参数(必须定义)。注意此外,将自定义 CRUSH 层次结构添加到
host_vars目录中的 OSD 文件,如上面的步骤中所述,使此配置正常工作。使用在
group_vars/clients.yml文件中创建的crush_rules来创建pools。示例
>>>>>>> 3993c70c7f25ab628cbfd9c8e27623403ca18c99
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-ansibleplaybook:[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。