单机CEPH安装部署与对象存储
个人记录,仅供参考
本文只记录操作流程以及我遇到的报错和解决手段,不包含CEPH知识
报错若没遇到可以不看,遇到其他问题可以去附录里的链接找找
1. 单机CEPH安装部署
(1) 准备
虚拟机:VMware WorkStation 16 Pro
系统:Ubuntu 20.04.3 LTS
安装ceph-deploy:
sudo apt -y install ceph-deploy
ceph-deploy是一个ceph的简易部署工具,先装这个
(2) 创建新集群
创建一个文件夹 myceph 在其内部打开终端输入:
ceph-deploy new zuiyumeng-virtual-machine
其中zuiyumeng-virtual-machine为我的主机名(后面改成了zuiyumeng),主机名可以输入hostname命令查看
这个命令可能会出现下面的报错1、2
修改配置
因为是单节点集群,需要修改配置把集群的副本数量设置为1,就是将以下内容加入ceph.conf中(在myceph中)
[global]
osd pool default size = 1
osd pool default min size = 1
报错1:
[ceph_deploy][ERROR ] RuntimeError: AttributeError: module 'platform' has no attribute 'linux_distribution'
原因是python3.7后不再支持platform.linux_distribution
解决:
修改/usr/lib/python3/dist-packages/ceph_deploy/hosts/remotes.py中对应位置为如下所示(需要对应权限,可以在终端中sudo vim修改)
def platform_information(_linux_distribution=None):
""" detect platform information from remote host """
"""
linux_distribution = _linux_distribution or platform.linux_distribution
distro, release, codename = linux_distribution()
"""
distro = release = codename = None
try:
linux_distribution = _linux_distribution or platform.linux_distribution
distro, release, codename = linux_distribution()
except AttributeError:
pass
修改后如图:
报错2:
[zuiyumeng-virtual-machine][DEBUG ] IP addresses found: ['192.168.218.128']
[ceph_deploy.new][DEBUG ] Resolving host zuiyumeng-virtual-machine
[ceph_deploy][ERROR ] UnableToResolveError: Unable to resolve host: zuiyumeng-virtual-machine
解决:
不清楚什么情况,但试了一下,重新设置了一个主机名就好了
hostnamectl set-hostname zuiyumeng
其中zuiyumeng是新设置的主机名
然后输入
ceph-deploy new zuiyumeng
就成功了= =
(3) 安装ceph软件包
安装Ceph软件,这里安装L版本(luminous),命令:
ceph-deploy install --release luminous zuiyumeng
**初始化 mon **Ceph的整个集群的状态和配置信息等都是通过一个名为Monitor的集群管理的,因此首先需要启动Monitor服务。可以执行如下命令完成:
ceph-deploy mon create-initial
ceph-deploy admin zuiyumeng
启动Monitor节点后Ceph集群就可以访问了,通过ceph -s命令可以查看集群的状态。
部署ceph mgr ceph mgr也是一个必须部署的组件,可以通过如下命令部署。
ceph-deploy mgr create zuiyumeng
**部署ceph osd **osd是Ceph中存储数据的节点,这里就构建一个只有一个逻辑卷的OSD实验一下。
部署前先查看当前节点可用磁盘信息(重点看/的信息而不是\的信息)
ceph-deploy disk list zuiyumeng
这个命令可能发生下面的报错3
可以看到有/dev/sda 、/dev/sdb等等
当然,我这次实验所有节点都在这个虚拟机上所以也可以直接使用命令lsblk查看磁盘
如果没有sdb的话需要去再挂载一个(保险起见,为了不影响sda,但我也没试过直接用sda),操作过程见报错3后面
确认有sdb后先擦除磁盘
ceph-deploy disk zap zuiyumeng /dev/sdb
这时可能出现报错4
之后就可以创建一个运行在整个盘上的OSD
ceph-deploy osd create zuiyumeng --data /dev/sdb
这时可能出现报错5
到此,CEPH以及安装并部署完毕了
报错3
[zuiyumeng][INFO ] Running command: sudo fdisk -l
[ceph_deploy][ERROR ] Traceback (most recent call last):
[ceph_deploy][ERROR ] File "/usr/lib/python3/dist-packages/ceph_deploy/util/decorators.py", line 69, in newfunc
[ceph_deploy][ERROR ] return f(*a, **kw)
[ceph_deploy][ERROR ] File "/usr/lib/python3/dist-packages/ceph_deploy/cli.py", line 166, in _main
[ceph_deploy][ERROR ] return args.func(args)
[ceph_deploy][ERROR ] File "/usr/lib/python3/dist-packages/ceph_deploy/osd.py", line 434, in disk
[ceph_deploy][ERROR ] disk_list(args, cfg)
[ceph_deploy][ERROR ] File "/usr/lib/python3/dist-packages/ceph_deploy/osd.py", line 375, in disk_list
[ceph_deploy][ERROR ] if line.startswith('Disk /'):
[ceph_deploy][ERROR ] TypeError: startswith first arg must be bytes or a tuple of bytes, not str
[ceph_deploy][ERROR ]
解决:
sudo vim /usr/lib/python3/dist-packages/ceph_deploy/osd.py
修改
if line.startswith('Disk /'):
为
if line.startswith(b'Disk /'):
我的在375行
VMware加载新磁盘
先关闭客户机(关机)
操作一图览,注意磁盘大小不用这么大,我最终好像就用了几十M,或者用完后跟据磁盘文件路径直接删除即可
报错4:
[zuiyumeng][ERROR ] RuntimeError: command returned non-zero exit status: 1
[ceph_deploy][ERROR ] RuntimeError: Failed to execute command: /usr/sbin/ceph-volume lvm zap /dev/sdb
解决:
手动查看并删除原osd创建的lvm信息
dmsetup ls
删除ceph osd lvm映射关系
dmsetup remove ceph--7438e419--a9e4--430c--98e2--64c9a7506562-osd--block--01320314--335f--4b9c--b310--015b9aab8ff6
这里后面ceph-.....替换成你的遗留信息名字
删除lv
lvremove /dev/mapper/ceph--7438e419--a9e4--430c--98e2--64c9a7506562-osd--block--01320314--335f--4b9c--b310--015b9aab8ff6
删除相关文件(如果还有的话)
rm –rf /dev/ceph--7438e419--a9e4--430c--98e2--64c9a7506562
PS: 这个解决方法我找了5个小时....
报错5:
[zuiyumeng][WARNIN] Running command: /usr/bin/ceph-authtool --gen-print-key
[zuiyumeng][WARNIN] Running command: /usr/bin/ceph --cluster ceph --name client.bootstrap-osd --keyring /var/lib/ceph/bootstrap-osd/ceph.keyring -i - osd new 41f1c070-8a32-43c6-ad44-964bf8757cbc
[zuiyumeng][WARNIN] Running command: lvcreate --yes -l 25 -n osd-block-41f1c070-8a32-43c6-ad44-964bf8757cbc ceph-d657d83a-bc89-4ebd-a0b7-24fa754d6c16
[zuiyumeng][WARNIN] stderr: Volume group "ceph-d657d83a-bc89-4ebd-a0b7-24fa754d6c16" has insufficient free space (0 extents): 25 required.
[zuiyumeng][WARNIN] --> Was unable to complete a new OSD, will rollback changes
[zuiyumeng][WARNIN] Running command: /usr/bin/ceph --cluster ceph --name client.bootstrap-osd --keyring /var/lib/ceph/bootstrap-osd/ceph.keyring osd purge-new osd.0 --yes-i-really-mean-it
[zuiyumeng][WARNIN] stderr: 2022-06-17T23:26:53.831+0800 7f2fee202700 -1 auth: unable to find a keyring on /etc/ceph/ceph.client.bootstrap-osd.keyring,/etc/ceph/ceph.keyring,/etc/ceph/keyring,/etc/ceph/keyring.bin,: (2) No such file or directory
[zuiyumeng][WARNIN] 2022-06-17T23:26:53.831+0800 7f2fee202700 -1 AuthRegistry(0x7f2fe8059360) no keyring found at /etc/ceph/ceph.client.bootstrap-osd.keyring,/etc/ceph/ceph.keyring,/etc/ceph/keyring,/etc/ceph/keyring.bin,, disabling cephx
[zuiyumeng][WARNIN] stderr: purged osd.0
[zuiyumeng][WARNIN] --> RuntimeError: command returned non-zero exit status: 5
[zuiyumeng][ERROR ] RuntimeError: command returned non-zero exit status: 1
[ceph_deploy.osd][ERROR ] Failed to execute command: /usr/sbin/ceph-volume --cluster ceph lvm create --bluestore --data /dev/sdb
[ceph_deploy][ERROR ] GenericError: Failed to create 1 OSDs
解决:
方法同报错4
2. 对象存储
**部署ceph rgw **
ceph-deploy rgw create zuiyumeng
验证rgb,浏览器访问 http://192.168.218.128:7480/
其中192.168.218.128为你文件夹中ceph.conf文件中mon_host后面的ip,端口号不变
可以看到输出以下内容
This XML file does not appear to have any style information associated with it. The document tree is shown below.
<ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Owner>
<ID>anonymous</ID>
<DisplayName/>
</Owner>
<Buckets/>
</ListAllMyBucketsResult>
部署ceph mds
ceph-deploy mds create zuiyumeng
查看 mds 状态
ceph mds stat
可以看到输出
1 up:standby
**创建ceph账号 **
radosgw-admin user create --uid=admin --display-name=admin --admin
可以看到输出的(你的值和我的不一样),这两个等下要用
"access_key": "02ZC6NZW5FMET8FVDIAW",
"secret_key": "NuO951B79lBlA72qlUGMBMIBsYDtA5wVfr2omdRj"
可以随时用
radosgw-admin user info --uid admin
查看这两个key
使用s3cmd工具管理ceph桶
sudo apt-get install s3cmd
配置
s3cmd --configure
输入刚才的两个key,其他的全部回车,最后会有retry....填n,save.....填y
修改配置
vim /root/.s3cfg
修改以下内容:
host_base = 192.168.218.128:7480
host_bucket = 192.168.218.128:7480/%(bucket)
use_https = False
使用对象存储
执行创建桶操作
s3cmd mb s3://test
查看桶是否创建成功
s3cmd ls
上传一个文件夹到刚才的桶中(在存有文件的文件夹打开终端)
s3cmd put /home/zuiyumeng/文档/tmp/* s3://test/
从桶中下载文件(需要先创建文件夹)
s3cmd get s3://test/* /home/zuiyumeng/文档/tmp1/
常用命令
1、配置,主要是 Access Key ID 和 Secret Access Key
s3cmd --configure
2、列举所有 Buckets。(bucket 相当于根文件夹)
s3cmd ls
3、创建 bucket,且 bucket 名称是唯一的,不能重复,默认创建的 bucket 是公开的。
s3cmd mb s3://my-bucket-name
4、删除空 bucket
s3cmd rb s3://my-bucket-name
5、列举 Bucket 中的内容
s3cmd ls s3://my-bucket-name
6、上传
s3cmd put file.txt s3://my-bucket-name/file.txt
支持批量上传,直接指定多个文件,如
s3cmd put t.py s3://tccpoc/t.py up.py s3://tccpoc/up.py
如果上传终断,比如ctrl+c,会显示upload-id,按照指示,带上`--upload-id`就可以实现断点上传
7、上传并将权限设置为所有人可读
s3cmd put --acl-public file.txt s3://my-bucket-name/file.txt
--acl-private,也可以是私有
8、批量上传文件
s3cmd put ./* s3://my-bucket-name/
9、下载文件
s3cmd get s3://my-bucket-name/file.txt file.txt
支持批量下载,直接指定多个文件,如
s3cmd get s3://tccpoc/t.py s3://tccpoc/up.py
如果下载终断,比如ctrl+c,带上参数`--continue`,可以实现断点下载
10、批量下载
s3cmd get s3://my-bucket-name/* ./
11、删除文件,
s3cmd del s3://my-bucket-name/file.txt
支持批量删除,直接指定多个 bucket 对象,如
s3cmd del s3://my-bucket-name/file.txt s3://my-bucket-name/file2.txt
12、来获得对应的bucket所占用的空间大小
s3cmd du -H s3://my-bucket-name
通过python控制
安装librados,该libradosAPI 是用 C++ 编写的,具有针对 C、Python、Java 和 PHP 的附加绑定。
sudo apt-get install librados-dev
安装python3-rados为python程序提供支持
sudo apt-get install python3-rados
编写程序完成上面的文件上传下载
注意上传需要str->byte用encode(),下载byte->str用decode()不然会报错
import rados
cluster = rados.Rados(conffile='/home/zuiyumeng/文档/myceph/ceph.conf')
cluster.connect()
# 删除池
#cluster.delete_pool('test')
# 创建池test
#cluster.create_pool('test')
# 连接到test池
ioctx = cluster.open_ioctx('test')
# up
file_name = "红高粱.txt"
f = open("/home/zuiyumeng/文档/tmp/红高粱.txt", "r",encoding = "utf-8")
file_content = f.read().encode()
f.close()
ioctx.write_full(file_name, file_content)
file_name = "三国演义.txt"
f = open("/home/zuiyumeng/文档/tmp/三国演义.txt", "r",encoding = "utf-8")
file_content = f.read().encode()
f.close()
ioctx.write_full(file_name, file_content)
file_name = "史记.txt"
f = open("/home/zuiyumeng/文档/tmp/史记.txt", "r",encoding = "utf-8")
file_content = f.read().encode()
f.close()
ioctx.write_full(file_name, file_content)
file_name = "水浒传.txt"
f = open("/home/zuiyumeng/文档/tmp/水浒传.txt", "r",encoding = "utf-8")
file_content = f.read().encode()
f.close()
ioctx.write_full(file_name, file_content)
file_name = "西游记.txt"
f = open("/home/zuiyumeng/文档/tmp/西游记.txt", "r",encoding = "utf-8")
file_content = f.read().encode()
f.close()
ioctx.write_full(file_name, file_content)
file_name = "资治通鉴.txt"
f = open("/home/zuiyumeng/文档/tmp/资治通鉴.txt", "r",encoding = "utf-8")
file_content = f.read().encode()
f.close()
ioctx.write_full(file_name, file_content)
# 将文件下载(写入)到本地
f = open("红高粱.txt", "w")
f.write(ioctx.read("红高粱.txt").decode())
f.close()
f = open("三国演义.txt", "w")
f.write(ioctx.read("三国演义.txt").decode())
f.close()
f = open("史记.txt", "w")
f.write(ioctx.read("史记.txt").decode())
f.close()
f = open("水浒传.txt", "w")
f.write(ioctx.read("水浒传.txt").decode())
f.close()
f = open("西游记.txt", "w")
f.write(ioctx.read("西游记.txt").decode())
f.close()
f = open("资治通鉴.txt", "w")
f.write(ioctx.read("资治通鉴.txt").decode())
f.close()
ioctx.close()
cluster.shutdown()
附录:主要参考文章
单机版Ceph环境部署,Linux平台
Ceph分布式存储系列(三):Ceph集群在线扩容及OSD相关命令
k8s学习笔记——ceph集群安装
Rook Ceph OSD异常,格式化osd硬盘重新挂载
Ceph 基础篇 - 对象存储使用
Ceph对象存储单机部署
s3cmd使用介绍
【Python】Ceph的python接口
ceph的python_api文档