**Ceph存储
SSD(固态)速度块,容量小 SATA(磁盘)速度慢,容量大
vim /usr/lib/systemd/system/ :存放配置文件的地方
存储的类型:
DAS :(直连存储,硬盘和电脑直接一根线连起来)中间的线分为:ide线sata线 sas线
NAS :(网络附加存储) Samba ,nfs, ftp 文件系统(#格式化过的)
SAN :iscsi 块(#没格式化)
SDS(软件定义存储) :分布式存储 ceph,glusterfs
ext3, ext4, fst32, ntfs, xfs文件系统 没格式化的叫块,格式化完成的叫文件系统
常用分布式文件系统:
Lustre
Hadoop
FastDFS 中国出版
Ceph 红帽出版
GlusterFS
Ceph :具有高扩展,高可用,高性能的特点Ceph可以通过对象存储,块存储,文件系统存储
Ceph官网帮助文档: http://docs.ceph.org/start/intro
**
**
OSDs -存储设备 必须要的组件
ceph-osd Monitors -集群监控组件
必须要的组件,至少要起3个mon
ceph-mon RadosGateway (RGW) -对象存储网关 对应的软件包:
ceph-radosgw MDSs 存放文件系统的元数据
ceph-mds Client -ceph客户端
– mon ceph-mon ceph-osd :安装好后可以做块模式iscsi
ceph-mds :安装了这个就可以做文件系统模式
ceph-radosgw :可以做对象存储网关
文件系统由2个部分组成:iondo (元数据) block (数据)
注意:所有主机基本系统光盘的YUM源必须提前配置好。
安装前准备
物理机为所有节点配置yum源服务器。
提示:ceph10.iso在/linux-soft/02目录
[root@room9pc01 ~]#mkdir /var/ftp/ceph
在真机上进行创建目录
[root@room9pc01 ~]#mount /linux-soft/02/ceph10.iso /var/ftp/ceph/
把第二阶段里面的准备好的内容 进行挂载
配置无密码连接(包括自己远程自己也不需要密码),在node1操作。
[root@node1 ~]#ssh-keygen -f /root/.ssh/id_rsa -N ''
:创建无迷密钥
[root@node1 ~]#
for i in 10 11 12 13 创建好后通过循环传给其他机子
do
ssh-copy-id 192.168.4.$i 把无迷密钥传给其他机子
done 结束后要输入其他机子的密码
修改/etc/hosts并同步到所有主机。
警告:/etc/hosts解析的域名必须与本机主机名一致!!!!
1. [root@node1 ~]# vim/etc/hosts 添加解析的域名
2.... ...
3.192.168.4.10 client
4.192.168.4.11 node1
5.192.168.4.12 node2
6.192.168.4.13 node3
警告:/etc/hosts解析的域名必须与本机主机名一致!!!!
[root@node1 ~]#
for i in 10 11 12 13
do
scp /etc/hosts 192.168.4.$i:/etc/ 把本地的/etc/hosts/远程传送到其他电脑上
done
修改所有节点都需要配置YUM源,并同步到所有主机。
createrepo /var/ftp/ceph #生成仓库数据文件
只有先生成仓库数据文件,后面配置的yum库才是真的yum仓库
[local_repo]
name=CentOS-$releasever - Base
baseurl="ftp://192.168.4.254/centos-1804"
enabled=1
gpgcheck=0
[mon]
name=mon
baseurl="ftp://192.168.4.254/ceph/MON"
enabled=1
gpgcheck=0
[osd]
name=osd
baseurl="ftp://192.168.4.254/ceph/OSD"
enabled=1
gpgcheck=0
[tools]
name=tools
baseurl="ftp://192.168.4.254/ceph/Tools"
enabled=1
gpgcheck=0
上面这些都是你真机上面拷贝到/var/ftp/ceph/里面有的仓库数据
[root@node1 ~]# yum repolist #验证YUM源软件数量
repolist: 10,013 1万多个软件包
[root@node1 ~]#
for i in 10 11 12 13 远程传给其他电脑
do
scp /etc/yum.repos.d/ceph.repo 192.168.4.$i:/etc/yum.repos.d/
done
所有节点主机与真实主机的NTP服务器同步时间。
提示:默认真实物理机已经配置为NTP服务器。
[root@node1 ~]#
vim /etc/chrony.conf
… …
server 192.168.4.254 iburst 指向真机为时间服务器
[root@node1 ~]#
for i in 10 11 12 13
do
scp /etc/chrony.conf 192.168.4.$i:/etc/ 把时间服务器传过去
ssh 192.168.4.$i "systemctl restart chronyd" 远程后重启服务
done
chronyc sources 传过去后,打这个命令可以查看是和谁在同步时间
准备存储磁盘
物理机上为每个虚拟机准备3块磁盘(可以使用命令,也可以使用图形直接添加)
[root@room9pc01 ~]# virt-manager
物理机,实验环境就是真机
部署ceph集群
安装部署软件ceph-deploy: 是一个用patroy写的脚本
在node1安装部署工具,学习工具的语法格式。
[root@node1 ~]# yum -y install ceph-deploy
[root@node1 ~]# ceph-deploy --help
看帮助
[root@node1 ~]# ceph-deploy mon --help
看mon 的帮助
安装好后会在/usr/bin/ceph-deploy 生成一个脚本
创建目录:
[root@node1 ~]#mkdir ceph-cluster
[root@node1 ~]#cd ceph-cluster/
部署Ceph集群
创建Ceph集群配置,在ceph-cluster目录下生成Ceph配置文件。
在ceph.conf配置文件中定义monitor主机是谁
[root@node1 ceph-cluster]#ceph-deploy new node1 node2 node3
在当前目录下生产配置文件
给所有节点安装ceph相关软件包
root@node1 ceph-cluster]#
for i in node1 node2 node3
do
ssh $i "yum -y install ceph-mon ceph-osd ceph-mds ceph-radosgw"
done
通过域名远程其它电脑安装ceph 的相关软件包
ceph-mon ceph-osd :安装好后可以做块模式iscsi
ceph-mds :安装了这个就可以做文件系统模式
ceph-radosgw :可以做对象存储网关
初始化所有节点的mon服务,也就是启动mon服务(主机名解析必须对)。
[root@node1 ceph-cluster]#ceph-deploy mon create-initial
把配置文件初始化,并拷贝给3个mon 集群里的成员,并启动服务
Ceph -s :查看ceph集群的详细信息
创建OSD
备注:vdb1和vdb2这两个分区用来做存储服务器的journal缓存盘。
[root@node1 ceph-cluster]#`
for i in node1 node2 node3
do
ssh $i "parted /dev/vdb mklabel gpt"
先进行parted 进行设置分区模式为 gpt模式
ssh $i "parted /dev/vdb mkpart primary 1 50%"
开始进行分第一个primary :主分区 ,分该磁盘的50%
ssh $i "parted /dev/vdb mkpart primary 50% 100%"
开始进行分第二个primary :主分区 ,分该磁盘的50% 到100% ,就是剩下所有
done
Vdb1和vdb2 做缓存
磁盘分区后的默认权限无法让ceph软件对其进行读写操作,需要修改权限。
node1、node2、node3都需要操作,这里以node1为例
[root@node1 ceph-cluster]# chown ceph:ceph /dev/vdb1
[root@node1 ceph-cluster]# chown ceph:ceph /dev/vdb2
修改2个分区的权限,所属者和所属组都修改成ceph
#上面的权限修改为临时操作,重启计算机后,权限会再次被重置。
#我们还需要将规则写到配置文件实现永久有效。
#规则:如果设备名称为/dev/vdb1则设备文件的所有者和所属组都设置为ceph。
#规则:如果设备名称为/dev/vdb2则设备文件的所有者和所属组都设置为ceph。
vim /etc/udev/rules.d/70-vdb.rules
永久改设备权限配置文件手动添加内容
ENV{DEVNAME}=="/dev/vdb1",OWNER="ceph",GROUP="ceph"
ENV{DEVNAME}=="/dev/vdb2",OWNER="ceph",GROUP="ceph"
如果有个设备名叫/dev/vdb1或/vdb2,所有者修改为ceph 所属者修改为ceph
DEVNAME :代表设备名称
OWNER :所有者
GROUP :所属组
For循环传输比较轻松,可以直接这样传送:
[root@node1 ~]#
> for i in node1 node2 node3
> do
> scp /etc/udev/rules.d/70-vdb.rules $i:/etc/udev/rules.d 你得完成上面的权限配置
> ssh $i "chown ceph:ceph /dev/vdb1"
> ssh $i "chown ceph:ceph /dev/vdb2"
> done
初始化清空磁盘数据(仅node1操作即可)
[root@node1 ceph-cluster]# ceph-deploy disk zap node1:vdc node1:vdd
[root@node1 ceph-cluster]# ceph-deploy disk zap node2:vdc node2:vdd
[root@node1 ceph-cluster]# ceph-deploy disk zap node3:vdc node3:vdd
通过node1上面的脚本命令ceph-deploy 来进行远程格式化
创建OSD存储空间(仅node1操作即可)
重要:很多同学在这里会出错!将主机名、设备名称输入错误!!!
[root@node1 ceph-cluster]# ceph-deploy osd create \
node1:vdc:/dev/vdb1 node1:vdd:/dev/vdb2
自动启动服务共享node1的vdc盘缓存盘为vdb1 vdd盘缓存盘为vdb2
//创建osd存储设备,vdc为集群提供存储空间,vdb1提供JOURNAL缓存,
//一个存储设备对应一个缓存设备,缓存需要SSD,不需要很大
[root@node1 ceph-cluster]# ceph-deploy osd create \
node2:vdc:/dev/vdb1 node2:vdd:/dev/vdb2
[root@node1 ceph-cluster]# ceph-deploy osd create \
node3:vdc:/dev/vdb1 node3:vdd:/dev/vdb2
小心,一但出错,就只能推了重做!!
完成后输入 ceph -s
查看一下ceph集群的详细信息如果出现:
ERROR : :ceph集群服务错误,不可使用
WARN :出了点小问题,服务能用
OK : 集群服务正常启动
创建Ceph块存储
创建镜像
查看存储池。
[root@node1 ~]# ceph osd lspools
查看存储池
0 rbd, 默认有一个叫rdb的存储池,编号为0
创建镜像、查看镜像
[root@node1 ~]# rbd create demo-image --image-feature layering --size 10G
[root@node1 ~]# rbd create rbd/image --image-feature layering --size 10G
#这里的demo-image和image为创建的镜像名称,可以为任意字符。
#–image-feature参数指定我们创建的镜像有哪些功能,layering是开启COW功能。 Cow 功能:快照 ,写时复制
#提示:ceph镜像支持很多功能,但很多是操作系统不支持的,我们只开启layering。
[root@node1 ~]#rbd list
查看有那些镜像
[root@node1 ~]#rbd info demo-image
查看名叫demo-image镜像的详细内容
动态调整
1)缩小容量
[root@node1 ~]#rbd resize --size 7G image --allow-shrink == 允许缩小大小
[root@node1 ~]#rbd info image 在进行查看
2)扩容容量
[root@node1 ~]#rbd resize --size 15G image
[root@node1 ~]#rbd info image
通过KRBD访问
客户端通过KRBD访问
1.#客户端需要安装ceph-common软件包
2.#拷贝配置文件(否则不知道集群在哪)
3.#拷贝连接密钥(否则无连接权限)
1.[root@client ~]# yum -y install ceph-common
安装软件包,会产生一个目录 :/etc/ceph
2.[root@client ~]# scp 192.168.4.11:/etc/ceph/ceph.conf /etc/ceph/
3.[root@client ~]# scp 192.168.4.11:/etc/ceph/ceph.client.admin.keyring \
/etc/ceph/
[root@client ~]# rbd map image
挂载 image镜像
[root@client ~]# lsblk
查看是否共享成功,有没有多一个磁盘
[root@client ~]# rbd showmapped
查看共享的磁盘是那个池里的镜像
id pool image snap device
0 rbd image - /dev/rbd0 是编号0池里面叫image的镜像共享的
客户端格式化、挂载分区
共享过来的磁盘可以格式化,可以分区:
[root@client ~]# mkfs.xfs /dev/rbd0
[root@client ~]# mount /dev/rbd0 /mnt/
[root@client ~]# echo "test" > /mnt/test.txt
创建镜像快照
Ceph(3副本) 防止计算机出错能依旧访问
快照是备份用的,防止人误删除,可以找回 (缺点:做一次,只能保存一次)
查看镜像快照(默认所有镜像都没有快照)。
[root@node1 ~]# rbd snap ls image
查看image的快照,默认没有快照
给镜像创建快照:
[root@node1 ~]# rbd snap create image --snap image-snap1
现在为其创建快照
#为image镜像创建快照,快照名称为image-snap1
[root@node1 ~]# rbd snap ls image
在次查看image就有快照了
SNAPID NAME SIZE
4 image-snap1 10240 MB
删除客户端写入的测试文件 :测试一下误删除,快照还原
[root@client ~]# rm -rf /mnt/test.txt
先删除
[root@client ~]# umount /mnt
快照不支持在线还原,得退出挂载
还原快照:
[root@node1 ~]# rbd snap rollback image --snap image-snap1
用快照:snap image-snap1 对镜像image 进行还原
#客户端重新挂载分区
[root@client ~]# mount /dev/rbd0 /mnt/
[root@client ~]# ls /mnt
在次查看,就会出现你之前创建快照时的所有文件
创建快照克隆
快照克隆镜像
Protect :保护
[root@node1 ~]# rbd snap protect image --snap image-snap1
:保护image这个盘里image-snap1这个快照
[root@node1 ~]# rbd snap rm image --snap image-snap1
因为你把image-snap1这个快照保护了,删除会失败
[root@node1 ~]# rbd clone \
image --snap image-snap1 image-clone --image-feature layering
//使用image的快照image-snap1克隆一个新的名称为image-clone镜像
rbd list
克隆完后,查看是否克隆成功
查看克隆镜像与父镜像快照的关系
[root@node1 ~]#rbd info image-clone
查看克隆镜像的父子关系
#克隆镜像很多数据都来自于快照链
#如果希望克隆镜像可以独立工作,就需要将父快照中的数据,全部拷贝一份,但比较耗时!!!
[root@node1 ~]#rbd flatten image-clone
把父快照数据全部拷贝过来
[root@node1 ~]#rbd info image-clone
拷贝完成后,再次查看
#注意,父快照信息没了!
[root@node1 ~]#rbd snap unprotect image --snap image-snap1
#取消快照保护
[root@node1 ~]#rbd snap rm image --snap image-snap1
#可以删除快照
客户端撤销磁盘映射
[root@client ~]#umount /mnt
解除挂载
[root@client ~]#rbd showmapped
查看磁盘对应的镜像信息
[root@client ~]#rbd unmap image
删除image镜像对应的磁盘
块存储应用案例
创建磁盘镜像:
[root@node1 ~]#rbd create vm1-image --image-feature layering --size 10G
[root@node1 ~]#rbd list
[root@node1 ~]#rbd info vm1-image
Ceph认证账户(仅查看即可):
Ceph默认开启用户认证,客户端需要账户才可以访问,默认账户名称为client.admin,key是账户的密钥。
可以使用ceph auth添加新账户(案例我们使用默认账户)
[root@node1 ~]#cat /etc/ceph/ceph.conf
//配置文件
[root@node1 ~]#cat /etc/ceph/ceph.client.admin.keyring
//账户文件
创建KVM虚拟机(注意:这里使用真实机当客户端!!!)。
使用virt-manager创建2台普通的KVM虚拟机。
配置libvirt secret(注意:这里使用真实机当客户端!!!)。
编写账户信息文件,让KVM虚拟机知道ceph的账户名称。
[root@room9pc01 ~]# vim secret.xml //新建临时文件,内容如下
<secret ephemeral='no' private='no'>
<usage type='ceph'> 允许访问ceph服务
<name>client.admin secret</name> 用户名
</usage>
</secret>
#使用XML配置文件创建secret virsh secret-list
[student@room9pc01 ~]$ virsh secret-define secret.xml
读取账号文件
生成 secret 7408708c-749c-41bb-87c8-f1e67ed0e7d9
//随机的UUID,这个UUID对应的有账户信息
virsh secret-undefine secret.xml 删除
给secret绑定admin账户的密码,密码参考服务器ceph.client.admin.keyring文件
[student@room9pc01 ~]$ virsh secret-set-value \
> --secret 7408708c-749c-41bb-87c8-f1e67ed0e7d9 \
> --base64 AQA3oTpd9gMLKhAAZ59utkaAIEcUJtOQwCP77Q==
//这里secret后面是之前创建的secret的UUID //base64后面是client.admin账户的密码
//现在secret中既有账户信息又有密钥信息
virsh secret-list
查看上面你创好的uuid
虚拟机的XML配置文件。
每个虚拟机都会有一个XML配置文件,包括:
虚拟机的名称、内存、CPU、磁盘、网卡等信息。
不推荐直接使用vim修改配置文件,推荐使用virsh edit修改配置文件,添加内容:
[root@room9pc01] virsh edit node1 //node1为虚拟机名称
<disk type='network' device='disk'>
<driver name='qemu' type='raw'/>
<auth username='admin'> 用户名
<secret type='ceph' uuid='733f0fd1-e3d6-4c25-a69f-6681fc19802b'/> 密码在在secret里
</auth> uuid要修改一下,可以virsh secret-list 看到之前弄过的信息
<source protocol='rbd' name='rbd/vm1-image'> 挂载vm1-image_x000B_ <host name='192.168.4.12' port='6789'/> 访问4.12,端口为6789_x000B_ </source>
<target dev='vde' bus='virtio'/> 生成的磁盘名叫vde
</disk>
不能改成本机访问本机,不然会电脑崩溃.
Ceph文件系统
添加一台虚拟机,部署MDS节点。
主机的主机名及对应的IP地址如表-1所示
格式化由2个部分组成:iondo (元数据) block (数据)
实现此案例需要按照如下步骤进行。
1)添加一台新的虚拟机,要求如下: IP地址:192.168.4.14 主机名:node4 配置yum源(包括rhel、ceph的源)
与Client主机同步时间 node1允许无密码远程node4
2)部署元数据服务器
登陆node4,安装ceph-mds软件包
[root@node4 ~]#yum -y install ceph-mds
登陆node1部署节点操作
[root@node1 ~]#cd /root/ceph-cluster
//该目录,是最早部署ceph集群时,创建的目录
[root@node1 ceph-cluster]#ceph-deploy mds create node4
//给nod4拷贝配置文件,启动mds服务
同步配置文件和key
[root@node1 ceph-cluster]#ceph-deploy admin node4
3)创建存储池
ceph osd lspools
:这个命令查看池子,默认有一个池子
[root@node4 ~]#ceph osd pool create cephfs_data 128
//创建存储池,对应128个PG
[root@node4 ~]#ceph osd pool create cephfs_metadata 128
//创建存储池,对应128个PG
5)创建Ceph文件系统
[root@node4 ~]#ceph mds stat
//查看mds状态
e2:, 1 up:standby
ceph fs new myfs1 cephfs_metadata cephfs_data
显示下面内容:
new fs with metadata pool 2 and data pool 1
//注意,先写medadata池,再写data池 前面的是做indot 后面是做block
//默认,一个集群只能创建1个文件系统,多余的会报错
[root@node4 ~]# ceph fs ls
显示下面内容
name: myfs1, metadata pool: cephfs_metadata, data pools: [cephfs_data]
[root@node4 ~]#ceph mds stat
e4: 1/1/1 up {0=node4=up:creating}
6)客户端挂载
[root@client ~]# mount -t ceph 192.168.4.11:6789:/ /mnt/cephfs/ \
-o name=admin,secret=AQBTsdRapUxBKRAANXtteNUyoEmQHveb75bISg==
//注意:文件系统类型为ceph
//192.168.4.11为MON节点的IP(不是MDS节点)
//admin是用户名,secret是密钥
//密钥可以在/etc/ceph/ceph.client.admin.keyring中找到
创建对象存储服务器
对象存储需要程序员写代码通过API 接口才可以去服务对象存储,读写的操作
百度云盘(对象存储)
部署对象存储服务器
1)准备实验环境,要求如下: IP地址:192.168.4.15 主机名:node5 配置yum源(包括rhel、ceph的源)
与Client主机同步时间 node1允许无密码远程node5 修改node1的/etc/hosts,并同步到所有node主机
2)部署RGW软件包
[root@node1 ~]#ceph-deploy install --rgw node5
同步配置文件与密钥到node5
[root@node1 ~]#cd /root/ceph-cluster
ceph-deploy admin node5
新建网关实例
启动一个rgw服务 radosgw
[root@node1 ~]# ceph-deploy rgw create node5
对象存储做好了
修改服务端口
登陆node5,RGW默认服务端口为7480,修改为8000或80更方便客户端记忆和使用
[root@node5 ~]# vim /etc/ceph/ceph.conf
[client.rgw.node5]
host = node5
rgw_frontends = "civetweb port=8000"
//node5为主机名 //civetweb是RGW内置的一个web服
systemctl restart [email protected]