Bootstrap

【企业级分布式系统】Ceph集群

存储基础

单机存储设备

  1. DAS(直接附加存储)
    • 定义:直接接到计算机的主板总线上去的存储。
    • 接口:IDE、SATA、SCSI、SAS、USB。
    • 特性:提供块级别的存储,即存储设备直接以块的形式向主机提供存储空间。
  2. NAS(网络附加存储)
    • 定义:通过网络附加到当前主机文件系统之上的存储。
    • 协议:NFS、CIFS、FTP。
    • 特性:文件系统级别的存储,客户端通过网络将远程存储上的文件系统挂载到本地,像使用本地文件系统一样使用远程存储。无法对NAS存储进行再次格式化创建新的文件系统。
  3. SAN(存储区域网络)
    • 定义:一种网络存储,通过专用网络将存储设备与服务器连接起来。
    • 协议与物理层:SCSI协议(仅用于数据传输)、FCSAN(物理层使用光纤)、iSCSI(物理层使用以太网)。
    • 特性:提供块级别的存储,客户端可以直接访问存储设备的块空间。

单机存储的问题

  1. 存储处理能力不足:传统磁盘的IO能力有限,无法满足大规模用户同时访问的需求。
  2. 存储空间能力不足:单块磁盘的容量有限,无法满足大规模数据存储的需求。
  3. 单点故障问题:单机存储存在单点故障风险,一旦存储设备故障,可能导致数据丢失。

商业存储解决方案

  • 品牌:EMC、NetAPP、IBM、DELL、华为、浪潮等。
  • 特点:提供高性能、高可用性的存储解决方案,通常具有冗余和备份机制,以降低单点故障风险。

分布式存储(SDS,软件定义的存储)

  • 定义:通过软件来定义和管理存储资源,实现存储资源的高扩展性、高性能和高可用性。
  • 常见系统:Ceph、TFS、FastDFS、MooseFS(MFS)、HDFS、GlusterFS(GFS)等。

分布式存储的类型

  1. 块存储
    • 定义:提供没有被组织过的存储空间,通常以裸设备的形式存在。
    • 适用场景:容器或虚拟机存储卷分配、日志存储、文件存储等。
    • 特性:底层以分块的方式来存储数据,每个块是一个独立的存储单元。
  2. 文件存储
    • 定义:建立在块存储结构之上,以文件形式来存储数据。
    • 适用场景:目录结构的存储、日志存储等。
    • 特性:文件的元数据和实际数据是分开存储的,可以通过网络被多个服务器同时挂载和使用。
  3. 对象存储
    • 定义:基于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。

  1. FileStore
    • FileStore是Ceph中存储对象的一个遗留方法,它依赖于标准文件系统(如XFS)和一个键/值数据库(传统上是LevelDB,BlueStore引入后则为RocksDB的变种)来保存和管理元数据。
    • FileStore经过了良好的测试,在生产中得到了广泛应用,但由于其总体设计和对传统文件系统的依赖,性能上存在一些不足。
  2. BlueStore
    • 从Ceph 12.2.0(Luminous)版本开始,BlueStore被引入作为一种新的、高性能的OSD存储引擎,以替代旧的FileStore引擎。
    • BlueStore将对象直接存储在原始块设备上,免除了对文件系统层的需要,提高了读写操作速度。它直接操作底层块设备来管理数据,而不是通过传统的文件系统。
    • BlueStore提供了更快的响应时间和更高的数据吞吐量,同时具有更好的可靠性和稳定性。它可以直接与Solid State Drive(SSD)交互,并利用其快速读写速度。
    • BlueStore还具有可扩展性,可以处理数百万个物理盘和千亿个对象。它实现了动态负载平衡和自动恢复机制,以确保高可用性和数据可靠性。

Ceph数据存储过程

  1. 客户端从MON(Monitor)节点获取最新的Cluster Map,该地图包含了集群中所有OSD、MON和PG的状态信息。
  2. Ceph存储的数据会被切分成一到多个固定大小的对象(Object),对象大小可以由管理员调整,通常为2M或4M。每个对象都会有一个唯一的OID(Object ID),由ino(文件的FileID,用于在全局唯一标识每一个文件)和ono(分片的编号)组成。
  3. 通过对OID使用HASH算法,得到一个16进制的特征码。用该特征码与Pool中的PG总数取余,得到的序号则是PGID(Placement Group ID)。
  4. 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集群部署

  1. ceph-deploy
    • 一个集群自动化部署工具,使用较久且成熟稳定。
    • 被很多自动化工具所集成,可用于生产部署。
  2. cephadm
    • 从Octopus和较新的版本后开始使用cephadm来部署ceph集群。
    • 使用容器和systemd安装和管理Ceph集群。
    • 目前在某些场景下可能不建议用于生产环境(但这一情况可能随时间变化,请查阅最新文档或社区建议)。
  3. 二进制手动部署
    • 需要一步步手动部署Ceph集群,支持较多定制化和了解部署细节。
    • 安装难度较大,适合对Ceph有深入了解的用户。

基于 ceph-deploy 部署 Ceph 集群

Ceph 生产环境推荐配置

  1. 存储集群全采用万兆网络
  2. 集群网络与公共网络分离
    • 集群网络(cluster-network):用于集群内部通讯
    • 公共网络(public-network):用于外部访问Ceph集群
  3. mon、mds 与 osd 分离部署在不同主机上
    • 测试环境中可以让一台主机节点运行多个组件
  4. OSD 可使用 SATA 磁盘
  5. 根据容量规划集群
  6. 硬件要求
    • CPU:至强E5 2620 V3或以上
    • 内存:64GB或更高
  7. 集群主机分散部署
    • 避免机柜的电源或网络故障

Ceph 环境规划

主机名Public网络Cluster网络角色
admin192.168.80.10admin(管理节点)、client
node01192.168.80.11192.168.100.11mon、mgr、osd(/dev/sdb、/dev/sdc、/dev/sdd)
node02192.168.80.12192.168.100.12mon、mgr、osd(/dev/sdb、/dev/sdc、/dev/sdd)
node03192.168.80.13192.168.100.13mon、osd(/dev/sdb、/dev/sdc、/dev/sdd)
client192.168.80.14client

环境准备

  1. 创建 Ceph 的管理用户
    创建一个专门用于管理 Ceph 的用户,并赋予其 root 权限。
    useradd cephadm
    passwd cephadm
    visudo
    cephadm ALL=(root) NOPASSWD:ALL
    
  2. 关闭 selinux 与防火墙
    实验环境中确保 Ceph 集群的网络通信不受限制。
    systemctl disable --now firewalld
    setenforce 0
    sed -i 's/enforcing/disabled/' /etc/selinux/config
    
  3. 根据规划设置主机名
    hostnamectl set-hostname admin
    hostnamectl set-hostname node01
    hostnamectl set-hostname node02
    hostnamectl set-hostname node03
    hostnamectl set-hostname client
    
  4. 配置 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
  1. 在 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
    
  2. 配置时间同步
    确保集群内各节点的时间一致,避免因时间不同步导致的问题。
    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
    
  3. 配置 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
    
  4. 执行完上面所有的操作之后重启所有主机(可选)
    确保所有配置生效,重启后集群可以正常运行。
    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,需全局考虑。
;