Ceph存储的三种模式 部署MDS文件存储 RBD块存储 RGW对象存储

mds文件存储接口

服务端操作

1. 将监控节点制作成文件系统

  • 我们这里是考虑到虚拟机环境,所以将监控节点制作成文件系统,生产环境中尽量不要这么做。
- 在管理端admin节点操作
cd /etc/ceph				# 必须切换到工作目录下,因为ceph认证的机制是检索当前目录下的密钥环文件ceph.bootstrap-rgw.keyring
ceph-deploy mds create mon01 mon02 mon03		# 将mon01 mon02 mon03制作成文件系统格式

- 在管理节点查看各个节点的mds服务
ssh root@mon01 systemctl status ceph-mds@mon01
ssh root@mon02 systemctl status ceph-mds@mon02
ssh root@mon03 systemctl status ceph-mds@mon03

2. 启用Ceph文件系统

  • Ceph文件系统至少需要两个RADOS池,一个用于数据,一个用于元数据。
- 在管理端admin节点操作
1. 创建数据pool池,将数据的大小设置为128个pg
ceph osd pool create cephfs_data 128
# pool 'cephfs_data' created

2. 创建pool池,将元数据的大小设置为128个pg
ceph osd pool create cephfs_metadata 128
# pool 'cephfs_metadata' created

3. 启用msd文件系统的pool池
ceph fs new cephfs cephfs_metadata cephfs_data		# 必须元数据池在前,真实数据池在后

4. 查看cephfs
ceph fs ls
# name: ceph, metadata pool: cephfs_metadata, data pools: [cephfs_data ]

3. 创建用户

  • 在服务端创建用户,主要是为了控制客户端对ceph服务端数据存储的权限
- 在管理端admin节点操作
1. 账户为celient.nana,用户name为nana,nana对文件系统的根目录(/ 不是操作系统的根目录,指的是服务端创建的文件系统的挂载点)有rw权限
ceph fs authorize cephfs client.nana / rw| tee /etc/ceph/nana.keyring

2. 账户为celient.tom,用户name为tom,tom对文件系统的根目录有r权限,对文件系统的根目录下子目录/test有rw权限
ceph fs authorize cephfs client.tom / r /test rw| tee /etc/ceph/tom.keyring

3. 查看用户对文件存储的权限
ceph auth list							查看ceph创建的所有用户
ceph auth rm client.tom					删除用户tom
ceph auth get client.nana				查看用户nana的权限

客户端操作

切记客户端一定要在public_addr网络内

  • 我们这里模拟管理服务器(admin节点)当作客户端访问public网络,所以客户端的部分操作我们不需要重复操作了。

生产环境中,客户端需要安装ceph软件包,还需要有配置文件以及密钥环文件

生产环境中,客户端需要有配置文件:ceph.conf
还要有账号的密钥环文件:nana.keyring、tom.keyring

- 在生产环境客户端需要操作
1. 首先需要在客户端创建好工作目录
mkdir /etc/ceph

2. 在ceph的管理节点将密钥文件传给该客户端
cd /etc/ceph
scp -r nana.keyring 1.1.1.10:/etc/ceph
scp -r tom.keyring 1.1.1.10:/etc/ceph

3. 在ceph的管理节点将/etc/hosts文件传给客户端
scp -r /etc/hosts 1.1.1.10:/etc/

4. 客户端需要安装ceph软件包
wget https://download.ceph.com/rpm-luminous/el7/noarch/ceph-release-1-1.el7.noarch.rpm
rpm -ivh ceph-release-1-1.el7.noarch.rpm
yum -y install ceph 

1. 客户端制作密钥文件

  • 从密钥文件中只提取密钥内容,挂载使用
- 在客户端操作
1. 将用户nana的密钥导入nana.key中
ceph-authtool -n client.nana -p nana.keyring > nana.key
cat nana.key
# AQDg36RgQat7GhAAFRQkGubUw2ahEB4P/qAK3Q==

2. 将用户tom的密钥导入tom.key中
ceph-authtool -n client.tom -p tom.keyring > tom.key
cat tom.key
# AQBM+KRgR7GNEBAAgYrR12s+kp/VtJUdsd6URA==

2. 客户端挂载使用

- 客户端操作
1. 在客户端以服务端创建用户nana的身份,将mon01,mon02,mon03挂载在本地的/opt/目录下,默认端口号6789 
mount -t ceph mon01:6789,mon02:6789,mon03:6789:/ /opt/ -o name=nana,secretfile=/etc/ceph/nana.key

2. 查看客户端本地的挂载点
df -h
# 1.1.1.4:6789,1.1.1.5:6789,1.1.1.6:6789:/   54G     0   54G   0% /opt

测试

1. 在挂载的/opt/目录下创建a.txt文件
echo 123 > /opt/a.txt

2. 将admin节点的密钥文件传给mon01
scp nana.key root@1.1.1.4:/etc/ceph/

3. 切换到mon01服务器,将mon01当作客户端,将ceph的文件系统挂载在/opt目录下,查看/opt目录下的文件内容
mount -t ceph mon01:6789,mon02:6789,mon03:6789:/ /opt/ -o name=nana,secretfile=/etc/ceph/nana.key
# 将ceph集群文件系统的挂载点挂载在本地的/opt/目录下
ls /opt			这里已经实现了文件系统的数据共享
# a.txt

- 测试ceph的高可用性
1. 切换到mon01节点,关闭ceph集群中服务端mon01节点服务
systemctl stop ceph-mds@mon01

2. 查看当前mfs文件系统的集群状态,还有两个节点可以使用
ceph -s
# mds: ceph-1/1/1 up  {0=mon03=up:active}, 2 up:standby

3. 在客户端mon01节点/opt/目录下创建b.txt
echo 123 > /opt/b.txt

4. 切换到客户端admin节点查看文件是否创建成功
ls /opt
# a.txt b.txt		说明ceph集群的文件存储不存在nfs那种单点故障问题

- 测试ceph集群的权限管理
echo 123 > /opt/test/c.txt
umount /opt				# 卸载挂载用户nana的身份
# 以tom用户的身份进行挂载,挂载到opt目录下。tom用户身份对挂载的根目录有r权限,对文件系统的根目录下子目录/test有rw权限
mount -t ceph mon01:6789,mon02:6789,mon03:6789:/ /opt/ -o name=tom,secretfile=/etc/ceph/tom.key		
echo 123456 >  /opt/a.txt
# -bash: /opt/a.txt: Permission denied
echo 123456 >  /opt/test/test.txt
cat /opt/test/c.txt
# 123

RBD块存储接口

服务端操作

1. 创建RBD接口需要创建专门用于RBD的存储池

- 在管理端admin节点操作
1. 创建一个名为kvm的普通pool池,并指定pg和pgp都为32
ceph osd pool create kvm 32 32
# pool 'kvm' created

2. 将pool池转换为RBD模式
ceph osd pool application enable kvm rbd
# enabled application 'rbd' on pool 'kvm'

2. 初始化存储池

- 在管理端admin节点操作
1. 初始化pool池
rbd pool init -p kvm

3. 创建镜像

  • 从pool池中划分出一块硬盘空间,这里的硬盘空间只是一个限制条件
- 在管理端admin节点操作
1. 从pool池里面划分一个1G的硬盘img1
rbd create --size 1G --pool kvm img1

4. 查看镜像信息

- 在管理端admin节点操作
1. 查看pool池中所有划分出的硬盘空间
rbd ls --pool kvm -l
# NAME SIZE PARENT FMT PROT LOCK 
# img1 1GiB          2     

2. 指定一块硬盘空间,查看指定硬盘空间的详细信息 
rbd --image img1 --pool kvm info
# rbd image 'img1':
#	size 1GiB in 256 objects

5. 修改镜像大小

生产环境中,镜像大小一般建议只增不减!!!缩容可能会导致数据丢失!!!

- 在管理端admin节点操作
1. 将pool池中的硬盘img1大小修改为5个G
rbd resize --pool kvm --image img1 --size 5G
# Resizing image: 100% complete...done.

2. 缩减镜像的大小必须要加一个选项--allow-shrink
rbd resize --pool kvm --image img1 --size 2G --allow-shrink
# Resizing image: 100% complete...done

6. 删除镜像

推荐使用trash命令,这个命令删除是将镜像移动到回收站,如果想找回还可以恢复。

  • 如果使用remove或者rm都可以直接删除镜像,通常情况不建议直接删除镜像,直接删除镜像不可恢复!!!
- 在管理端admin节点操作
方式一: 将镜像放入回收站,数据可恢复
rbd trash move kvm/img1							将镜像放入回收站
rbd trash list --pool kvm						查看kvm放入回收站的硬盘
# 10e66b8b4567 img1
rbd trash restore kvm/10e66b8b4567				恢复kvm放入回收站的硬盘    

方式二: 直接删除镜像,不推荐!!!
rbd remove kvm/img2				
# Removing image: 100% complete...done.

7. 创建用户

  • 在ceph集群,在管理节点创建并授权一个用户可访问指定的rdb存储池,这里指定存储池为kvm。
- 在管理端admin节点操作
1. 创建并授权一个用户osd-mount可访问指定的rdb存储池kvm
ceph auth get-or-create client.osd-mount osd "allow * pool=kvm" mon "allow r" > /etc/ceph/ceph.client.osd-mount.keyring
# 创建或者获取账号密钥,密钥名字为osd-mount。对存储池kvm具备所有权限,对mon节点具备读权限。
# 追加到/etc/ceph/ceph.client.osd-mount.keyring文件中。

2. 查看密钥文件的内容 
cat ceph.client.osd-mount.keyring
# [client.osd-mount]
# key = AQB/EqVg37WmMxAA2NOXhlqpduXUmLRv8sHdnA==

3. 关闭RBD镜像特性,默认情况下只支持layering和striping特性,需要将其他的特性关闭,否则客户端无法正常使用
rbd feature disable kvm/img1 object-map, fast-diff, deep-flatten

客户端操作

切记客户端一定要在public_addr网络内

  • 我们这里模拟管理服务器(admin节点)当作客户端访问public网络,所以客户端的部分操作我们不需要重复操作了。

生产环境中,客户端需要安装ceph软件包,还需要有配置文件以及密钥环文件

- 生产环境中,需要将服务端的这些目录和文件推送给客户端
ssh root@1.1.1.10 mkdir /etc/ceph
scp /etc/ceph/ceph.client.osd-mount.keyring root@1.1.1.10:/etc/ceph
scp /etc/ceph/ceph.conf root@1.1.1.10:/etc/ceph

1. 安装ceph-common软件包

- 在客户端操作
yum -y install ceph-common 
注意:安装ceph-common软件包推荐使用软件包源和Ceph集群源相同,软件版本一致。

2. 执行客户端映射

- 在客户端操作
# 注意用户名为 osd-mount
1. 将存储池kvm中的硬盘img1进行映射,映射的过程中需要指定密钥环文件,指定用户名osd-mount	
cd /etc/ceph
rbd map --pool kvm --image img1 --keyring /etc/ceph/ceph.client.osd-mount.keyring --user osd-mount		
# /dev/rbd0

3. 查看/断开映射

- 在客户端操作
1. 查看映射过来的裸盘
rbd showmapped
# id pool image snap device    
# 0  kvm  img1  -    /dev/rbd0 

2. 解除映射
rbd unmap kvm/img1
rbd unmap -o force kvm/img1				# 强制解除

4. 格式化并挂载

- 在客户端操作
1. 将映射的硬盘/dev/rbd0格式化成xfs的文件系统 
mkfs.xfs /dev/rbd0 

2. 挂载使用格式化的文件系统
mount /dev/rbd0 /mnt/

快照功能

查看快照

1. 查看快照
rbd snap list kvm/img1
# SNAPID NAME       SIZE TIMESTAMP                
#      4 img1_snap1 1GiB Thu May 20 00:11:41 2021 

2. 查看快照json格式输出
rbd snap list kvm/img1 --format json --pretty-format 

限制快照数

1. 限制镜像可创建的快照数
rbd snap limit set kvm/img1 --limit 3

2. 解除限制
rbd snap limit clear kvm/img1

删除快照

1. 删除指定快照
rbd snap rm kvm/img1@img1_snap1

2. 删除所有快照
rbd snap rm kvm/img1

快照克隆

1. 在服务端ceph集群中重新创建一个快照,并将重新创建的快照克隆一个kvm/img3
rbd snap create kvm/img1@img1_snap666
rbd snap protect kvm/img1@img1_snap666
rbd clone kvm/img1@img1_snap666 --dest kvm/img3

2. 在客户端测试
umount /mnt			# 卸载之前的挂载
rbd map --pool kvm --image img3 --keyring /etc/ceph/ceph.client.osd-mount.keyring --user osd-mount		# 将克隆好的快照kvm/img3映射到客户端
# /dev/rbd1
mount /dev/rbd1 /mnt			# 挂载客户端	
ls /mnt				
## a.txt

快照展平

  • 通常情况下通过克隆而得到的镜像会保留对父快照的引用,这时候不可以删除该父快照,否则会有影响
rbd snap rm kvm/img1@img1_snap666				报错信息如下
# Removing snap: 0% complete...failed.
# rbd: snapshot 'img1_snap666' is protected from removal.
# 2021-05-20 00:46:38.171161 7f698cd12d40 -1 librbd::Operations: snapshot is protected
  • 如果响应删除快照但是想保留其子镜像,必须先展平其子镜像,展开的时间取决于镜像的大小。
1. 展平子镜像
rbd flatten kvm/img3
# Image flatten: 100% complete...done.

2. 取消快照保护
rbd snap unprotect kvm/img1@img1_snap666

3. 删除快照
rbd snap rm kvm/img1@img1_snap666
# Removing snap: 100% complete...done.

4. 查看镜像		
bd ls --pool kvm -l							kvm/img3依然存在
# NAME            SIZE PARENT FMT PROT LOCK 
# img1            5GiB          2      excl 
# img1@img1_snap1 1GiB          2           
# img3            5GiB          2           

测试

验证快照

1. 在客户端写入文件
echo 123 > /mnt/a.txt

2. 在服务端ceph集群中对镜像做快照
rbd snap create kvm/img1@img1_snap1				在服务端ceph集群中对镜像做快照

3. 在客户端删除文件
rm -rf /mnt/a.txt

4. 在客户端卸载挂载,断开映射
umount /mnt 
rbd unmap kvm/img1

5. 在服务端ceph集群中恢复快照
rbd snap rollback kvm/img1@img1_snap1

6. 客户端重新映射并挂载
rbd map --pool kvm --image img1 --keyring /etc/ceph/ceph.client.osd-mount.keyring --user osd-mount
mount /dev/rbd0 /mnt

7. 查看数据还原
ls /mnt 
# a.txt

验证ceph在线扩容

1. 重启一个客户端终端,执行一个脚本
while true;do echo 111 >> /mnt/a.txt;sleep 1;done

2. 在服务端ceph集群中调整ceph集群的大小
rbd resize --pool kvm --image img1 --size 5G

3. 在客户端执行下述命令
resize2fs /dev/rbd0
xfs_growfs /dev/rbd0

4. 查看扩容后的硬盘空间大小
df -h			查看文件系统扩容后的大小
# /dev/rbd0                5.0G   34M  5.0G   1% /mnt

RGW对象存储接口

  • 大多数对象存储的核心资源类型大同小异,如亚马逊S3̵、OpenStack Swift与RadosGW。这其中S3与Swift互不兼容,而RadosGW兼容S3与Swift。RadosGW为了兼容S3与Swift,Ceph在RadosGW集群的基础上提供了RGW(Rados GateWay)数据抽象层和管理层,它可以原生兼容S3和Swift的应用程序结构(API)。

  • S3和Swift他们可基于http或者https完成数据交换,由RadosGW内建的Civeweb提供服务,它还可以支持主流的Web服务器程序以代理的形式接收用户请求,在转发至RadoGW进程,这些代理服务器包括nginx、haproxy等。

  • RGW的功能依赖于对象网关守护进程实现,负责向客户端提供REST API接口。出于冗余负载均衡的需求,一个Ceph集群上通常不止一个RadoGW守护进程。在云计算环境中还会在多个Ceph集群中定义出多个Zone,这些Zone之间通过同步实现冗余功能,在本地环境中通常不需要Zone。

服务端操作

1. 创建radosgw接口

  • 如果使用搭配类似S3或者Swift接口的时候才需要部署/创建radosgw接口,RadosGW通常作为对象存储使用。

一般生产环境中rgw守护进程需要部署高可用

- 在管理端admin节点操作
1. 创建RadosGW(Rados GateWay)守护进程,可以创建在集群任何节点
cd /etc/ceph
ceph-deploy rgw create mon02

2. 查看RadosGW守护进程创建成功后,默认情况下自动创建的一系列用于RadosGW的存储池
ceph osd pool ls
# .rgw.root
# default.rgw.control		控制器信息
# default.rgw.meta			记录元数据
# default.rgw.log			日志信息

3. 默认情况下RadosGW会监听7480号端口,在创建完成后日志会有显示。我们也可以在浏览器输入mon02的ip地址加端口号查看(192.168.70.5:7480)。
curl http://mon02:7480
# url http://mon02:7480
# <?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>[root@admin ceph]# 

2. 更改监听端口号

  • RadosGW守护进程内部由Civeweb(公民网)实现,通过对Civeweb的配置可以完成对RadosGW的基本管理。
  • Civeweb默认监听在7480端口并提供http协议,如果需要修改配置需要编辑ceph.conf配置文件,在管理节点编辑ceph.conf,新增如下配置。
- 在管理端admin节点操作
1. 新增配置文件内容
vim /etc/ceph/ceph.conf
...
[client.rgw.mon02]
rgw_host = mon02
rgw_frontends = "civetweb port=8080 num_threads=500 request_timeout_ms=60000"		
	
2. 将管理节点的配置文件推送给其他各个节点
ceph-deploy --overwrite-conf config push mon01 mon02 mon03 osd01 osd02 osd03	# --overwrite-conf强制覆盖

- 在mon02节点操作
1. 重启radosgw守护进程服务
systemctl restart ceph-radosgw.target
netstat -an | grep 8080					查看修改后的端口号
# tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN 		

3. Http配置

  • 要在Civetweb(公民网)上启用SSL,首先你需要一个证书,它应该与提供Ceph对象网关服务的域名相对应。
- 在mon02(rgw节点)上进行操作
1. 生成CA证书私钥:civetweb.key
openssl genrsa -out civetweb.key 2048

2. 生成CA证书公钥:civetweb.crt
openssl req -new -x509 -key civetweb.key -out civetweb.crt -days 3650 -subj "/CN=1.1.1.5"

3. 将生成的证书合并为pem
cat civetweb.key civetweb.crt > /etc/ceph/civetweb.pem

4. 修改/etc/ceph/ceph.conf配置文件
vim /etc/ceph/ceph.conf 
...
[client.rgw.mon02]
rgw_host = mon02
# rgw_frontends = "civetweb port=8080 num_threads=500 request_timeout_ms=60000"
rgw_frontends = "civetweb port=80+443s ssl_certificate=/etc/ceph/civetweb.pem num_threads=500 request_timeout_ms=60000"
# port:https端口需要在端口号后面加一个s,ssl_certificate:指定证书的路径

5. 重启服务
systemctl restart ceph-radosgw.target
netstat -an |grep 443	
netstat -an |grep -w 80

- 测试
其他虚拟机输入: curl http://mon02
浏览器输入:https://192.168.70.5/:443或者http://192.168.70.5/

4. 创建RadosGW用户

- 在管理端admin节点操作
1. 创建Radosgw用户,可以在集群任何管理节点执行下面命令。
radosgw-admin user create --uid="test" --display-name="test user"
# uid:指定用户名 		display-name:指定用户描述信息

2. 查看用户信息
radosgw-admin user info --uid="test"
# "access_key": "22FB5A913HO5Z6H7WB60",
# "secret_key": "j9PTtEmRVqB8ykr8N6oceV2GNqWGNtGf7nL1heu1"

客户端操作

切记客户端一定要在public_addr网络内
在这里插入图片描述

S3接口访问测试

  • 我们可以直接用我们的真机进行测试,真机测试需要先安装Python。
1. 打开电脑的cmd,安装pip模块
C:\Users\彭于晏>pip3 install boto

2. 脚本可以放入pycharm中进行检测执行,需要先下载boto s3模块
# coding:utf-8
import ssl
import boto.s3.connection						
from boto.s3.key import Key

try:
    _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
    pass
else:
    ssl._create_default_https_context = _create_unverified_https_context

# test用户的keys信息
access_key = "22FB5A913HO5Z6H7WB60"
secret_key = "j9PTtEmRVqB8ykr8N6oceV2GNqWGNtGf7nL1heu1"

# rgw的ip与端口
host = "1.1.1.5"
port = 443          # 如果使用443端口,下述链接应设置is_secure=True
# port = 80         # 如果使用80端口,下述连接应设置is_secure=False

conn = boto.connect_s3(
    aws_access_key_id=access_key,
    aws_secret_access_key=secret_key,
    host=host,
    port=port,
    is_secure=True,
    validate_certs=False,
    calling_format=boto.s3.connection.OrdinaryCallingFormat()
)

# 创建存储桶
conn.create_bucket(bucket_name='bucket01')
conn.create_bucket(bucket_name='bucket02')

# 获得一个存储桶
bucket1 = conn.get_bucket('bucket01')
bucket2 = conn.get_bucket('bucket02')

# 判断是否存在,不存在返回None
exists = conn.lookup('bucket01')
print(exists)
exists = conn.lookup('bucket02')
print(exists)

# 查看bucket存储桶下的内容
print(list(bucket1.list()))
print(list(bucket2.list()))

# 向S3存储数据,数据来源可以是file、stream或者string
# 上传文件
bucket1 = conn.get_bucket('bucket01')
key = Key(bucket=bucket1, name='myfile')            # name的值的数据是key
key.set_contents_from_filename(r'D:\课件\venv\nana.txt')
print(key.get_contents_as_string())         # 读取s3中文件的内容,返回string即文件nana.txt的内容

# 上传字符串
bucket1 = conn.get_bucket('bucket01')       # 如果之前已经获取过对象,此处不需要重复获取
k = Key(bucket1)
k.key = 'xxx'
k.set_contents_from_string('lala is happy')
print(k.get_contents_as_string())

# 删除一个存储桶,在删除存储桶本身时必须删除该存储桶内的所有key
bucket1 = conn.get_bucket('bucket01')
for key in bucket1:
    key.delete()
bucket1.delete()

# bucket1.get_all_keys()[0].delete()        # 删除某一个key

# 迭代遍历buckets和keys
for bucket in conn:
    for key in bucket:
        print(key.name,key.get_contents_as_string())

# 判断文件加中是否有文件的方法
bucket1 = conn.get_bucket('bucket01')
res = bucket1.get_all_keys()
if len(res) > 0:
    print("有内容")
else:
    print("空文件")

RadosGW负载均衡

RadosGW负载均衡+高可用的架构如下

  • 在RadosGW前面加一层代理,同时还可以使用keepalived做高可用
  • 代理后端地址为RadosGW主机的IP+PORT,可以起多个RadosGW进程在不同的主机,这样就实现了负载均衡+高可用
  • 这时候HTTPS证书需要配置在前端代理,在使用s3cmd --configure的时候在"HTTP Proxy name"这里需要填写代理服务器访问的域名。
  • 在ceph.conf配置文件内不需要指定rgw_dns_name选项,配置为HTTP即可。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值