端口号
NFS 2049
rpcbind 111
NFS 目录越深,写入性能越差
操作简单,
【1】DAS(直接附加存储,是直接接到计算机的主板总线上去的存储)
IDE、SATA、SCSI、SAS、USB 接口的磁盘
所谓接口就是一种存储设备驱动下的磁盘设备,提供块级别的存储
【2】NAS(网络附加存储,是通过网络附加到当前主机文件系统之上的存储)
NFS、CIFS、FTP
文件系统级别的存储,本身就是一个做好的文件系统,通过nfs接口在用户空间输出后,客户端基
于内核模块与远程主机进行网络通信,把它转为好像本地文件系统一样来使用,这种存储服务是没
办法对它再一次格式化创建文件系统块的
【3】SAN(存储区域网络)
SCSI协议(只是用来传输数据的存取操作,物理层使用SCSI线缆来传输)、FCSAN(物理层使用
光纤来传输)、iSCSI(物理层使用以太网来传输)
也是一种网络存储,但不同之处在于SAN提供给客户端主机使用的接口是块级别的存储
(1)存储处理能力不足
传统的IDE的IO值是100次/秒,SATA固态磁盘500次/秒,固态硬盘达到2000-4000次/秒。即使磁
盘的IO能力再大数十倍,也不够抗住网站访问高峰期数十万、数百万甚至上亿用户的同时访问,这
同时还要受到主机网络IO能力的限制。
(2)存储空间能力不足
单块磁盘的容量再大,也无法满足用户的正常访问所需的数据容量限制。
(3)单点故障问题
单机存储数据存在单点故障问题
EMC、NetAPP、IBM、DELL、华为、浪潮
Ceph、TFS、FastDFS、MooseFS(MFS)、HDFS、GlusterFS(GFS)
存储机制会把数据分散存储到多个节点上,具有高扩展性、高性能、高可用性等优点。
(1)分布式存储的类型
【1】块存储(例如硬盘,一般是一个存储被一个服务器挂载使用,适用于容器或虚拟机存储卷分
配、日志存储、文件存储)
就是一个裸设备,用于提供没有被组织过的存储空间,底层以分块的方式来存储数据
【2】文件存储(例如NFS,解决块存储无法共享问题,可以一个存储被多个服务器同时挂载,适
用于目录结构的存储、日志存储)
是一种数据的组织存放接口,一般是建立在块级别的存储结构之上,以文件形式来存储数据,而文
件的元数据和实际数据是分开存储的
【3】对象存储(例如OSS,一个存储可以被多服务同时访问,具备块存储的高速读写能力,也具
备文件存储共享的特性,适用图片存储、视频存储)
基于API接口提供的文件存储,每一个文件都是一个对象,且文件大小各不相同的,文件的元数据
和实际数据是存放在一起的
Ceph使用C++语言开发,是一个开放、自我修复和自我管理的开源分布式存储系统。具有高扩展
性、高性能、高可靠性的优点。
Ceph目前已得到众多云计算厂商的支持并被广泛应用。RedHat及OpenStack,Kubernetes都可与
Ceph整合以支持虚拟机镜像的后端存储。
粗略估计,我国70%—80%的云平台都将Ceph作为底层的存储平台,由此可见Ceph俨然成为了开
源云平台的标配。目前国内使用Ceph搭建分布式存储系统较为成功的企业有华为、阿里、中兴、
华三、浪潮、中国移动、网易、乐视、360、星辰天合存储、杉岩数据等。
(1)高扩展性:去中心化,支持使用普通X86服务器,支持上千个存储节点的规模,支持TB到EB
级的扩展。
(2)高可靠性:没有单点故障,多数据副本,自动管理,自动修复。
(3)高性能:摒弃了传统的集中式存储元数据寻址的方案,采用 CRUSH 算法,数据分布均衡,
并行度高。
(4)功能强大:Ceph是个大一统的存储系统,集块存储接口(RBD)、文件存储接口
(CephFS)、对象存储接口(RadosGW)于一身,因而适用于不同的应用场景。
自下向上,可以将Ceph系统分为四个层次:
(1)RADOS 基础存储系统(Reliab1e,Autonomic,Distributed object store,即可靠的、自动
化的、分布式的对象存储)
RADOS是Ceph最底层的功能模块,是一个无限可扩容的对象存储服务,能将文件拆解成无数个对
象(碎片)存放在硬盘中,大大提高了数据的稳定性。它主要由OSD和Monitor两个组件组成,
OSD和Monitor都可以部署在多台服务器中,这就是ceph分布式的由来,高扩展性的由来。
(2)LIBRADOS 基础库
Librados提供了与RADOS进行交互的方式,并向上层应用提供Ceph服务的API接口,因此上层的
RBD、RGW和CephFS都是通过Librados访问的,目前提供PHP、Ruby、Java、Python、Go、C
和C++支持,以便直接基于RADOS(而不是整个Ceph)进行客户端应用开发。
(3)高层应用接口:包括了三个部分
【1】对象存储接口 RGW(RADOS Gateway)
网关接口,基于Librados开发的对象存储系统,提供S3和Swift兼容的RESTful API接口。
【2】块存储接口 RBD(Reliable Block Device)
基于Librados提供块设备接口,主要用于Host/VM。
【3】文件存储接口 CephFS(Ceph File System)
Ceph文件系统,提供了一个符合POSIX标准的文件系统,它使用Ceph存储集群在文件系统上存储
用户数据。基于Librados提供的分布式文件系统接口。
(4)应用层:基于高层接口或者基础库Librados开发出来的各种APP,或者Host、VM等诸多客户
端;
Ceph是一个对象式存储系统,它把每一个待管理的数据流(如文件等数据)切分为一到多个固定
大小(默认4兆)的对象数据(Object),并以其为原子单元(原子是构成元素的最小单元)完成
数据的读写。
(1)OSD(Object Storage Daemon,守护进程 ceph-osd)
是负责物理存储的进程,一般配置成和磁盘一一对应,一块磁盘启动一个OSD进程。主要功能是
存储数据、复制数据、平衡数据、恢复数据,以及与其它OSD间进行心跳检查,负责响应客户端
请求返回具体数据的进程等。通常至少需要3个OSD来实现冗余和高可用性。
(2)PG(Placement Group 归置组)
PG 是一个虚拟的概念而已,物理上不真实存在。它在数据寻址时类似于数据库中的索引:Ceph
先将每个对象数据通过HASH算法固定映射到一个 PG 中,然后将 PG 通过 CRUSH 算法映射到
OSD。
(3)Pool
Pool 是存储对象的逻辑分区,它起到 namespace 的作用。每个 Pool 包含一定数量(可配置)的
PG。Pool 可以做故障隔离域,根据不同的用户场景统一进行隔离。
(4)Pool中数据保存方式支持两种类型:
【1】多副本(replicated):类似 raid1,一个对象数据默认保存 3 个副本,放在不同的 OSD
【2】纠删码(Erasure Code):类似 raid5,对 CPU 消耗稍大,但是节约磁盘空间,对象数据保
存只有 1 个副本。由于Ceph部分功能不支持纠删码池,此类型存储池使用不多
(5)Pool、PG 和 OSD 的关系:
一个Pool里有很多个PG;一个PG里包含一堆对象,一个对象只能属于一个PG;PG有主从之分,
一个PG分布在不同的OSD上(针对多副本类型)
【1】Monitor(守护进程 ceph-mon)
用来保存OSD的元数据。负责维护集群状态的映射视图(Cluster Map:OSD Map、Monitor
Map、PG Map 和 CRUSH Map),维护展示集群状态的各种图表, 管理集群客户端认证与授
权。一个Ceph集群通常至少需要 3 或 5 个(奇数个)Monitor 节点才能实现冗余和高可用性,它
们通过 Paxos 协议实现节点间的同步数据。
【2】Manager(守护进程 ceph-mgr)
负责跟踪运行时指标和 Ceph 集群的当前状态,包括存储利用率、当前性能指标和系统负载。为外
部监视和管理系统提供额外的监视和接口,例如 zabbix、prometheus、 cephmetrics 等。一个
Ceph 集群通常至少需要 2 个 mgr 节点实现高可用性,基于 raft 协议实现节点间的信息同步。
【3】MDS(Metadata Server,守护进程 ceph-mds)
是 CephFS 服务依赖的元数据服务。负责保存文件系统的元数据,管理目录结构。对象存储和块
设备存储不需要元数据服务;如果不使用 CephFS 可以不安装。
OSD 有两种方式管理它们存储的数据。在 Luminous 12.2.z 及以后的发行版中,默认(也是推荐
的)后端是 BlueStore。在 Luminous 发布之前, 默认是 FileStore, 也是唯一的选项。
(1)Filestore
FileStore是在Ceph中存储对象的一个遗留方法。它依赖于一个标准文件系统(只能是XFS),并结
合一个键/值数据库(传统上是LevelDB,现在BlueStore是RocksDB),用于保存和管理元数据。
FileStore经过了良好的测试,在生产中得到了广泛的应用。然而,由于它的总体设计和对传统文件
系统的依赖,使得它在性能上存在许多不足。
(2)Bluestore
从 Ceph 12.2.0(Luminous) 版本开始的。在 Luminous 版本中,BlueStore 被引入作为一种新
的、高性能的 OSD 存储引擎,以替代旧的 FileStore 引擎。
在 Ceph 中,BlueStore 可以提供更快的响应时间和更高的数据吞吐量,同时也具有更好的可靠性
和稳定性。相比之下,旧的 FileStore 存储引擎通常需要更多的 CPU 和内存资源,对 IO 延迟的敏
感度也较高。
FileStore 将对象存储为块设备基础上的文件系统(通常是 XFS)中的文件。
BlueStore 将对象直接存储在原始块设备上,免除了对文件系统层的需要,提高了读写操作速度,
通过直接操作底层块设备来管理数据,而不是传统的文件系统。
这种方法提供了更好的性能和可靠性,因为可以将数据划分为较小的块并使用校验和来检测错误。
此外,BlueStore可以直接与Solid State Drive(SSD)交互,并利用其快速读写速度。
BlueStore还具有可扩展性,可以处理数百万个物理盘和千亿个对象。它实现了动态负载平衡和自
动恢复机制,以确保高可用性和数据可靠性。
(1)客户端从 mon 获取最新的 Cluster Map
(2)在 Ceph 中,一切皆对象。Ceph 存储的数据都会被切分成为一到多个固定大小的对象
(Object)。Object size 大小可以由管理员调整,通常为 2M 或 4M。
每个对象都会有一个唯一的 OID,由 ino 与 ono 组成:
比如:一个文件 FileID 为 A,它被切成了两个对象,一个对象编号0,另一个编号1,那么这两个
文件的 oid 则为 A0 与 A1。
OID 的好处是可以唯一标示每个不同的对象,并且存储了对象与文件的从属关系。由于 Ceph 的所
有数据都虚拟成了整齐划一的对象,所以在读写时效率都会比较高。
(3)通过对 OID 使用 HASH 算法得到一个16进制的特征码,用特征码与 Pool 中的 PG 总数取
余,得到的序号则是 PGID 。
即 Pool_ID + HASH(OID) % PG_NUM 得到 PGID
(4)PG 会根据设置的副本数量进行复制,通过对 PGID 使用 CRUSH 算法算出 PG 中目标主和
次 OSD 的 ID,存储到不同的 OSD 节点上(其实是把 PG 中的所有对象存储到 OSD 上)。
即通过 CRUSH(PGID) 得到将 PG 中的数据存储到各个 OSD 组中
CRUSH 是 Ceph 使用的数据分布算法,类似一致性哈希,让数据分配到预期的地方。
(1)Ceph从Nautilus版本(14.2.0)开始,每年都会有一个新的稳定版发行,预计是每年的3月份
发布,每年的新版本都会起一个新的名称(例如,“Mimic”)和一个主版本号(例如,13代表
Mimic,因为“M”是字母表的第13个字母)。
(2)版本号的格式为 x.y.z,x 表示发布周期(例如,13 代表 Mimic,17 代表 Quincy),y 表示
发布版本类型,即
目前 Ceph 官方提供很多种部署 Ceph 集群的方法,常用的分别是 ceph-deploy,cephadm 和 二
进制:
(1)ceph-deploy :一个集群自动化部署工具,使用较久,成熟稳定,被很多自动化工具所集
成,可用于生产部署。
(2)cephadm :从 Octopus 和较新的版本版本后使用 cephadm 来部署 ceph 集群,使用容器和
systemd 安装和管理 Ceph 集群。目前不建议用于生产环境。
(3)二进制:手动部署,一步步部署 Ceph 集群,支持较多定制化和了解部署细节,安装难度较
大。
Ceph 生产环境推荐:
1、存储集群全采用万兆网络
2、集群网络(cluster-network,用于集群内部通讯)与公共网络(public-network,用于外部访问Ceph集群)分离
3、mon、mds 与 osd 分离部署在不同主机上(测试环境中可以让一台主机节点运行多个组件)
4、OSD 使用 SATA 亦可
5、根据容量规划集群
6、至强E5 2620 V3或以上 CPU,64GB或更高内存
7、集群主机分散部署,避免机柜的电源或者网络故障
主机名 Public网络 Cluster网络 角色 admin 192.168.10.10 admin(管理节点负责集群整体部署)、client node01 192.168.10.20 192.168.100.20 mon、mgr、osd(/dev/sdb、/dev/sdc、/dev/sdd) node02 192.168.10.30 192.168.100.30 mon、mgr、osd(/dev/sdb、/dev/sdc、/dev/sdd) node03 192.168.10.40 192.168.100.40 mon、osd(/dev/sdb、/dev/sdc、/dev/sdd) client 192.168.10.50 client
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 bash
cat >> /etc/hosts << EOF 192.168.10.10 admin 192.168.10.20 node01 192.168.10.30 node02 192.168.10.40 node03 192.168.10.50 client EOF cat /etc/hosts #查看信息是否配置上去
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 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
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
rpm -q chrony systemctl enable --now chronyd
vim /etc/chrony.conf server ntp.aliyun.com iburst
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
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
mkdir -p /etc/ceph
cd /etc/ceph yum install -y ceph-deploy ceph-deploy --version
ceph-deploy 2.0.1 默认部署的是 mimic 版的 Ceph,若想安装其他版本的 Ceph,可以用 --release 手动指定版本 cd /etc/ceph ceph-deploy install --release nautilus node0{1..3} admin #ceph-deploy install 本质就是在执行下面的命令: yum clean all yum -y install epel-release yum -y install yum-plugin-priorities yum -y install ceph-release ceph ceph-radosgw
我们执行下面这几条命令
也可采用手动安装 Ceph 包方式,在其它节点上执行下面的命令将 Ceph 的安装包都部署上:(不用再client上安装)
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
(1)关机给admin、node01、node02、node03添加网卡并进行配置;四台机器同样的操作;
cd /etc/sysconfig/network-scripts/ cp ifcfg-ens33 ifcfg-ens36 vim ifcfg-ens36 systemctl restart network
(2)在管理节点运行下述命令,告诉 ceph-deploy 哪些是 mon 监控节点;(只在admin节点)
cd /etc/ceph ceph-deploy new --public-network 192.168.10.0/24 --cluster-network 192.168.100.0/24 node01 node02 node03
命令执行成功后会在 /etc/ceph 下生成配置文件
ceph.conf #ceph的配置文件
ceph-deploy-ceph.log #monitor的日志
ceph.mon.keyring #monitor的密钥环文件
cd /etc/ceph ceph-deploy mon create node01 node02 node03 #创建 mon 节点,由于 monitor 使用 Paxos 算法,其高可用集群节点数量要求为大于等于 3 的奇数台
systemctl status ceph-mon@node01.service (会在其他node节点上启动这个服务) systemctl status ceph-mon@node02.service systemctl status ceph-mon@node03.service
ceph-deploy --overwrite-conf mon create-initial #配置初始化 mon 节点,并向所有节点同步配置 #将admin的ceph.conf同步到其他几个节点上去 #还会在本机生成一些文件 # --overwrite-conf 参数用于表示强制覆盖配置文件
ceph.bootstrap-mds.keyring #引导启动 mds 的密钥文件 ceph.bootstrap-mgr.keyring #引导启动 mgr 的密钥文件 ceph.bootstrap-osd.keyring #引导启动 osd 的密钥文件 ceph.bootstrap-rgw.keyring #引导启动 rgw 的密钥文件 ceph.client.admin.keyring #ceph客户端和管理端通信的认证密钥,拥有ceph集群的所有权限
在 mon 节点上查看自动开启的 mon 进程(node节点) ps aux | grep ceph
在管理节点查看 Ceph 集群状态(admin) cd /etc/ceph ceph -s
查看 mon 集群选举的情况(admin) ceph quorum_status --format json-pretty | grep leader
扩容 mon 节点 ceph-deploy mon add <节点名称>
注意:一般只有在admin节点上才能使用 ceph -s ;因为只有admin节点才有密钥文件;如果想要其他节点,可通过下面的命令
可实现在各个节点执行 ceph 命令管理集群 cd /etc/ceph ceph-deploy --overwrite-conf config push node01 node02 node03 #向所有 mon 节点同步配置,确保所有 mon 节点上的 ceph.conf 内容必须一致;如果一致可省略 ceph-deploy admin node01 node02 node03 #本质就是把 ceph.client.admin.keyring 集群认证文件拷贝到各个节点
使用后,其他node节点会出现密钥文件;之后就可以使用 ceph -s 的命令
(1)先给 node节点添加硬盘;三台node节点相同操作
添加完成后,使用命令刷新
echo "- - -" > /sys/class/scsi_host/host0/scan echo "- - -" > /sys/class/scsi_host/host1/scan echo "- - -" > /sys/class/scsi_host/host2/scan lsblk 查看
(2)如果是利旧的硬盘,则需要先擦净(删除分区表)磁盘(可选,无数据的新硬盘可不做)
cd /etc/ceph ceph-deploy disk zap node01 /dev/sdb ceph-deploy disk zap node02 /dev/sdb ceph-deploy disk zap node03 /dev/sdb
(3)添加 osd 节点(admin节点执行)
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-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
(4)查看 ceph 集群状态
lsblk ceph -s
ceph osd stat 查看osd的进程 ceph osd tree 查看每个osd的状态信息 rados df
ceph osd status #查看 osd 状态,需部署 mgr 后才能执行 ceph osd df #查看 osd 容量,需部署 mgr 后才能执行
ceph-mgr守护进程以Active/Standby模式运行,可确保在Active节点或其ceph-mgr守护进程故障时,其中的一个Standby实例可以在不中断服务的情况下接管其任务。根据官方的架构原则,mgr至少要有两个节点来进行工作
cd /etc/ceph ceph-deploy mgr create node01 node02
之后, 就能 查看 osd 状态和查看 osd 容量
解决 HEALTH_WARN 问题:mons are allowing insecure global_id reclaim问题: 禁用不安全模式: ceph config set mon auth_allow_insecure_global_id_reclaim false
在 ceph-mgr Active节点执行命令开启
ceph -s | grep mgr
yum install -y ceph-mgr-dashboard cd /etc/ceph ceph mgr module ls | grep dashboard
#开启 dashboard 模块 ceph mgr module enable dashboard --force #禁用 dashboard 的 ssl 功能 ceph config set mgr mgr/dashboard/ssl false #配置 dashboard 监听的地址和端口 ceph config set mgr mgr/dashboard/server_addr 0.0.0.0 ceph config set mgr mgr/dashboard/server_port 8000 #重启 dashboard ceph mgr module disable dashboard ceph mgr module enable dashboard --force #确认访问 dashboard 的 url ceph mgr services
#设置 dashboard 账户以及密码 echo "12345678" > dashboard_passwd.txt ceph dashboard set-login-credentials admin -i dashboard_passwd.txt 或 ceph dashboard ac-user-create admin administrator -i dashboard_passwd.txt
浏览器访问:http://192.168.10.20:8000 ,账号密码为 admin/12345678