ceph存储系统

ceph存储系统

简介

  • ceph被称作面向未来的存储
  • 可以实现的存储方式
    • 块存储:提供像普通硬盘一样的存储,为使用者提供“硬盘”
    • 文件系统存储:类似于NFS的共享方式,为使用者提供共享文件夹
    • 对象存储:像百度云盘一样,需要使用单独的客户端
  • ceph还是一个分布式的存储系统,非常灵活。如果需要扩容,只要向ceph集中增加服务器即可。
  • ceph存储数据时采用多副本的方式进行存储,生产环境下,一个文件至少要存3份。ceph默认也是三副本存储。

ceph的构成

  • Ceph OSD 守护进程: Ceph OSD 用于存储数据。此外,Ceph OSD 利用 Ceph 节点的 CPU、内存和网络来执行数据复制、纠删代码、重新平衡、恢复、监控和报告功能。存储节点有几块硬盘用于存储,该节点就会有几个osd进程。
  • Ceph Mon监控器: Ceph Mon维护 Ceph 存储集群映射的主副本和 Ceph 存储群集的当前状态。监控器需要高度一致性,确保对Ceph 存储集群状态达成一致。维护着展示集群状态的各种图表,包括监视器图、 OSD 图、归置组( PG )图、和 CRUSH 图。
  • MDSs: Ceph 元数据服务器( MDS )为 Ceph 文件系统存储元数据。
  • RGW:对象存储网关。主要为访问ceph的软件提供API接口。

搭建ceph

服务器名称IP简介
client192.168.2.1客户端(同时也是临时的yum仓库和时钟服务器)
node1192.168.2.101管理节点,硬盘/dev/sda系统盘,/dev/sdb 20G,/dev/sdc 20G
node2192.168.2.102节点,硬盘/dev/sda系统盘,/dev/sdb 20G,/dev/sdc 20G
Node3192.168.2.103节点,硬盘/dev/sda系统盘,/dev/sdb 20G,/dev/sdc 20G

注意事项

  1. 防火墙关闭
  2. 控制节点到各个节点的域名解析和免密登录一定要配置好
  3. 时钟一定要同步
  4. 安装的软件可以重复执行命令查看是否成功
  5. 创建OSD的时候一定要根据自己的硬盘名称来创建

配置网络和防火墙

  • client
# 关闭防火墙
systemctl stop firewalld
setenforce 0
sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config

# 搭建yum源
yum install -y vsftpd
systemctl enable vsftpd --now
mkdir -p /var/ftp/{centos,ceph}
echo "/data/iso/ceph10.iso  /var/ftp/ceph  iso9660  defaults 0  0" >> /etc/fstab
echo "/data/iso/centos7.iso  /var/ftp/centos  iso9660  defaults 0  0" >> /etc/fstab
mount -a
  • node1
# 设置服务器名,关闭防火墙,设置网络,清除之前的yum源
hostnamectl set-hostname node1
yum remove -y firewalld
sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config
nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.2.101/24 ipv4.gateway 192.168.2.254 autoconnect yes
nmcli connection up eth0
rm -rf /etc/yum.repos.d/*
yum clean all
  • node2
# 设置服务器名,关闭防火墙,设置网络,清除之前的yum源
hostnamectl set-hostname node2
yum remove -y firewalld
sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config
nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.2.102/24 ipv4.gateway 192.168.2.254 autoconnect yes
nmcli connection up eth0
rm -rf /etc/yum.repos.d/*
yum clean all
  • node3
# 设置服务器名,关闭防火墙,设置网络,清除之前的yum源
hostnamectl set-hostname node3
yum remove -y firewalld
sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config
nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.2.103/24 ipv4.gateway 192.168.2.254 autoconnect yes
nmcli connection up eth0
rm -rf /etc/yum.repos.d/*
yum clean all

配置yum源和域名解析

  • client
# 创建repo
vim local.repo
# 文件内容如下
[base]
name=Centos-$releasever - Base
baseurl=ftp://yum-server/centos/
gpgcheck=0

vim ceph.repo
# 文件内容如下
[osd]
name = ceph osd 
baseurl = ftp://yum-server/ceph/OSD/
enabled = 1
gpgcheck = 0

[mon]
name = ceph mon 
baseurl = ftp://yum-server/ceph/MON/
enabled = 1
gpgcheck = 0

[tools]
name = ceph tools
baseurl = ftp://yum-server/ceph/Tools/
enabled = 1
gpgcheck = 0

# 配置节点的yum和免密登录
echo "192.168.2.1  yum-server" >> /etc/hosts
for i in {1..3}
do
    echo "192.168.2.10${i}  node${i}" >> /etc/hosts
    ssh-copy-id node${i}
    scp local.repo ceph.repo node${i}:/etc/yum.repos.d/
done

# 配置域名解析
for i in node{1..3}
do
    scp /etc/hosts $i:/etc/
done

# 在clietn上安装chrony,ceph必须要求时钟同步,不然后面分区之后会有警告
yum install -y chrony
vim /etc/chrony.conf
# 取消下面两行注释并修改部分内容,26,29两行
allow 192.168.2.0/24
local stratum 10

# 启动服务
systemctl restart chrony

配置节点时钟同步

  • node1(控制节点)
# 配置控制节点到每个节点的免密登录
ssh-keygen  # 一直回车
ssh-copy-id node2
ssh-copy-id node3

# 配置时钟跟client同步
yum install -y chrony
vim /etc/chrony.conf
# 文件中上面几个server都注释,添加一行,效果如下
# server 0.centos.pool.ntp.org iburst
# server 1.centos.pool.ntp.org iburst
# server 2.centos.pool.ntp.org iburst
# server 3.centos.pool.ntp.org iburst
server 192.168.2.1 iburst

systemctl enable chronyd --now  # 启动服务器并开机自启
chronyc sources -v  # 查看 ^* yum-server说明成功

# 配置其他节点的时钟同步
for i in node2 node3
do
    ssh $i yum install -y chrony
    scp /etc/chrony.conf $i:/etc/
    ssh $i systemctl restart chronyd
    ssh $i systemctl enable chronyd
done

# 检查是否成功,出现^* yum-server就说明成功了,因为我这里时钟服务器和yum服务器是用一个服务器,所以显示的是同一个
ssh node2 chronyc sources -v
ssh node3 chronyc sources -v

安装ceph集群

  • node1:通过node1控制节点进行安装
# 本机安装软件
yum install -y ceph-mon ceph-osd ceph-mds ceph-radosgw ceph-deploy
# 远程node1和node2进行软件安装
ssh node2 yum install -y ceph-mon ceph-osd ceph-mds ceph-radosgw
ssh node3 yum install -y ceph-mon ceph-osd ceph-mds ceph-radosgw

# 检查是否安装成功
ceph-deploy --help

# 创建工作目录并进入
mkdir ceph-cluster && cd ceph-cluster

# 创建新的集群,会出现3个文件,ceph.conf集群配置文件,ceph-deploy-ceph.log日志文件,ceph.mon.keyring共享密钥
ceph-deploy new node{1..3}
echo "rbd_default_features = 1" >> ceph.conf  # 开启快照功能
echo "mon clock drift allowed = 2" >> ceph.conf
echo "mon clock drift warn backoff = 30" >> ceph.conf

# 初始化monitor
ceph-deploy mon create-initial

# 查看各节点的ceph-mon
systemctl status ceph-mon*
ssh node2 systemctl status ceph-mon* | grep Active
ssh node3 systemctl status ceph-mon* | grep Active  # 也可以执行这个 ^2^3,是将上一条命令的2换成3

# 查看集群状态,目前因为没有硬盘,所以是HEALTH_ERR
ceph -s | grep health

# 创建OSD,这里自己的实际情况配置,我这里每个节点上都是sdb、sdc,你可以执行lsblk看一下自己的本地环境
ceph-deploy disk zap node1:sd{b,c}
ceph-deploy disk zap node2:sd{b,c}
ceph-deploy disk zap node3:sd{b,c}

# 创建存储空间。这里的名称跟上面一样根据实际情况进行修改,ceph会硬盘分为两个分区,一个分区大小为5GB,用于保存ceph的内部资源;另一个分区是剩余全部空间
ceph-deploy osd create node1:sd{b,c}
ceph-deploy osd create node2:sd{b,c}
ceph-deploy osd create node3:sd{b,c}

# 查看集群状态
ceph -s | grep health  # HEALTH_OK,如果是HEALTH_WARN,显示时钟问题,说明上面少了步骤,可以参考下面第三步

Tips(安装错误的时候,可以尝试下面命令,本人安装错误的时候,试了下,发现好像没用,可能是自己脸黑):

# 1. 如果安装过程中出现keyring...这种报错,可以试着执行以下命令
ceph-deploy gatherkeys node{1..3}

# 2. 如果安装错误,可以清理数据后,重新安装。清理数据命令
ceph-deploy purge node1
ceph-deploy purge node2
ceph-deploy purge node3

# 3. health HEALTH_WARN clock skew detected on mon.node2, mon.node3 Monitor clock skew > detected问题
# 这里执行了之后,后面MDS和对象存储在部署的时候都需要加--overwrite-conf
echo "mon clock drift allowed = 2" >> ceph.conf
echo "mon clock drift warn backoff = 30" >> ceph.conf
ceph-deploy --overwrite-conf config push node{1,2,3}
systemctl restart ceph-mon.target
ceph -s # 再次查看

块存储

  • 块存储,就是可以提供像硬盘一样的设备。使用块存储的节点,第一次连接块设备,需要对块设备进行分区、格式化,然后挂载使用。
  • 快照功能
    • 快照可以保存某一时间点时的状态数据
    • 希望回到以前的一个状态,可以恢复快照

基本使用

ceph-1

  • node1:查看镜像、创建镜像、删除镜像、扩容镜像、缩小镜像
# 查看存储池,这里默认会有一个
ceph osd lspools

# 查看存储池大小
ceph df

# 查看存储池rbd存储数据时,保存的副本数量
ceph osd pool get rbd size

# 在默认存储池中,创建一个名为demo-image大小为10G的镜像
rbd create demo-image --size 10G

# 查看默认存储池中的镜像
rbd list

# 查看镜像信息
rbd info demo-image

# 扩容至20G
rbd resize --size 15G demo-image
rbd info demo-image

# 缩减至8G,慎用,一般不用
rbd resize --size 8G demo-image --allow-shrink
rbd info demo-image

# 删除镜像,慎用
rbd rm demo-image
  • client:映射镜像、查看已映射镜像、格式化镜像、挂载镜像、取消挂载、取消映射
#安装ceph客户端软件
yum install -y ceph-common

# 复制节点的配置文件和密钥keyring到客户端
scp node1:/etc/ceph/ceph.{conf,client.admin.keyring} /etc/ceph/

# 创建一个大小10G的镜像,提供给客户端使用
rbd create demo --size 10G
rbd info demo

# 客户端查看镜像
rbd list  # demo

# 将ceph提供的镜像映射到本地
rbd map demo  # /dev/rbd0

# 查看映射
rbd showmapped

# 格式化,第一次使用才需要格式化
mkfs.xfs /dev/rbd0

# 临时挂载使用
mount /dev/rbd0 /mnt/

# 查看是否挂载成功
df -h /mnt

# 取消挂载
umount /mnt/

# 取消映射
rbd unmap /dev/rbd0

# 删除镜像
rbd rm demo

快照

ceph-2

  • 创建快照、查看快照、(取消)保护快照、恢复快照、删除快照
# 创建镜像
rbd create img --size 10G

# 创建快照
rbd snap create img --snap img-sn1

# 查看快照
rbd snap ls img
rbd info img --snap img-sn1

# 保护快照/取消保护快照
rbd snap protect img --snap img-sn1
rbd snap unprotect img --snap img-sn1

# 恢复快照
rbd snap rollback img --snap img-sn1

# 删除快照
rbd snap remove img --snap img-sn1
  • client:测试快照能否恢复数据
# 创建镜像
rbd create img1 --size 20G
rbd list

# 映射镜像
rbd map img1
rbd showmapped

# 格式化镜像,挂载,存放数据
mkfs.xfs /dev/rbd1
mkdir /test
mount /dev/rbd1 /test/
echo "haha heihei" > /test/1.txt

# 创建快照
rbd snap create img1 --snap img1-snap1
rbd snap ls img1

# 删除数据
rm -rf /test/1.txt

# 取消挂载,取消映射
umount /test
rbd unmap /dev/rbd1

# 恢复快照
rbd snap rollback img1 --snap img1-snap1

# 重新挂载,映射
rbd map img1
mount /dev/rbd1 /test/
cat /test/1.txt

# 保护快照,测试能否可以删除
rbd snap protect img1 --snap img1-snap1
rbd snap remove img1 --snap img1-snap1

# 去除保护,测试是否可以删除
rbd snap unprotect img1 --snap img1-snap1
rbd snap rm img1 --snap img1-snap1
rbd snap ls img1

ceph-3

  • client快照克隆
# 1. 创建img2镜像,大小10G
rbd create img2 --size 10G
rbd ls

# 2. 映射、挂载镜像,写入数据
rbd map img2
mkfs.xfs /dev/rbd0
mount /dev/rbd0 /mnt/
for i in {1..10}; do echo "test${i}" > /mnt/file$i.txt; done

# 3. 卸载镜像
umount /mnt
rbd unmap img2

# 4. 创建快照
rbd snap create img2 --snap img2-sn1
rbd snap ls img2

# 5. 保护快照
rbd snap protect img2 --snap img2-sn1
rbd info img2 --snap img2-sn1

# 6. 克隆两个镜像
rbd clone img2 --snap img2-sn1 img2-sn1-1
rbd clone img2 --snap img2-sn1 img2-sn1-2 --image-feature layering

# 7. 将克隆的两个镜像挂载到不同的两个客户端
[client1] rbd map img2-sn1-1
[client1] mount /dev/rbd0 /mnt/

[client2] rbd map img2-sn1-2
[client2] mount /dev/rbd0 /mnt/
  • 合并父子镜像,删除之前的父镜像,查看子镜像能否正常工作
# img2-sn1-2是基于img2的快照克隆来的,不能独立使用,将父镜像内容合并到子镜像中,子镜像就可以独立使用了
# 1. 将img2的数据合并到img2-sn1-2中
rbd flatten img2-sn1-2

# 2. 查看状态,镜像对比
rbd info img2-sn1-2
rbd info img2-sn1-1

# 3. 删除父镜像
rbd rm img2  # 出现问题:rbd: image has snapshots

# 3.1 查看img2的快照并删除
rbd snap ls img2
rbd snap rm img2 --snap img2-sn1  # 出现问题: snapshot is protected

# 3.2 接触快照img2-sn1的保护
rbd snap unprotect img2 --snap img2-sn1  # 出现问题: cannot unprotect: at least 1 child(ren)

# 3.3 查看这个快照的克隆出来的镜像rbd/img2-sn1-1,此时已经没有rbd/img2-sn1-2了,是因为它已经独立出来了
rbd children img2 --snap img2-sn1

# 3.4 删除上面的输出rbd/img2-sn1-1
rbd rm img2-sn1-1  # 出现问题: rbd: error: image still has watchers

# 3.5 查看有哪些服务器在使用
rbd status img2-sn1-1  # 在输出中的服务器上,取消挂载,取消映射

# 3.6 再次删除img2-sn1-1
rbd rm img2-sn1-1

# 3.7 取消img2-sn1的保护并删除
rbd snap unprotect img2 --snap img2-sn1
rbd snap rm img2 --snap img2-sn1

# 3.8 删除父镜像
rbd rm img2

# 4. 挂载img2-sn1-2,测试是否成功
rbd map img2-sn1-2
mount /dev/rbd0 /mnt/

MDS

  • 元数据就是描述数据的属性。如属主、属组、权限等。
  • ceph文件系统中,数据和元数据是分开存储的
  • 新建存储池
    • 置组PG:存储池包含PGPG是一个容器,用于存储数据。
    • 为了管理方便,将数量众多的数据放到不同的PG中管理,而不是直接把所有的数据扁平化存放。
    • 通常一个存储池中创建100个PG

ceph-4

  • node1创建MDS
# 由于之前三个节点机器已经安装过ceph-mds了,所以这里就不需要安装了
# 创建并启动三个节点的mds,防止由于一台宕机导致访问不了
cd ceph-cluster/
ceph-deploy mds create node1
ceph-deploy mds create node2
ceph-deploy mds create node3

# 新建存储池,第一个名称为data,有100个PG;第一个名称为metadata,有100个PG
ceph osd pool create data 100
ceph osd pool create metadata 100

# 查看存储池 
ceph osd lspools  # 格式:id 名称,id 名称
ceph df

# 创建文件系统
ceph fs new myfs metadata data

# 查看文件系统
ceph fs ls

# 查看帮助 ceph fs --help
  • client挂载使用
mkdir /data
cat /etc/ceph/ceph.client.admin.keyring  # 复制client.admin下面的key = xxx
# 这里的xxx是上面复制的内容,然后node1,填node2或者node3都可以
mount -t ceph -o name=admin,secret=xxx node1:6789:/ /data
df -h /data

对象存储

  • 需要专门的客户端访问
  • 键值对存储方式
  • 对象存储需要rgw组件
# node1,使用rgw需要安装ceph-radosgw,部署的时候都安装过了
cd ceph-cluster/
ceph-deploy rgw create node1
ceph-deploy rgw create node2
ceph-deploy rgw create node3
  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值