CEPH官方对RGW Multi-tenancy的介绍如下
RGW Multi-tenancy
多租户特性允许创建使用不同的存储桶和用户,前提是将其分离在不同的租户之下。例如,允许不同租户下的Swift API的用户,都可以创建形如“test”,“trove”这样很容易重复的桶名。
从Jewel版本开始,每个用户和桶都在租户之下。为了兼容性,RGW提供了一个名为空的“legacy”租户,如果引用桶时没有指明所属租户,则默认从“legacy”租户下获取该桶的信息。由于原有用户位于传统租户之下,因此他们将继续像以前一样创建和访问存储桶。RADOS中对象的布局以兼容的方式扩展,确保能顺利升级到Jewel版本。
指定租户下管理用户
租户实际没有做任何操作。当管理用户时,租户的概念才能起作用。为了明确使用租户的创建、修改和删除用户,可以使用附加提供的参数-tanant。或者在radosgw-admin名参数中使用语法<tenant>$<user>”
示例
创建S3用户testx$tester
radosgw-admin --tenant testx --uid tester--display-name "Test User" --access_key TESTER --secret test123 usercreate
创建Swift用户testx$tester
radosgw-admin --tenant testx --uid tester--display-name "Test User" --subuser tester:test --key-type swift--access full user create
请注意,指明租户的子用户必须在shell中引用
测试
创建租户为testx,用户名为tester的用户,swift子账号名为test,创建命令
radosgw-admin --tenant testx --uid tester--display-name "Test User" --subuser tester:test --key-type swift--access full user create
用该用户的keys调用SWIFT API创建桶test
创建租户为testx3,用户名为tester的用户,swift子账号名为test,创建命令
radosgw-admin --tenant testx3--uid tester --display-name "Test User" --subuser tester:test--key-type swift --access full user create
用该用户的keys调用SWIFT API创建桶test
底层使用命令radosgw-admin metadata list bucket查看RGW所有桶
由此可见,底层其实是把租户的名称加到桶名前面,这样实现不同租户下可以创建相同的桶名。
同样的,使用命令radosgw-admin metadata list user查看,可以看出RGW用户名格式为<tenant>$<user>
总结
RGWMulti-tenancy这个特性,底层实现其实就是在桶名和用户名前加个租户tenant字段来实现区分,对于用户而言是透明的,但是对于底层而言,是在用户名或者桶名加上了tenant字段而已。这个在做应用的时候会有一定的好处,即对不同租户的使用上来说,可以看成是可以创建同名的bucket桶。
测试python脚本(需先安装swiftclient的python包)
import requests import swiftclient KEY = '0os329T9icBwNB1Kpjt5SJi0BNTJPltcrZH5YCAj' USERNAME = 'testx$tester:test' server = '192.168.59.2:8080' url = 'http://%s/auth' % server conn = swiftclient.Connection( user=USERNAME, key=KEY, authurl=url, ) print USERNAME print conn.put_container("test") print conn.get_account()