【分布式系统】Ceph对象存储系统之RGW接口

2024-07-13 1369阅读

目录

【分布式系统】Ceph对象存储系统之RGW接口
(图片来源网络,侵删)

一.对象存储概述

二.创建RGW接口

1.在管理节点创建一个 RGW 守护进程

2.创建成功后默认情况下会自动创建一系列用于 RGW 的存储池

3.默认情况下 RGW 监听 7480 号端口

4.开启 http+https ,更改监听端口

5.在 rgw 节点上查看端口

6.在客户端访问验证

7.创建 RadosGW 账户

8.客户端测试

三.总结


接着之前的部署集群架构

一.对象存储概述

对象存储(object storage)是非结构数据的存储方法,对象存储中每一条数据都作为单独的对象

存储,拥有唯一的地址来识别数据对象,通常用于云计算环境中

不同于其他数据存储方法,基于对象的存储不使用目录树。

虽然在设计与实现上有所区别,但大多数对象存储系统对外呈现的核心资源类型大同小异。从客户

端的角度来看,分为以下几个逻辑单位

  • Amazon S3

    提供了

    1. 用户(User)
    2. 存储桶(Bucket)
    3. 对象(Object)

    三者的关系是

    1. User将Object存储到系统上的Bucket
    2. 存储桶属于某个用户并可以容纳对象,一个存储桶用于存储多个对象
    3. 同一个用户可以拥有多个存储桶,不同用户允许使用相同名称的Bucket,因此User名称即可做为Bucket的名称空间
    • OpenStack Swift
      1. 提供了user、container和object分别对应于用户、存储桶和对象,
      2. 它还额外为user提供了父级组件account,用于表示一个项目或用户组
      3. 因此一个account中可以包含一到多个user,它们可共享使用同一组container,并为container提供名称空间
      • RadosGW
        1. 提供了user、subuser、bucket和object,其中的user对应于S3的user,而subuser则对应于Swift的user
        2. user和subuser都不支持为bucket提供名称空间,因此不同用户的存储桶不允许同名
        3. 自jewel版本起,RadosGW引入了tenant(租户)用于为user和bucket提供名称空间,但他是个可选组件

        二.创建RGW接口

        如果需要使用到类似 S3 或者 Swift 接口时候才需要部署/创建 RadosGW 接口,RadosGW 通常作

        为对象存储(Object Storage)使用,类于阿里云OSS

        1.在管理节点创建一个 RGW 守护进程

        cd /etc/ceph
        ceph-deploy rgw create node01
        ceph -s
        

        2.创建成功后默认情况下会自动创建一系列用于 RGW 的存储池

        ceph osd pool ls
        rgw.root 
        default.rgw.control			#控制器信息
        default.rgw.meta			#记录元数据
        default.rgw.log				#日志信息
        default.rgw.buckets.index	#为 rgw 的 bucket 信息,写入数据后生成
        default.rgw.buckets.data	#是实际存储的数据信息,写入数据后生成

        3.默认情况下 RGW 监听 7480 号端口

        ssh root@node01 netstat -lntp | grep 7480
        

        4.开启 http+https ,更改监听端口

        RadosGW 守护进程内部由 Civetweb 实现,通过对 Civetweb 的配置可以完成对 RadosGW 的

        基本管理

         

        #要在 Civetweb 上启用SSL,首先需要一个证书,在 rgw 节点生成证书
        1)生成CA证书私钥:
        openssl genrsa -out civetweb.key 2048
         
        2)生成CA证书公钥:
        openssl req -new -x509 -key civetweb.key -out civetweb.crt -days 3650 -subj "/CN=192.168.20.7"
         
        #3、将生成的证书合并为pem
        cat civetweb.key civetweb.crt > /etc/ceph/civetweb.pem

        更改监听端口

        vim ceph.conf
        ......
        [client.rgw.node01]
        rgw_host = node01
        rgw_frontends = "civetweb port=80+443s ssl_certificate=/etc/ceph/civetweb.pem num_threads=500 request_timeout_ms=60000"
         
        ------------------------------------------------------------
        ●rgw_host:对应的RadosGW名称或者IP地址
        ●rgw_frontends:这里配置监听的端口,是否使用https,以及一些常用配置:
        •port:如果是https端口,需要在端口后面加一个s。
        •ssl_certificate:指定证书的路径。
        •num_threads:最大并发连接数,默认为50,根据需求调整,通常在生产集群环境中此值应该更大
        •request_timeout_ms:发送与接收超时时长,以ms为单位,默认为30000
        •access_log_file:访问日志路径,默认为空
        •error_log_file:错误日志路径,默认为空
        ------------------------------------------------------------
         
        #修改完 ceph.conf 配置文件后需要重启对应的 RadosGW 服务,再推送配置文件
        ceph-deploy --overwrite-conf config push node0{1..3}
        systemctl restart ceph-radosgw.target

        5.在 rgw 节点上查看端口

        netstat -lntp | grep -w 80
        netstat -lntp | grep 443

        6.在客户端访问验证

        curl http://192.168.80.105:80
        curl -k https://192.168.80.105:443

        7.创建 RadosGW 账户

        在管理节点使用 radosgw-admin 命令创建 RadosGW 账户

        radosgw-admin user create --uid="rgwuser" --display-name="rgw test user"
        
        #创建成功后将输出用户的基本信息,其中最重要的两项信息为 access_key 和 secret_key 。用户创建成后功,如果忘记用户信息可以使用下面的命令查看
        radosgw-admin user info --uid="rgwuser"

        8.客户端测试

        1)在客户端安装 python3、python3-pip
        yum install -y python3 python3-pip
        python3 -V
        Python 3.6.8
        pip3 -V
        pip 9.0.3 from /usr/lib/python3.6/site-packages (python 3.6)
        2)安装 boto 模块,用于测试连接 S3
        pip3 install boto
        3)测试访问 S3 接口
        echo 123123 > /opt/123.txt
        vim test.py
        #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 = "ER0SCVRJWNRIKFGQD31H"                          #输入 RadosGW 账户的 access_key
        secret_key = "YKYjk7L4FfAu8GHeQarIlXodjtj1BXVaxpKv2Nna"      #输入 RadosGW 账户的 secret_key
        #rgw的ip与端口
        host = "192.168.80.11"        #输入 RGW 接口的 public 网络地址
        #如果使用443端口,下述链接应设置is_secure=True
        port = 443
        #如果使用80端口,下述链接应设置is_secure=False
        #port = 80
        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')
        #二:判断是否存在,不存在返回None
        exists = conn.lookup('bucket01')
        print(exists)
        #exists = conn.lookup('bucket02')
        #print(exists)
        #三:获得一个存储桶
        #bucket1 = conn.get_bucket('bucket01')
        #bucket2 = conn.get_bucket('bucket02')
        #四:查看一个bucket下的文件
        #print(list(bucket1.list()))
        #print(list(bucket2.list()))
        #五:向s3上存储数据,数据来源可以是file、stream、or string
        #5.1、上传文件
        #bucket1 = conn.get_bucket('bucket01')
        # name的值是数据的key
        #key = Key(bucket=bucket1, name='myfile')
        #key.set_contents_from_filename('/opt/123.txt')
        # 读取 s3 中文件的内容,返回 string 即文件 123.txt 的内容
        #print(key.get_contents_as_string())
        #5.2、上传字符串
        #如果之前已经获取过对象,此处不需要重复获取
        bucket2 = conn.get_bucket('bucket02')
        key = Key(bucket=bucket2, name='mystr')
        key.set_contents_from_string('hello world')
        print(key.get_contents_as_string())
        #六:删除一个存储桶,在删除存储桶本身时必须删除该存储桶内的所有key
        bucket1 = conn.get_bucket('bucket01')
        for key in bucket1:
            key.delete()
        bucket1.delete()
        4)按照以上步骤执行 python 脚本测试
        python3 test.py
        

        三.总结

        RGW操作

        服务端

        ceph-deploy rgw create 节点列表                                      
        #创建RGW接口,还可以修改ceph配置文件,设置RGW监听的端口号(默认端口为7480)
        radosgw-admin user create --uid="用户名" --display-name="备注信息"      
        #创建RGW账户,获取access_key和secret_key

        客户端

        1. 准备好客户端应用程序
        2. 使用RGW账户的access_key和secret_key做验证访问RGW对象存储接口
        3. 在对象存储里创建bucket存储桶
        4. 在bucket存储桶里创建对象object,上传数据
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]