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,上传数据