rgw multisite最佳实践

前言

  随着社区在jewel版对multisite进行重构,multisitev2作为全新的对象存储灾备特性了用户的视野。作为rgw集群整体数据灾备方案,从ceph社区来看,H3C和中移动苏州研究院等企业已经开始将此特性应用于产品中。
  本文从以下八个方面对multisite进行介绍:
  1. Multisite概念介绍
  2. Multisite部署
  3. Multisite原理介绍
  4. 灾难发生时的故障处理
  5. 已有单站点集群到多站点集群的迁移
  6. 目前jewel 10.2.7版本multisite已知问题
  7. 后续multisite社区发展方向
  8. 参考资料

Multisite概念介绍

  当前jewel版本multisite还只是简单实现Region内部多个s3集群的active/active及active/passive功能,无法实现bucket粒度级别的同步功能。
  Zone: 一个逻辑的组概念,由一个或多个radosgw实例构成。ZongGroup中必须有一个Zone被设置成master Zone,负责处理所有的 bucket和用户的创建。
  ZoneGroup:J版之前称为Region,目前被ZoneGroup替代,避免用户完全理解成AWS的Region概念。一个ZoneGroup不限于AWS的一个ragion片区,它可以跨越多个地理位置,并且简单的称为一组zone,也就是说,每个ZoneGroup内部都包含一个或多个Zone。rgw元数据在所有ZoneGroup之间同步。数据只能在ZoneGroup内部的Zone之间同步。
  Period:Period保存当前的realm配置。每个period包含一个全局的id和时代。每个realm关联当前的period,并保存当前的配置状态。period只在ZoneGroup和Zone配置改变时更改。
  Realms:realm作为全局命名空间,保存所有的ZoneGroup、Zone、period和bucket的元数据。

Multisite部署

  在本文的部署例子中,我们以部署三个分别的Zone组成单个ZoneGroup为例,介绍Multisite的部署步骤。其中两个Zone属于相同的ceph cluster,第三个属于另外一个ceph cluster,它们共同组成了A/A的负载模式。
  本例子由如下几个部分组成:

1
2
3
4
    Master zonegroup: us
      Master zone:us-east-1
      Secondary zone:us-east-2
      Secondary zone: us-west

  其中us-east-1与us-east-2所在同一个ceph cluster

Master Zone配置

  在配置multisite前,需要创建一个S3兼容的System key用户。rgw实例使用system user的access key和secret key来拉取远端multisite配置。
  生成System user key的命令如下:

1
2
    SYSTEM_ACCESS_KEY=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 20 | head -n 1)
    SYSTEM_SECRET_KEY=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 40 | head -n 1)

  将生成的SYSTEM_ACCESS_KEY和SYSTEM_SECRET_KEY存放到/etc/environment中
  编辑environment:

1
    vim /etc/environment

  内容如下:

1
2
    SYSTEM_ACCESS_KEY=上面生成的SYSTEM_ACCESS_KEY
    SYSTEM_SECRET_KEY=上面生成的SYSTEM_SECRET_KEY

  使environment生效,

1
    source /etc/environment

  通过下述命令创建pool,注意pg_num和pgp_num需要根据http://ceph.com/pgcalc/提前规划

1
ceph osd pool create {poolname}{pg_num} {pgp_num} replicated

  需要在第一个ceph集群上创建如下几个pool,命名规则为zone-name.pool-name,创建其他zone时,可以通过替换us-east-1为其他zone的名字。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
.rgw.root
us-east-1.rgw.control
us-east-1.rgw.data.root
us-east-1.rgw.gc
us-east-1.rgw.log
us-east-1.rgw.intent-log
us-east-1.rgw.usage
us-east-1.rgw.users.keys
us-east-1.rgw.users.email
us-east-1.rgw.users.swift
us-east-1.rgw.users.uid
us-east-1.rgw.buckets.index
us-east-1.rgw.buckets.data
us-east-1.rgw.meta

  创建名字为gold的Realm,并设置为默认realm。命令为:radosgw-admin realm create –rgw-realm={realm-name} [–default]。如果指定–default,radosgw-admin会使用此realm作为默认relam。如果不指定–default,添加zonegroup和zone时,需要用–rgw-realm标志或–realm-id标志指定realm。

1
2
3
4
5
6
7
  radosgw-admin realm create --rgw-realm=gold --default
  {
  "id": "4a367026-bd8f-40ee-b486-8212482ddcd7",
  "name": "gold",
  "current_period": "09559832-67a4-4101-8b3f-10dfcd6b2707",
  "epoch": 1
  }

  创建名字为us的Master Zonegroup。如果只有一个zonegroup,使用–default标志设置为默认zongroup,当添加新zone时radosgw-admin会使用此zonegroup作为默认的zonegroup。如果不设置–default,添加或修改zone时需要使用–rgw-zonegroup或–zonegroup-id指定zonegroup。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  radosgw-admin zonegroup create --rgw-zonegroup=us \
--endpoints=http://rgw1:80 --master --default
  {
  "id": "d4018b8d-8c0d-4072-8919-608726fa369e",
  "name": "us",
  "api_name": "us",
"is_master": "true",
"endpoints": [
"http:\/\/rgw1:80"
],
"hostnames": [],
"hostnames_s3website": [],
"master_zone": "",
"zones": [],
"placement_targets": [],
"default_placement": "",
"realm_id": "4a367026-bd8f-40ee-b486-8212482ddcd7"

  创建名字为us-east-1的zone并添加到默认zonegroup中。此zone主要负责user和bucket元数据管理

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
  radosgw-admin zone create --rgw-zonegroup=us --rgw-zone=us-east-1 \
--endpoints=http://rgw1:80 --master --default --access-key=$SYSTEM_ACCESS_KEY --secret=$SYSTEM_SECRET_KEY
{
"id": "83859a9a-9901-4f00-aa6d-285c777e10f0",
"name": "us-east-1",
"domain_root": "us-east-1/gc.rgw.data.root",
"control_pool": "us-east-1/gc.rgw.control",
"gc_pool": "us-east-1/gc.rgw.gc",
"log_pool": "us-east-1/gc.rgw.log",
"intent_log_pool": "us-east-1/gc.rgw.intent-log",
"usage_log_pool": "us-east-1/gc.rgw.usage",
"user_keys_pool": "us-east-1/gc.rgw.users.keys",
"user_email_pool": "us-east-1/gc.rgw.users.email",
"user_swift_pool": "us-east-1/gc.rgw.users.swift",
"user_uid_pool": "us-east-1/gc.rgw.users.uid",
"system_key": {
"access_key": "1555b35654ad1656d804",
"secret_key": "h7GhxuBLTrlhVUyxSPUKUV8r\/2EI4ngqJxD7iBdBYLhwluN30JaT3Q=="
},
"placement_pools": [
{
"key": "default-placement",
"val": {
"index_pool": "us-east-1/gc.rgw.buckets.index",
"data_pool": "us-east-1/gc.rgw.buckets.data",
"data_extra_pool": "us-east-1/gc.rgw.buckets.non-ec",
"index_type": 0
}
}
],
"metadata_heap": "us-east-1/gc.rgw.meta",
"realm_id": "4a367026-bd8f-40ee-b486-8212482ddcd7"
}

  删除default zone和zone:

1
2
3
4
5
6
  radosgw-admin zonegroup remove --rgw-zonegroup=default --rgw-zone=default
  radosgw-admin period update --commit
  radosgw-admin zone delete --rgw-zone=default
  radosgw-admin period update --commit
  radosgw-admin zonegroup delete --rgw-zonegroup=default
  radosgw-admin period update --commit

  删除创建ceph cluster集群时的默认pool,注意如果默认pool中有数据需要先转移:

1
2
3
4
5
  rados rmpool default.rgw.control default.rgw.control --yes-i-really-really-mean-it
  rados rmpool default.rgw.data.root default.rgw.data.root --yes-i-really-really-mean-it
  rados rmpool default.rgw.gc default.rgw.gc --yes-i-really-really-mean-it
  rados rmpool default.rgw.log default.rgw.log --yes-i-really-really-mean-it
  rados rmpool default.rgw.users.uid default.rgw.users.uid --yes-i-really-really-mean-it

  创建System user。radosgw后台进程在拉取realm和period信息之前必须经过认证,因此需要在master zone创建system user:

1
2
3
  radosgw-admin user create --uid=zone.user \
--display-name="Zone User" --access-key=$SYSTEM_ACCESS_KEY \
--secret=$SYSTEM_SECRET_KEY --system

  提交Period变化:

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
  radosgw-admin period update --commit
{
"id": "b5e4d3ec-2a62-4746-b479-4b2bc14b27d1",
"epoch": 1,
"predecessor_uuid": "09559832-67a4-4101-8b3f-10dfcd6b2707",
"sync_status": [ "[...]"
],
"period_map": {
"id": "b5e4d3ec-2a62-4746-b479-4b2bc14b27d1",
"zonegroups": [
{
"id": "d4018b8d-8c0d-4072-8919-608726fa369e",
"name": "us",
"api_name": "us",
"is_master": "true",
"endpoints": [
"http:\/\/rgw1:80"
],
"hostnames": [],
"hostnames_s3website": [],
"master_zone": "83859a9a-9901-4f00-aa6d-285c777e10f0",
"zones": [
{
"id": "83859a9a-9901-4f00-aa6d-285c777e10f0",
"name": "us-east-1",
"endpoints": [
"http:\/\/rgw1:80"
],
"log_meta": "true",
"log_data": "false",
"bucket_index_max_shards": 0,
"read_only": "false"
}
],
"placement_targets": [
{
"name": "default-placement",
"tags": []
}
],
"default_placement": "default-placement",
"realm_id": "4a367026-bd8f-40ee-b486-8212482ddcd7"
}
],
"short_zone_ids": [
{
"key": "83859a9a-9901-4f00-aa6d-285c777e10f0",
"val": 630926044
}
]
},
"master_zonegroup": "d4018b8d-8c0d-4072-8919-608726fa369e",
"master_zone": "83859a9a-9901-4f00-aa6d-285c777e10f0",
"period_config": {
"bucket_quota": {
"enabled": false,
"max_size_kb": -1,
"max_objects": -1
},
"user_quota": {
"enabled": false,
"max_size_kb": -1,
"max_objects": -1
}
},
"realm_id": "4a367026-bd8f-40ee-b486-8212482ddcd7",
"realm_name": "gold",
"realm_epoch": 2
}

  修改ceph配置文件,增加rgw_zone配置:

1
2
  [client.rgw.us-east-1]
  rgw_zone=us-east-1

  重启rgw实例:

1
service radosgw restart id=rgw.{hostname}

创建Secondary Zone

  在同一个ceph cluster的另一个rgw实例上创建第二个zone,命名为us-east-2。首先创建zone对应的pool,名称如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
us-east-2.rgw.control
us-east-2.rgw.data.root
us-east-2.rgw.gc
us-east-2.rgw.log
us-east-2.rgw.intent-log
us-east-2.rgw.usage
us-east-2.rgw.users.keys
us-east-2.rgw.users.email
us-east-2.rgw.users.swift
us-east-2.rgw.users.uid
us-east-2.rgw.buckets.index
us-east-2.rgw.buckets.data
us-east-2.rgw.meta

  创建seco2dary zone的命令与primary zone相同,只是去掉master标志位:

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
radosgw-admin zone create --rgw-zonegroup=us --endpoints=http://rgw2:80 \
--rgw-zone=us-east-2 --access-key=$SYSTEM_ACCESS_KEY --secret=$SYSTEM_SECRET_KEY
{
"id": "950c1a43-6836-41a2-a161-64777e07e8b8",
"name": "us-east-2",
"domain_root": "us-east-2.rgw.data.root",
"control_pool": "us-east-2.rgw.control",
"gc_pool": "us-east-2.rgw.gc",
"log_pool": "us-east-2.rgw.log",
"intent_log_pool": "us-east-2.rgw.intent-log",
"usage_log_pool": "us-east-2.rgw.usage",
"user_keys_pool": "us-east-2.rgw.users.keys",
"user_email_pool": "us-east-2.rgw.users.email",
"user_swift_pool": "us-east-2.rgw.users.swift",
"user_uid_pool": "us-east-2.rgw.users.uid",
"system_key": {
"access_key": "1555b35654ad1656d804",
"secret_key": "h7GhxuBLTrlhVUyxSPUKUV8r\/2EI4ngqJxD7iBdBYLhwluN30JaT3Q=="
},
"placement_pools": [
{
"key": "default-placement",
"val": {
"index_pool": "us-east-2.rgw.buckets.index",
"data_pool": "us-east-2.rgw.buckets.data",
"data_extra_pool": "us-east-2.rgw.buckets.non-ec",
"index_type": 0
}
}
],
"metadata_heap": "us-east-2.rgw.meta",
"realm_id": "815d74c2-80d6-4e63-8cfc-232037f7ff5c"
}

  更新period

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
radosgw-admin period update --commit
{
"id": "b5e4d3ec-2a62-4746-b479-4b2bc14b27d1",
"epoch": 2,
"predecessor_uuid": "09559832-67a4-4101-8b3f-10dfcd6b2707",
"sync_status": [ "[...]"
],
"period_map": {
"id": "b5e4d3ec-2a62-4746-b479-4b2bc14b27d1",
"zonegroups": [
{
"id": "d4018b8d-8c0d-4072-8919-608726fa369e",
"name": "us",
"api_name": "us",
"is_master": "true",
"endpoints": [
"http:\/\/rgw1:80"
],
"hostnames": [],
"hostnames_s3website": [],
"master_zone": "83859a9a-9901-4f00-aa6d-285c777e10f0",
"zones": [
{
"id": "83859a9a-9901-4f00-aa6d-285c777e10f0",
"name": "us-east-1",
"endpoints": [
"http:\/\/rgw1:80"
],
"log_meta": "true",
"log_data": "false",
"bucket_index_max_shards": 0,
"read_only": "false"
},
{
"id": "950c1a43-6836-41a2-a161-64777e07e8b8",
"name": "us-east-2",
"endpoints": [
"http:\/\/rgw2:80"
],
"log_meta": "false",
"log_data": "true",
"bucket_index_max_shards": 0,
"read_only": "false"
}
],
"placement_targets": [
{
"name": "default-placement",
"tags": []
}
],
"default_placement": "default-placement",
"realm_id": "4a367026-bd8f-40ee-b486-8212482ddcd7"
}
],
"short_zone_ids": [
{
"key": "83859a9a-9901-4f00-aa6d-285c777e10f0",
"val": 630926044
},
{
"key": "950c1a43-6836-41a2-a161-64777e07e8b8",
"val": 4276257543
}
]
},
"master_zonegroup": "d4018b8d-8c0d-4072-8919-608726fa369e",
"master_zone": "83859a9a-9901-4f00-aa6d-285c777e10f0",
"period_config": {
"bucket_quota": {
"enabled": false,
"max_size_kb": -1,
"max_objects": -1
},
"user_quota": {
"enabled": false,
"max_size_kb": -1,
"max_objects": -1
}
},
"realm_id": "4a367026-bd8f-40ee-b486-8212482ddcd7",
"realm_name": "gold",
"realm_epoch": 2
}

  修改ceph.conf,增加rgw_zone配置

1
2
[client.rgw.us-east-2]
rgw_zone=us-east-2

  重启rgw网关

1
service radosgw restart id=rgw.{hostname}

第二个ceph cluster的Zone配置

  拉取master zone的realm

1
2
3
4
5
6
7
8
9
radosgw-admin realm pull --url=http://rgw1:80 \
--access-key=$SYSTEM_ACCESS_KEY --secret=$SYSTEM_SECRET_KEY
{
"id": "4a367026-bd8f-40ee-b486-8212482ddcd7",
"name": "gold",
"current_period": "b5e4d3ec-2a62-4746-b479-4b2bc14b27d1",
"epoch": 2
}
radosgw-admin realm default --rgw-realm=gold

  拉取master zone的period

1
2
  radosgw-admin period pull --url=http://rgw1:80 \
--access-key=$SYSTEM_ACCESS_KEY --secret=$SYSTEM_SECRET_KEY

  设置默认的zonegroup

1
  radosgw-admin zonegroup default --rgw-zonegroup=us

  创建zone对应的pools,名称如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
us-west.rgw.control
us-west.rgw.data.root
us-west.rgw.gc
us-west.rgw.log
us-west.rgw.intent-log
us-west.rgw.usage
us-west.rgw.users.keys
us-west.rgw.users.email
us-west.rgw.users.swift
us-west.rgw.users.uid
us-west.rgw.buckets.index
us-west.rgw.buckets.data
us-west.rgw.meta

  创建名字为us-west的zone

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
radosgw-admin zone create --rgw-zonegroup=us --rgw-zone=us-west \
--access-key=$SYSTEM_ACCESS_KEY --secret=$SYSTEM_SECRET_KEY \
--endpoints=http://rgw3:80 --default
{
"id": "950c1a43-6836-41a2-a161-64777e07e8b8",
"name": "us-west",
"domain_root": "us-west.rgw.data.root",
"control_pool": "us-west.rgw.control",
"gc_pool": "us-west.rgw.gc",
"log_pool": "us-west.rgw.log",
"intent_log_pool": "us-west.rgw.intent-log",
"usage_log_pool": "us-west.rgw.usage",
"user_keys_pool": "us-west.rgw.users.keys",
"user_email_pool": "us-west.rgw.users.email",
"user_swift_pool": "us-west.rgw.users.swift",
"user_uid_pool": "us-west.rgw.users.uid",
"system_key": {
"access_key": "1555b35654ad1656d804",
"secret_key": "h7GhxuBLTrlhVUyxSPUKUV8r\/2EI4ngqJxD7iBdBYLhwluN30JaT3Q=="
},
"placement_pools": [
{
"key": "default-placement",
"val": {
"index_pool": "us-west.rgw.buckets.index",
"data_pool": "us-west.rgw.buckets.data",
"data_extra_pool": "us-west.rgw.buckets.non-ec",
"index_type": 0
}
}
],
"metadata_heap": "us-west.rgw.meta",
"realm_id": "4a367026-bd8f-40ee-b486-8212482ddcd7"
}

  删除default zone和zone:

1
2
3
4
5
6
  radosgw-admin zonegroup remove --rgw-zonegroup=default --rgw-zone=default
  radosgw-admin period update --commit
  radosgw-admin zone delete --rgw-zone=default
  radosgw-admin period update --commit
  radosgw-admin zonegroup delete --rgw-zonegroup=default
  radosgw-admin period update --commit

  删除创建ceph cluster集群时的默认pool,注意如果默认pool中有数据需要先转移:

1
2
3
4
5
  rados rmpool default.rgw.control default.rgw.control --yes-i-really-really-mean-it
  rados rmpool default.rgw.data.root default.rgw.data.root --yes-i-really-really-mean-it
  rados rmpool default.rgw.gc default.rgw.gc --yes-i-really-really-mean-it
  rados rmpool default.rgw.log default.rgw.log --yes-i-really-really-mean-it
  rados rmpool default.rgw.users.uid default.rgw.users.uid --yes-i-really-really-mean-it

  提交更新的period:

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
radosgw-admin period update --commit --rgw-zone=us-west
{
"id": "b5e4d3ec-2a62-4746-b479-4b2bc14b27d1",
"epoch": 3,
"predecessor_uuid": "09559832-67a4-4101-8b3f-10dfcd6b2707",
"sync_status": [
"", # truncated
],
"period_map": {
"id": "b5e4d3ec-2a62-4746-b479-4b2bc14b27d1",
"zonegroups": [
{
"id": "d4018b8d-8c0d-4072-8919-608726fa369e",
"name": "us",
"api_name": "us",
"is_master": "true",
"endpoints": [
"http:\/\/rgw1:80"
],
"hostnames": [],
"hostnames_s3website": [],
"master_zone": "83859a9a-9901-4f00-aa6d-285c777e10f0",
"zones": [
{
"id": "83859a9a-9901-4f00-aa6d-285c777e10f0",
"name": "us-east-1",
"endpoints": [
"http:\/\/rgw1:80"
],
"log_meta": "true",
"log_data": "true",
"bucket_index_max_shards": 0,
"read_only": "false"
},
{
"id": "950c1a43-6836-41a2-a161-64777e07e8b8",
"name": "us-east-2",
"endpoints": [
"http:\/\/rgw2:80"
],
"log_meta": "false",
"log_data": "true",
"bucket_index_max_shards": 0,
"read_only": "false"
},
{
"id": "d9522067-cb7b-4129-8751-591e45815b16",
"name": "us-west",
"endpoints": [
"http:\/\/rgw3:80"
],
"log_meta": "false",
"log_data": "true",
"bucket_index_max_shards": 0,
"read_only": "false"
}
],
"placement_targets": [
{
"name": "default-placement",
"tags": []
}
],
"default_placement": "default-placement",
"realm_id": "4a367026-bd8f-40ee-b486-8212482ddcd7"
}
],
"short_zone_ids": [
{
"key": "83859a9a-9901-4f00-aa6d-285c777e10f0",
"val": 630926044
},
{
"key": "950c1a43-6836-41a2-a161-64777e07e8b8",
"val": 4276257543
},
{
"key": "d9522067-cb7b-4129-8751-591e45815b16",
"val": 329470157
}
]
},
"master_zonegroup": "d4018b8d-8c0d-4072-8919-608726fa369e",
"master_zone": "83859a9a-9901-4f00-aa6d-285c777e10f0",
"period_config": {
"bucket_quota": {
"enabled": false,
"max_size_kb": -1,
"max_objects": -1
},
"user_quota": {
"enabled": false,
"max_size_kb": -1,
"max_objects": -1
}
},
"realm_id": "4a367026-bd8f-40ee-b486-8212482ddcd7",
"realm_name": "gold",
"realm_epoch": 2
}

  修改ceph.conf,增加rgw_zone配置:

1
2
  [client.rgw.us-east-2]
  rgw_zone=us-west

  重启rgw网关:

1
  service radosgw restart id=rgw.{hostname}

  在第二个ceph集群上检查同步状态:

1
2
3
4
5
6
7
8
9
10
11
12
13
  radosgw-admin sync status
    realm f3239bc5-e1a8-4206-a81d-e1576480804d (earth)
  zonegroup c50dbb7e-d9ce-47cc-a8bb-97d9b399d388 (us)
    zone 4c453b70-4a16-4ce8-8185-1893b05d346e (us-west)
  metadata sync syncing
         full sync: 0/64 shards
metadata is caught up with master
         incremental sync: 64/64 shards
  data sync source: 1ee9da3e-114d-4ae3-a8a4-056e8a17f532 (us-east)
     syncing
     full sync: 0/128 shards
     incremental sync: 128/128 shards
     data is caught up with source

Multisite原理介绍

  本章节介绍了multisite一些主要概念的原理和组成,更加详细的设计原理请阅读本文末尾的参考资料。

Period和Realm介绍

  每个peroid都有一个unique id。Period包含了realm配置,epoch和它之前period的id(除了第一个period)。可通过如下命令查看period的组成:

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
radosgw-admin period get
{
"id": "9c16dc3a-2c4c-418e-9332-857bfecbcc7b",
"epoch": 1,
"predecessor_uuid": "5a57fda5-e21a-4ea3-a135-c5e8f6ef85d2",
"sync_status": [
""
],
"period_map": {
"id": "9c16dc3a-2c4c-418e-9332-857bfecbcc7b",
"zonegroups": [
{
"id": "4e17988a-6d48-4030-a5b1-681fc218b8e0",
"name": "cn",
"api_name": "cn",
"is_master": "true",
"endpoints": [
"http:\/\/192.168.242.147:8080"
],
"hostnames": [],
"hostnames_s3website": [],
"master_zone": "4af832b3-02a5-4e44-8ff0-2e1d81a93b66",
"zones": [
{
"id": "4af832b3-02a5-4e44-8ff0-2e1d81a93b66",
"name": "cn-sy-south",
"endpoints": [
"http:\/\/192.168.242.147:8080"
],
"log_meta": "true",
"log_data": "true",
"bucket_index_max_shards": 0,
"read_only": "false"
},
{
"id": "70ab0014-28f6-46cb-bd0f-68713268e657",
"name": "cn-bj-east",
"endpoints": [
"http:\/\/192.168.242.149:8080"
],
"log_meta": "false",
"log_data": "true",
"bucket_index_max_shards": 0,
"read_only": "false"
}
],
"placement_targets": [
{
"name": "default-placement",
"tags": []
}
],
"default_placement": "default-placement",
"realm_id": "03202997-3b9e-4455-a2dc-c1e442376589"
}
],
"short_zone_ids": [
{
"key": "4af832b3-02a5-4e44-8ff0-2e1d81a93b66",
"val": 3422535981
},
{
"key": "70ab0014-28f6-46cb-bd0f-68713268e657",
"val": 1669507347
}
]
},
"master_zonegroup": "4e17988a-6d48-4030-a5b1-681fc218b8e0",
"master_zone": "4af832b3-02a5-4e44-8ff0-2e1d81a93b66",
"period_config": {
"bucket_quota": {
"enabled": false,
"max_size_kb": -1,
"max_objects": -1
},
"user_quota": {
"enabled": false,
"max_size_kb": -1,
"max_objects": -1
}
},
"realm_id": "03202997-3b9e-4455-a2dc-c1e442376589",
"realm_name": "earth",
"realm_epoch": 4
}

  下述命令获取period的历史信息

1
2
3
4
5
6
7
8
9
10
radosgw-admin period list
{
"periods": [
"03202997-3b9e-4455-a2dc-c1e442376589:staging",
"3956f90a-6f67-4f7c-aba0-df2fc6600117",
"5a57fda5-e21a-4ea3-a135-c5e8f6ef85d2",
"9c16dc3a-2c4c-418e-9332-857bfecbcc7b",
"dc8661a1-b013-4a12-aa60-07025dbc5d38"
]
  }

  每个realm关联当前的period,以及一列period历史信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
radosgw-admin realm get
{
"id": "03202997-3b9e-4455-a2dc-c1e442376589",
"name": "earth",
"current_period": "9c16dc3a-2c4c-418e-9332-857bfecbcc7b",
"epoch": 4
}
radosgw-admin realm list-periods
{
"current_period": "9c16dc3a-2c4c-418e-9332-857bfecbcc7b",
"periods": [
"9c16dc3a-2c4c-418e-9332-857bfecbcc7b",
"5a57fda5-e21a-4ea3-a135-c5e8f6ef85d2",
"3956f90a-6f67-4f7c-aba0-df2fc6600117",
"dc8661a1-b013-4a12-aa60-07025dbc5d38"
]
}

  multisite配置设计成类似git的机制。用户配置存储在stagging period中,可以通过radosgw-adim period update命令更新period。multisite配置更改后,需要通过radosgw-admin period commit命令使其生效。
  每个zone可以通过radosgw-admin period pull拉取配置。

Realm、Zonegroup和Zone的关系

  1.png
  每个realm中有一个或者多个zonegroup,其中有且只有一个master zonegroup。
每个zonegroup有且只有一个master zone。元数据在Realm中的所有zone之间同步,数据只在Zonegroup内部的zone之间以A/A或A/P的方式同步。master zonegroup的master zone负责传播所有的配置改变。

Period解析

  一个period是一个包括realm的配置状态,它包括这些zonegroup和zone的有效时期。
  比如添加一个新zone或者修改endpoint地址,period依然与之前一样。但是会增加它的epoch,相当于相同period的新版本。
  2.png
  上图描述了period和epoch的关系。通过下列命令激活一个新的period或者增加epoch

1
2
3
  id=radosgw.am1
  radosgw­admin ­­id $id zone create …
  radosgw­admin ­­id $id zone modify …

  然后更新并提交period变化,新的配置会通过master zone传播到它的所有对端:

1
  radosgw­admin ­­id $id ­­rgw­realm=r10 period update ­­commit

  所有的realm和period信息保存在ceph pool .rgw.root中。在同一个ceph集群的所有rgw进程或radosgw-admin cli可以很容易的获取信息。但是所有的rgw进程以及它们不同的zone使用不同的ceph集群时,情况会变得复杂一些。
  在我们创建第二个zone时,会使用下列命令拉取realm和period配置

1
2
3
4
  radosgw-admin realm pull --url=http://rgw1:80 \
--access-key=$SYSTEM_ACCESS_KEY --secret=$SYSTEM_SECRET_KEY
  radosgw-admin period pull --url=http://rgw1:80 \
--access-key=$SYSTEM_ACCESS_KEY --secret=$SYSTEM_SECRET_KEY

  这两条命令会将period关联的信息从master zone传送到其他zone的集群。通过–url、–access-key和–scecet向master zone认证。
  一旦realm和period的信息在新集群的.rgw.root pool建立后。后续不需要再进行pull操作,因为master zone会自动向所有对端更新配置变化。
  另外,除了配置更改需要update和commit操作之外,其他操作都是自动传播和复制到其它zone。
  例如使用下列命令创建一个s3用户,这个操作会自动同步到其他zone。注意只有在master zone gateway上执行的用户操作,才能自动传播到其他zone的ceph集群

1
2
  id=radosgw.am1
  radosgw­admin ­­id $id user create ­­uid=...

  bucket的创建也需要master zone进行提交操作,同步机制由zone之间内部完成。因此当master zone失效时,如果没有其它zone被提升为master zone,在这种情况下只能创建或者读写object,不能创建bucket
  另外注意一点,通常情况下使用多个Zone对应多个ceph集群,这是推荐的用法。但是也可以多个zone对应单个ceph集群,在这种情况下,这些zone必须在crushmap中是故障隔离的,并且集群内部的各个节点网络必须是低延迟。

灾难发生时的故障处理

  本章我们讨论一下故障接管和故障回切(failback和failover)。通常情况下不需要进行集群间的故障接管和回切。例如:

  • 对于硬件故障来说,负载均衡通常是高可用的
  • 单独的radosgw gateway可能失效,但是它不会影响系统整体的崩溃
  • 集群所有的数据和配置都是高可用的,没有单点故障。任何ceph集群的单个组件都可以失效也可以被恢复,不会导致任何的服务中断或者数据丢失。
      考虑接管/回切的操作只有在灾难发生的情况下,也就是单个站点的完全失效。因此需要考虑如下两种情况:
  • 单个站点临时不可用
  • 单个站点长时间停机和服务失效

运维策略-站点临时不可用

  通常情况下,由断电或者网络大规模故障导致的站点服务失效往往在几小时或者几天后会被恢复。
  如果包含master zone的站点服务失效,其他站点仍然可以像通常一样提供读写请求服务,只是不能创建新的bucket和用户。在这种情况下,可以把应用的s3 url地址从失效站点替换为可用站点。
  失效站点恢复后,简单的重启rgw实例即可,新启动的rgw实例会使用已经存在的配置并重新从其他zone的rgw实例同步。请注意,前提是没有将其他站点提升为主站点或者更改其他配置,以及失效站点没有数据丢失。
  因为大部分的应用使用s3 api时,并不会创建全新的bucket,而仅仅使用一组静态的bucket。因此在站点临时失效时,这种处理方式是最稳妥的。

运维策略-站点长时间不可用以及数据丢失

  当站点长期失效及大部分数据丢失时,其余站点会继续提供服务并保存运营。
  如果失效站点是非master zone,我们不需要进行回切操作。因为master zone依然存在而且可操作,其余的站点可以提供所有的读写操作及创建bucket和s3用户操作。
  如果失效站点是master zone,其余的站点可以提供读写服务。但是不能创建bucket和user。这时候应用应该将自己使用的s3 url连接配置到其他站点。
  下一步应该仔细考虑,是否为了创建bucket和用户,提升一个非master zone为master zone。通常的策略是保持原状,直到无法避免。

接管操作(failed over)

  提升在需要提升为master zone的ceph集群的管理节点执行下列配置,如果之前是A/P模式,还需要加上–read-only=False,允许数据读写:

1
  radosgw-admin zone modify --rgw-zone=<zone-name> --master --default --read-only=False

  更新period,使配置生效。

1
  radosgw-admin period update --commit

  此时不需要重启rgw服务,直接可以创建bucket或s3用户了。

回切操作(failed back)

  如果原master zone恢复后,且之前的数据没有丢失。直接通过radosgw period pull获取新的period,然后通过上一节的接管操作步骤重新提升为master zone。  
  如果原master zone无法恢复及ceph集群完全损坏,则需要重建一个新的ceph cluster和zone。
  第一步需要从master zone拉取realm和period到当前的空ceph集群,例如:

1
2
  radosgw­admin realm pull ­­url=<rgw_endpoint> ­­default ­­access=<system_accesskey> ­­secret=<system_password>
 radosgw­admin period pull ­­url=<rgw_endpoint> ­­access=<system_accesskey>­­secret=<system_password>

  下一步,我们需要创建一个master zone,例如:

1
2
3
4
  radosgw-admin zone create --rgw-zonegroup=<zonegroup_name>  \
--rgw-zone=<zone_name> --endpoints=<rgw_endpoint> --master --default \
--access-key=<system_accesskey> --secret=<system_password>
  radosgw­admin period update ­­commit

  第三步,把之前的master zone改为非master zone

1
2
  radosgw­admin zone modify ­­rgw­zone=<zone_name> ­­master=false
  radosgw­admin period update ­­commit

  最后,把应用的s3 url恢复为原有的配置即可。

状态查看

  赠送以下几个命令用于运维multisite。注意,有些命令执行时需要加一些额外参数,指定bucket、data等,请自行查询详细用法:

  • sync error log查看

    1
      radosgw-admin sync error list
  • log状态查看

    1
    2
    3
      radosgw-admin bilog status
      radosgw-admin datalog status
      radosgw-admin mdlog status
  • 同步状态查看

    1
    2
    3
      radosgw-admin bucket sync status
      radosgw-admin data sync status
      radosgw-admin metadata sync status
  • 全局重新resync触发

    1
    2
    3
      radosgw-admin bucket sync init
      radosgw-admin data sync init
      radosgw-admin metadata sync init

已有单站点集群到多站点集群的迁移

  如何迁移已经部署的ceph rgw集群到multisite配置,参照如下几步:
  首先在集群上创建realm

1
  radosgw-admin realm create --rgw-realm=<name> --default

  重命名默认zone和zonegroup

1
2
3
4
  radosgw-admin zonegroup rename --rgw-zonegroup \
default --zonegroup-new-name=<zonegroup_name>
  radosgw-admin zone rename --rgw-zone default --zone-new-name <zong_name> \
--rgw-zonegroup=<name>

  配置master zonegroup的默认realm

1
2
  radosgw-admin zonegroup modify --rgw-realm=<name> --rgw-zonegroup=<name> \
--endpoints <rgw_endpoint> --master --default

  配置master zone的默认realm

1
2
3
  radosgw-admin zone modify --rgw-realm=<name> --rgw-zonegroup=<name> \
--rgw-zone=<name> --endpoints http://<fqdn>:80 --access-key=<access-key> \
--secret=<secret-key> --master --default

  创建system user

1
2
  radosgw-admin user create --uid=<user-id> --display-name="<display-name>" \
--access-key=<access-key> --secret=<secret-key> --system

  更新配置

1
  radosgw-admin period update --commit

  重启rgw服务

1
  service radosgw restart id=<rgw.hostname>

目前jewel 10.2.7版本multisite已知问题

未来multisite feature特性展望

bucket粒度同步特性

  当前multisite还是以ceph集群整体为单位进行迁移,后续会提供类似公有云服务以bucket粒度进行数据同步的功能。例如AWS s3 CRR特性。由H3C公司开发,PR已经进入了review和unit test阶段。具体请见 https://github.com/ceph/ceph/pull/10995。

multisite框架支持插件

  multisite在L版已经支持基于multisite机制的插件开发框架。rgw metadata search就是基于此开发的,同时一些开发人员基于此框架也开发了数据同步到其他对象存储的混合云存储功能。可以参考如下链接:

  

参考资料

  1.Orit, Wasserman . Geo replication and disaster recovery for cloud object storage with Ceph rados gateway[Z]. LinuxCon EU: LinuxCon ,2016.
  2.Walter, Graf . Understanding a Multi Site Ceph Gateway Installation[Z]. 2017.
  3.温涛. 对象存储服务多站点功能分析[Z]. BeiJing: Ceph社区,2016.
  4.朱荣泽. RGW multisite Overview[Z]. BeiJing: ceph社区,2016.
  5.RedHat documentation
  6.SuSe documentation