安装CEPH对象网关

从管理服务器的工作目录中,在Ceph Object Gateway节点上安装Ceph Object Gateway软件包。例如:

ceph-deploy install --rgw <gateway-node1> [<gateway-node2> ...]
# 加上--rgw参数就只安装rgw的软件包,不加这个参数默认是安装所有Ceph的软件包(mon, osd, mds, rgw)
#注:我这里把ceph02,ceph03这两台主机作为rgw节点,前面已经安装好了环境

#如果要将Ceph Object Gateway节点设置为管理员节点,请从管理服务器的工作目录执行以下命令
ceph-deploy admin <node-name>
创建ceph网关实例
[ceph@ceph01 ceph-cluster]$ ceph-deploy rgw create ceph02 ceph03

网关运行后,您应该能够7480 通过未认证的请求在端口上访问它,如下所示:

http://ceph02:7480                    #我这里ceph02,ceph03是rgw节点,注意7480端口在firewall没开放的要开放

如果网关实例正常运行,您应该收到如下响应:

<ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Owner>
<ID>anonymous</ID>
<DisplayName/>
</Owner>
<Buckets/>
</ListAllMyBucketsResult>
更改默认端口

在ceph.conf文件中添加如下部分,如更改端口为80:

[client.rgw.ceph02]
rgw_frontends = "civetweb port=80"

[client.rgw.ceph03]
rgw_frontends = "civetweb port=80"

要使新的端口设置生效,请重新启动Ceph对象网关:

#在ceph02上执行
[ceph@ceph02 ~]$ sudo systemctl restart ceph-radosgw@rgw.ceph02
#在ceph03上执行
[ceph@ceph03 ~]$ sudo systemctl restart ceph-radosgw@rgw.ceph03

防火墙设置:

sudo firewall-cmd --list-all
sudo firewall-cmd --zone=public --add-port 80/tcp --permanent
sudo firewall-cmd --reload

注:rgw在ceph里默认是没有做负载的和高可用的,多个rgw节点可配合keepalived做负载

使用SSL CIVETWEB

在SSL与civetweb结合使用之前,需要一个与主机名匹配的证书,我这里以在ceph02的主机上创建一个自签名的认证,如下:

[ceph@ceph02 ceph]$ sudo openssl genrsa -des3 -out cephrgw.key 1024           #生成根证书的私钥,参数des3是加密算法
[ceph@ceph02 ceph]$ sudo openssl rsa -in cephrgw.key -out cephrgw.key         #去除密钥文件的保护密码,每次读取key文件时可以不需要口令
[ceph@ceph02 ceph]$ sudo openssl req -new -key cephrgw.key -out cephrgw.csr   #生成服务器端证书签名请求文件(csr文件),利用私钥生成一个根证书的申请,一般证书的申请格式都是csr。所以私钥和csr一般需要保存好
Common Name (eg, your name or your servers hostname) []:*.cephrgw.com        #其它提示默认回车就可以,在这行输入域名
[ceph@ceph02 ceph]$ sudo openssl x509 -req -days 3650 -in cephrgw.csr -signkey cephrgw.key -out cephrgw.crt   #自签名,有效期10年
[ceph@ceph02 ceph]$ sudo cp cephrgw.crt cephrgw.pem         #Civetweb要求必须采用pem格式,这里转一下格式
[ceph@ceph02 ceph]$ sudo cat cephrgw.key >> cephrgw.pem     #组合文件包含密钥,再把密钥追加到pem文件下

#在ceph.conf文件中配置rgw_dns_name和rgw_frontends两个参数信息,把配置文件再重推到各个节点上。
[client.rgw.ceph02]
host = ceph02
rgw_dns_name = cephrgw.com
rgw_frontends = civetweb port=80+443s ssl_certificate=/etc/ceph/cephrgw.pem  #可以只要https,去掉80端口即可

#在rgw实例所在的主机的etc/hosts下加入以下域名映射:
192.168.37.6 bucket.cephrgw.com
civetweb的其它参数

num_threads
设置Civetweb产生的用于处理传入HTTP连接的线程数。这有效地限制了前端可以服务的并发连接数。默认rgw_thread_pool_size

request_timeout_ms
Civetweb在放弃之前将等待更多传入数据的时间(以毫秒为单位)。默认:30000

access_log_file
访问日志文件的路径。完整路径或相对于当前工作目录的路径。如果不存在(默认),则不记录访问。

error_log_file
错误日志文件的路径。完整路径或相对于当前工作目录的路径。如果不存在(默认),则不记录错误。

配置存储桶分片
bucket index背景简介

bucket index是整个RGW里面一个非常关键的数据结构,用于存储bucket的索引数据,默认情况下单个bucket的index全部存储在一个shard文件(shard数量为0,主要以OMAP-keys方式存储在leveldb中),随着单个bucket内的Object数量增加,整个shard文件的体积也在不断增长,当shard文件体积过大就会引发各种问题,常见的问题有:

对index pool进行scrub或deep-scrub的时候,如果shard对应的Object过大,会极大消耗底层存储设备性能,造成io请求超时。
底层deep-scrub的时候耗时过长,会出现request blocked,导致大量http请求超时而出现50x错误,从而影响到整个RGW服务的可用性。
当坏盘或者osd故障需要恢复数据的时候,恢复一个大体积的shard文件将耗尽存储节点性能,甚至可能因为OSD响应超时而导致整个集群出现雪崩。

index shard 优化基本思路

1、index pool一定要上SSD,这个是本文优化的前提,没硬件支撑后面这些操作都是白搭。

2、合理设置bucket 的shard 数量

  • shard的数量并不是越多越好,过多的shard会导致部分类似list bucket的操作消耗大量底层存储IO,导致部分请求耗时过长。
  • shard的数量还要考虑到你OSD的故障隔离域和副本数设置。比如你设置index pool的size为2,并且有2个机柜,共24个OSD节点,理想情况下每个shard的2个副本都应该分布在2个机柜里面,比如当你shard设置为8的时候,总共有8*2=16个shard文件需要存储,那么这16个shard要做到均分到2个机柜。同时如果你shard超过24个,这很明显也是不合适的。

3、控制好单个bucket index shard的平均体积,目前推荐单个shard存储的Object信息条目在10-15W左右,过多则需要对相应的bucket做单独reshard操作(注意这个是高危操作,谨慎使用)。比如你预计单个bucket最多存储100W个Object,那么100W/8=12.5W,设置shard数为8是比较合理的。shard文件中每条omapkey记录大概占用200 byte的容量,那么150000*200/1024/1024 ≈ 28.61 MB,也就是说要控制单个shard文件的体积在28MB以内。

4、业务层面控制好每个bucket的Object上限,按每个shard文件平均10-15W Object为宜。

在Ceph配置文件ceph.conf中更改了存储分片配置后,请重新启动网关

[global]
rgw_override_bucket_index_max_shards = 2          #这个是全局的

[client.rgw.ceph02]
host = ceph02
rgw_dns_name = cephrgw.com
rgw_frontends = civetweb port=80+443s ssl_certificate=/etc/ceph/cephrgw.pem
rgw_override_bucket_index_max_shards = 2          #可以只针对某个rgw节点设置

对于联合配置,每个zone可能具有不同index_pool 的故障转移设置。要使值与区域组的zone一致,可以rgw_override_bucket_index_max_shards在网关的区域组配置中进行设置。

[ceph@ceph02 ~]$ sudo radosgw-admin zonegroup get > zonegroup.json   

#打开zonegroup.json文件并编辑bucket_index_max_shards每个zone的设置。保存zonegroup.json文件并重置区域组:
[ceph@ceph02 ~]$ radosgw-admin zonegroup set < zonegroup.json

#更新区域组后,请更新并提交period
radosgw-admin period update --commit
使用rgw
创建用于S3访问的RADOSGW用户

在rgw节点上执行:

[ceph@ceph02 ~]$ sudo radosgw-admin user create --uid="testuser" --display-name="First User"
{
    "user_id": "testuser",
    "display_name": "First User",
    "email": "",
    "suspended": 0,
    "max_buckets": 1000,
    "subusers": [],
    "keys": [
        {
            "user": "testuser",
            "access_key": "7OG6W4G8I1UTIYBYDK3V",
            "secret_key": "iZszNz4pBrWlJvVpAuhHubGalCqLgRKwSiICdUyn"
        }
    ],
    "swift_keys": [],
    "caps": [],
    "op_mask": "read, write, delete",
    "default_placement": "",
    "default_storage_class": "",
    "placement_tags": [],
    "bucket_quota": {
        "enabled": false,
        "check_on_raw": false,
        "max_size": -1,
        "max_size_kb": 0,
        "max_objects": -1
    },
    "user_quota": {
        "enabled": false,
        "check_on_raw": false,
        "max_size": -1,
        "max_size_kb": 0,
        "max_objects": -1
    },
    "temp_url_keys": [],
    "type": "rgw",
    "mfa_ids": []
}
创建一个SWIFT用户

如果需要这种访问,则需要创建一个Swift子用户。创建Swift用户需要两个步骤。第一步是创建用户。第二个是创建密钥。

#创建Swift用户:

[ceph@ceph02 ~]$ sudo radosgw-admin subuser create --uid=testuser --subuser=testuser:swift --access=full
{
    "user_id": "testuser",
    "display_name": "First User",
    "email": "",
    "suspended": 0,
    "max_buckets": 1000,
    "subusers": [
        {
            "id": "testuser:swift",
            "permissions": "full-control"
        }
    ],
    "keys": [
        {
            "user": "testuser",
            "access_key": "7OG6W4G8I1UTIYBYDK3V",
            "secret_key": "iZszNz4pBrWlJvVpAuhHubGalCqLgRKwSiICdUyn"
        }
    ],
    "swift_keys": [
        {
            "user": "testuser:swift",
            "secret_key": "MwyuaRbDyPeD9VmjpBa6a1PJjYApHj3miXNU7Scs"
        }
    ],
    "caps": [],
    "op_mask": "read, write, delete",
    "default_placement": "",
    "default_storage_class": "",
    "placement_tags": [],
    "bucket_quota": {
        "enabled": false,
        "check_on_raw": false,
        "max_size": -1,
        "max_size_kb": 0,
        "max_objects": -1
    },
    "user_quota": {
        "enabled": false,
        "check_on_raw": false,
        "max_size": -1,
        "max_size_kb": 0,
        "max_objects": -1
    },
    "temp_url_keys": [],
    "type": "rgw",
    "mfa_ids": []
}

#创建密钥:
[ceph@ceph02 ~]$ sudo radosgw-admin key create --subuser=testuser:swift --key-type=swift --gen-secret
{
    "user_id": "testuser",
    "display_name": "First User",
    "email": "",
    "suspended": 0,
    "max_buckets": 1000,
    "subusers": [
        {
            "id": "testuser:swift",
            "permissions": "full-control"
        }
    ],
    "keys": [
        {
            "user": "testuser",
            "access_key": "7OG6W4G8I1UTIYBYDK3V",
            "secret_key": "iZszNz4pBrWlJvVpAuhHubGalCqLgRKwSiICdUyn"
        }
    ],
    "swift_keys": [
        {
            "user": "testuser:swift",
            "secret_key": "jObtccZhTVNw39d7GeZ7GqOeo5yyU64MblN4CSCF"
        }
    ],
    "caps": [],
    "op_mask": "read, write, delete",
    "default_placement": "",
    "default_storage_class": "",
    "placement_tags": [],
    "bucket_quota": {
        "enabled": false,
        "check_on_raw": false,
        "max_size": -1,
        "max_size_kb": 0,
        "max_objects": -1
    },
    "user_quota": {
        "enabled": false,
        "check_on_raw": false,
        "max_size": -1,
        "max_size_kb": 0,
        "max_objects": -1
    },
    "temp_url_keys": [],
    "type": "rgw",
    "mfa_ids": []
}
测试S3访问

需要编写并运行Python测试脚本来验证S3访问。S3访问测试脚本将连接到radosgw,创建一个新存储桶并列出所有存储桶。
1、需要安装该python-boto软件包:

sudo yum install python-boto

2、创建Python脚本,并执行脚本:

[ceph@ceph01 ~]$ vi s3test.py 
import boto.s3.connection

access_key = '7OG6W4G8I1UTIYBYDK3V'
secret_key = 'iZszNz4pBrWlJvVpAuhHubGalCqLgRKwSiICdUyn'
conn = boto.connect_s3(
        aws_access_key_id=access_key,
        aws_secret_access_key=secret_key,
        host='192.168.37.6', port=80,           #这里替换成你rgw节点ip地址和端口,注意自签名证书这里用443端口证书的检查不过
        is_secure=False, calling_format=boto.s3.connection.OrdinaryCallingFormat(),
       )

bucket = conn.create_bucket('my-new-bucket')
for bucket in conn.get_all_buckets():
    print "{name} {created}".format(
    name=bucket.name,
    created=bucket.creation_date,
    )
[ceph@ceph01 ~]$ python s3test.py
my-new-bucket 2020-05-20T08:10:50.662Z
测试swift访问

要安装swift客户端,请执行以下命令:

sudo yum install python-setuptools
sudo easy_install pip
sudo pip install --upgrade setuptools
sudo pip install --upgrade python-swiftclient

要测试快速访问,请执行以下操作:

[ceph@ceph01 ~]$ swift -V 1 -A http://192.168.37.6:80/auth -U testuser:swift -K 'jObtccZhTVNw39d7GeZ7GqOeo5yyU64MblN4CSCF' list
my-new-bucket
文档更新时间: 2020-05-20 17:34   作者:子木