「Certbot」- ImportError: ‘pyOpenSSL’ module missing required functionality
问题描述
执行 certbot renew 产生如下错误:
# certbot renew –renew-hook “docker-compose -f /usr/local/harbor/docker-compose.yml restart”
/usr/lib/python2.7/site-packages/pkg_resources/py2_warn.py:22: UserWarning: Setuptools will stop working on Python 2
************************************************************
You are running Setuptools on Python 2, which is no longer
supported and
>>> SETUPTOOLS WILL STOP WORKING <<<
in a subsequent release (no sooner than 2020-04-20).
Please ensure you are installing
Setuptools using pip 9.x or later or pin to `setuptools<45`
in your environment.
If you have done those things and are still encountering
this message, please comment in
https://github.com/pypa/setuptools/issues/1458
about the steps that led to this unsupported combination.
************************************************************
sys.version_info < (3,) and warnings.warn(pre + “*” * 60 + msg + “*” * 60)
Traceback (most recent call last):
File “/usr/bin/certbot”, line 9, in <module>
load_entry_point(‘certbot==1.0.0’, ‘console_scripts’, ‘certbot’)()
File “/usr/lib/python2.7/site-packages/pkg_resources/__init__.py”, line 490, in load_entry_poi[……]
「Certbot」- SERVFAIL looking up CAA for
问题描述
# certbot certonly -a certbot-dns-aliyun:dns-aliyun –certbot-dns-aliyun:dns-aliyun-credentials /etc/letsencrypt/dns-aliyun-credentials.ini -d harboar.example.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator certbot-dns-aliyun:dns-aliyun, Installer None
Obtaining a new certificate
Performing the following challenges:
dns-01 challenge for harboar.example.com
Waiting 30 seconds for DNS changes to propagate
Waiting for verification…
Challenge failed for domain harboar.example.com
dns-01 challenge for harboar.example.com
Cleaning up challenges
Some challenges have failed.
IMPORTANT NOTES:
– The following errors were reported by the server:
Domain: harboar.example.com
Type: dns
Detail: DNS problem: SERVFAIL looking up CAA for
harboar.example.com – the domain’s nameservers may be
malfunctioning
解决办法
在域名解析服务商添加此域名的 CAA 记录:
主机记录:<<对应域名>>
记录类型:CAA
记录的值:0 issue “letsencrypt.org”
然后保存并等待生效,再重新执行申请证书的命令。
参考文献
更新https报错的解决文案“DNSproblem:SERVFAILlookingupCAAforshop.xxx.com”[……]
「Certbot」- ocsp.int-x3.letsencrypt.org Read timed out
问题描述
执行命令 certbot renew 返回如下错误:
2020-06-23 16:46:12,224:DEBUG:certbot._internal.main:certbot version: 1.5.0
2020-06-23 16:46:12,226:DEBUG:certbot._internal.main:Arguments: []
2020-06-23 16:46:12,227:DEBUG:certbot._internal.main:Discovered plugins: PluginsRegistry(PluginEntryPoint#certbot-dns-aliyun:dns-aliyun,PluginEntryPoint#manual,PluginEntryPoint#nginx,PluginEntryPoint#null,PluginEntryPoint#standalone,PluginEntryPoint#webroot)
2020-06-23 16:46:12,252:DEBUG:certbot._internal.log:Root logging level set at 20
2020-06-23 16:46:12,253:INFO:certbot._internal.log:Saving debug log to /var/log/letsencrypt/letsencrypt.log
2020-06-23 16:46:12,305:DEBUG:certbot._internal.plugins.selection:Requested authenticator <certbot._internal.cli.cli_utils._Default object at 0x7fd6da256400> and installer <certbot._internal.cli.cli_utils._Default object at 0x7fd6da256400>
2020-06-23 16:46:12,356:DEBUG:requests.packages.urllib3.connectionpool:Starting new HTTP connection (1): ocsp.int-x3.letsencrypt.org:80
2020-06-23 16:46:22,369:INFO:certbot.ocsp:OCSP check failed for /etc/letsencrypt/archive/harbor.example.com/cert3.pem (are we offline?)
Traceback (most recent call last):
File “[……]
「P2P」- 加入 PT 站点(过程记录)
解决方案
第一步、加入 PT 站点
我们收到朋友邀请,获取到 m-team 站点访问权限;
清影PT CMCT-PT 葡萄 蝴蝶-HUDBT 皇后opencd TTG HD4FANS HDChina m-team HDU HDSKY hdcity hdtime CCFbits hdhome CHDBits ourbits gztown keepfrds 美盒子PT(影客) 北洋园PT 极视望江 joyhd 南洋PT U2动漫花园 资源简介自动生成工具(豆瓣) 发布种子用图床 新ptgen(发种子用) BYR IPT moecat 52pt TCCF filelist pterclub btschool
第二步、部署下载服务
我们使用 qBittorrent 客户端,以 Web 方式运行:
# https://hub.docker.com/r/linuxserver/qbittorrent
—
version: “2.1”
services:
qbittorrent:
image: lscr.io/linuxserver/qbittorrent:latest
container_name: qbittorrent
environment:
– PUID=1000
– PGID=1000
– TZ=Etc/UTC
– WEBUI_PORT=8080
volumes:
– /path/to/appdata/config:/config
– /path/to/downloads:/downloads
ports:
– 8080:8080
– 6881:6881
– 6881:6881/udp
restart: unless-stopped
第三步、登录 Web 界面
The webui is at <your-ip>:8080 and the default username/password is admin/adminadmin.
常见问题处理
Port 6881 is blacklisted.
Error (port 6881 is blacklisted) – Peer to peer – On the internet
问题描述:在 Tracker 中,提示 Port 6881 is blacklisted. 错误,并且无法下载;
原因分析:Many trackers disable port 6881 to avoid ISP scans and throttling.
解决方案:[……]
「RAID」- Redundant Array of Independent Disks(磁盘阵列)
问题描述
伯克利大学研究目的是反映当时 CPU 快速的性能。CPU 效能每年大约成长 30~50%,而硬磁机只能成长约 7%。研究小组希望能找出一种新的技术,在短期内,立即提升效能来平衡计算机的运算能力。在当时,柏克莱研究小组的主要研究目的是效能与成本;
解决方案
另外,研究小组也设计出容错、逻辑数据备份,而产生了 RAID 理论。研究初期,便宜(Inexpensive)的磁盘也是主要的重点,但后来发现,大量便宜磁盘组合并不能适用于现实的生产环境,后来 Inexpensive 被改为 independent,许多独立的磁盘组;
原理简述
磁盘阵列是使用多块独立磁盘组合成单块大容量磁盘组的技术。
特性特征
1)多种级别:磁盘阵列具有多种级别。级别不同,功能特性不同。有些级别(RAID0)可以提高读写速度,有些级别(RAID1)可以保护数据; 2)数据冗余:通过镜像或者存储奇偶校验信息的方式,实现了对数据的冗余保护; 3)数据存取速度块:通过对磁盘上的数据进行条带化,实现对数据成块存取,减少磁盘的机械寻道时间,提高了数据存取速度;
应用场景
在 Photoshop 中,渲染缓存数据可以使用 RAID0 级别。只求读写速度,不要求可靠性;
作为云操作系统的承载,可以使用 RAID1 级别。即使任意磁盘损坏,操作系统也能快速度启动;
在移动工作站中,可以使用 RAID5 级别。对数据的读取、写入性能要求高,同时要求一定的可靠性;
参考文献
Wikipedia/RAID 百度百科/磁盘阵列 云计算 RAID 的六种应用场景[……]
「RAID」- 基本概念及工作原理
问题描述
该笔记将记录:与 RAID 工作原理、技术细节相关;
Stripe, Stripe Unit, Stripe Size
Optimal RAID Stripe Size and filesystem Readahead for RAID-10?
写入 RAID 的数据会被分解为较小的数据块,然后再将数据块写入磁盘,这些数据块就是 Stripe Unit,其大小为 Stripe Size,横向的多个 Stripe Unit 组成 Stripe;
以 RAID 0 例:
Stripe Unit
在 RAID 0 中的 stripe unit 是指将数据分成的固定大小的块。每个块称为 stripe unit。在 RAID 0 中,数据被分成几个 stripe unit,并且这些 stripe unit 被分别存储在不同的磁盘上。
A1~A8 皆为 Stripe Unit,图示包含 8 个 Stripe Unit;
Stripe Size
Stripe size 是 RAID 0 中指定的每个 stripe unit 的大小。它是将数据分成 stripe unit 的基本单位,通常是以字节为单位进行度量。
A1~A8 的大小相同,其大小为 Stripe Size;
通常 Stripe Size 取值在 128KB~256KB 之间;
Stripe
多个 Stripe Unit 组成一个 Stripe;
A1+A2 为一个 Stripe,A3+A4 为一个 Stripe,所以图示包含 4 个 Stripe;
实现方式
磁盘阵列有三种实现方式:(1)外接式磁盘阵列柜;(2)内接式磁盘阵列卡;(3)软件模拟(软阵列)
外接式磁盘阵列柜
磁盘阵列柜是装配众多硬盘的外置磁盘阵列,常在大型服务器上使用。该设备具有多个接口,可以物理服务器直接相连,提供存储功能;
在机房中可以见到外接式磁盘阵列柜,它通常是单独的设备;
内接式磁盘阵列卡
在物理服务器(或工作站)中,通常具有内置磁盘阵列卡。它是独立的硬件模块,具有专用的处理单元;
软件模拟(软阵列)
常见于低成本或无法使用硬件的环境中,利用软件模拟,将众多磁盘组成磁盘阵列;
缺点: 1)该方式组成的磁盘阵列,性能会有所损失; 2)同时会消耗系统资源,不适合大数据流量的服务器; 3)支持有限的磁盘阵列级别;
优点: 1)成本低,无需购买额外硬件设备; 2)当然,既然是磁盘阵列,因此它也具备磁盘阵列的优点;
IT mode, HBA mode, RAID mode in (SAS) Controllers
What are IT mo[……]
「RAID」- 级别
内容简介
磁盘阵列通常具有多种界别,而界别也有分列:标准、嵌套(混合)、非标准。
本文将见到介绍这些磁盘阵列级别。
标准磁盘阵列级别
RAID 0
将众多磁盘组成单个大卷集。
优点: (1)提高整盘容量,空间完全利用; (2)提高性能和吞吐量;
RAID 1
数据镜像。
RAID 2
带海明码校验,使用一定的编码技术来提供错误检查及恢复。这种编码技术需要多个磁盘存放检查及恢复信息。
RAID 3
带奇偶校验码的并行传送,只能查错不能纠错。
RAID 4
带奇偶校验码的独立磁盘结构,它对数据的访问是按数据块进行的。
RAID 5
分布式奇偶校验的独立磁盘结构。
RAID 6
带两种分布存储的奇偶校验码独立磁盘结构
嵌套(混合)级别
结合两种或者多种磁盘阵列级别。比如RAID 10、RAID 01、RAID 30、RAID、50、RAID 60、RAID 100等等。
RAID 10
由于RAID 10是常见混合模式,因为我们简单介绍RAID 10级别: (1)先做“1”,再做“0”:(1)先使用“1”级别组建两个磁盘(攻击四块硬盘),(2)再使用这两块磁盘组件“0”级别阵列; (2)最少需要四块物理磁盘; (3)具有两块物理磁盘空间(浪费百分之五十); (4)存取速度是单块磁盘的两倍;
非标准变体级别
除了标准、混合级别外,还有非标准磁盘阵列级别、非磁盘阵列驱动架构。
由于我们并非磁盘阵列专家,并且磁盘阵列并不是我们的技术方向,因此不再深入展开,有兴趣可以参考维基百科。
非标准磁盘阵列级别
比如RAID 5E、RAID 5EE、RAID 6E、RAID 1E、RAID-Z等等。
非磁盘阵列驱动架构
比如JBOD、SPAN/BIG、MAID等等。
参考文献
Standard RAID levels Nested RAID levels Non-standard RAID levels Non-RAID drive architectures 百度百科/磁盘阵列[……]
「Linux」- 组建软件磁盘阵列(mdraid)
问题描述
通过软阵列技术,可以在没有阵列卡的情况下使用磁盘阵列技术。
该笔记将记录:与 RAID 有关,诸如 搭建磁盘软阵列的方法、配置、管理 等等;
前提条件
关闭磁盘缓存
磁盘通常具有内建缓存(缓冲),用于提高读写速度。如果在缓存中包含文件系统元数据,在断电之前没有写入磁盘,将出现文件系统损坏或数据丢失问题。
对于硬件磁盘阵列,它们附带 BBU 或 ZMCP 模块保护,防止在断电时数据丢失。而软阵列没有断电保护,因此最好关闭磁盘缓存。
但是也有例外,有些磁盘具有断电数据保护功能,比如 Intel 320 Series SSD 磁盘,会在电源故障时将数据写入 FLASH PROM 中,以防止丢失。在这种情况下,就无需关闭磁盘缓存。
软件磁盘阵列级别
LINEAR md devices, RAID0 (striping), RAID1 (mirroring), RAID4, RAID5, RAID6, RAID10, MULTIPATH, FAULTY, and CONTAINER
Superblock
该软件磁盘阵列会将所有与磁盘阵列有关的必要信息写入 superblock 中,该元信息的具体位置与元数据版本有关(可以通过命令 mdadm -E /dev/sdxN | grep “Version: “查看元数据版本)。
创建阵列(RAID 1)
创建阵列
执行命令创建磁盘阵列:
#!/bin/sh
mdadm –create /dev/md0 –level=1 –raid-devices=2 /dev/sdb /dev/sdc
查看同步进度
查看初始化创建进度(两种方式):
#!/bin/sh
cat /proc/mdstat
mdadm -D /dev/md0
调整同步速度
当阵列创建完成后,可以立即使用,即使它出于同步状态,但是会影响同步速度。
可以使用如下方法调整同步速率:
#!/bin/sh
cat /proc/sys/dev/raid/speed_limit_max
cat /proc/sys/dev/raid/speed_limit_min
echo 100000 > /proc/sys/dev/raid/speed_limit_min
查看对齐信息
元数据保存在superblock中,使用mdadm -E /dev/sdxN命令查看,重点关注其中的Data Offset与Super Offset字段。
删除磁盘阵列
#!/bin/sh
mdadm –stop /dev/md0
# 清除在superblock中[……]
「Linux」- Intel RST RAID in Linux
在 Dell M6800 中,组建 RAID 5 阵列,并安装 Ubuntu 系统
问题描述
在 BIOS 中,我们设置 RAID 之后,我们从 Windows PE 启动(老毛桃),然后可以看到有 RAID 创建的逻辑磁盘。
当我们换成 Linux 发行版的 USB 安装盘 时,问题出现: 1)从启动盘进去系统后,看到的是多个单盘,而不是单个逻辑磁盘; 2)当我再次从 Windows PE 启动后,看到的依旧是单个逻辑磁盘; 3)当我们将发行版直接安装到 USB 中,并从中启动,此时看到的现象与(1) 相同;
原因分析
然后我在 RAID 设置界面,看到 Intel Rapid Storage Technology 标题,这是 仅有的 可用于 Google 搜索的 信息。
Intel Rapid Storage Technology
关于该技术的详细介绍可以参考 Intel® Rapid Storage Technology 页面: 1)该技术会释放固态硬盘的性能; 2)配合 Intel® Smart Response Technology 特性,提高文件和应用的访问速度;(支持 SSHD 磁盘) 3)支持 RAID 技术 4)快速数据恢复(Intel® Rapid Recover Technology)
该技术与磁盘有关,用于提高性能、响应、可靠性,具有以下特性: Intel® Smart Response Technology PCIe* storage support Dynamic storage accelerator Serial ATA RAID 0, 1, 5, and 10 support Power-up in standby (PUIS) support
所以说,我们的 RAID 是 IRST 提供的,我们得搜索 IRST 与 Linux 有关的问题(Google: Intel RST raid linux),于是得到下面这篇文章: Intel® Rapid Storage Technology (Intel® RST) in Linux*
Intel Rapid Storage Technology in Linux(学习笔记)
在阅读 Intel® Rapid Storage Technology (Intel® RST) in Linux* 之后,我们得知以下事实:
根据该文档的描述,他依旧是种软 RAID 技术。
Linux software RAID implementations 支持多种 RAID volume type,这其中就包括 Intel RST RAID volume type 。
使用 Intel RST RAID[……]
「RAID-CONTROLLER」 – 硬件阵列卡
电池模块
Q:阵列卡的电池多久换一次? A:商家说:“电池是自动充电的,只要开机,硬件正常,那么电池将自动充电”。我们觉得还是取决于具体的硬件,获取某些不支持自动充电,按理说应该都是支持的,不然就要关机更换电池,从设计上来说这并不合理;
Q:阵列卡的电池鼓包?是否该更换?是否会爆炸? A:商家说:“不会爆炸,能够正常使用。手里的电池都有不同程度的鼓包”;
阵列卡直通技术
关于华为服务器阵列卡直通的问题_weixin_34348805 的博客-CSDN 博客 Mixed, Passthru, HBA and RAID mode SAS or SATA IO Controller card support (53573)
“直通”就是不做 RAID,系统也能识别到,比如 DELL 服务器的 Non-raid 模式。华为阵列卡 RD130、RD430 都支持直通;
HBA, Host-bus Adapter
Host adapter – Wikipedia What is the relationship between RAID and HBA?
该术语主要用于「指代用于连接 SCSI、Fibre Channel、SATA 设备」的设备。
PERC H750 Adapter
Specification: Category: Dell Controller Sub-Category: RAID Controller Generation: PCI-Express Part Number: HYM6Y Device Type: Storage Controller (RAID) Plug-In Card Bus Type: PCIe x8 Interface: SATA 6Gb/s / SAS 12Gb/s Data Transfer Rate: 1.2GB/s Cache Memory: 8GB Port Qty: 8 Max Storage Device Qty: 50 RAID Level: RAID 0 1 5 6 10 50 60
For Dell: PowerEdge R440 PowerEdge R540 PowerEdge R640 PowerEdge R740 PowerEdge R740XD PowerEdge T440 PowerEdge T640
Slow SSD performance: Dell R530, PERC H730P, dell provided SSDs – Dell Community[……]
「RAID Controllers」- LSI 9260-8i
LSI 9260-8i,512M 缓存,电池,6Gb,SAS 阵列卡
支持RAID级别:0/1/5/6/10/50/60
单盘,4T 6T 8T 10T 12T
SATA 线,一分4连接
x8 lane PCI Express 2.0 Compliant,当然也能够插在 x16 接口上,只是接口带宽只有一半。
问题:配置阵列
megaraid bios_如何使用新磁盘在MegaRAID BIOS中设置RAID0
1)Enter the Physical View; Choose the corresponding disk and press ENTER: 2)Choose the Make Unconf Good status and click Go: 3)Enter Configuration Wizard interface from the Home. If you want to keep the original configuration, choose Add configuration: 4)Choose Manual Configuration: 5)Choose your disk on the left, and click Add to array. 6)It will add the disks into a new group on the right. Then click Accept DG: …
# 03/19/2021 在选择磁盘时,Backplane 会被默认选择,应该取消选择,否则会提示:
You cannot add Enclosures, Backplanes or Online drivers to the driver group. Please select only unconfigured good drivers.
问题:(FOREIGN) Slot: …
Unable to import foreign configuration / Deleted my MegaRAID array Lenovo ThinkSystem RAID management tools article landing page – Lenovo Support TW
针对其他阵列迁移过来的磁盘,其存在先前的配置,所以会被标为 `(FOREIGN) Slot: …`;
需要先清理其配置,然后才能使用,否则不能参与阵列的组建;
在 Controller Properties 中,进行配置的清理;
补充说明: 1)在我们固件版本中,需要通过鼠标才能完成操作,无法通过键盘进行选择;[……]
「RAID」- 杂记
#1 mdadm no arrays found in config file or automatically
今天早上开机报了这么个错误。我笔记本又没做RAID,你报哪们子错误,我直接把mdadm软件卸载了,然后重启测试,好了。 TODO RAID 了解常见的RAID级别。
#2 如何对「RAID 5」阵列扩容
-「RAID 5 – replace discs & expand size?」
TODO 对RAID 5阵列扩容[……]
「Software RAID」- 缓存设置
问题描述
在磁盘中,通常内置缓存模块,用于提高磁盘性能。写入磁盘的数据,可能并没有直接写入磁盘,而是写入该缓存中,以提高性能。
但是在电源故障时,缓存数据将会丢失。如果该缓存中包含为写入文件系统的元数据,在意外断电后,可能会导致文件系统的损坏。
本文将介绍如何配置磁盘缓存,以防止出现在电源故障时出现数据损坏的问题。
影响数据访问的缓存
在计算机中,有以下几种类型的缓存。
操作系统缓存
在现代操作系统中,使用“页缓存”。数据将首先写入该缓存,然后定期写入底层内存系统(可能是RAID控制器,或者直接写入磁盘)。
使用free命令,可以查看页缓存的内存大小(查看“buff/cache”列)。
如果出现电源故障,在页缓存中的数据将会丢失。
控制器(RAID Controller)缓存
这里“控制器”指“RAID控制器”。控制器缓存同样用于提高性能,但是在电源故障时,依旧会导致缓存数据丢失。除非在控制器中具有BBU或ZMCP特性。
BBU(BARTTERY BACKUP UNIT,备用电池单元),用于保护控制器缓存。在电源故障时,电池会持续供电,大约72小时,以防止缓存数据丢失。如果服务器在这期间启动,便可恢复缓存数据。另外,由于电池寿命有限,要注意电池的更换。
ZMCP(ZERO MAINTENANCE CACHE PROTECTION,零维护缓存保护),也用于保护缓存。它会将缓存数据写入闪存,以保护缓存数据。
磁盘缓存
磁盘通常也内置缓存,但是该缓存没有任何保护(某些磁盘可能有保护)。在电源故障时,将会出现数据丢失的情况。
在电源故障时,由缓存数据丢失带来的风险
最坏的情况:控制器电源保护模块故障,在电源故障时,数据将会丢失。
另外,我们组建软件磁盘阵列,没有缓存保护模块,在电源故障时,数据将会丢失。对于我们来说,没有太多选择,只能禁用磁盘缓存,但是这会降低磁盘性能。
下面我们将讨论避免风险的方法。
降低由缓存丢失带来的风险
在使用RAID Controller缓存时
如果使用BBU进行缓存保护,要注意电池的寿命,根据官方建议及时更换电池。并且要留意电池供电时长,如果超过该时长,数据依旧会丢失。
如果使用ZMCP进行缓存保护,缓存会被“永久”存储,通常不需要过度担心。
在使用磁盘缓存时
如果使用磁盘缓存(像我们的软件磁盘阵列),只能禁用磁盘缓存(毕竟缓存没有任何保)。虽然会带来性能损失,但是为了数据安全,这是值得的。
关于磁盘缓存设置,这里不再展开,可以参考 磁盘缓存 相关的内容。
参考文献
RAID Controller and Hard Disk Cache Settings[……]
「CEPH」- 学习指南
研究对象
Ceph
研究目标
1)应用:掌握 Ceph 的部署及运维,并能够使用 Ceph 作为存储的解决方案; 2)调优:熟悉其工作原理(源码级别),实现对 Ceph Cluster 的性能调优;
研究工具
信息采集
培训机构: 1)必然是我们的首选,但是我们正在参加其他培训,空余时间少,所以仅能在空闲时间阅读 Ceph 相关的学习资料;
书籍文章,以下书籍是我们针对网络检索搜索结果(11/09/2022):
Year
Name
Author
ISBN
Publisher
Description
2014
Building Large-Scale Storage Systems with Ceph
Sam Fineberg
2015
Ceph Cookbook
Vikhyat Umrao
2015
Learning Ceph
Anthony D’Atri
9781783985623
2016
Ceph Cookbook 中文版
芬兰 KaranSingh 卡兰。辛格
9787121290169
电子工业出版社
基于 Ceph Giant 版本 代码附件:https://github.com/ksingh7/ceph-cookbook
2016
(eb) Ceph 源码分析
9787111552079
2017
(eb) Ceph 分布式存储实战
Ceph 中国社区著
9787111553588
2017
Ceph Cookbook Second Edition
Vikhyat Umrao, Michael Hackett
978178839106[……]
「Ceph」- 概念术语
问题描述
我们将快速阅读官方文档,并摘录的关键信息(至少在我们看来是重要的内容),以形成对 Ceph 的整体认识;
该笔记将记录:与 Ceph 相关的概念术语,以形成对 Ceph 的基本认识,并针对特定概念进行深入地学习;
解决方案
该笔记是根据我们的理解所记录,仅是为了快速理解,详细内容建议阅读官方文档;
原理简述
OSD
类型:物理磁盘;
描述:OSD,Object Storage Device,是进行存储数据的物理磁盘;每个磁盘、分区都可以称为一个 OSD;
Ceph OSD(Ceph OSD, ceph-osd)
类型:守护进程
描述:负责管理 OSD(物理磁盘);与 OSD 为 1:1 关系;进行数据写入与读取;主要功能包括存储数据,处理数据的复制、恢复、回补、平衡数据分布,并将一些相关数据提供给 Ceph Monitor,例如 Ceph OSD 心跳等。一个 Ceph 的存储集群,至少需要两个 Ceph OSD 来实现 active+clean 健康状态和有效的保存数据的双副本(默认情况下是双副本,可以调整);
Ceph MON(Ceph Monitor, ceph-mon)
类型:守护进程
描述:Ceph Monitor,其负责维护集群状态,其他组件周期向 MON 汇报自身状态;主要功能是维护整个集群健康状态,提供一致性的决策,包含 Monitor map、OSD map、PG map、CRUSH map;Client 从 MON 得知集群状态;
Ceph MGR(Ceph Manager, ceph-mgr)
类型:守护进程
描述:Ceph Manager 与 Ceph MON 一起运行,为外部监控和管理系统提供额外的监控和接口。Ceph Manager 守护进程 (ceph-mgr) 负责跟踪运行时指标和 Ceph 集群的当前状态,包括存储利用率、当前性能指标和系统负载。Ceph Manager 守护进程还托管基于 python 的模块来管理和公开 Ceph 集群信息,包括基于 Web 的 Ceph Dashboard 和 REST API。如果没有运行 Ceph MGR 进程,集群会给出健康警告,并且 ceph status 输出中的一些其他信息将丢失或过时(在启动 mgr 之前);
数量:高可用性通常至少需要 2 个 Ceph Mgr 进程;
Ceph MDS(Ceph Metadata Server, ceph-mds)
仅供 CephFS 使用,仅用于存储文件的元数据,并不存储实际的数据;Ceph MDS 主要保存的是 CephFS 的元数据(Ceph 的块存储和 Ceph 的对象存储都不需要[……]
「CEPH」- 概念术语:Monitor,ceph-mon,Ceph Monitor,Ceph Mon,Ceph MON
功能作用
提供 Cluster Map 信息
Ceph Mon 既不保存客户端业务数据,也不向客户端提供业务数据。所有集群节点均向 Ceph Mon 报告并共享有关其状态的每个更改信息,然后 Ceph Mon 将其保存在 Cluster Map 中。Ceph Mon 负责向客户端和集群的其他节点提供一直保持更新的 Cluster Map(包括集群拓扑);
Ceph Client 在读写数据(OSD)前,都需要和 Ceph Mon 通信,以获取最新的 Cluster Map 副本;
Ceph Client 只需连接某个 Ceph Mon 节点并检索当前的 Cluster Map,便能确定所有 Monitor 和 OSD 节点的位置;
Ceph Client 和其他节点,周期性地与 Ceph Mon 通信,来获取最新的 Cluster Map 副本,以得知整个集群的当前状态;
Authentication
Auth:Monitors are also responsible for managing authentication between daemons and clients.
高可用性
Ceph Cluster 可以在只有一个 Ceph Mon 的情形下运行,然而这会带来单点故障的风险。也就是说,如果该 Ceph Mon 停止工作,Ceph Client 就再也无法读、写数据;
要克服该风险,典型的 Ceph Cluster 必须组建 Ceph Mon 集群,这些运行 Ceph Mon 服务的节点被称为 Ceph Mon 节点;
节点数量
Monitor使用Paxos算法来保证分布式数据一致。Cluster Map一致性的保证需要集群的大多数Monitor存活,以建立仲裁集。例如3个Monitor中有2个存活,5个Monitor中有3个存活,6个Monitor中有4个存活等,这就是大多数Monitor存活原则。在生产环境中至少要运行3个Monitor,以确保高可用性。当集群规模增大的时候,考虑增加Monitor的存活个数到5个以上。
在 Ceph 集群中有多个 MON 时,MON 的数目必须是奇数,最小的数目是 1,最小的推荐数目是 3。因为 monitor 将运行于仲裁模式中,超过总数一半的 monitor 必须保持运行状态来避免脑裂。所有的 monitor 中,有一个将作为 leader 运行。当 leader 不工作时,其他 Monitor 节点被选举为 Leader 节点。
数据一致
分布式性算法
多个 monitor 使用 Paxos 算法来保证主 Cluster Map 的一致性,对Ceph集群所做的任何更新,都要由Paxos来保证Clus[……]
「Ceph」- 概念术语:Cluster Map
Ceph MON 负责监控整个集群的健康状态,以及维护集群成员关系状态(clustermembership state)、对等节点 (peer nodes) 的状态,集群的配置信息等。诸如:Ceph集群中有哪些进程状态为In。Ceph集群中的哪些进程已启动、正在运行或已关闭。放置组是处于活动状态、非活动状态、清洁状态还是其他某种状态。集群当前状态的其他详细信息,例如总存储空间或已使用的存储量。
Ceph MON 通过维护 Cluster Map 的主副本来实现这些功能;Ceph Cluster Map,Cluster Map:其为多个 map 的组合,是映射统称,其包括 Monitor map, OSD map, PG map, MDS map, CRUSH map;
当集群状态发生重大变化时(比如Ceph OSD掉线、放置组进入降级状态等),Cluster Map会更新,以反映集群的当前状态。
epoch:每种 map 都维护着其历史版本, 每个版本被称为一个 epoch,epoch 是一个单调递增的序列
Monitor Map
它包含 Monitor 节点端到端的信息,包括 1)Ceph Cluster ID、Monitor Node Hostname、IP-ADDR、Port 等; 2)它还保存自 monitor map 被创建以来的最新版本号,以及最后修改时间等;
Monitor间的相互发现是使用Monitor Map,而不是配置文件。Monitor Map存在于集群中,需要的时候可以执行命令导出,这样Ceph集群的管理信息就比存放在配置文件中更安全。例如在配置文件中指定Ceph启动端口时写错,导致Ceph不可用,而有了Monitor Map,即便是端口错误,Ceph集群的各个Monmap依旧在集群中,并不影响多Monitor间的通信。
执行 ceph mon dump 命令来查看其状态;
OSD Map
它保存一些常用的信息,包括: 1)Cluster ID 2)OSD Map 自创建以来的最新版本号(epoch)及其最后修改时间, 3)OSD 的信息,比如数量、状态、权重、最后清理间隔(last clean interval)以及 OSD 节点的信息; 4)存储池(Pool)相关的信息,包括 Pool Name、Pool ID、类型、副本级别(replication level)、PGP;
通过 ceph osd dump 命令,能够查看相关信息;
PG Map
它保存的信息包括: 1)PG 的版本、时间戳、OSD map 的最新版本号(epoch)、每个 PG 的 ID,其为 {pool-num}.{pg-id} 格式、对象数量、状态、状态时间戳; 2)容量已满[……]
「CEPH」- CRUSH Map
概述介绍
CRUSH Map 包含 OSD 列表,用于将设备聚合到物理位置的桶列表中,并告诉 CRUSH 如何在存储池中复制数据的规则列表。通过映射底层物理基础架构信息,CRUSH 可以规避相关硬件设备故障带来的风险。典型的故障来源包括物理上临近的资源,如共享的电源和共享的网络等。此信息可以编码到 Cluster Map;
CRUSH Algorithm 利用这些信息可以指定放置策略,可以在不同故障域之间分离对象副本,同时保证所需的数据均匀分布。这样,即便某个服务器或者某个机架故障也不会影响整个集群的正常使用,还能保证数据的安全。例如,为了解决并发故障,我们可能需要确保数据副本位于使用不同机架、电源组、控制器和 / 或物理位置的设备上;
部署大型数据集群时,我们应充分考虑自定义的 CRUSH Map,因为它将帮助你管理 Ceph 集群,提高性能并确保数据安全。例如,如果 OSD 出现故障,且你需要更换硬件时,CRUSH Map 可以帮助查找 OSD 发生故障的主机的物理数据中心、房间和机架等资源,快速定位坏盘所在位置。同样,CRUSH 可以帮助你更快地识别故障。例如,如果特定机架中的所有 OSD 同时下线,故障可能出在网络交换机 / 机架 / 网络交换机的电源上,而不是 OSD 本身。当与故障主机关联的放置组处于 degraded 状态时,CRUSH Map 还可以帮助识别 Ceph 存储数据的冗余副本的物理位置;
查看 CRUSH Map 的内容结构
它保存的信息包括:集群设备列表、bucket 列表、故障域(failure domain)分层结构、保存数据时用到的为故障域定义的规则(rules)等;
# ceph osd crush dump
其包含很多内容,主要为如下四部分:Device、Bucket Type、Bucket、Rule;
Device(设备)
ceph-osd 守护进程相对应的任何对象存储设备;
通常,Ceph 集群使用多种类型的存储设备,包括 HDD、SSD、NVMe 及其混合。我们将这些不同类型的存储设备称为 Device Class,以避免与 CRUSH Bucket 的 type 属性混淆(例如主机、机架)。由 SSD 支持的 OSD 比由传统机械磁盘支持的 OSD 运行快得多,因此其更适合大的工作负载。Ceph 可以为不同类型的数据集或工作负载创建池,并分配不同的 CRUSH 规则来控制这些池中数据的放置。因此,Device 是区分物理设备属性的,为将来存储具备特定属性的数据提供描述依据;
集群的所有设备列表,其位于 CRUSH Map 的开头部分:
# devices
device 0 osd.0 class ssd
device 1[……]
「CEPH」- 概念术语:OSD
概念区分:OSD vs. Ceph OSD
ceph-osd(Ceph OSD,Object Storage Daemon) OSD,Object Storage Device
Ceph OSD 与 OSD 是两个不同的术语: 2)OSD 表示 Object Storage Device,是物理或逻辑存储单元; 1)Ceph OSD 表示 Ceph Object Storage Daemon;
Ceph OSD 与 OSD 为 1:1 关系,所以在描述中通常将 OSD 与 Ceph OSD 合并称为”OSD“。在叙述时,我们也将使用该说法,除非特殊说明;
功能作用
数据存储
Ceph 如何将对象写入具体的 OSD 呢?这就是 Ceph 的对象存储做的事情。对象存储为 OSD 的原子块设备提供了一个底层接口。当 Client 读写数据时,Client 与对象存储接口进行交互。保存在集群中的对象具有唯一的标识符、对象数据、元数据。对象存储接口通过确保 Ceph 对象语义正确来保证对象一致性。对象存储接口是存储介质的底层接口,提供了性能统计信息;
Ceph OSD 是 Ceph 的对象存储守护进程,负责数据存储(读写)、复制、恢复、平衡。每个存储服务器(存储节点)运行一个或多个 Ceph OSD 进程,通常每个磁盘存储设备对应一个 Ceph OSD 进程。在 Ceph Cluster 中,当启动所有的 Ceph OSD 管理相应的磁盘时,都是在宿主机操作系统中启动一个进程;
任何读写操作请求,当 Client 从 Ceph Mon 获取 Cluster Map 后,Client 将直接与 Ceph OSD 进行 I/O 操作的交互,而不再需要 Ceph Mon 干预。这使得数据读写过程更为迅速(因为这些操作过程不像其他存储系统,它没有其他额外的层级数据处理);
数据存储方式: 1)早期使用 Filestore(其依赖于节点的文件系统,Ext4、XFS、Btrfs),即数据存储在文件系统中; 2)后面改用 Bluestore(直接接管块设备,以提高性能),即数据直接存储在块设备中; 3)其他数据存储方式,诸如 MemStore、K/V Store 等等,较少在生产中使用,所以这里暂不做讨论;
Ceph 使用存储介质有两种方法:OSD 日志盘;OSD 数据盘;
状态汇报
Ceph Mon 是个轻量级进程: 1)当 Ceph OSD 加入集群后,需要周期向 Ceph Mon 报告其状态。如果 Ceph Mon 定期主动检测 OSD 状态,当 Ceph 集群中存在很多 OSD 进程时,将使得 Ceph Mon 负载较高; 2)在 Ceph 的心跳设计中,Ceph OSD 还要检查其他守护进程[……]
「CEPH」- Bluestore
问题描述
Ceph 的数据被写了两次。第一次是将数据写入日志系统,第二次是将数据从日志系统写入文件系统进而落盘。这样就有了写放大,势必会影响性能。这也是 FileStore 的一个致命缺陷;
FileStore 对 SSD 的设计存在局限,尽管做了许多改进来提高 SSD 和 NVMe 存储支持性能,但仍然存在其他限制。例如,增加的 PG 要耗费巨大的计算和数据迁移成本,并且仍然存在双重写入损失;
FileStore 与块设备上的文件系统进行交互,具有性能损失;
解决方案
为了提高写性能,Ceph 解决 FileStore 写放大的问题,Ceph 开发 BlueStore 作为新的对象存储方案;
BlueStore 是 Ceph 的下一代存储实现。现有的存储设备包括固态驱动器 PCI Express 或 NVMe SSD;
BlueStore 的诞生是为了解决 FileStore 同时维护一套日志系统和基于文件系统写放大的问题,实现 FileStore 本身没有的对 SSD 的最优支持;
BlueStore 相比于 FileStore 主要做了两方面工作:(1)而 BlueStore 消除了文件系统层,直接使用原始块设备进行对象存储,操作裸设备,优化日志系统。(2)针对 SSD/NVMe 进行专门优化设计;
原理简述
RocksDB
存储 WAL、对象元数据、OMAP 数据以及分配器的元数据。RocksDB 是一种嵌入式高性能 K/V 存储,在闪存存储方面表现出色;
BlueFS
Bluestore 直接操作块设备(没有文件系统),而 RocksDB 无法直接写入原始磁盘设备,需要文件系统来持久化数据。所以设计 BlueFS 这个简化的文件系统,解决元数据、文件及磁盘的空间分配和管理问题,存储 RocksDB 日志和 sst 文件,主要作用是支持 RocksDB;
Ceph 对象的所有元数据的修改都记录在 BlueFS 的日志中。对于 BlueFS 而言,元数据持久保存在日志中。Ceph 挂载文件系统时,只需回放日志,就可将所有的元数据都加载到内存中。这就保证了内存文件系统数据持久化;
BlueStore 自己管理裸盘,因此需要有元数据来管理对象,对应的是 Onode。Onode 是常驻内存的数据结构,以 K/V 形式存储到 RocksDB 中,进而通过 BlueFS 的日志功能持久化数据;
HDD/SSD
物理块设备,存储实际的数据;
特征特征
数据完整
在使用 BlueStore 的 Ceph 集群中,Ceph 可以通过对 Write 操作进行循环冗余校验来确保数据完整,然后将 CRC 值存储在块数据库 RocksDB[……]
「CEPH」- Filestore
问题描述
基于 PCIE 的 SSD 或者基于 NVMe 的 SSD 在技术以及成本上没有可行性;
解决方案
FileStore 是 Ceph 的原始存储实现之一,并且是使用最广泛的实现方式。当 2004 年 Ceph 项目启动时,Ceph 完全依靠机械硬盘进行存储;
原理简述
FileStore 不是直接与原子块设备进行交互,而是与文件系统(通常为 xfs)进行交互。当对象存储处理完对象的语义并将其传递给 FileStore 时,FileStore 会将 PG 视为目录,将对象视为文件,并将元数据视为 XATTR 或 omap 条目,然后将剩下的操作交给文件系统处理,保证数据落盘;
数据的写入分为两个部分:Ceph 日志;Ceph 数据;
第一步、数据写入日志
用户数据文件在客户端写入 Ceph 集群时,将被客户端分割,生成多个以 4MB 为单位的对象。生成的每个对象将来都需要写入 OSD,但首先是写入日志。
Ceph 日志是事物日志系统。Ceph 采用的是全日志系统,即将所有数据存放在日志中。当有突发的大量写入操作时,Ceph 可以先把一些零散的、随机的 I/O 请求保存到缓存中并进行合并,然后再统一向内核发起 I/O 请求。以提高效率,但是一旦 OSD 崩溃,缓存中的数据就会丢失,所以数据在还未写入硬盘时,都会记录到事务日志系统中。当 OSD 崩溃后重新启动时,自动尝试从事务日志系统恢复因崩溃丢失的缓存数据。
写日志有两种模式: 1)Parallel 是日志和磁盘数据同时写; 2)Writeahead 是先写日志,只要日志写成功就返回,后台周期会同步日志中的写操作,实现落盘。其优点是能合并较小 I/O 请求,形成顺序写盘,提高 IOPS。
日志,是提高 FileStore 性能的关键因素,这些都是调优的考量参数: 2)日志同步时间的设置也会影响 Ceph 的性能; 1)日志系统空间大小代表能缓存的数据量; 3)计算日志大小的公式:如果 SSD 的预期吞吐量为 2GB/s,并且文件存储最大同步间隔为 10s,则日志大小应为 40GB(2×2×10); 3)在生产环境中,我们通常使用 SSD 来单独存储日志文件,以提高 Ceph 读写性能;
第二步、日志写入磁盘
在 FileStore 存储模式中,每一个对象都要通过 FileStore 的相关功能写入底层的磁盘。
Ceph 数据就是 Ceph 的对象数据,其中包含元数据。Ceph 在写完日志后,返给 OSD 写完成消息(Writeahead 模式),然后处理下一次写请求。这意味着数据当前保留在日志系统中,还没有真正落入后端的存储磁盘。Ceph OSD 进程根据参数设置的时间定期向文件系统同步数据。此操作[……]
「Ceph」- 客户端
客户端类型
Ceph 支持多种客户端类型,所有的用户数据都是通过客户端进行交互的。每种客户端底层都依赖 Ceph 不同标准的客户端接口:S3/Swift、RBD、CephFS;
Ceph RDB 提供了块存储,其安装方式类似于物理存储驱动器。Ceph RGW 通过其自己的用户管理器提供具有 S3 兼容和 Swift 兼容的 RESTful 接口的对象存储服务。但是,所有 Ceph Client 底层都使用 RADOS 协议和存储集群进行交互;
Ceph 支持当前主流的数据访问方式,比如 NFS、iSCSI、RBD、Filesystem、S3 等等;
librados
librados(分布式对象存储系统 RADOS 库),是对 RADOS 的抽象和封装,并向上层提供 API,用于与 RADOS 系统交互。Client 调用本机上的 librados,再由后者通过 socket 与 RADOS 的节点通信并完成各种操作;
基于 LIBRADOS 实现的兼容 Swift 和 S3 的存储网关系统 RADOSGW; 基于 LIBRADOS 实现的块设备驱动 RBD; 基于 LIBRADOS 实现的 POSIX 分布式文件系统 CephFS;
我们也能够借助 librados 来编写自己的应用,实现与 RADOS 的直接交互;
对象存储接口
现代应用程序需要具有异步通信功能的简单对象存储接口。Ceph Cluster 提供了具有异步通信功能的简单对象存储接口。该接口支持对整个集群中对象的直接、并行访问;
通过对象接口,能够执行以下操作: 1)池操作 2)快照 3)读 / 写对象 4)创建 / 设置 / 获取 / 删除 XATTR 5)创建 / 设置 / 获取 / 删除键 / 值对
访问集群的必要参数
不论哪种存储客户端访问方式,它们都要有以下几个必备要素: 1)Ceph 配置文件和 Ceph Monitor 地址 2)存储池名称 3)用户名和密钥的路径
客户端的 Watch/Notify 机制
在 Ceph Cluster 中,Watch/Notify 机制用于在不同客户端之间进行通信,使各客户端的状态保持一致;
Watch/Notify 机制需关联到特定对象。当多个客户端接收到同一个对象后,任一客户端发送通知消息对该对象所在的 OSD 消息进行复制,进而转发给所有的客户端;
当某客户端不是以只读方式打开对象时会接收消息,并主动发送通知消息到其他客户端,同时接收来自其他客户端的消息。而且该客户端也会收到自己发出去的通知消息,并判断此通知是不是自己发出的消息对应的回应消息;
客户端的独占锁
如果一个 RBD 映射到多个客户端,独[……]
「CEPH」- 概念术语:放置组(Placement Group,PG)
问题描述
Ceph 可通过副本或纠删码实现数据持久性,通过清洗或循环冗余校验保证数据完整,实现复制、重新平衡和故障恢复。
但是,在 EB 级存储集群中,存储池可能存储数百万个数据对象。数据的复制、移动,会存在性能问题。
解决方案
Ceph 通过将 Pool 划分为 PG(Placement Group,放置组)来解决性能瓶颈问题。PG 是一个非常重要的概念,对其进行合理设置可以提高集群的性能。有效地分配 PG,以提高集群性能;
原理简述
Pool, PG and Data
Pool 被分隔为 PG ,即 PG 是 Pool 的子集 PG 是数据对象的集合,即 PG 中包含数据对象。
例如,每个 Pool 分配 PG * 100,意味着每个 PG 大约包含 Pool 中 1% 的数据。
数据保存在 Pool 中,而 Pool 被分为多个 PG,而 PG 其中包含多个 Object; 最终 PG 将其中的数据存储在 OSD 中; PG 是若干 Object 的逻辑集合; PG 会被复制和分布到多个 OSD 上; 以 PG 为单位,Ceph 来进行数据的复制、副本;
CRUSH算法用于在Ceph中定位存储数据的位置,并计算放置组中的OSD目标集。CRUSH算法将每个对象放入一个放置组,然后将每个放置组存储在一组OSD中。
数据读写的大致过程
系统管理员在创建或修改 Pool 时,设置 PG 数。
Ceph将一个存储池划分为一系列放置组,每一个客户端对象都会分配给一个放置组,然后将该放置组分配给一个主OSD。由于Ceph通过设置副本数量或纠删码级别对数据进行保护,因此Ceph会根据副本数或者纠删码中校验盘的数量选择OSD,并将主OSD中的放置组复制到从OSD。如果主OSD发生故障或集群做了数据重新平衡,Ceph可以对集群中现有非主OSD上保存的放置组数据进行复制或移动。因为有了放置组,对象所在的OSD位置就清楚了。即便是OSD有损坏,你也不必为每个对象单独寻址。CRUSH算法会结合Cluster Map和集群的状态将放置组均匀、伪随机地分配给集群中的OSD(包括主OSD和从OSD)。
PG 在 OSD 间复制,保证集群数据安全的方法: 1)CRUSH 算法将 OBJ 00 分配给 PG 00,并且将 PG 00 分配给 OSD 01,让 OSD 1 作为 Primary OSD。 2)CRUSH 算法计算出 OSD 04 是 PG 00 的 Secondary OSD,则 Primary OSD 01 将 PG 00 内容数据复制到 OSD 01 和 OSD 04。
数量配置
集群 PG 总数
集群 PG 总数 = (OSD 总数)×(每[……]
「CEPH」- Placement Group Placement
PGP(Placement Group for PlacementPurpose)决定对象分布在哪些 OSD 上。参数 pgp_num 表示 PGP 的可操作值;
调整 pgp_num 而带来的变化
如果增大 PGP 值,PG 内的对象会重新计算,集群中的数据将开始做重新分布;
现在,创建存储池 Pool(pg_num=1, pgp_num=1) 即只有 PG * 1 和 PGP * 1,并且 PG 内有 100 个对象:
假设数据冗余 replica=3,数据会分布在 3 个 OSD 上,设这三个 OSD 编号为 1、3、8。那么,这些数据的位置在创建存储池的时候都会被固定;
随后调整 Pool(pg_num=2, pgp_num=1),即新增 PG * 1,而且这个 PG 内分割了原有 PG 内的一部分对象,也就是说两个 PG 共同存储 100 个对象。然而观察 PG 的分布,发现这两个 PG 对象的 OSD 编号仍然是 1、3、8,即增加 PG 的数量不改变原有的 OSD 映射关系;
而调整 Pool(pg_num=2, pgp_num=2),即增加 PGP * 1,现在 PG 内的对象并没有发生变化,只是其中一个 PG 中对象的 OSD 编号发生了变化,变成了 2、4、9。这时,集群中该 PG 的数据开始从 OSD 1、3、8 向 OSD 2、4、9 迁移;
pg_num vs. pgp_num
pg_num 是存储池中存储对象的“目录数”。pg_num 的增加,会引起 PG 内的对象的分布,即分裂到相同的 OSD 上新生成的 PG 中;
pgp_num 是存储池中放置组内的 OSD 分布组合个数。pgp_num 的增加会引起部分 PG 在 OSD 上的分布变化,但是不会引起 PG 内对象的变动;[……]
「Ceph」- 概念术语:Pool,存储池
概述介绍
Pool 是存储对象的逻辑分区,Ceph Cluster 将数据对象存储在 Pool 中(逻辑分区),以实现不同数据的逻辑隔离;
管理员,能为特定类型的数据(例如块设备、对象网关)创建多个 Pool 实例,或使用 Pool 将一组用户与另一组用户分开;
客户端,当读取或写入数据时,总是连接到某个 Pool。Client 指定 Pool Name、用户和密钥,因此该池看起来像是一个逻辑分区,便于对数据对象进行访问控制;
相关概念
池类型
副本,通过数据复制来提供数据冗余;纠删码,通过校验码来确保数据冗余,类似 RAID-5 技术; 存储池类型定义了创建池时的数据持久化方法。存储池类型对客户端完全透明,客户端不需要关心
CRUSH 规则集
CRUSH 扮演着另一个重要角色,可用于检测故障域和性能域。CRUSH 可以按存储介质类型识别 OSD。CRUSH 使 OSD 能够跨故障域存储对象副本。例如,对象副本可能会存储在不同的服务器机房、机架和节点中。如果集群的很大一部分节点发生故障(例如机架),集群仍可以降级状态运行,直到集群恢复正常为止。此外,CRUSH 能够使客户端将数据写入特定类型的硬件,例如 SSD;
容量大小
参数 target_size_bytes 可以对存储池的容量进行硬限制,即限制存储池最大使用容量;
缓存分层(Cache Tiering)
缓存分层,通过将部分数据保存在缓存层(通常为更快的存储硬件),为 Ceph Client 提供更好的 IO 性能;
Writeback Mode
当客户端写数据时: 1)数据写到缓存层中,客户端就会立刻收到确认回复; 2)基于所配置的刷新 / 删除(flush/evict) 策略,数据从缓存层迁移到存储层, 3)最后被缓存分层代理〈cache-tiering agent) 从缓存层中删除;
当客户端执行读操作时: 1)数据通过缓存分层代理,先从存储层传输到缓存层,然后发送给客户端; 2)数据会保留在缓存层直到变为无效数据或冷数据;
writeback 模式的缓存层是用于可变数据,如图片或视频编辑、交易性数据等的理想模式;
Read-only Mode
在该模式下,写操作不会被它处理,而是直接存到后端的存储层;
当缓存分层被配置成 read-on1y 模式时,它只服务于客户端的读操作。当客户端执行读操作时,缓存分层代理从存储层复制请求数据到缓存层; 基于已经配置在缓存层上的策略,过期的 object 会从缓存层中被删除。这种方法适用于多个客户端读取相同的数据时,比如社交媒体内容;
不可变数据是 read-only 缓存层的理想备选方案;[……]
「CEPH」- 纠删码存储池
问题描述
在 Ceph 中,默认的数据保护机制是副本。但是,副本的缺点是需要占用多倍的存储空间来提供冗余。例如,计划搭建 replica=3 的 1PB 可用容量的存储集群,则需要准备 3PB 的存储容量,也就是 +200%,甚至更多。在这种情况下,使用副本机制会使 /GB 的存储费用大幅上升;
解决方案
从 Firefly 发行版本开始,Ceph 推出被称为 Erasure Code(纠删码)的数据保护方法;
原理简述
概述流程
在写入数据时,将每个 Object 划分成更小的 Chunk(数据块),每个块称为 Data Chunk(数据块),再用 Coding Chunk(编码块)对它们进行编码,最后将 Data Chunk 与 Coding Chunk 共同存储到 Ceph Cluster 中的不同故障域中,从而保证数据安全;
纠删码原理
Ceph 可以加载多种纠删码算法。最早且最常用的纠删码算法是 Reed-Solomon。纠删码实际上是前向纠错(Forward Error Correction,FEC)码;
FEC 代码将 K 个 chunk(以下称为块)数据进行冗余校验处理,得到 N 个块数据。这 N 个块数据既包含原数据,也包括校验数据。这样就能保证 K 个块中如果有数据丢失,可以通过 N 个块中包含的校验数据进行恢复;
N=K+M,是纠删码概念的核心在公式。具体地说,变量 K 是数据块即原始数量;变量 M 代表防止故障的冗余块的数量;变量 N 是在纠删码之后创建的块的总数。这种方法保证 Ceph 可以访问所有原始数据,可以抵抗任意 M 个故障。例如,当 K=10, N=16 时,Ceph 会将 6 个冗余块添加到 10 个基本块 K 中。在 M=N–K(即 16–10=6)的配置中,Ceph 会将 16 个块分布在 16 个 OSD 中,这样即使 6 个 OSD 掉线,也可以从 10 个块中重建原始文件,以确保不会丢失数据,提高容错能力;
数据写入过程
在纠删码存储池中,Primary OSD 接收所有写操作。纠删码存储池将每个对象存储为 K+M 个块(K 个数据块和 M 个编码块),配置大小为 K+M,以便 Ceph 将每个块存储到一个 OSD 中。Ceph 将块的等级配置为对象的属性。Secondary OSD 负责将对象编码为 K+M 个块,并将其发送给其他 OSD。Secondary OSD 还负责维护放置组日志的权威版本;
首先,创建 5=3+2 的纠删码存储池,所以需要使用 5 个 OSD 来存储数据块,并 M=2 保证在 2 个 OSD 丢失的情况下恢复数据;
然后,当将包含 ABCDEFGHI 的对象 NYAN 写入纠删码存储池时,纠删码[……]
「Ceph」- 用户、权限、安全
Ceph 提供 Cephx身份验证系统,以保护系统并防止攻击; 注意,Cephx 解决的是系统认证问题,但不提供网络通信时的数据加密。
被认证的对象
1)用户:用户需要完成验证,而后才能访问 Ceph Cluster 数据。比如,某客户端要想执行命令来操作集群,就要有登录Ceph的密钥; 2)进程:集群守护进程间的互相访问,也需要进行认证。这是一种特殊的用户类型MON/OSD/MDS。也就是说,Monitor、OSD、MDS都需要账号和密码来登录Ceph系统。
认证方式
None
针对用户、守护进程,不进行认证;
CephX
针对用户、守护进程,进行认证;
ceph auth cluster required = cephx
ceph auth service required = cephx
ceph auth client required = cephx
Client 访问 Ceph MON 完成身份认证;
Cephx 使用共享密钥进行身份验证,这意味着客户端和Monitor都具有客户端密钥的副本。身份验证协议使双方可以相互证明自己拥有密钥的副本,而无须透露密钥。也就是说,集群确定用户拥有密钥,并且用户确定集群有密钥的副本。
认证过程
客户端的凭证下发
针对请求的认证检查
用户通过Ceph客户端访问Monitor。每个Monitor都可以对用户进行身份验证并分配密钥,因此使用Cephx时不会出现单点故障。Monitor返回身份验证数据,其中包含用于获取Ceph服务的会话密钥。该会话密钥本身已使用用户的永久密钥加密,因此用户只能向Monitor请求服务,然后客户端使用会话密钥从Monitor请求其所需的服务,并且由Monitor向客户端提供密钥,客户端拿到该密钥即可向实际处理数据的OSD发起认证。Monitor和OSD共享一个密钥,因此Monitor提供的密钥可以被集群中的任何OSD或元数据服务器共用。这种身份验证形式可防止有权访问通信介质的攻击者创建虚假消息或更改其他用户的合法消息,但只要该用户的密钥在到期前不被泄露就不会有威胁。要使用Cephx,管理员必须首先设置用户。
用户权限
User Management — Ceph Documentation
allow: 只用于赋予用户 MDS 的 rw 权限;
r: 赋予用户读数据的权限,该权限也是从 monitor 读取 CRUSH map 时必须要有的; w: 赋予用户写入数据的权限; x: 赋予用户调用对和象方法的权限,包括读和写,以及在 monitor 上执行用户身份验证的权限;
class-read: 这是 x 权限的子集,它允许用户调用类的[……]
「CEPH」- CRUSH(Controlled Replication Under Scalable Hashing )
问题描述
数据分布是分布式存储系统的一个重要部分,数据分布算法至少要考虑以下 3 个因素: 1)故障域隔离。同份数据的不同副本分布在不同的故障域,降低数据损坏的风险; 2)负载均衡。数据能够均匀地分布在磁盘容量不等的存储节点,避免部分节点空闲,部分节点超载,从而影响系统性能; 3)控制节点加入离开时引起的数据迁移量。当节点离开时,最优的数据迁移是只有离线节点上的数据被迁移到其他节点,而正常工作的节点的数据不会发生迁移;
解决方案
CRUSH Algorithm,是为解决以上问题而设计的,是 Ceph 的设计精髓。
The CRUSH algorithm enables the Ceph Storage Cluster to scale, rebalance, and recover dynamically.
Using the CRUSH algorithm:Ceph calculates which placement group should contain the object, and further calculates which Ceph OSD Daemon should store the placement group.
原理简述
CRUSH Map,是个结构,该结构描述整个存储集群的结构(诸如 地域、数据中心、区域、机架、主机 等等),是人为定义的。借助于 CRUSH Map 结构,CRUSH 伪随机地存储和检索 OSD 中的数据,并使数据在整个存储集群中均匀分布。
层次结构
在 Ceph Cluster 中,CRUSH 通过简洁而层次清晰的设备描述(CRUSH Map),包括存储集群和副本放置策略,就可以有效地把数据对象映射到存储设备上,且这个过程是完全分布式的,在集群系统中的任何一方都可以独立计算任何对象的位置;
动态变化
另外,大型系统存储结构是动态变化的(存储节点的扩展或者缩容、硬件故障等),CRUSH 能够处理存储设备的变更(添加或删除),并最小化由于存储设备的变更而导致的数据迁移;
特性特征
通过 CRUSH Algorithm 计算来确定数据的存储位置,不需要像以往要查询元数据服务器才能知道数据的位置。这也是 Ceph 不需要元数据服务器的原因。
CRUSH是受控复制的分布式hash算法。 CRUSH算法可以避免单点故障、性能瓶颈以及对Ceph可扩展性的物理限制。 CRUSH 是一种基于伪随机控制数据分布、复制的算法;
数据条带化
存储系统通常都支持 Stripe(条带化)以增加存储系统的吞吐量并提升性能,数据条带化最常见的方式是做 RAID 0 或 “带区卷”,这种数据的分配方式可以弥补单个磁盘读写性能不足的问题。Cep[……]
「Ceph」- 概述数据写入过程
概述介绍
通过 CRUSH 算法,Ceph 实现去中心化;
Ceph Client 根据 CRUSH 来计算它的数据要被写到哪里,以及从哪里读取它所需要的数据。所有这些计算操作都是在 Client 完成的,因此它们不会影响 Ceph Cluster 服务器端的性能。然后 Client 与 Ceph OSD 直接通信;
Ceph OSD 负责创建对象,以及在其他 Ceph Node 上创建这些对象的副本来保证数据的安全性和高可用性。Ceph 还使用 Ceph Mon Cluster 来保证系统的高可用性;
像 Ceph Client 一样,OSD 也连接 Ceph Mon,以检索 Cluster Map 的最新副本。OSD 也使用 CRUSH 算法来计算对象副本的存储位置。在典型的写场景中,Ceph Client 使用 CRUSH 算法来计算对象的 PG ID 和 Primary OSD;
Client
Ceph Client 接口负责和 Ceph Cluster 进行数据交互,包括数据的读写;
Ceph Client 需要以下数据才能与 Ceph Cluster 进行通信: 1)Ceph 配置文件或集群的名称(通常命名为 ceph)、Monitor 地址 2)存储池名称 3)用户名和密钥路径
Ceph 客户端维护对象 ID 和存储对象的存储池名称;
Client <=> Ceph MON
Ceph Client 和其他守护进程使用配置文件发现 Monitor;
为了存储和检索数据: 1)首先,Ceph Client 访问 Ceph Monitor 并检索最新的 Cluster Map 副本,以使知晓 Ceph Cluster 的状态和配置; 2)然后,Ceph Client 通过向 librados 提供对象名称和存储池名称; 3)librados 会使用 CRUSH 算法为要存储和检索的数据计算对象的 PG 和 Primary OSD;
inside Client
2)然后,Client 将数据转化为一个或者多个对象,每个对象都具有 Name 和 Pool name;
3)接着,该对象会被以 PG 的数目为基数做哈希,在指定的 Ceph Pool 中生成最终的 PG;
计算 PG ID 示例,过程如下: 1)Client 输入 Pool ID 和 Object Name(如 pool=liverpool, object-name=john); 2)CRUSH 获得 Pool ID 并 hash(object name) 运算; 3)CRUSH 计算 PG 个数,Hash 取模获得 PG ID; 4)CRUSH 获得已命名 Pool ID([……]
「CEPH」- 消息通信框架
Ceph 客户端和服务器端的消息通信框架有三种:SimpleMessenger、AsyncMessenger XIOMessenger;
SimpleMessenger,使用 TCP Socket 实现。每个 Socket 有两个线程:一个线程用于接收,另一个线程用于发送。但是,这种通信机制在集群规模较大的情况下会创建大量连接,对集群的性能有一定挑战。这种框架比较稳定、成熟;
AsyncMessenger,使用带有固定大小线程池的 TCPSocket 进行连接。该 Socket 数应等于最大副本数或者纠删码块数。这种框架兼容不同的网络传输类型,如 posix、rdma、dpdk。当前,Ceph 默认的消息框架和传输类型为 async+posix。对于 rdma 和 dpdk,其在很多时候技术还不够成熟,商业化过程中的很多问题还没有发现。因此对于追求集群稳定的场景,建议慎重选用该框架;
XIOMessenger,基于开源网络通信库 Accelio 实现。Accelio xio 是与传输相独立的消息抽象,当前在 RDMA(Infiniband 或 Ethernet)上运行,处于试验阶段;[……]