在一个Ceph集群里部署一个multisite RGW环境。有什么意义吗?没有,存属个人折腾。由于资源有限,所以只能在一个集群里委屈了。
限盐少许,直接开整。
版本 14.2.3 (0f776cf838a1ae3130b2b73dc26be9c95c6ccc39) nautilus (stable)
RGW配置部署 一个Site的部署 修改.rgw.root
Pool 修改/etc/ceph/ceph.conf
中使用到.rgw.root
pool的所有配置项,将其改为exter.rgw.root
。ceph.conf
中没有显示的配置,所以建议查找一下源代码中的配置options.cc
。 之后再创建realm
、zonegroup
、zone
等信息都会记录到exter.rgw.root
中。
1 2 3 4 5 rgw_zone_root_pool = exter.rgw.root rgw_region_root_pool = exter.rgw.root rgw_zonegroup_root_pool = exter.rgw.root rgw_realm_root_pool = exter.rgw.root rgw_period_root_pool = exter.rgw.root
配置完成后,启动RGW。本人将RGW安装到了容器中,所以下面给出容器的启动命令
1 docker run -d --net=host --name rgw -v /etc/ceph/:/etc/ceph/ -v /var/lib/ceph/:/var/lib/ceph/ ceph/daemon:latest-nautilus rgw
运行后记得用docker logs -f rgw
看一下rgw日志,确保其正常运行。
然后使用ceph df
看一下,当前RGW创建了哪些Pools
1 2 3 4 5 6 7 8 9 10 # ceph df GLOBAL: SIZE AVAIL RAW USED %RAW USED 57 GiB 56 GiB 654 MiB 1.12 POOLS: NAME ID USED %USED MAX AVAIL OBJECTS exter.rgw.root 18 1.2 KiB 0 27 GiB 4 default.rgw.control 19 0 B 0 27 GiB 8 default.rgw.meta 20 0 B 0 27 GiB 0 default.rgw.log 21 0 B 0 27 GiB 33
创建Realm 创建一个 realm ,若不创建,后续在设置自定义的zone为default时会报无效参数的错误。此问题,可以看rgw_admin.cc
的源码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 4438 case OPT_ZONE_DEFAULT:4439 {4440 RGWZoneGroup zonegroup (zonegroup_id,zonegroup_name) ;4441 int ret = zonegroup.init(g_ceph_context, store->svc()->sysobj);4442 if (ret < 0 ) {4443 cerr << "WARNING: failed to initialize zonegroup " << zonegroup_name << std ::endl ;4444 }4445 if (zone_id.empty() && zone_name.empty()) {4446 cerr << "no zone name or id provided" << std ::endl ;4447 return EINVAL;4448 }4449 RGWZoneParams zone (zone_id, zone_name) ;4450 ret = zone.init(g_ceph_context, store->svc()->sysobj);4451 if (ret < 0 ) {4452 cerr << "unable to initialize zone: " << cpp_strerror(-ret) << std ::endl ;4453 return -ret;4454 }4455 ret = zone.set_as_default();4456 if (ret < 0 ) {4457 cerr << "failed to set zone as default: " << cpp_strerror(-ret) << std ::endl ;4458 return -ret;4459 }4460 }4461 break ;
在failed to set zone as default
这个位置报错。
所以先配置一个realm吧
1 2 3 4 5 6 7 8 9 10 11 12 [root@master ~]# radosgw-admin realm list { "default_info": "", "realms": [] } [root@master ~]# radosgw-admin realm create --rgw-realm=default --default { "id": "f334e6c2-c2b4-4c04-b541-f64d96c10c07", "name": "default", "current_period": "40775bd3-d592-46c0-98c7-33171915825b", "epoch": 1 }
设置zonegroup的default info 此时zonegroup的default info缺失了
1 2 3 4 5 6 7 8 9 [root@master ~]# radosgw-admin zonegroup list { "default_info": "", "zonegroups": [ "default" ] } [root@master ~]# radosgw-admin zonegroup get failed to init zonegroup: (2) No such file or directory
使用 zonegroup default
重新设置default info
1 2 3 4 5 6 7 8 [root@master ~]# radosgw-admin zonegroup default --rgw-zonegroup=default [root@master ~]# radosgw-admin zonegroup list { "default_info": "57b6eaac-63da-42dd-b69d-f7e871ce74c9", "zonegroups": [ "default" ] }
创建Zone 接下来,创建我们需要的zone, 并设置其为default
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 [root@master ~]# radosgw-admin zone list { "default_info": "", "zones": [ "default" ] } [root@master ~]# radosgw-admin zone create --rgw-zonegroup=default --rgw-zone=exter --master --default 2019-10-14 19:00:50.322 7f3698ef7240 0 NOTICE: overriding master zone: f2a55476-fb68-4ea7-af97-251b91e94747 { "id": "69234f1d-8f48-4431-b45f-912087431a47", "name": "exter", "domain_root": "exter.rgw.meta:root", "control_pool": "exter.rgw.control", "gc_pool": "exter.rgw.log:gc", "lc_pool": "exter.rgw.log:lc", "log_pool": "exter.rgw.log", "intent_log_pool": "exter.rgw.log:intent", "usage_log_pool": "exter.rgw.log:usage", "reshard_pool": "exter.rgw.log:reshard", "user_keys_pool": "exter.rgw.meta:users.keys", "user_email_pool": "exter.rgw.meta:users.email", "user_swift_pool": "exter.rgw.meta:users.swift", "user_uid_pool": "exter.rgw.meta:users.uid", "otp_pool": "exter.rgw.otp", "system_key": { "access_key": "", "secret_key": "" }, "placement_pools": [ { "key": "default-placement", "val": { "index_pool": "exter.rgw.buckets.index", "data_pool": "exter.rgw.buckets.data", "data_extra_pool": "exter.rgw.buckets.non-ec", "index_type": 0, "compression": "" } } ], "metadata_heap": "", "realm_id": "f334e6c2-c2b4-4c04-b541-f64d96c10c07" } [root@master ~]# radosgw-admin zone list { "default_info": "69234f1d-8f48-4431-b45f-912087431a47", "zones": [ "exter", "default" ] }
删除default zone 现在你会发现有两个zone了,一个是我们新建的,另一个是default,这个default没用了,我们把它删掉。
1 radosgw-admin zone delete --rgw-zone=default --default
细心的朋友可能会发现radosgw-admin命令中没有zone delete
这个命令啊,-h
中显示的是zone rm
啊。这是Bug,嘿嘿嘿~~~
1 2 3 4 5 6 7 8 9 10 11 12 [root@master ~]# radosgw-admin -h | grep -i zone | grep -i rm zonegroup rm remove a zone group info zonegroup rm remove a zone from a zonegroup zonegroup placement rm remove a placement target from a zonegroup zone rm remove a zone zone placement rm remove a zone placement target --tags-rm=<list> list of tags to remove for zonegroup placement modify command --sync-from-rm=[zone-name][,...] [root@master ~]# radosgw-admin -h | grep -i delete replica mdlog get/delete replica datalog get/delete (NOTE: required to delete a non-empty bucket)
重启RGW服务 1 2 [root@master ~]# docker stop rgw [root@master ~]# docker start rgw
删除default相关的Pools 1 2 3 4 5 6 7 8 9 10 11 12 13 [root@master ~]# ceph df GLOBAL: SIZE AVAIL RAW USED %RAW USED 57 GiB 56 GiB 657 MiB 1.13 POOLS: NAME ID USED %USED MAX AVAIL OBJECTS exter.rgw.root 18 1.7 KiB 0 27 GiB 13 default.rgw.control 19 0 B 0 27 GiB 8 default.rgw.meta 20 0 B 0 27 GiB 0 default.rgw.log 21 0 B 0 27 GiB 175 exter.rgw.control 22 0 B 0 27 GiB 8 exter.rgw.meta 23 0 B 0 27 GiB 0 exter.rgw.log 24 0 B 0 27 GiB 159
重启RGW服务后,发现多了三个Pool exter.rgw.control
、exter.rgw.meta
、exter.rgw.log
。而default开头的pool就没用了,可以删除了。
1 2 3 4 5 6 [root@master ~]# ceph osd pool rm default.rgw.control default.rgw.control --yes-i-really-really-mean-it pool 'default.rgw.control' removed [root@master ~]# ceph osd pool rm default.rgw.meta default.rgw.meta --yes-i-really-really-mean-it pool 'default.rgw.meta' removed [root@master ~]# ceph osd pool rm default.rgw.log default.rgw.log --yes-i-really-really-mean-it pool 'default.rgw.log' removed
另一个Site的部署 *** 参考一个Site的部署方法
吧 ***
Zone之间的数据同步 如果上述的部署方法你都清楚了,相信配置一个Zone之间同步数据的Multisite应该不在话下了。下面说说数据同步的几点注意事项吧。
数据同步必须是在不同zone之间进行的,但zone必须在同一zonegroup之下。
每一个zonegroup内都有一个master zone;一个realm中有多个zonegroup,但master zonegroup只有一个,realm命名空间全局唯一;
数据分为 period 数据、user数据、bucket数据、object数据。 period数据需要用户手动配置,不能自动同步; user数据只能从master zone写入,然后非master zone同步; bucket数据可以从任意一个zone写入,但最后都会转发给master zone,待master 写入成功后,其它zone同步数据,若master失败,其它zone亦失败; object数据可以从任意一个zone写入,若master zone写入失败,不影响其它zone写入情况。
每个zone的endpoints
需要配置,否则zone之间无法正常访问
zone上配置的access key
和secret
要与master zone一致
补个图吧:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 +--- master zone | +--- secondary zone 1 | +---------- master zonegroup ----+--- ...... | | | +--- secondary zone n | realm ---+---------- secondary zonegroup 1 --+--- master zone | | | +--- secondary zone 1 +---------- ...... | | +--- ...... | +---------- secondary zonegropu n