存储基础
单机存储设备
- DAS(直接附加存储)
- 定义:直接接到计算机的主板总线上去的存储。
- 接口:IDE、SATA、SCSI、SAS、USB。
- 特性:提供块级别的存储,即存储设备直接以块的形式向主机提供存储空间。
- NAS(网络附加存储)
- 定义:通过网络附加到当前主机文件系统之上的存储。
- 协议:NFS、CIFS、FTP。
- 特性:文件系统级别的存储,客户端通过网络将远程存储上的文件系统挂载到本地,像使用本地文件系统一样使用远程存储。无法对NAS存储进行再次格式化创建新的文件系统。
- SAN(存储区域网络)
- 定义:一种网络存储,通过专用网络将存储设备与服务器连接起来。
- 协议与物理层:SCSI协议(仅用于数据传输)、FCSAN(物理层使用光纤)、iSCSI(物理层使用以太网)。
- 特性:提供块级别的存储,客户端可以直接访问存储设备的块空间。
单机存储的问题
- 存储处理能力不足:传统磁盘的IO能力有限,无法满足大规模用户同时访问的需求。
- 存储空间能力不足:单块磁盘的容量有限,无法满足大规模数据存储的需求。
- 单点故障问题:单机存储存在单点故障风险,一旦存储设备故障,可能导致数据丢失。
商业存储解决方案
- 品牌:EMC、NetAPP、IBM、DELL、华为、浪潮等。
- 特点:提供高性能、高可用性的存储解决方案,通常具有冗余和备份机制,以降低单点故障风险。
分布式存储(SDS,软件定义的存储)
- 定义:通过软件来定义和管理存储资源,实现存储资源的高扩展性、高性能和高可用性。
- 常见系统:Ceph、TFS、FastDFS、MooseFS(MFS)、HDFS、GlusterFS(GFS)等。
分布式存储的类型
- 块存储
- 定义:提供没有被组织过的存储空间,通常以裸设备的形式存在。
- 适用场景:容器或虚拟机存储卷分配、日志存储、文件存储等。
- 特性:底层以分块的方式来存储数据,每个块是一个独立的存储单元。
- 文件存储
- 定义:建立在块存储结构之上,以文件形式来存储数据。
- 适用场景:目录结构的存储、日志存储等。
- 特性:文件的元数据和实际数据是分开存储的,可以通过网络被多个服务器同时挂载和使用。
- 对象存储
- 定义:基于API接口提供的文件存储,每个文件都是一个对象。
- 适用场景:图片存储、视频存储等。
- 特性:文件的元数据和实际数据是存放在一起的,具有块存储的高速读写能力和文件存储的共享特性。每个对象都有唯一的标识符,可以通过API进行访问和管理。
Ceph是一个开源的分布式存储系统,具有高扩展性、高性能和高可靠性的优点,广泛应用于云计算和大数据领域。以下是对Ceph的详细介绍:
Ceph
Ceph的基本特点
- 开源性:Ceph是一个开源项目,其源代码可以在GitHub等平台上获取,社区活跃,有大量的开发者和用户参与贡献和维护。
- 自我修复和自我管理:Ceph具有自我修复和自我管理的能力,能够自动检测和处理故障,确保存储系统的稳定性和可靠性。
- 多种存储类型支持:Ceph支持对象存储、块存储和文件系统等多种存储类型,可以满足不同应用场景的需求。
Ceph的应用场景
- 云平台后端存储:Ceph可以作为云平台的后端存储,支持虚拟机镜像的存储和管理,提高云平台的性能和可靠性。
- 大数据存储:Ceph支持大数据存储和处理,能够处理PB级的数据量,适用于分布式文件系统、数据仓库等场景。
- 内容分发网络(CDN):Ceph的对象存储功能可以支持内容分发网络,提供高效的内容存储和分发服务。
Ceph的架构
Ceph的架构可以自下向上分为四个层次:
- RADOS基础存储系统:RADOS是Ceph最底层的功能模块,是一个无限可扩容的对象存储服务。它将文件拆解成无数个对象(碎片)存放在硬盘中,提高了数据的稳定性。RADOS主要由OSD和Monitor两个组件组成,OSD负责数据的存储和复制,Monitor负责集群的状态监控和元数据管理。
- LIBRADOS基础库:LIBRADOS提供了与RADOS进行交互的方式,并向上层应用提供Ceph服务的API接口。上层的RBD、RGW和CephFS都是通过LIBRADOS访问的。LIBRADOS支持多种编程语言,如PHP、Ruby、Java、Python、Go、C和C++等,方便开发者进行客户端应用开发。
- 高层应用接口:包括对象存储接口RGW、块存储接口RBD和文件存储接口CephFS。RGW提供S3和Swift兼容的RESTful API接口,支持对象存储服务;RBD提供块设备接口,主要用于Host/VM;CephFS提供了一个符合POSIX标准的文件系统,支持分布式文件系统功能。
- 应用层:基于高层接口或者基础库LIBRADOS开发出来的各种APP,或者Host、VM等诸多客户端。这些应用可以直接与Ceph存储系统进行交互,实现数据的存储、访问和管理。
Ceph的核心组件
- OSD(Object Storage Daemon):负责物理存储的进程,一般配置成和磁盘一一对应。主要功能是存储数据、复制数据、平衡数据、恢复数据,以及与其它OSD间进行心跳检查等。通常至少需要3个OSD来实现冗余和高可用性。
- PG(Placement Group):归置组是一个虚拟的概念,用于数据寻址。Ceph先将每个对象数据通过HASH算法映射到一个PG中,然后将PG通过CRUSH算法映射到OSD上。
- Pool:存储对象的逻辑分区,起到namespace的作用。每个Pool包含一定数量的PG,并可以做故障隔离域。Pool中数据保存方式支持多副本和纠删码两种类型。
- Monitor:用来保存OSD的元数据,并维护集群状态的映射视图(包括OSD Map、Monitor Map、PG Map和CRUSH Map等)。同时负责维护展示集群状态的各种图表,以及管理集群客户端认证与授权。一个Ceph集群通常至少需要3或5个(奇数个)Monitor节点来实现冗余和高可用性。
- Manager:负责跟踪运行时指标和Ceph集群的当前状态,包括存储利用率、当前性能指标和系统负载等。为外部监视和管理系统提供额外的监视和接口。一个Ceph集群通常至少需要2个Manager节点实现高可用性。
- MDS(Metadata Server):是CephFS服务依赖的元数据服务,负责保存文件系统的元数据和管理目录结构。对象存储和块设备存储不需要元数据服务;如果不使用CephFS可以不安装MDS。
OSD存储引擎
OSD存储引擎主要有两种方式:FileStore和BlueStore。
- FileStore:
- FileStore是Ceph中存储对象的一个遗留方法,它依赖于标准文件系统(如XFS)和一个键/值数据库(传统上是LevelDB,BlueStore引入后则为RocksDB的变种)来保存和管理元数据。
- FileStore经过了良好的测试,在生产中得到了广泛应用,但由于其总体设计和对传统文件系统的依赖,性能上存在一些不足。
- BlueStore:
- 从Ceph 12.2.0(Luminous)版本开始,BlueStore被引入作为一种新的、高性能的OSD存储引擎,以替代旧的FileStore引擎。
- BlueStore将对象直接存储在原始块设备上,免除了对文件系统层的需要,提高了读写操作速度。它直接操作底层块设备来管理数据,而不是通过传统的文件系统。
- BlueStore提供了更快的响应时间和更高的数据吞吐量,同时具有更好的可靠性和稳定性。它可以直接与Solid State Drive(SSD)交互,并利用其快速读写速度。
- BlueStore还具有可扩展性,可以处理数百万个物理盘和千亿个对象。它实现了动态负载平衡和自动恢复机制,以确保高可用性和数据可靠性。
Ceph数据存储过程
- 客户端从MON(Monitor)节点获取最新的Cluster Map,该地图包含了集群中所有OSD、MON和PG的状态信息。
- Ceph存储的数据会被切分成一到多个固定大小的对象(Object),对象大小可以由管理员调整,通常为2M或4M。每个对象都会有一个唯一的OID(Object ID),由ino(文件的FileID,用于在全局唯一标识每一个文件)和ono(分片的编号)组成。
- 通过对OID使用HASH算法,得到一个16进制的特征码。用该特征码与Pool中的PG总数取余,得到的序号则是PGID(Placement Group ID)。
- PG会根据设置的副本数量进行复制。通过对PGID使用CRUSH算法,可以算出PG中目标主和次OSD的ID,然后将数据(实际上是PG中的所有对象)存储到不同的OSD节点上。CRUSH是Ceph使用的数据分布算法,它类似于一致性哈希,可以确保数据被分配到预期的地方。
Ceph版本发行生命周期
Ceph从Nautilus版本(14.2.0)开始,每年都会有一个新的稳定版发行,预计是每年的3月份发布。每年的新版本都会起一个新的名称和一个主版本号。版本号的格式为x.y.z,其中x表示发布周期,y表示发布版本类型(0为开发版本,1为发布候选版本,2为稳定/错误修复版本),z表示具体的修订版本。
Ceph集群部署
- ceph-deploy:
- 一个集群自动化部署工具,使用较久且成熟稳定。
- 被很多自动化工具所集成,可用于生产部署。
- cephadm:
- 从Octopus和较新的版本后开始使用cephadm来部署ceph集群。
- 使用容器和systemd安装和管理Ceph集群。
- 目前在某些场景下可能不建议用于生产环境(但这一情况可能随时间变化,请查阅最新文档或社区建议)。
- 二进制手动部署:
- 需要一步步手动部署Ceph集群,支持较多定制化和了解部署细节。
- 安装难度较大,适合对Ceph有深入了解的用户。
基于 ceph-deploy 部署 Ceph 集群
Ceph 生产环境推荐配置
- 存储集群全采用万兆网络
- 集群网络与公共网络分离
- 集群网络(cluster-network):用于集群内部通讯
- 公共网络(public-network):用于外部访问Ceph集群
- mon、mds 与 osd 分离部署在不同主机上
- 测试环境中可以让一台主机节点运行多个组件
- OSD 可使用 SATA 磁盘
- 根据容量规划集群
- 硬件要求
- CPU:至强E5 2620 V3或以上
- 内存:64GB或更高
- 集群主机分散部署
- 避免机柜的电源或网络故障
Ceph 环境规划
主机名 | Public网络 | Cluster网络 | 角色 |
---|---|---|---|
admin | 192.168.80.10 | admin(管理节点)、client | |
node01 | 192.168.80.11 | 192.168.100.11 | mon、mgr、osd(/dev/sdb、/dev/sdc、/dev/sdd) |
node02 | 192.168.80.12 | 192.168.100.12 | mon、mgr、osd(/dev/sdb、/dev/sdc、/dev/sdd) |
node03 | 192.168.80.13 | 192.168.100.13 | mon、osd(/dev/sdb、/dev/sdc、/dev/sdd) |
client | 192.168.80.14 | client |
环境准备
- 创建 Ceph 的管理用户
创建一个专门用于管理 Ceph 的用户,并赋予其 root 权限。useradd cephadm passwd cephadm visudo cephadm ALL=(root) NOPASSWD:ALL
- 关闭 selinux 与防火墙
实验环境中确保 Ceph 集群的网络通信不受限制。systemctl disable --now firewalld setenforce 0 sed -i 's/enforcing/disabled/' /etc/selinux/config
- 根据规划设置主机名
hostnamectl set-hostname admin hostnamectl set-hostname node01 hostnamectl set-hostname node02 hostnamectl set-hostname node03 hostnamectl set-hostname client
- 配置 hosts 解析
确保各节点之间可以通过主机名互相访问。cat >> /etc/hosts << EOF 192.168.80.10 admin 192.168.80.11 node01 192.168.80.12 node02 192.168.80.13 node03 192.168.80.14 client EOF
5. **安装常用软件和依赖包**
```bash
yum -y install epel-release
yum -y install yum-plugin-priorities yum-utils ntpdate python-setuptools python-pip gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel zip unzip ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5-devel libidn libidn-devel openssl openssh openssl-devel nss_ldap openldap openldap-devel openldap-clients openldap-servers libxslt-devel libevent-devel ntp libtool-ltdl bison libtool vim-enhanced python wget lsof iptraf strace lrzsz kernel-devel kernel-headers pam-devel tcl tk cmake ncurses-devel bison setuptool popt-devel net-snmp screen perl-devel pcre-devel net-snmp screen tcpdump rsync sysstat man iptables sudo libconfig git bind-utils tmux elinks numactl iftop bwm-ng net-tools expect snappy leveldb gdisk python-argparse gperftools-libs conntrack ipset jq libseccomp socat chrony sshpass
- 在 admin 管理节点配置 ssh 免密登录所有节点
简化集群节点间的操作,避免每次都需要输入密码。ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa sshpass -p 'abc1234' ssh-copy-id -o StrictHostKeyChecking=no root@admin sshpass -p 'abc1234' ssh-copy-id -o StrictHostKeyChecking=no root@node01 sshpass -p 'abc1234' ssh-copy-id -o StrictHostKeyChecking=no root@node02 sshpass -p 'abc1234' ssh-copy-id -o StrictHostKeyChecking=no root@node03
- 配置时间同步
确保集群内各节点的时间一致,避免因时间不同步导致的问题。systemctl enable --now chronyd timedatectl set-ntp true # 开启 NTP timedatectl set-timezone Asia/Shanghai # 设置时区 chronyc -a makestep # 强制同步下系统时钟 timedatectl status # 查看时间同步状态 chronyc sources -v # 查看 ntp 源服务器信息 timedatectl set-local-rtc 0 # 将当前的UTC时间写入硬件时钟 # 重启依赖于系统时间的服务 systemctl restart rsyslog systemctl restart crond # 关闭无关服务 systemctl disable --now postfix
- 配置 Ceph yum源
添加 Ceph 的 yum 源以便于安装 Ceph 软件包。wget https://download.ceph.com/rpm-nautilus/el7/noarch/ceph-release-1-1.el7.noarch.rpm --no-check-certificate rpm -ivh ceph-release-1-1.el7.noarch.rpm --force
- 执行完上面所有的操作之后重启所有主机(可选)
确保所有配置生效,重启后集群可以正常运行。sync reboot
Ceph 集群部署
1. 创建工作目录
mkdir -p /etc/ceph
2. 安装 ceph-deploy
cd /etc/ceph
yum install -y ceph-deploy
ceph-deploy --version
3. 在管理节点为其它节点安装 Ceph 软件包
ceph-deploy install --release nautilus node0{1..3} admin
或手动安装:
sed -i 's#download.ceph.com#mirrors.tuna.tsinghua.edu.cn/ceph#' /etc/yum.repos.d/ceph.repo
yum install -y ceph-mon ceph-radosgw ceph-mds ceph-mgr ceph-osd ceph-common ceph
4. 生成初始配置
ceph-deploy new --public-network 192.168.80.0/24 --cluster-network 192.168.100.0/24 node01 node02 node03
5. 初始化 mon 节点
ceph-deploy mon create node01 node02 node03
ceph-deploy --overwrite-conf mon create-initial
ceph-deploy gatherkeys node01
查看 mon 进程:
ps aux | grep ceph
查看集群状态:
ceph -s
查看 mon 集群选举情况:
ceph quorum_status --format json-pretty | grep leader
扩容 mon 节点:
ceph-deploy mon add <节点名称>
6. 部署管理节点(可选)
ceph-deploy --overwrite-conf config push node01 node02 node03
ceph-deploy admin node01 node02 node03
7. 部署 osd 存储节点
添加硬盘后直接使用:
lsblk
擦净磁盘(可选):
ceph-deploy disk zap node01 /dev/sdb
添加 osd 节点:
ceph-deploy --overwrite-conf osd create node01 --data /dev/sdb
ceph-deploy --overwrite-conf osd create node02 --data /dev/sdb
ceph-deploy --overwrite-conf osd create node03 --data /dev/sdb
查看集群状态:
ceph -s
查看 osd 状态:
ceph osd status
ceph osd tree
rados df
ssh root@node01 systemctl status ceph-osd@0
扩容 osd 节点:
ceph-deploy --overwrite-conf osd create node01 --data /dev/sdc
ceph-deploy --overwrite-conf osd create node02 --data /dev/sdc
ceph-deploy --overwrite-conf osd create node03 --data /dev/sdc
ceph-deploy --overwrite-conf osd create node01 --data /dev/sdd
ceph-deploy --overwrite-conf osd create node02 --data /dev/sdd
ceph-deploy --overwrite-conf osd create node03 --data /dev/sdd
8. 部署 mgr 节点
ceph-deploy mgr create node01 node02
查看集群状态:
ceph -s
解决 mons are allowing insecure global_id reclaim
问题:
ceph config set mon auth_allow_insecure_global_id_reclaim false
扩容 mgr 节点:
ceph-deploy mgr create <节点名称>
9. 开启监控模块
yum install -y ceph-mgr-dashboard
ceph mgr module ls | grep dashboard
ceph mgr module enable dashboard --force
ceph config set mgr mgr/dashboard/ssl false
ceph config set mgr mgr/dashboard/server_addr 0.0.0.0
ceph config set mgr mgr/dashboard/server_port 8000
ceph mgr module disable dashboard
ceph mgr module enable dashboard --force
ceph mgr services
echo "12345678" > dashboard_passwd.txt
ceph dashboard set-login-credentials admin -i dashboard_passwd.txt
访问 dashboard:
http://192.168.80.11:8000
账号密码为 admin/12345678
Ceph 资源池 Pool 管理
在 Ceph 集群中,资源池(Pool)是存储 Object 对象的逻辑分区。Pool 由多个 PG(Placement Group)组成,PG 通过 CRUSH 算法映射到不同的 OSD(Object Storage Daemon)上。Pool 可以设置副本大小,默认副本数量为 3。
创建资源池
cd /etc/ceph
ceph osd pool create mypool 64 64 # 创建名为 mypool 的 Pool,PGs 和 PGP 数量设置为 64
查看 Pool 信息
ceph osd pool ls # 列出所有 Pool
rados lspools # 列出所有 Pool
ceph osd lspools # 列出所有 Pool
查看资源池副本数量
ceph osd pool get mypool size # 查看 mypool 的副本数量
查看 PG 和 PGP 数量
ceph osd pool get mypool pg_num # 查看 mypool 的 PG 数量
ceph osd pool get mypool pgp_num # 查看 mypool 的 PGP 数量
修改 PG 和 PGP 数量
ceph osd pool set mypool pg_num 128 # 修改 mypool 的 PG 数量为 128
ceph osd pool set mypool pgp_num 128 # 修改 mypool 的 PGP 数量为 128
ceph osd pool get mypool pg_num # 确认修改
ceph osd pool get mypool pgp_num # 确认修改
修改 Pool 副本数量
ceph osd pool set mypool size 2 # 修改 mypool 的副本数量为 2
ceph osd pool get mypool size # 确认修改
修改默认副本数
vim ceph.conf # 编辑 ceph.conf 文件
......
osd_pool_default_size = 2 # 设置默认副本数为 2
ceph-deploy --overwrite-conf config push node01 node02 node03 # 推送配置文件给所有节点
删除 Pool 资源池
1) 编辑 ceph.conf 文件,开启删除 Pool 的支持
vim ceph.conf
......
[mon]
mon_allow_pool_delete = true # 开启删除 Pool 的支持
2) 推送 ceph.conf 配置文件给所有 mon 节点
ceph-deploy --overwrite-conf config push node01 node02 node03
3) 重启所有 mon 节点的 ceph-mon 服务
systemctl restart ceph-mon.target # 重启 mon 服务
4) 执行删除 Pool 命令
ceph osd pool rm mypool mypool --yes-i-really-really-mean-it # 删除名为 mypool 的 Pool
注意
- 修改 PG 和 PGP 数量会影响数据的分布和性能,需谨慎操作。
- 删除 Pool 会导致数据丢失,务必确认无误后再执行删除操作。
- 修改默认副本数会影响后续创建的 Pool,需全局考虑。