在一个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 | rgw_zone_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 | ceph df |
创建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
244438 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 | [root@master ~]# radosgw-admin realm list |
设置zonegroup的default info
此时zonegroup的default info缺失了
1 | [root@master ~]# radosgw-admin zonegroup list |
使用 zonegroup default
重新设置default info
1 | [root@master ~]# radosgw-admin zonegroup default --rgw-zonegroup=default |
创建Zone
接下来,创建我们需要的zone, 并设置其为default
1 | [root@master ~]# radosgw-admin zone list |
删除default zone
现在你会发现有两个zone了,一个是我们新建的,另一个是default,这个default没用了,我们把它删掉。
1 | radosgw-admin zone delete --rgw-zone=default --default |
细心的朋友可能会发现radosgw-admin命令中没有zone delete
这个命令啊,-h
中显示的是zone rm
啊。这是Bug,嘿嘿嘿~~~
1 | [root@master ~]# radosgw-admin -h | grep -i zone | grep -i rm |
重启RGW服务
1 | [root@master ~]# docker stop rgw |
删除default相关的Pools
1 | [root@master ~]# ceph df |
重启RGW服务后,发现多了三个Pool exter.rgw.control
、exter.rgw.meta
、exter.rgw.log
。而default开头的pool就没用了,可以删除了。
1 | [root@master ~]# ceph osd pool rm default.rgw.control default.rgw.control --yes-i-really-really-mean-it |
另一个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 +--- master zone
|
+--- secondary zone 1
|
+---------- master zonegroup ----+--- ......
| |
| +--- secondary zone n
|
realm ---+---------- secondary zonegroup 1 --+--- master zone
| |
| +--- secondary zone 1
+---------- ...... |
| +--- ......
|
+---------- secondary zonegropu n