Ceph分布式文件系统

1.数据存储的三大类型

(1)块存储

块存储:存储设备和客户端主机是一对一的关系,块存储设备只能宝贝一个主机挂载使用,数据以块为单位进行存储的。
典型代表:硬盘

(2)文件存储

文件存储:一对多的关系,能被多个主机同时挂载使用,数据以文件的形式存储的,其中文件的元数据和实际数据是分开存储的,并且有目录的层级关系。
典型代表:NFS、CIFS

(3)对象存储

对象存储:一对多的关系,能被多个主机或应用服务同时通过API接口访问使用,数据以文件的形式存储,一个文件即是一个对象(object),文件的元数据和实际数据是存在一起的。文件是扁平化方式存储的,且没有目录的层级关系。
典型代表:MinIO、OSS(阿里云)、S3(AWS亚马逊云)、OBS(华为云)

2.Ceph概述

是用C++开发的一款开源的分布式存储系统
存储机制:把数据分片成对象,分散存储到多个节点中
特点:具有高可扩展性、高性能、高可靠性,还集块存储、文件存储、对象存储功能于一身

(1)Ceph架构(从下往上)

RADOS对象存储系统(统一存储池):提供存储能力的。Ceph中的一切都是以对象形式存储的,RADOS就是负责存储这些对象的,并保证数据的一致性和可靠性。

(2)LibRADOS对象访问接口

提供访问存储接口给客户端使用。支持用户使用C、C++、java、python等编程语言二次开发自定义的访问接口。
Ceph默认提供三个接口:RBD块存储接口、RGW对象存储接口、CephFS文件存储接口。
客户端(物理机/虚拟机/容器/应用APP):通过接口在Ceph进行数据读写的终端。

(3)Ceph组件

1)OSD(ceph-osd)
负责存储数据和管理数据,一般一个磁盘对于一个OSD;还负责响应客户端的读写请求

2)Monitor(ceph-mon)
负责保存OSD的元数据,维持Ceph集群状态的各种映射视图Map(用于监控全局状态的),还负责管理客户端的认证和授权

3)Manager(ceph-mgr)
负责跟踪Ceph集群性能状态和监控指标,暴露接口给监控系统获取监控指标数据

4)MDS(ceph-mds)
负责保存CephFS文件存储系统的元数据,管理目录接口,仅在使用CephFS文件存储接口功能的时候需要安装

5)PG(归置组)
可理解成保存OSD位置的索引,一个PG可以包含多个数据对象(object),一个数据对象只能属于一个PG

6)Pool(资源池/存储池)
可理解成存放PG的namespace命名空间,一个Pool可包含多个PG,同一个Pool里的PG不能同名,不同Pool里的PG可以同名

7)OSD存储引擎
默认使用BlueStore,将数据对象直接存储在块设备上,相较于FileStore(存储在文件系统上的)具有更好的数据读写性能和可靠性

3.Ceph的存储过程

1)文件会默认以4M大小进行分片成一个或多个数据对象(object)
2)每个数据对象都有一个oid(由文件ID(ino)和分片编号(non)组成),通过对oid使用hash算法得到一个16进制的数值,再除以Pool里的PG总数取余,获取到数据对象的pgid
3)通过对pgid使用crush算法获取到PG所映射的OSD的ID,如果是多副本,则会有多个OSD的ID(PG和OSD的映射关系是在创建Pool的时候就确定好了的)
4)将数据对象存储到PG所映射的OSD里

4.基于 ceph-deploy 部署 Ceph 集群




(1)环境准备

1、存储集群全采用万兆网络
2、集群网络(cluster-network,用于集群内部通讯)与公共网络(public-network,用于外部访问Ceph集群)分离

3、mon、mds 与 osd 分离部署在不同主机上(测试环境中可以让一台主机节点运行多个组件)
4、OSD 使用 SATA 亦可
5、根据容量规划集群
6、至强E5 2620 V3或以上 CPU,64GB或更高内存
7、集群主机分散部署,避免机柜的电源或者网络故障

(1)Ceph 环境规划

主机名		 Public网络		    Cluster网络	    	              角色
admin	   20.0.0.130	    admin(管理节点负责集群整体部署)      client

node01     20.0.0.140         20.0.0.140                     mon、mgr、osd(/dev/sdb、/dev/sdc、/dev/sdd)

node02	   20.0.0.150        20.0.0.150                      mon、mgr、osd(/dev/sdb、/dev/sdc、/dev/sdd)

node03	   20.0.0.160	     20.0.0.160                      mon、osd(/dev/sdb、/dev/sdc、/dev/sdd)

client	   20.0.0.100									     client

(2)关闭 selinux 与防火墙

systemctl disable --now firewalld
setenforce 0
ed -i 's/enforcing/disabled/' /etc/selinux/config
vim /etc/selinux/config
     disabled

(3)根据规划设置主机名

hostnamectl set-hostname admin
hostnamectl set-hostname node01
hostnamectl set-hostname node02
hostnamectl set-hostname node03
hostnamectl set-hostname client

bash

(4)配置 hosts 解析

cat >> /etc/hosts << EOF
20.0.0.130 admin
20.0.0.140 node01
20.0.0.150 node02
20.0.0.160 node03
20.0.0.100 client
EOF

cat /etc/hosts

(5)安装常用软件和依赖包

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

(6)在 admin 管理节点配置 ssh 免密登录所有节点

//20.0.0.130
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
ls ~/.ssh

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

(7)配置时间同步

systemctl enable --now chronyd
systemctl status chronyd
vim /etc/chroxy.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

(8)配置 Ceph yum源

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

(9)执行完上面所有的操作之后重启所有主机(可选)

sync
reboot

(2)部署 Ceph 集群

(1)为所有节点都创建一个 Ceph 工作目录,后续的工作都在该目录下进行

mkdir -p /etc/ceph

(2)安装 ceph-deploy 部署工具

//admin 20.0.0.130
cd /etc/ceph
yum install -y ceph-deploy

ceph-deploy --versio

(3)在管理节点为其它节点安装 Ceph 软件包

#采用手动安装 Ceph 包方式,在其它节点上执行下面的命令将 Ceph 的安装包都部署上
sed -i 's#download.ceph.com#mirrors.tuna.tsinghua.edu.cn/ceph#' /etc/yum.repos.d/ceph.repo

cd /etc/yum.repos.d/
ls

//admin    20.0.0.130
//node01   20.0.0.140
//node02   20.0.0.150
//node03   20.0.0.160

yum install -y ceph-mon ceph-radosgw ceph-mds ceph-mgr ceph-osd ceph-common ceph

(4)生成初始配置

#在管理节点运行下述命令,告诉 ceph-deploy 哪些是 mon 监控节点
//admin    20.0.0.130
//node01   20.0.0.140
//node02   20.0.0.150
//node03   20.0.0.160

添加网络适配器
ifconfig

cd /etc/sysconfig/network-scripts/
ls
cp ifcfg-ens33 ifcfg-ens36
ls
vim ifcfg-ens36
#UUID删除
ens36
IPADDR=20.0.100.10
NETMASK
下面删除

systemctl restart network
ifconfig

cd /etc/ceph
ls


//admin    20.0.0.130
ceph-deploy new --public-network 20.0.0.0/24 --cluster-network 20.0.100.0/24 node01 node02 node03

#命令执行成功后会在 /etc/ceph 下生成配置文件
ls /etc/ceph
ceph.conf					#ceph的配置文件
ceph-deploy-ceph.log		#monitor的日志
ceph.mon.keyring			#monitor的密钥环文件

(5)在管理节点初始化 mon 节点

//admin    20.0.0.130
ceph-deploy mon create node01 node02 node03			
#创建 mon 节点,由于 monitor 使用 Paxos 算法,其高可用集群节点数量要求为大于等于 3 的奇数台

ceph-deploy --overwrite-conf mon create-initial		
#配置初始化 mon 节点,并向所有节点同步配置
# --overwrite-conf 参数用于表示强制覆盖配置文件

ps aux | grep ceph  #在 mon 节点上查看自动开启的 mon 进程
ceph -s   #在管理节点查看 Ceph 集群状态

(6)部署能够管理 Ceph 集群的节点(可选)

#可实现在各个节点执行 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 集群认证文件拷贝到各个节点

ceph -s

(7)部署 osd 存储节点

#主机添加完硬盘后不要分区,直接使用
//node01   20.0.0.140
//node02   20.0.0.150
//node03   20.0.0.160
添加新硬盘

在线刷新识别
echo "- - -" > /sys/class/scsi_host/host0/scan
echo "- - -" > /sys/class/scsi_host/host1/scan
echo "- - -" > /sys/class/scsi_host/host2/scan

lsblk

#添加 osd 节点
//20.0.0.130
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

#扩容 osd 节点
cd /etc/ceph
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

ceph osd status    #查看 osd 状态,需部署 mgr 后才能执行
ceph osd df    #查看 osd 容量,需部署 mgr 后才能执行

(8)部署 mgr 节点

//20.0.0.130
#ceph-mgr守护进程以Active/Standby模式运行,可确保在Active节点或其ceph-mgr守护进程故障时,其中的一个Standby实例可以在不中断服务的情况下接管其任务。根据官方的架构原则,mgr至少要有两个节点来进行工作。
cd /etc/ceph
ceph-deploy mgr create node01 node02
ceph -s

#禁用不安全模式
ceph config set mon auth_allow_insecure_global_id_reclaim false

(9)开启监控模块

//node01   20.0.0.140
#在 ceph-mgr Active节点执行命令开启
yum install -y ceph-mgr-dashboard

ceph mgr module enable dashboard --force    #开启 dashboard 模块
ls
ceph config set mgr mgr/dashboard/ssl false   #禁用 dashboard 的 ssl 功能

#配置 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

浏览器访问:http://20.0.0.140:8000 ,账号密码为 admin/12345678

5.资源池 Pool 管理

(1)一个Pool应该包含多少PG数?

OSD总数   
小于 5 个,官方推荐 PG数 为 128
5 ~ 10 个,官方推荐 PG数 为 512
10 ~ 50 个,官方推荐 PG数 为 1024
大于 50 个,参考公式 PG数=( Target PGs per OSD ) x ( OSD # ) x ( %Data )  /  ( Size )

Target PGs per OSD :表示每个OSD对应的PG数(如近期不扩容OSD数量可设置为100,如近期要扩容OSD数量可设置为200)
OSD # :表示当前OSD总数
%Data :当前Pool预计会占用Ceph总存储空间的百分比
Size :当前Pool的副本数
				  
举例:现有新建的Ceph集群,OSD不扩容,共60个OSD,Pool占用总空间50%,3个副本: 100 x 60 x 50% / 3 = 1000 -> 取最接近2的次方值 1024

(2)Pool管理操作

ceph osd pool create Pool名 PG数 [PGP数]                      #创建Pool
ceph osd pool ls        ceph osd lspools                      #查看Pool列表
ceph osd pool get Pool名 size|pg_num|pgp_num                  #查看Pool的副本数|PG数|PGP数
ceph osd pool set Pool名 size|pg_num|pgp_num  数量            #修改Pool的副本数|PG数|PGP数
ceph osd pool rm Pool名 Pool名 --yes-i-really-really-mean-it  #删除Pool,需要先修改ceph配置文件,添加mon配置 mon_allow_pool_delete = true

(3)CephFS操作

(1)服务端

ceph-deploy mds create 节点列表                           #创建MDS
ceph osd pool create 元数据Pool名 PG数据                  #创建元数据Pool
ceph osd pool create 数据Pool名 PG数据                    #创建数据Pool
ceph fs new  CephFS名  元数据Pool名  数据Pool名           #创建CephFS
ceph fs authorize  CephFS名  client.用户名  文件系统路径  rw|r  | tee /etc/ceph/XXX.keyring     #给用户授权在指定的文件系统路径中的读写权限

(2)客户端

mount -t ceph  节点列表:6789:文件系统路径   本地挂载点目录  -o name=用户名,secret=密钥信息|secretfile=密钥文件

ceph-fuse -m 节点列表:6789  本地挂载点目录

(4)RBD操作

(1)服务端

ceph osd pool create RBD-Pool名  PG数据                   #创建RBD存储用的Pool
ceph osd pool application enable RBD-Pool名 rbd           #将Pool转换为RBD模式
rbd pool init -p  RBD-Pool名                              #RBD初始化
rbd create -p RBD-Pool名 --image 镜像名 --size 镜像大小   #创建RBD镜像
rbd create  RBD-Pool名/镜像名  --size 镜像大小
rbd ls -l -p RBD-Pool名                                   #查看Pool中的镜像列表
rbd info  -p RBD-Pool名 --image 镜像名                    #查看镜像的详细信息
rbd rm|remove  -p RBD-Pool名 --image 镜像名               #直接删除镜像
rbd trash move  -p RBD-Pool名 --image 镜像名              #临时删除镜像
rbd trash list -p RBD-Pool名                              #查看被临时删除的镜像列表和镜像恢复ID
rbd trash restore  RBD-Pool名/镜像恢复ID                  #恢复被临时删除的镜像

ceph auth get-or-create client.用户名 osd "allow * pool=RBD-Pool名" mon "allow r" > ceph.client.用户名.keyring      #给用户授权访问RBD-Pool

rbd feature disable RBD-Pool名/镜像名 object-map,fast-diff,deep-flatten                                             #关闭不支持的RBD镜像特性

rbd resize  RBD-Pool名/镜像名 --size 镜像大小             #扩容镜像大小

(2)客户端

rbd map RBD-Pool名/镜像名 --keyring ceph.client.用户名.keyring --user 用户名         
#在客户端映射RBD镜像

rbd showmapped      rbd device list         #查看映射信息
mkfs -t xfs /dev/rbd0               #格式化并挂载使用
mount /dev/rbd0  本地挂载点目录

xfs_growfs  /dev/rbd0          #刷新扩容后的容量

umount /dev/rbd0          #解挂并断开映射
rbd unmap  RBD-Pool名/镜像名

(5)RBD快照操作

rbd snap create -p RBD-Pool名 --image 镜像名 --snap 快照名     #创建镜像的快照
rbd snap create  RBD-Pool名/镜像名@快照名
rbd snap list  RBD-Pool名/镜像名       #查看镜像的快照列表
rbd snap rollback  RBD-Pool名/镜像名@快照名      #根据快照回滚镜像
rbd snap rm  RBD-Pool名/镜像名@快照名            #删除镜像的一个快照
rbd snap purge  RBD-Pool名/镜像名               #清空镜像的索引快照
rbd snap protect RBD-Pool名/镜像名@快照名        #设置快照为保护模式
rbd snap unprotect RBD-Pool名/镜像名@快照名      #关闭快照的保护模式

rbd clone RBD-Pool名/镜像名@快照名 --dest RBD-Pool名/子镜像名  #根据快照克隆子镜像
rbd flatten  RBD-Pool名/子镜像名         #将子镜像展平

rbd export  RBD-Pool名/镜像名  镜像文件路径       #将镜像导出成文件
rbd import  镜像文件路径  RBD-Pool名/镜像名       #将文件导入成镜像

(6)RGW操作

(1)服务端

ceph-deploy rgw create 节点列表                                         
#创建RGW接口,还可以修改ceph配置文件,设置RGW监听的端口号(默认端口为7480)

radosgw-admin user create --uid="用户名" --display-name="备注信息"      
#创建RGW账户,获取access_key和secret_key

(1)客户端

1)准备好客户端应用程序
2)使用RGW账户的access_key和secret_key做验证访问RGW对象存储接口
3)在对象存储里创建bucket存储桶
4)在bucket存储桶里创建对象object,上传数据

posted @ 2024-07-18 00:22  无敌小鲁班  阅读(33)  评论(0编辑  收藏  举报