赞
踩
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文件系统
- 在管理端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. 创建用户
- 在管理端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网络内
生产环境中,客户端需要安装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
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. 创建镜像
- 在管理端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命令,这个命令删除是将镜像移动到回收站,如果想找回还可以恢复。
- 在管理端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. 创建用户
- 在管理端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网络内
生产环境中,客户端需要安装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
大多数对象存储的核心资源类型大同小异,如亚马逊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接口
一般生产环境中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. 更改监听端口号
- 在管理端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配置
- 在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接口访问测试
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负载均衡+高可用的架构如下
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。