基本简介
Ceph是一种为优秀的性能、可靠性和可扩展性而设计的统一的、分布式文件系统。
中文搭建帮助:http://docs.ceph.org.cn/start/
Ceph有哪些优点
1、统一存储
虽然ceph底层是一个分布式文件系统,但由于在上层开发了支持对象和块的接口。所以在开源存储软件中,能够一统江湖。
2、高扩展性
扩容方便、容量大。能够管理上千台服务器、EB级的容量。
3、可靠性强
支持多份强一致性副本,EC。副本能够垮主机、机架、机房、数据中心存放。所以安全可靠。存储节点可以自管理、自动修复。无单点故障,容错性强。
4、高性能
因为是多个副本,因此在读写操作时候能够做到高度并行化。理论上,节点越多,整个集群的IOPS和吞吐量越高。另外一点ceph客户端读写数据直接与存储设备(osd) 交互。
Ceph各组件介绍:
•Ceph OSDs: Ceph OSD 守护进程( Ceph OSD )的功能是存储数据,处理数据的复制、恢复、回填、再均衡,并通过检查其他OSD 守护进程的心跳来向 Ceph Monitors 提供一些监控信息。当 Ceph 存储集群设定为有2个副本时,至少需要2个 OSD 守护进程,集群才能达到 active+clean 状态( Ceph 默认有3个副本,但你可以调整副本数)。
•Monitors: Ceph Monitor维护着展示集群状态的各种图表,包括监视器图、 OSD 图、归置组( PG )图、和 CRUSH 图。 Ceph 保存着发生在Monitors 、 OSD 和 PG上的每一次状态变更的历史信息(称为 epoch )。
•MDSs: Ceph 元数据服务器( MDS )为 Ceph 文件系统存储元数据(也就是说,Ceph 块设备和 Ceph 对象存储不使用MDS )。元数据服务器使得 POSIX 文件系统的用户们,可以在不对 Ceph 存储集群造成负担的前提下,执行诸如 ls、find 等基本命令。
Ceph 生态系统架构可以划分为四部分:
- Clients:客户端(数据用户)
- cmds:Metadata server cluster,元数据服务器(缓存和同步分布式元数据)
- cosd:Object storage cluster,对象存储集群(将数据和元数据作为对象存储,执行其他关键职能)
- cmon:Cluster monitors,集群监视器(执行监视功能)系统架构
什么是块存储/对象存储/文件系统存储?
- 对象存储: 也就是通常意义的键值存储,其接口就是简单的GET、PUT、DEL 和其他扩展,代表主要有 Swift 、S3 以及Gluster 等;
- 块存储: 这种接口通常以 QEMU Driver 或者 Kernel Module 的方式存在,这种接口需要实现 Linux 的 Block Device 的接口或者 QEMU 提供的 Block Driver 接口,如 Sheepdog,AWS 的EBS,青云的云硬盘和阿里云的盘古系统,还有 Ceph 的 RBD(RBD是Ceph面向块存储的接口)。在常见的存储中 DAS、SAN提供的也是块存储;
- 文件存储: 通常意义是支持 POSIX 接口,它跟传统的文件系统如 Ext4 是一个类型的,但区别在于分布式存储提供了并行化的能力,如 Ceph 的 CephFS (CephFS是Ceph面向文件存储的接口),但是有时候又会把 GlusterFS ,HDFS这种非POSIX接口的类文件存储接口归入此类。当然 NFS、NAS也是属于文件系统存储.
构建Ceph集群
使用4台虚拟机,1台客户端、3台存储集群服务器,拓扑结构如图所示。
步骤一:安装前准备
1)物理机为所有节点配置yum源服务器。
[root@room9pc01 ~]# mkdir /var/ftp/ceph
[root@room9pc01 ~]# mount ceph10.iso /var/ftp/ceph/
2)配置无密码连接(包括自己远程自己也不需要密码),在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
3)修改/etc/hosts并同步到所有主机。/etc/hosts解析的域名必须与本机主机名一致!!!!
[root@node1 ~]# cat /etc/hosts
... ...
192.168.4.10 client
192.168.4.11 node1
192.168.4.12 node2
192.168.4.13 node3
[root@node1 ~]# for i in client node1 node2 node3
do
scp /etc/hosts $i:/etc/
done
4)修改所有节点都需要配置YUM源,并同步到所有主机。
[root@node1 ~]# cat /etc/yum.repos.d/ceph.repo
[mon]
name=mon
baseurl=ftp://192.168.4.254/ceph/MON
gpgcheck=0
[osd]
name=osd
baseurl=ftp://192.168.4.254/ceph/OSD
gpgcheck=0
[tools]
name=tools
baseurl=ftp://192.168.4.254/ceph/Tools
gpgcheck=0
[root@node1 ~]# yum repolist #验证YUM源软件数量
源标识 源名称 状态
Dvd redhat 9,911
Mon mon 41
Osd osd 28
Tools tools 33
repolist: 10,013
[root@node1 ~]# for i in client node1 node2 node3
do
scp /etc/yum.repos.d/ceph.repo $i:/etc/yum.repos.d/
done
5)所有节点主机与真实主机的NTP服务器同步时间。
[root@node1 ~]# vim /etc/chrony.conf
… …
server 192.168.4.254 iburst
[root@node1 ~]# for i in client node1 node2 node3
do
scp /etc/chrony.conf $i:/etc/
ssh $i "systemctl restart chronyd"
done
步骤二:准备存储磁盘
部署ceph集群
步骤一:安装部署软件ceph-deploy
1)在node1安装部署工具,学习工具的语法格式。
[root@node1 ~]# yum -y install ceph-deploy
[root@node1 ~]# ceph-deploy --help
[root@node1 ~]# ceph-deploy mon --help
2)创建目录
[root@node1 ~]# mkdir ceph-cluster
[root@node1 ~]# cd ceph-cluster/
步骤二:部署Ceph集群
1)给所有节点安装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
2)创建Ceph集群配置,在ceph-cluster目录下生成Ceph配置文件。
在ceph.conf配置文件中定义monitor主机是谁。
[root@node1 ceph-cluster]# ceph-deploy new node1 node2 node3
3)初始化所有节点的mon服务,也就是启动mon服务(主机名解析必须对)。
[root@node1 ceph-cluster]# ceph-deploy mon create-initial
常见错误及解决方法(非必要操作,有错误可以参考):
如果提示如下错误信息:
[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 node3
步骤三:创建OSD
备注:vdb1和vdb2这两个分区用来做存储服务器的journal缓存盘。
[root@node1 ceph-cluster]# for i in node1 node2 node3
do
ssh $i "parted /dev/vdb mklabel gpt"
ssh $i "parted /dev/vdb mkpart primary 1 50%"
ssh $i "parted /dev/vdb mkpart primary 50% 100%"
done
2)磁盘分区后的默认权限无法让ceph软件对其进行读写操作,需要修改权限。
node1、node2、node3都需要操作,这里以node1为例。
[root@node1 ceph-cluster]# chown ceph.ceph /dev/vdb1
[root@node1 ceph-cluster]# chown ceph.ceph /dev/vdb2
#上面的权限修改为临时操作,重启计算机后,权限会再次被重置。
#我们还需要将规则写到配置文件实现永久有效。
#规则:如果设备名称为/dev/vdb1则设备文件的所有者和所属组都设置为ceph。
#规则:如果设备名称为/dev/vdb2则设备文件的所有者和所属组都设置为ceph。
[root@node1 ceph-cluster]# vim /etc/udev/rules.d/70-vdb.rules
ENV{DEVNAME}=="/dev/vdb1",OWNER="ceph",GROUP="ceph"
ENV{DEVNAME}=="/dev/vdb2",OWNER="ceph",GROUP="ceph"
3)初始化清空磁盘数据(仅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
4)创建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
常见错误及解决方法(非必须操作)。
使用osd create创建OSD存储空间时,如提示下面的错误提示:
[ceph_deploy][ERROR ] RuntimeError: bootstrap-osd keyring not found; run 'gatherkeys'
可以使用如下命令修复文件,重新配置ceph的密钥文件:
[root@node1 ceph-cluster]# ceph-deploy gatherkeys node1 node2 node3
创建Ceph块存储
步骤一:创建镜像
1)查看存储池。
[root@node1 ~]# ceph osd lspools
0 rbd,
2)创建镜像、查看镜像
[root@node1 ~]# rbd create demo-image --image-feature layering --size 10G
[root@node1 ~]# rbd create rbd/jacob --image-feature layering --size 10G
#这里的demo-image和jacob为创建的镜像名称,可以为任意字符。
#--image-feature参数指定我们创建的镜像有哪些功能,layering是开启COW功能。
#提示:ceph镜像支持很多功能,但很多是操作系统不支持的,我们只开启layering。
[root@node1 ~]# rbd list
[root@node1 ~]# 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
步骤二:动态调整
1)扩容容量
[root@node1 ~]# rbd resize --size 15G jacob
[root@node1 ~]# rbd info jacob
2)缩小容量
[root@node1 ~]# rbd resize --size 7G jacob --allow-shrink
[root@node1 ~]# rbd info image
步骤三:通过KRBD访问
1)客户端通过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 jacob
[root@client ~]# lsblk
[root@client ~]# rbd showmapped
id pool image snap device
0 rbd jacob - /dev/rbd0
- 客户端格式化、挂载分区
[root@client ~]# mkfs.xfs /dev/rbd0
[root@client ~]# mount /dev/rbd0 /mnt/
[root@client ~]# echo "test" > /mnt/test.txt
步骤四:创建镜像快照
- 查看镜像快照(默认所有镜像都没有快照)。
[root@node1 ~]# rbd snap ls jacob
- 给镜像创建快照。
[root@node1 ~]# rbd snap create jacob --snap jacob-snap1
#为jacob镜像创建快照,快照名称为jacob-snap1
[root@node1 ~]# rbd snap ls jacob
SNAPID NAME SIZE
4 jacob-snap1 15360 MB
- 删除客户端写入的测试文件
[root@client ~]# rm -rf /mnt/test.txt
[root@client ~]# umount /mnt
- 还原快照
[root@node1 ~]# rbd snap rollback jacob --snap jacob-snap1
#客户端重新挂载分区
[root@client ~]# mount /dev/rbd0 /mnt/
[root@client ~]# ls /mnt
步骤五:创建快照克隆
1)克隆快照
[root@node1 ~]# rbd snap protect jacob --snap jacob-snap1
[root@node1 ~]# rbd snap rm jacob --snap jacob-snap1 //会失败
[root@node1 ~]# rbd clone \
jacob --snap jacob-snap1 jacob-clone --image-feature layering
//使用jacob镜像的快照jacob-snap1克隆一个新的名称为jacob-clone的镜像
2)查看克隆镜像与父镜像快照的关系
[root@node1 ~]# rbd info jacob-clone
rbd image 'jacob-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/jacob@jacob-snap1
#克隆镜像很多数据都来自于快照链
#如果希望克隆镜像可以独立工作,就需要将父快照中的数据,全部拷贝一份,但比较耗时!!!
[root@node1 ~]# rbd flatten jacob-clone
[root@node1 ~]# rbd info jacob-clone
rbd image 'jadob-clone':
size 15360 MB in 3840 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.d3f53d1b58ba
format: 2
features: layering
flags:
#注意,父快照信息没了!
[root@node1 ~]# rbd snap unprotect jacob --snap jacob-snap1 #取消快照保护
[root@node1 ~]# rbd snap rm jacob --snap jacob-snap1 #可以删除快照
步骤六:其他操作
1) 客户端撤销磁盘映射
[root@client ~]# umount /mnt
[root@client ~]# rbd showmapped
id pool image snap device
0 rbd jacob - /dev/rbd0
//语法格式:
[root@client ~]# rbd unmap /dev/rbd0
块存储应用
1)创建磁盘镜像。
[root@node1 ~]# rbd create vm1-image --image-feature layering --size 10G
[root@node1 ~]# rbd list
[root@node1 ~]# rbd info vm1-image
2)Ceph认证账户(仅查看即可)。
Ceph默认开启用户认证,客户端需要账户才可以访问,默认账户名称为client.admin,key是账户的密钥。
可以使用ceph auth添加新账户(案例我们使用默认账户)。
[root@node1 ~]# 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 ~]# cat /etc/ceph/ceph.client.admin.keyring //账户文件
[client.admin]
key = AQBTsdRapUxBKRAANXtteNUyoEmQHveb75bISg==
3)创建KVM虚拟机(注意:这里使用真实机操作!!!)。
创建2台的KVM虚拟机,或者直接使用现有的虚拟机也可以。
4)配置libvirt secret(注意:这里使用真实机操作!!!)。
编写账户信息文件,让KVM知道ceph的账户名称。
[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 secret.xml
#命令会生成随机的UUID,这个UUID对应的有账户信息
[root@room9pc01 ~]# virsh secret-list #查看Secret信息
给secret绑定admin账户的密码,密码参考ceph.client.admin.keyring文件。
[root@room9pc01] virsh secret-set-value \
--secret 733f0fd1-e3d6-4c25-a69f-6681fc19802b \
--base64 AQBTsdRapUxBKRAANXtteNUyoEmQHveb75bISg
#这里secret后面是前一步secret-fine创建的UUID
#base64后面是client.admin账户的密码
5)虚拟机的XML配置文件。
每个虚拟机都会有一个XML配置文件,包括:
虚拟机的名称、内存、CPU、磁盘、网卡等信息。
[root@room9pc01 ~]# virsh edit 虚拟机名称
//原始模板内容如下:
<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 tedu_node01 //tedu_node01为虚拟机名称
<disk type='network' device='disk'>
<driver name='qemu' type='raw'/>
<auth username='admin'>
<secret type='ceph' uuid='733f0fd1-e3d6-4c25-a69f-6681fc19802b'/>
</auth>
<source protocol='rbd' name='rbd/vm1-image'> <host name='192.168.4.11' port='6789'/> </source>
<target dev='vda' bus='virtio'/>
</disk>
备注:修改secret的UUID,修改source中的共享名name,修改dev设备名称。
Ceph文件系统
1)添加一台新的虚拟机,要求如下:
IP地址:192.168.4.14
主机名:node4
配置yum源(包括rhel、ceph的源)
与Client主机同步时间
node1允许无密码远程node4
修改node1的/etc/hosts,并同步到所有node主机
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服务
如果没有密钥和配置文件则可以通过admin命令重新发送配置和密钥(备选操作)
[root@node1 ceph-cluster]# ceph-deploy admin node4 //同步配置文件和key
3)创建存储池
[root@node4 ~]# ceph osd pool create cephfs_data 128
//创建存储池,对应128个PG
[root@node4 ~]# ceph osd pool create cephfs_metadata 128
//创建存储池,对应128个PG
备注:一个文件系统是由inode和block两部分组成,效果如图所示。
inode存储文件的描述信息(metadata元数据),block中存储真正的数据。
4)创建Ceph文件系统
[root@node4 ~]# ceph fs new myfs1 cephfs_metadata cephfs_data
new fs with metadata pool 2 and data pool 1
//注意,先写medadata池,再写data池
//默认,只能创建1个文件系统,多余的会报错
[root@node4 ~]# ceph fs ls
name: myfs1, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
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中找到
对象存储服务器
步骤一:部署对象存储服务器
1)准备实验环境,要求如下:
IP地址:192.168.4.15
主机名:node5
配置yum源(包括rhel、ceph的源)
与Client主机同步时间
node1允许无密码远程node5
修改node1的/etc/hosts,并同步到所有node主机
2)部署RGW软件包
[root@node1 ~]# yum -y install ceph-radosgw
或者使用脚本自动安装ceph-deploy install --rgw node5.
3)新建网关实例
拷贝配置文件,启动一个rgw服务
[root@node1 ~]# cd /root/ceph-cluster
[root@node1 ~]# ceph-deploy rgw create node5
如果没有密钥和配置文件则可以通过admin命令重新发送配置和密钥(备选操作)
[root@node1 ceph-cluster]# ceph-deploy admin node4
//同步配置文件和key
登陆node5验证服务是否启动
[root@node5 ~]# ps aux |grep radosgw
ceph 4109 0.2 1.4 2289196 14972 ? Ssl 22:53 0:00 /usr/bin/radosgw -f --cluster ceph --name client.rgw.node4 --setuser ceph --setgroup ceph
[root@node5 ~]# systemctl status ceph-radosgw@\*
4)修改服务端口
登陆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服务
步骤二:客户端测试(扩展选做实验)
1)curl测试
[root@client ~]# curl 192.168.4.15:8000
<?xml version="1.0" encoding="UTF-8"?><ListAllMyBucketsResult xmlns="http://s3.amazonaws.com /doc/2006-03-01/"><Owner><ID>anonymous</ID><DisplayName></DisplayName></Owner><Buckets></Buckets></ListAllMyBucketsResult>
2)使用第三方软件访问
登陆node5(RGW)创建账户
[root@node5 ~]# radosgw-admin user create \
--uid="testuser" --display-name="First User"
… …
"keys": [
{
"user": "testuser",
"access_key": "5E42OEGB1M95Y49IBG7B",
"secret_key": "i8YtM8cs7QDCK3rTRopb0TTPBFJVXdEryRbeLGK6"
}
],
... ...
#
[root@node5 ~]# radosgw-admin user info --uid=testuser
//testuser为用户,key是账户访问密钥
3)客户端安装软件
[root@client ~]# yum install s3cmd-2.0.1-1.el7.noarch.rpm
修改软件配置(注意,除了下面设置的内容,其他提示都默认回车)
[root@client ~]# s3cmd --configure
Access Key: 5E42OEGB1M95Y49IBG7BSecret Key: i8YtM8cs7QDCK3rTRopb0TTPBFJVXdEryRbeLGK6
S3 Endpoint [s3.amazonaws.com]: 192.168.4.15:8000
[%(bucket)s.s3.amazonaws.com]: %(bucket)s.192.168.4.15:8000
Use HTTPS protocol [Yes]: No
Test access with supplied credentials? [Y/n] n
Save settings? [y/N] y
//注意,其他提示都默认回车
4)创建存储数据的bucket(类似于存储数据的目录)
[root@client ~]# s3cmd ls
[root@client ~]# s3cmd mb s3://my_bucket
Bucket 's3://my_bucket/' created
[root@client ~]# s3cmd ls
2018-05-09 08:14 s3://my_bucket
[root@client ~]# s3cmd put /var/log/messages s3://my_bucket/log/
[root@client ~]# s3cmd ls s3://my_bucket
DIR s3://my_bucket/log/
[root@client ~]# s3cmd ls s3://my_bucket/log/
2018-05-09 08:19 309034 s3://my_bucket/log/messages
5)测试下载功能
[root@client ~]# s3cmd get s3://my_bucket/log/messages /tmp/
6)测试删除功能
[root@client ~]# s3cmd del s3://my_bucket/log/messages