• 单机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
    

    修改后如图:
    image.png

    报错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,或者用完后跟据磁盘文件路径直接删除即可
    image.png

    报错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文档

  • 相关阅读:
    Camera HAL3学习
    Android GPU呈现模式分析
    Android O版本自定义日志输出目录
    Android Configstore HAL
    Ubuntu下设置adb path的方法
    Ubuntu使用技巧
    PHP学习笔记
    mysql安装
    在ubuntu中安装Python
    OS X在使用<semaphore.h>时报错
  • 原文地址:https://www.cnblogs.com/zuiyumeng/p/16387733.html
Copyright © 2020-2023  润新知