一 前言
分布式文件系统(Distributed File System):文件系统管理的物理存储资源不必定直接链接在本地节点上,而是经过计算机网络与节点相连.分布式文件系统的设计基于C/S模式
1,什么是Ceph?
Ceph:是一个 Linux PB 级分布式文件系统
特色:
具备高扩展,高可用,高性能的特色
能够提供对象存储,块存储,文件存储
能够提供PB级别的存储空间(PB->TB->GB)
帮助文档:http://docs.ceph.org/start/intro
中文文档:http://docs.ceph.org.cn/
Ceph核心组件:
OSD:存储设备(OSD越多性能越好)
Monitor:集群监控组件 (取基数,如3,5,7)
MDS:存放文件系统的元数据(对象存储和块存储不须要该组件)
Client:ceph客户端
二 搭建块存储
1,实验环境
虚拟机都是rhel7.4,真机centos7
虚拟机:4台
node1,node2,node3既是OSD,也是Mpnitor
真实机:(centos7)或者从新新建一台虚拟机代替真机也能够
镜像地址:https://pan.baidu.com/s/1Uo_7yEl4mTXTiS7N98Abfwnode
2,安装前准备
1)物理机为全部节点配置yum源服务器。
[root@room9pc01 ~]# yum -y install vsftpd
[root@room9pc01 ~]# mkdir /var/ftp/ceph
[root@room9pc01 ~]# mount -o loop \
rhcs2.0-rhosp9-20161113-x86_64.iso /var/ftp/ceph #此光盘在网盘里
[root@room9pc01 ~]# systemctl restart vsftpd
2)修改全部节点都须要配置YUM源(这里仅以node1为例)。
[root@node1 ceph-cluster]# cat /etc/yum.repos.d/ceph.repo
[mon]
name=mon
baseurl=ftp://192.168.4.254/ceph/rhceph-2.0-rhel-7-x86_64/MON
gpgcheck=0
[osd]
name=osd
baseurl=ftp://192.168.4.254/ceph/rhceph-2.0-rhel-7-x86_64/OSD
gpgcheck=0
[tools]
name=tools
baseurl=ftp://192.168.4.254/ceph/rhceph-2.0-rhel-7-x86_64/Tools
gpgcheck=0
3)修改/etc/hosts并同步到全部主机。
警告:/etc/hosts解析的域名必须与本机主机名一致!!!!
[root@node1 ceph-cluster]# cat /etc/hosts
... ...
192.168.4.10 client
192.168.4.11 node1
192.168.4.12 node2
192.168.4.13 node3
警告:/etc/hosts解析的域名必须与本机主机名一致!!!!
[root@node1 ceph-cluster]# for i in 10 11 12 13vim
do
scp /etc/hosts 192.168.4.$i:/etc/
done
[root@node1 ceph-cluster]# for i in 10 11 12 13
do
scp /etc/yum.repos.d/ceph.repo 192.168.4.$i:/etc/yum.repos.d/
done
3)配置无密码链接(包括本身远程本身也不须要密码)。
[root@node1 ceph-cluster]# ssh-keygen -f /root/.ssh/id_rsa -N '' #生成密钥
[root@node1 ceph-cluster]# for i in 10 11 12 13 #上传密钥到个个主机
do
ssh-copy-id 192.168.4.$i
donecentos
3,配置NTP时间同步
1)真实物理机建立NTP服务器。
[root@room9pc01 ~]# yum -y install chrony
[root@room9pc01~]# cat /etc/chrony.conf
server 0.centos.pool.ntp.org iburst
allow 192.168.4.0/24
local stratum 10
[root@room9pc01 ~]# systemctl restart chronyd
[root@room9pc01 ~]# iptables -F #若是有防火墙规则,须要清空全部规则
2)其余全部节点与NTP服务器同步时间(以node1为例)。
[root@node1 ceph-cluster]# cat /etc/chrony.conf
#server 0.rhel.pool.ntp.org iburst
#server 1.rhel.pool.ntp.org iburst
#server 2.rhel.pool.ntp.org iburst
server 192.168.4.254 iburst
[root@node1 ceph-cluster]# systemctl restart chronyd
[root@node1 ceph-cluster]# systemctl enable chronyd服务器
4,准备存储磁盘网络
直接打开虚拟机管理器添加磁盘,node1,node2,node3每台添加三个10G磁盘app
5,部署软件
1)在node1安装部署工具,学习工具的语法格式。
[root@node1 ~]# yum -y install ceph-deploy
[root@node1 ~]# ceph-deploy --help #查看命令格式
2)建立目录
[root@node1 ~]# mkdir ceph-cluster
[root@node1 ~]# cd ceph-cluster/
6,部署Ceph集群
1)建立Ceph集群配置。
[root@node1 ceph-cluster]# ceph-deploy new node1 node2 node3
2)给全部节点安装软件包。
[root@node1 ceph-cluster]# ceph-deploy install node1 node2 node3
3)初始化全部节点的mon服务(主机名解析必须对)
[root@node1 ceph-cluster]# vim ceph.conf #文件最后追加如下内容
public_network = 192.168.4.0/24 #避免会出现以下错误加上这一行
[root@node1 ceph-cluster]# ceph-deploy mon create-initial //拷贝配置文件,并启动mon服务
常见错误及解决方法(非必要操做,有错误能够参考):
若是提示以下错误信息:
[node1][ERROR ] admin_socket: exception getting command descriptions: [Error 2] No such file or directory
解决方案以下(在node1操做):
先检查本身的命令是不是在ceph-cluster目录下执行的!!!!若是时确认是在该目录下执行的create-initial命令,依然保存,可使用以下方式修复。
[root@node1 ceph-cluster]# vim ceph.conf #文件最后追加如下内容
public_network = 192.168.4.0/24
修改后从新推送配置文件:
[root@node1 ceph-cluster]# ceph-deploy --overwrite-conf config push node1 node2 node3dom
7,建立OSD
1)准备磁盘分区(node1,node2,node3都要作)
[root@node1 ceph-cluster]# parted /dev/vdb mklabel gpt
[root@node1 ceph-cluster]# parted /dev/vdb mkpart primary 1M 50%
[root@node1 ceph-cluster]# parted /dev/vdb mkpart primary 50% 100%
[root@node1 ceph-cluster]# chown ceph.ceph /dev/vdb1 #受权给ceph用户
[root@node1 ceph-cluster]# chown ceph.ceph /dev/vdb2
提示:重启后失效,要想永久有效,1,把命令写入/etc/rc.local文件中,并给文件赋予执行权限;2,用udev写入权限
//这两个分区用来作存储服务器的日志journal盘
2)初始化清空磁盘数据(仅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,node2,node3)卸载掉
3)建立OSD存储空间(仅node1操做便可)
[root@node1 ceph-cluster]# ceph-deploy osd create node1:vdc:/dev/vdb1 node1:vdd:/dev/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
4)常见错误(非必须操做)
使用osd create建立OSD存储空间时,如提示run 'gatherkeys',可使用以下命令修复:
[root@node1 ceph-cluster]# ceph-deploy gatherkeys node1 node2 node3 ssh
8,验证测试
1) 查看集群状态
[root@node1 ceph-cluster]# ceph -s
cluster d3266b4f-5c8c-44f3-b11e-7a2cafd1f75b
health HEALTH_OK #出现ok就成功了,err就失败了,若是出现warning,执行 systemctl restart ceph*.service ceph*.target重启服务
monmap e1: 3 mons at {node1=192.168.4.11:6789/0,node2=192.168.4.12:6789/0,node3=192.168.4.13:6789/0}
election epoch 6, quorum 0,1,2 node1,node2,node3
osdmap e42: 6 osds: 6 up, 6 in
flags sortbitwise
pgmap v323: 64 pgs, 1 pools, 88496 kB data, 5147 objects
503 MB used, 119 GB / 119 GB avail
64 active+cleansocket
2)常见错误(非必须操做)
若是查看状态包含以下信息:
health: HEALTH_WARN
clock skew detected on node2, node3…
clock skew表示时间不一样步,解决办法:请先将全部主机的时间都使用NTP时间同步!!!
若是状态仍是失败,能够尝试执行以下命令,重启ceph服务:
[root@node1 ceph-cluster]# systemctl restart ceph*.service ceph*.target分布式
9,建立镜像
1)查看存储池。
[root@node1 ceph-cluster]# ceph osd lspools
0 rbd,
2)建立镜像、查看镜像
两种建立镜像(共享硬盘)方式
方式一(没有指明存储池默认rbd)
[root@node1 ceph-cluster]# rbd create demo-image --image-feature layering --size 10G
方式二(指明存储池rbd)
[root@node1 ceph-cluster]# rbd create rbd/image --image-feature layering --size 10G
[root@node1 ceph-cluster]# rbd list #rbd ls也能够查看镜像
demo-image
image
[root@node1 ceph-cluster]# rbd info demo-image #查看具体某个镜像信息
rbd image 'demo-image':
size 10240 MB in 2560 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.d3aa2ae8944a
format: 2
features: layering
10,动态调整镜像大小
1)缩小容量
[root@node1 ceph-cluster]# rbd resize --size 7G image --allow-shrink
[root@node1 ceph-cluster]# rbd info image
2)扩容容量
[root@node1 ceph-cluster]# rbd resize --size 15G image
[root@node1 ceph-cluster]# rbd info image
11,经过KRBD访问
1)集群内将镜像映射为本地磁盘
[root@node1 ceph-cluster]# rbd map demo-image#使用内核将镜像映射到块设备
/dev/rbd0
[root@node1 ceph-cluster]# lsblk
… …
rbd0 251:0 0 10G 0 disk #此处为加载识别的块设备
[root@node1 ceph-cluster]# mkfs.xfs /dev/rbd0 #格式化
[root@node1 ceph-cluster]# mount /dev/rbd0 /mnt #挂载使用
[root@node1 ceph-cluster]# df -h #查看当前挂载信息
2)客户端经过KRBD访问
#客户端须要安装ceph-common软件包
#拷贝配置文件(不然不知道集群在哪)
#拷贝链接密钥(不然无链接权限)
[root@client ~]# yum -y install ceph-common
[root@client ~]# scp 192.168.4.11:/etc/ceph/ceph.conf /etc/ceph/ #从集群中下载配置文件
[root@client ~]# scp 192.168.4.11:/etc/ceph/ceph.client.admin.keyring \
/etc/ceph/ #从集群中下载密钥
[root@client ~]# rbd map image #使用内核将镜像映射到块设备
[root@client ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
vda 252:0 0 20G 0 disk
├─vda1 252:1 0 1G 0 part /boot
└─vda2 252:2 0 19G 0 part
├─rhel-root 253:0 0 17G 0 lvm /
└─rhel-swap 253:1 0 2G 0 lvm [SWAP]
rbd0 251:0 0 15G 0 disk #此处是使用的网络磁盘
[root@client ~]# rbd showmapped #查看使用的网络镜像(磁盘)信息
id pool image snap device
0 rbd image - /dev/rbd0
3) 客户端格式化、挂载分区并使用
[root@client ~]# mkfs.xfs /dev/rbd0
[root@client ~]# mount /dev/rbd0 /mnt/
[root@client ~]# echo "test" > /mnt/test.txt
12,建立镜像快照
磁盘快照(Snapshot)是针对整个磁盘卷册进行快速的档案系统备份,与其它备份方式最主要的不一样点在于「速度」。进行磁盘快照时,并不牵涉到任何档案复制动做。就算数据量再大,通常来讲,一般能够在一秒以内完成备份动做。
磁盘快照的基本概念与磁带备份等机制有很是大的不一样。在创建磁盘快照时,并不须要复制数据自己,它所做的只是通知LX Series NAS服务器将目前有数据的磁盘区块所有保留起来,不被覆写。这个通知动做只需花费极短的时间。接下来的档案修改或任何新增、删除动做,均不会覆写本来数据所在的磁盘区块,而是将修改部分写入其它可用的磁盘区块中。因此能够说,数据复制,或者说数据备份,是在日常档案存取时就作好了,并且对效能影响极低.
1)建立镜像快照
[root@node1 ceph-cluster]# rbd snap create image --snap image-snap1
[root@node1 ceph-cluster]# rbd snap ls image #查看image的快照
SNAPID NAME SIZE
4 image-snap1 15360 MB
2)删除客户端写入的测试文件
[root@client ~]# rm -rf /mnt/test.txt
[root@client ~]# umount /mnt 先卸载再去还原快照,否则会报下面错误
3) 还原快照
[root@node1 ceph-cluster]# rbd snap rollback image --snap image-snap1
#客户端从新挂载分区
[root@client ~]# mount /dev/rbd0 /mnt/
[root@client ~]# ls /mnt
test.txt
快照还原问题:
[root@client ~]# mount /dev/rbd0 /mnt
mount: 文件系统类型错误、选项错误、/dev/rbd0 上有坏超级块、
缺乏代码页或助手程序,或其余错误
有些状况下在 syslog 中能够找到一些有用信息- 请尝试 dmesg | tail 这样的命令看看
解决办法:
1,先在客户机卸载
2,在node1在还原快照
2,在客户机上挂载
13,建立快照克隆
1)克隆快照
[root@node1 ceph-cluster]# rbd snap protect image --snap image-snap1 #把快照保护起来
[root@node1 ceph-cluster]# rbd snap rm image --snap image-snap1 //会失败
[root@node1 ceph-cluster]# rbd clone \
image --snap image-snap1 image-clone --image-feature layering
//使用image的快照image-snap1克隆一个新的image-clone镜像
2)查看克隆镜像与父镜像快照的关系
[root@node1 ceph-cluster]# rbd info image-clone
rbd image 'image-clone':
size 15360 MB in 3840 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.d3f53d1b58ba
format: 2
features: layering
flags:
parent: rbd/image@image-snap1
#克隆镜像不少数据都来自于快照链
#若是但愿克隆镜像能够独立工做,就须要将父快照中的数据,所有拷贝一份,但比较耗时!!!
[root@node1 ceph-cluster]# rbd flatten image-clone #解除与快照的关系
[root@node1 ceph-cluster]# rbd info image-clone
rbd image 'image-clone':
size 15360 MB in 3840 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.d3f53d1b58ba
format: 2
features: layering
flags:
#注意,父快照信息没了
14,其余操做
1) 客户端撤销磁盘映射
[root@client ~]# umount /mnt
[root@client ~]# rbd showmapped
id pool image snap device
0 rbd image - /dev/rbd0
[root@client ~]# rbd unmap /dev/rbd/rbd/image #撤销磁盘映射image
2)删除快照与镜像
[root@node1 ceph-deploy]# rbd snap unprotect image --snap image-snap1 #解除保护
[root@node1 ceph-cluster]# rbd snap rm image --snap image-snap1 #删除快照
[root@node1 ceph-cluster]# rbd list
[root@node1 ceph-cluster]# rbd rm image
15,块存储应用案例
1)建立磁盘镜像。
[root@node1 ceph-cluster]# rbd create vm1-image --image-feature layering --size 10G
[root@node1 ceph-cluster]# rbd create vm2-image --image-feature layering --size 10G
[root@node1 ceph-cluster]# rbd list
[root@node1 ceph-cluster]# rbd info vm1-image
[root@node1 ceph-cluster]# qemu-img info rbd:rbd/vm1-image
image: rbd:rbd/vm1-image
file format: raw
virtual size: 10G (10737418240 bytes)
disk size: unavailable
2)Ceph认证帐户。
Ceph默认开启用户认证,客户端须要帐户才能够访问,
默认帐户名称为client.admin,key是帐户的密钥,
可使用ceph auth添加新帐户(案例咱们使用默认帐户)。
[root@node1 ceph-cluster]# cat /etc/ceph/ceph.conf //配置文件
[global]
mon_initial_members = node1, node2, node3
mon_host = 192.168.2.10,192.168.2.20,192.168.2.30
auth_cluster_required = cephx //开启认证
auth_service_required = cephx //开启认证
auth_client_required = cephx //开启认证
[root@node1 ceph-cluster]# cat /etc/ceph/ceph.client.admin.keyring //帐户文件
[client.admin]
key = AQBTsdRapUxBKRAANXtteNUyoEmQHveb75bISg==
3)部署客户端环境。
注意:这里使用真实机当客户端!!!
客户端须要安装ceph-common软件包,拷贝配置文件(不然不知道集群在哪),
拷贝链接密钥(不然无链接权限)。
[root@room9pc01 ~]# yum -y install ceph-common
[root@room9pc01 ~]# scp 192.168.4.11:/etc/ceph/ceph.conf /etc/ceph/ #下载ceph配置文件
[root@room9pc01 ~]# scp 192.168.4.11:/etc/ceph/ceph.client.admin.keyring \
/etc/ceph/ #下载ceph密钥
4)建立KVM虚拟机。
使用virt-manager建立1台普通的KVM虚拟机。名称为vm1
5)配置libvirt secret。
编写帐户信息文件(真实机操做)
[root@room9pc01 ~]# vim secret.xml //新建临时文件,内容以下
<secret ephemeral='no' private='no'>
<usage type='ceph'>
<name>client.admin secret</name>
</usage>
</secret>
#使用XML配置文件建立secret
[root@room9pc01 ~]# virsh secret-define --file secret.xml
生成 secret c409ec4c-803b-46bc-b4e4-35dc86a08f85
//随机的UUID,这个UUID对应的有帐户信息
编写帐户信息文件(真实机操做)
--获取client.admin的key,或者直接查看密钥文件
方式一:
[root@room9pc01 ~]# ceph auth get-key client.admin
方式二:
[root@room9pc01 ~]# cat /etc/ceph/ceph.client.admin.keyring
[client.admin]
key = AQDExOpbE+W9BxAA9QBqQUAY0tFmSmjOWmS8Nw==
c409ec4c-803b-46bc-b4e4-35dc86a08f85 ceph client.admin secret
6)虚拟机的XML配置文件。
每一个虚拟机都会有一个XML配置文件,包括:
虚拟机的名称、内存、CPU、磁盘、网卡等信息
[root@room9pc01 ~]# vim /etc/libvirt/qemu/vm1.xml
//修改前内容以下
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/vm1.qcow2'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</disk>
不推荐直接使用vim修改配置文件,推荐使用virsh edit修改配置文件,效果以下:
[root@room9pc01] virsh edit vm1 //vm1为虚拟机名称
<disk type='network' device='disk'>
<driver name='qemu' type='raw'/>
<auth username='admin'>
<secret type='ceph' uuid='c409ec4c-803b-46bc-b4e4-35dc86a08f85'/>
</auth>
<source protocol='rbd' name='rbd/vm1-image'>
<host name='192.168.4.11' port='6789'/>
</source>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</disk>
提示:保存退出出现"编辑了域 rhel7.4 XML 配置。"说明成功了
源路经:rbd://192.168.4.11:6789/rbd/vm1-image
Ceph块存储总结:
1,Linux能够直接使用
2,Kvm虚拟机使用,修改kvm虚拟机xml配置文件
二 Ceph文件系统(MDS)
1,添加一台新的虚拟机,要求以下:
IP地址:192.168.4.14
主机名:node4(部署元数据服务器)
配置yum源(包括rhel、ceph的源)
与真机主机同步时间([root@node1 ceph-deploy]# scp /etc/chrony.conf root@192.168.4.14:/etc/)
node1容许无密码远程node4 命令:ssh-copy-id root@192.168.4.14
[root@node1 ceph-deploy]#vim /etc/hosts #并拷贝到node1-4,client
192.168.4.10 client
192.168.4.11 node1
192.168.4.12 node2
192.168.4.13 node3
192.168.4.14 node4
2,部署元数据服务器
登录node4,安装ceph-mds软件包
[root@node1 ceph-cluster]yum -y install ceph-mds
登录node1部署节点操做
[root@node1 ceph-cluster]# cd /root/ceph-cluster #该目录,是最先部署ceph集群时,建立的目录
[root@node1 ceph-cluster]# ceph-deploy mds create node4 #给nod4拷贝配置文件,启动mds服务
[root@node1 ceph-cluster]# ceph-deploy admin node4 #同步配置文件和key
3,建立存储池
[root@node1 ceph-cluster]ceph osd pool create cephfs_data 128 #建立存储池,对应128个PG
[root@node1 ceph-cluster]ceph osd pool create cephfs_metadata 128 #建立存储池,对应128个PG
4,建立Ceph文件系统
[root@node1 ceph-cluster]ceph mds stat //查看mds状态
e2:, 1 up:standby
[root@node1 ceph-cluster]ceph fs new myfs1 cephfs_metadata cephfs_data
new fs with metadata pool 2 and data pool 1
//注意,如今medadata池,再写data池
//默认,只能建立1个文件系统,多余的会报错
[root@node1 ceph-cluster]ceph fs ls
name: myfs1, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
[root@node1 ceph-cluster]ceph mds stat
e4: 1/1/1 up {0=node4=up:creating}
5,客户端挂载
[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中找到
三 建立对象存储服务器(RGW)1,部署对象存储服务器1)准备实验环境,要求以下:IP地址:192.168.4.15主机名:node5配置yum源(包括rhel、ceph的源)与真机主机同步时间node1容许无密码远程node5 命令:ssh-copy-id root@192.168.4.15修改node1的/etc/hosts,并同步到全部node主机[root@node1 ceph-cluster]# vim /etc/hosts... ...192.168.4.10 client192.168.4.11 node1192.168.4.12 node2192.168.4.13 node3192.168.4.14 node4192.168.4.15 node5