[TOC]
存储配置:将存储分空间或者容量以块、文件或对象的形式分配给物理或虚拟服务器的过程
5.1 Ceph块设备
5.1.1 介绍
Ceph块设备也称为RADOS块设备(RBD),对外提供块存储
- 可以被映射、格式化并可以挂载到服务器
- 也可以当作裸分区或标记为文件系统,然后进行挂载
- 也可以为物理层的虚拟机监控程序以及虚拟机提供块存储解决方案
读写流程
当客户端向RBD写数据时,librbd库将数据映射到对象而存储在Ceph集群中,删除这些数据对象并跨集群复制这些对象,从而提供更好的性能和可靠性。
Ceph RBD驱动程序已经被集成到Linux内核中(内核RBD,KRBD)
- 完整和增量快照:能够实现基于时间点的还原
- 自动精简配置:只有发生变化的对象才需要存储,节省OpenStack大量的存储空间
- 写时复制和即时克隆
- 动态调整大小
- 内存式缓存
虚拟机监控器完全支持RBD
业内领先的开源hypervisor(虚拟机监控器),如:KVM、Xen、VMware、HyperV完全支持RBD,并利用它为各自的客户虚拟机提供RBD特性。
hypervisor是一种运行在基础物理服务器和操作系统之间的中间软件层,允许多个操作系统和应用共享硬件
I型(裸机型):直接运行在系统硬件上,不需要底层OS
II型(托管型,宿主型):运行在传统操作系统上,构建出一整套虚拟硬件平台(CPU、内存、外存、适配器),底层和上层的操作系统可以完全无关化
VM中的应用程序调用硬件资源需要经过:VM内核->Hypervisor->主机内核,性能是三种虚拟化技术中最差的
III型(操作系统虚拟化):虚拟机运行在传统操作系统上,创建一个独立的虚拟化实例(容器),指向底层操作系统。所有虚拟机共享内核空间,性能最好,耗费资源最少。但是缺点是底层和上层必须使用同一种操作系统
Ceph RBD完全支持云平台
Ceph提供的块设备后端能存储OpenStack虚拟机的卷(Cinder)和操作系统镜像(glance)
- Ceph RBD支持的最大镜像为16EB,这些镜像可以作为磁盘映射到物理裸机、虚拟机或其他主机使用
Ceph写时复制和即时克隆能帮助OpenStack在很短时间内部署数百个虚拟机实例
所有机器都可以访问Ceph集群存储从而更好地实现虚拟机迁移
- 虚拟化容器(Xen,KVM)都可以配置从存储在Ceph的卷来启动虚拟机
5.1.2 RBD存储配置
创建并配置客户端
系统环境准备
创建虚拟机,启动并安装OS
当成功安装OS后,修改网络配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17修改eth0配置
vim /etc/sysconfig/network-scripts/ifcfg-eth0
ONBOOT=yes
BOOTPROTO=dhcp
修改eth1配置
vim /etc/sysconfig/network-scripts/ifcfg-eth1
ONBOOT=yes
BOOTPROTO=dhcp
IPADDR=
NETMASK=
修改主机配置
vim /etc/hosts
192.168.xxx.xxx ceph-nodex
...
本机ip 本机名ceph-client1查看Linux内核版本并检查是否支持RBD
Linux内核从2.5.32版本开始支持Ceph,若要支持本地化访问Ceph块设备和文件系统,使用2.5.34版本以上的Linux内核
1
2
3lsb_release -a # 检查OS
uname -r #内核版本
modprobe rbd #查看Linux内核版本是否支持RBD升级内核版本
安装ELRepo rpm包
1
rpm -Uvh http://www.elrepo.org/elrepo-release-6.el6.elrepo.noarch.rpm
安装新内核
1
yum --enablerepo=elrepo-kernel install kernel-ml
编辑/etc/grub.conf文件,更新
default=0
,重启机器再次检查是否支持RBD
复制集群配置文件
将ceph-node1的root公钥复制到客户端ceph-client1
1 | root@ceph-node1 $ ssh-copy-id root@ceph-client1 |
在ceph-node1使用ceph-deploy程序为客户端安装Ceph程序
1 | cd /etc/ceph |
将Ceph配置文件复制到ceph-client1
1 | ceph-node1 $ ceph-deploy --username root config push ceph-client1 |
授权客户端访问集群权限
客户端需要Ceph密钥访问Ceph集群,Ceph集群搭建时,已经创建了一个默认用户 client.admin,它拥有足够的权限去访问Ceph集群。但不应该将client.admin用户共享到Ceph节点和管理主机外的机器上
应该创建有限权限集的用户,并用其密钥环来访问RBD
创建Ceph用户client.rbd,使其拥有访问rbd存储池的权限
1 | ceph auth get-or-create client.rbd mon 'allow r' osd 'allow class-read object_prefix rbd_children,allow rwx pool=rbd' |
为ceph-client1上的client.rbd用户添加密钥
1 | ceph auth get-or-create client.rbd | ssh root@ceph-client1 sudo tee /etc/ceph/ceph.client.rbd.keyring |
提供用户名和密钥在ceph-client1上检查Ceph集群状态
1 | ssh ceph-client1 |
创建/删除块设备
登录Ceph集群的任一个monitor节点或具有Ceph集群管理员权限的管理主机或者客户端
创建名为 ceph-client1-rbd1、大小为10240MB的RBD
1 | 集群内节点$ rbd create ceph-client1-rbd1 --size 10240 |
列出rbd镜像
1 | 集群内节点$ rbd ls |
检查rbd镜像的具体情况
1 | 集群内节点$ rbd --image ceph-client1-rbd1 info |
删除rbd镜像
1 | 集群内节点$ rbd rm ceph-client1-rbd1 -p rbd |
映射RADOS块设备
在客户端执行
1 | rbd map --image ceph-client1-rbd1 --name client.rbd #将块设备映射到客户端 |
在客户端映射完成后,就可以当做本地磁盘或块设备使用
1 | fdisk -l /dev/rbd0 |
调整RBD大小
Ceph支持自动精简配置的块设备:只有当把数据存入这个块设备,才会真正地使用物理存储空间
自动精简配置 :预先配置给应用一个空间额度,根据实际所需要的容量系统自动多次分量地分配给该应用
- 简化操作,提高运维效率
- 按需供给,提高存储空间的整体利用率
- 分期采购,降低TCO成本
1 | rbd resize 池名/rbd名 --size 调整后容量/MB |
在客户端机器上,还需要扩展文件系统的容量,以便能够使用新增的存储空间
- XFS支持在线调整容量
RBD快照
创建基于时间点的、只读的RBD镜像副本。可以通过创建快照并恢复其原始数据,保存RBD的状态
1 | 1. 新建测试文件 |
RBD可写副本(克隆)
Ceph快照分层特性
Ceph定义了两种RBD镜像:format-1和format-2
只有 format-2 类型的RBD支持快照分层 Ceph集群可以为format-2的RBD镜像创建 写时复制(COW) 副本,允许客户端创建RBD的多个即时副本
- COW可写
- 可以调整容量
- 可以创建新的快照
- 可以创建新的COW
应用 :对于云平台(OpenStack,CloudStacl)和虚拟化平台(Qemu,KVM)很有用
这些平台通常以快照的形式保护含有OS/VM镜像的CephRBD镜像,通过不断复制这个快照的COW副本来创建新的虚拟机/实例
每一个复制的镜像都包含父快照的引用,用于读取镜像数据。
当有数据写入COW时,COW会为自己生成新的数据引用
指令
1 | 1. 创建format-2类型的RBD镜像 |
扁平化镜像(解除关系)
扁平化(flatten)镜像可以让RBD镜像不依赖于父镜像
- 父镜像会将数据复制到子镜像中,复制过程与数据量有关
1 | 1. 子rbd镜像上启动扁平化 |
删除保护快照
1 | 1. 解除快照的保护状态 |
5.2 Ceph文件系统
5.2.0 Ceph文件系统
CephFS在RADOS层上提供了一个任意大小且兼容POSIX的文件系统,是ceph里最晚满足production ready的一个功能
CephFS架构
客户端挂载方式不同,IO路径也存在较大差异,cephfs-fuse的IO path比较长,性能会比cephfs kernel module的方式差一些;
客户端访问cephfs的流程
- client端与mds节点通讯,获取metadata信息(metadata也存在osd上)
- client直接写数据到osd
CephFS组件间通信
Client <–> MDS
元数据操作和capalities
Client <–> OSD
数据IO
Client <–> Monitor
认证,集群map信息等
MDS <–> Monitor
心跳,集群map信息等
MDS <–> OSD
元数据IO
Monitor <–> OSD
心跳,集群map信息等
模块 | 版本 |
---|---|
Ceph Version | Jewel 10.2.7 |
Ceph Cluster OS | CentOS Linux release 7.2.1511 (Core) |
Ceph Cluster kernel version | 3.10.0-327.el7.x86_64 |
Cephfs Client OS | CentOS Linux release 7.2.1511 (Core) |
Cephfs kernel version | 4.11.3-1.el7.elrepo.x86_64 |
MDS
Ceph元数据服务器(MDS),使用Ceph MDS作为守护进程,跟踪文件层次结构并存储只供CephFS使用的元数据,并将它和其他数据分开,降低复杂性并提高可靠性
- 只有Ceph文件系统(CephFS)才需要
- MDS只管理元数据,不向客户端提供任何数据,数据通过OSD服务提供,避免系统中的一个单点故障
MDS提供一个带智能缓存层的共享型连续文件系统,大大减少读写操作
一部分MDS只负责一部分元数据,且不存储本地数据
- 如果一个MDS守护进程发生故障,可以在任何可以访问集群的节点上启动他
MDS本质上是动态的,守护进程可以加入、离开,并且快速接管出错的节点
一个MDS可配置为主动和被动状态
主MDS节点为活跃状态,其他的为备用状态
主MDS故障,则第二个MDS节点负责接管。也可以指定备用节点跟随主MDS节点
MDS配置命令
1 | ceph-deploy mds create [mdsnodeName]#mdsnodeName为运行MDS进程的节点名 |
与客户端交互方法
基于libcephfs库实现多种客户端交互
- libcephfs拥有本地Linux内核驱动程序支持,因此客户可以使用mount命令实现本机文件系统的挂载
- 同时也支持CIFS,SMB,NFS
- 客户端可以使用使用Ceph社区提供的ceph-fuse(用户空间文件系统)驱动CephFS
- 允许直接与应用程序交互。使用libcephfs库直接访问RADOS集群
- CephFS可以代替HDFS:Ceph为Hadoop和Hadoop插件提供了必要的CephFS Java接口
CephFS可以实现多个MDS的active-active状态,使他具备高可扩展性、高性能且没有单点故障
5.2.1 通过内核驱动程序 挂载CephFS
Linux2.5.34及以上版本本地化支持Ceph
在客户端执行以下命令
1 | 1. 检查客户端Linux版本 |
5.2.2 通过 FUSE 挂载CephFS
若Linux主机内核低于2.5.34版本,可以通过Ceph的 FUSE(用户空间文件系统) 来挂载CephFS
1 | 1. 安装ceph-fuse |
5.3 Ceph对象存储
对象存储不能被OS当做本地或者远程文件系统访问,只能在应用程序通过API访问
5.3.0 Ceph对象网关
RGW特性
Ceph 对象网关,也即RADOS网关(radosgw),将HTTP请求转换为RADOS请求,同时也可以把RADOS请求转换为HTTP请求
Ceph对象存储使用Ceph对象网关守护进程(radosgw)和librgw、librados交互,通过RESTful API和HTTP/s对外提供可访问且稳定的多租户对象存储
- RESTful:假设互联网上的资源有固定的url,可以通过不同的动作(GET、PUT、POST、PATCH、DEL)获取或修改资源,服务器响应分为HTTP状态码和数据两部分
RADOS网关利用librgw(RADOS网关库)和librados允许应用程序与Ceph对象存储建立连接。
兼容S3(Amazon)接口
兼容Swift(OpenStack)接口:提供兼容OpenStack Swift API的接口来访问Ceph存储集群,在OpenStack集群中Ceph对象网关能够代替Swift
兼容OpenStack的身份Keystone身份验证服务
Admin API:管理API或者原生API,通过基于HTTP的RESTful接口来管理Ceph集群
应用程序可以绕过RADOS网关,librados软件库允许用户的应用程序通过C、C++、Java、Python和PHP直接访问Ceph对象存储
Ceph对象网关拥有自己的用户管理体系:
- S3和Swift API共享Ceph集群内同一个命名空间:可以通过一个API写入数据而通过另一个API获取数据
- 可以使用多个网关,并将它们放在一个负载均衡器下控制对象存储的负载
快速处理策略:
- 支持使用内存缓存元数据
- 支持将大文件分为多个小的RADOS对象的方法提高性能
最佳实践
在生产环境中,若对象存储上有大量的工作负载,则应该用专用的物理服务器来配置RADOS网关;也可以考虑将所有的mon节点配置为RADOS网关
建议在负载均衡器后运行多个RGW实例
5.3.1 基于RADOS网关的对象存储
安装RADOS网关
Ceph对象存储需要Apache和FastCGI,推进安装Ceph社区提供的Apache和FastCGI的100个连续的优化版本
在RADOS网关节点ceph-rgw上执行
1.修改Apache安装源
1 | vim /etc/yum.repos.d/ceph-apache.repo |
2. 修改fastcgi源
在/etc/yum.repos.d下新建ceph-fastcgi.repo文件
1 | vim /etc/yum.repos.d/ceph-fastcgi.repo |
3.修改Ceph安装源
1 | vim /etc/yum.repos.d/ceph.repo |
4. 安装yum-plugin-priorities
1 | yum install yum-plugin-priorities |
5. 安装apache(httpd)、fastcgi(mod_fastcgi)、ceph-radosgw和ceph包
1 | yum install httpd mod_fastcgi ceph-radosgw ceph |
6. 为ceph-rgw设置FQDN
编辑/etc/hosts ,按照 rgw_ip_addr FQDN hostname 格式添加
1
192.168.57.110 ceph-rgw.objstore.com ceph-rgw
编辑/etc/sysconfig/network ,将HOSTNAME设置为FQDN
1
HOSTNAME=ceph-rgw.objstore.com
检查主机名和FQDN
1
2hostname # rgw-node1
hostname -f
配置RADOS网关
- Apache的配置
- FastCGI的配置
- Ceph密钥的生成
1.Apache的配置
编辑 /etc/httpd/conf/httpd.conf 文件以配置 Apache:
设置 ServerName
。 确保下面这行存在并且是非注释状态
1
2
3cat /etc/httpd/conf/httpd.conf | egrep "rgw|rewrite"
LoadModule rewrite_module modules/mod_rewrite.so
ServerName ceph-rgw.objstore.com
2.配置 FastCGI
编辑 /etc/httpd/conf.d/fastcgi.conf 文件以配置 FastCGI:
确保 FastCGI模块开启
1
2
3cat /etc/httpd/conf.d/fastcgi.conf | egrep -i "FastCgiWrapperlfastcgi_module"
LoadModule fastcgi_module_modules/mod fastcgi.so
FastCgiwrapper off关闭 FastCgiWrapper
3. 创建Ceph对象网关脚本,修改脚本文件所有权,并增加可执行权限
1 | vim /var/www/html/s3gw.fcgi |
4. 配置网关
在 /etc/httpd/conf.d 目录下创建网关配置文件 rgw.conf,其中包含下列内容。创建文件时使用服务器的 fqdn (hostname -f) 替换 {fqdn},使用服务器管理员的e-mail 地址替:{email.address}
1 | FastCgiExternalServer /var/www/html/s3gw.fcgi -socket /var/run/ceph/ceph.radosgw.gateway.fastcgi.sock |
4. 为Ceph创建RADOS网关用户及密钥环
在任意一台 Ceph monitor 节点上执行
1 | 1. 创建密钥环 |
5. 调整 RADOS 网关节点上 /var/log/httpd、var/run/ceph 和 /var/log/ceph 这三个文件的所有权和权限,并设置 SELinux为 Permissive:
1 | chown apache:apache /var/log/httpd |
6. 启动 Apache 和 Ceph RADOS 网关服务
1 | service httpd start |
7. 检查配置
使用 curl 对 radosgw的FQDN 执行 Http Get请求
1 | curl http://ceph-rgw.objstore.com |
看到以下输出,则说明配置正确
1 |
|
访问 radosgw FQDN ceph-rgw.objtore.com
也可以看到同样的配置
创建radosgw用户
若要访问Ceph对象存储,需要为RADOS网关创建用户,这些用户的账户将由访问权限及密钥标识
1. 确保RADOS网关节点可以访问Ceph集群
1 | 从monitor节点复制Ceph密钥环到RADOS网关节点上 |
2. 创建RADOS网关用户
产生该用户的access_key和secret_key,用于访问Ceph对象存储
1 | radosgw-admin user create --uid=mona --display-name="MonikaSingh" --email=mona@example.com |
5.3.2 S3兼容的对象存储
Amazon的简单存储服务S3通过Web接口(RESTful API)为用户提供存储服务
S3客户端可以通过access和密钥来访问Ceph 对象存储
为RADOS网关添加处理S3请求能力
1 | radosgw-admin caps add --uid=mona --caps="users=*" |
为RGW网关添加DNS服务
约定形式:<bucket name>.<RGW_FQDN>
- 如:bucket 名为 jupiter ,访问方式为
HTTP URL http://jupiter.ceph-rgw.objstore.com
1. 在ceph-rgw节点安装bind包
1 | yum install bind* -y |
2. 修改 /etc/named.conf中的IP、IP范围、区域(zone)
1 | listen-on port 53 {127,0.0.1;192.168.57.110;}; ### |
保存 /etc/named.conf文件并退出编辑器
3. 创建区域配置文件 /var/named/db.objstore.com
1 | @ 86400 IN SOA objstore.com. root.objstore.com. ( |
4. 关闭防火墙,或允许DNS通过
1 | service iptables stop |
5. 编辑 /etc/resolve.conf文件,添加以下内容:
1 | search objstore.com |
6. 启动named服务
1 | service named start |
7. 测试 DNS 配置文件的语法是否有问题
1 | named-checkconf /etc/named.conf |
8. 测试DNS服务器
1 | dig ceph-rgw.objstore.com |
配置S3客户端
1. 给 ceph-client1 增加相同的 DNS 设置,它将是这里的 S3 客户端机器。
编辑 cephclient1 节点上的 /etc/resolve.conf文件,添加以下内容:
1 | search objstore.com |
测试 ceph-client1 上的 DNS 设置:
1 | dig ceph-rgw.objstore.com |
2. 配置S3客户端
安装s3cmd
1 | yum install s3cmd |
配置 s3cmd将需要用户的 access key 和 secret key()
1 | s3cmd --configure |
s3cmd 配置命令将会在 /root 目录下创建s3cfg 文件。在该文件中配置 RADOS 网关的详细信息。
将 host_base 和 host_bucket 改为如下代码片段所示的值。确保这两行尾部没带空格:
1 | host_base = ceph-rgw.objstore.com |
3. 创建S3 bucket并向其中存放对象
1 | s3cmd ls |
5.3.3 Swift API兼容的对象存储
在RADOS 网关上创建Swift用户
登录 ceph-rgw 并创建一个子用户用于 Swift 访问。该子用户会拥有自己的密钥:
1 | radosgw-admin subuser create --uid=mona --subuser=mona:swift --access=full --secret=secretkey --key-type=swift |
在客户端节点安装Swift客户端
1 | yum install python-setuptools |
使用Swift客户端创建并查看bucket
1 | swift -V 1.0 -A http://ceph-rgw.objectstore.com/auth -U mona:swift -K secretkey post example-bucket |
5.3.4 bucket涉及的相关操作
list操作
ordered list
1 | 标准S3,Swift的list操作 |
unordered list
1 | radosgw bucket list 指定为unordered模式 |
stats操作
1 | bucket stats |
多数据中心数据同步
创建/删除bucket
1 | create / delete bucket |
容灾
[企业级]#11Ceph容灾