Deploy multisite in 同一个集群

在一个Ceph集群里部署一个multisite RGW环境。有什么意义吗?没有,存属个人折腾。由于资源有限,所以只能在一个集群里委屈了。

限盐少许,直接开整。

版本

14.2.3 (0f776cf838a1ae3130b2b73dc26be9c95c6ccc39) nautilus (stable)

RGW配置部署

一个Site的部署

修改.rgw.rootPool

修改/etc/ceph/ceph.conf中使用到.rgw.rootpool的所有配置项,将其改为exter.rgw.rootceph.conf中没有显示的配置,所以建议查找一下源代码中的配置options.cc
之后再创建realmzonegroupzone等信息都会记录到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.controlexter.rgw.metaexter.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应该不在话下了。下面说说数据同步的几点注意事项吧。

  1. 数据同步必须是在不同zone之间进行的,但zone必须在同一zonegroup之下。
  2. 每一个zonegroup内都有一个master zone;一个realm中有多个zonegroup,但master zonegroup只有一个,realm命名空间全局唯一;
  3. 数据分为 period 数据、user数据、bucket数据、object数据。
    period数据需要用户手动配置,不能自动同步;
    user数据只能从master zone写入,然后非master zone同步;
    bucket数据可以从任意一个zone写入,但最后都会转发给master zone,待master 写入成功后,其它zone同步数据,若master失败,其它zone亦失败;
    object数据可以从任意一个zone写入,若master zone写入失败,不影响其它zone写入情况。
  4. 每个zone的endpoints需要配置,否则zone之间无法正常访问
  5. zone上配置的access keysecret要与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