我們一起聊聊 Ceph 對象存儲多站點復制
如何在兩個Ceph集群之間建立初始的多站點復制配置,如下圖所示:
Ceph 對象存儲多站點初始配置概述
自Quincy版本起,Ceph引入了一個名為rgw的新管理器模塊,集成在cephadm編排器中。該模塊簡化了多站點復制的配置流程。本節將指導您如何使用rgw管理器模塊,通過CLI在兩個獨立Ceph集群(每個集群作為一個區域)之間配置對象存儲多站點復制。
創建RGW模塊配置文件
我們首先為cluster1創建一個RGW模塊配置文件。通過主機標簽來定義哪些節點可以托管每個服務。對于復制RGW服務,我們設置rgwsync標簽。任何配置了此標簽的主機都將啟動一個RGW服務,并使用文件中定義的規格。
[root@ceph-node-00 ~]# cat << EOF >> /root/rgw.spec
placement:
label: rgwsync
count_per_host: 1
rgw_realm: multisite
rgw_zone: zone1
rgw_zonegroup: multizg
spec:
rgw_frontend_port: 8000
EOF
標記主機
在我們的第一個集群中,我們希望在節點ceph-node-00和ceph-node-01上運行rgwsync服務,因此我們需要標記相應的節點:
[root@ceph-node-00 ~]# ceph orch host label add ceph-node-00.cephlab.com rgwsync
Added label rgwsync to host ceph-node-00.cephlab.com
[root@ceph-node-00 ~]# ceph orch host label add ceph-node-01.cephlab.com rgwsync
Added label rgwsync to host ceph-node-01.cephlab.com
啟用RGW管理器模塊并引導配置
標記節點后,我們啟用RGW管理器模塊并引導RGW多站點配置。引導多站點配置時,rgw管理器模塊將執行以下步驟:
- 創建領域、區域組和區域,并應用周期
- 創建特定于區域名稱的RGW RADOS池
- 創建RGW多站點復制同步用戶
- 為每個RGW服務配置領域、區域組和區域
- 使用cephadm Orchestrator創建RGW服務
[root@ceph-node-00 ~]# ceph mgr module enable rgw
[root@ceph-node-00 ~]# ceph rgw realm bootstrap -i rgw.spec
Realm(s) created correctly. Please use 'ceph rgw realm tokens' to get the token.
驗證配置
我們可以通過以下命令檢查領域、同步用戶和RADOS池的創建情況:
[root@ceph-node-00 ~]# radosgw-admin realm list
{
"default_info": "d85b6eef-2285-4072-8407-35e2ea7a17a2",
"realms": [
"multisite"
]
}
多站點同步用戶:
[root@ceph01 ~]# radosgw-admin user list | grep sysuser
"Sysuser-multisite"
Zone1 RGW RADOS 池:
[root@ceph01 ~]# ceph osd lspools | grep rgw
24 .rgw.root
25 zone1.rgw.log
26 zone1.rgw.control
27 zone1.rgw.meta
一旦我們創建了第一個桶,桶索引池就會自動創建。此外,一旦我們將第一個對象/數據上傳到zone1中的存儲桶,就會為我們創建數據池。默認情況下,副本為 3 的池是使用集群的預定義 CRUSH 規則replicated_rule創建的。如果我們想在數據池中使用糾刪碼 (EC) 或自定義故障域等,則需要在開始將數據上傳到第一個存儲桶之前,使用自定義內容手動預先創建池。
[!CAUTION]
請務必仔細檢查RGW池的Placement Groups(PG)數量是否正確,以確保所需的性能。我們可以選擇為每個池啟用帶有批量標志(bulk flag)的PG自動擴展管理器模塊,或者借助PG計算器(https://docs.ceph.com/en/squid/rados/operations/pgcalc/)預先靜態計算池所需的PG數量。我們建議每個OSD的PG副本目標值為200,即"PG比例"。
[!CAUTION]
只有RGW數據池可以配置為使用糾刪碼(erasure coding)。RGW其他池必須配置為副本,默認復制因子為3(size=3)。
RGW 服務已啟動并正在端口 8000 上為 S3 端點提供服務:
[root@ceph-node-00 ~]# curl http://ceph-node-00:8000
<?xml versinotallow="1.0" encoding="UTF-8"?><ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Owner><ID>anonymous</ID><DisplayName></DisplayName></Owner><Buckets></Buckets></ListAllMyBucketsResult>
RGW 管理器模塊創建一個帶有我們部署的編碼信息的令牌。想要作為復制區域添加到我們的多站點配置的其他 Ceph 集群可以將此令牌導入到 RGW 管理器模塊中,并使用單個命令配置和運行復制。
我們可以使用ceph rgw realm tokens命令檢查令牌的內容,并使用base64命令對其進行解碼。正如您所看到的,它提供了輔助區域連接到主區域組并提取領域和區域組配置所需的信息。
[root@ceph-node-00 ~]# TOKEN=$(ceph rgw realm tokens | jq .[0].token | sed 's/"http://g')
[root@ceph-node-00 ~]# echo $TOKEN | base64 -d
{
"realm_name": "multisite",
"realm_id": "d85b6eef-2285-4072-8407-35e2ea7a17a2",
"endpoint": "http://ceph-node-00.cephlab.com:8000",
"access_key": "RUB7U4C6CCOMG3EM9QGF",
"secret": "vg8XFPehb21Y8oUMB9RS0XXXXH2E1qIDIhZzpC"
}
從提示中可以看到,我們已經切換到第二個 Ceph 集群,從第一個集群復制了令牌,并與第一個集群類似地定義了其余參數。
[root@ceph-node-04 ~]# cat rgw2.spec
placement:
label: rgwsync
count_per_host: 1
rgw_zone: zone2
rgw_realm_token: ewogICAgInJlYWxtX25hbWUiOiAibXVsdGlzaXRlIiwKICAgICJyZWFsbV9pZCI6ICIxNmM3OGJkMS0xOTIwLTRlMjMtOGM3Yi1lYmYxNWQ5ODI0NTgiLAogICAgImVuZHBvaW50IjogImh0dHA6Ly9jZXBoLW5vZGUtMDEuY2VwaGxhYi5jb206ODAwMCIsCiAgICAiYWNjZXNzX2tleSI6ICIwOFlXQ0NTNzEzUU9LN0pQQzFRUSIsCiAgICAic2VjcmV0IjogImZUZGlmTXpDUldaSXgwajI0ZEw4VGppRUFtOHpRdE01ZGNScXEyTjYiCn0=
spec:
rgw_frontend_port: 8000
我們標記將運行 Ceph RGW 同步服務的主機:
[root@ceph-node-04 ~]# ceph orch host label add ceph-node-04.cephlab.com rgwsync
Added label rgwsync to host ceph-node-04.cephlab.com
[root@ceph-node-04 ~]# ceph orch host label add ceph-node-05.cephlab.com rgwsync
Added label rgwsync to host ceph-node-05.cephlab.com
啟用該模塊,并使用我們剛才創建的規范文件運行ceph rgw zone create命令:
[root@ceph02 ~]# ceph mgr module enable rgw
[root@ceph02 ~]# ceph rgw zone create -i rgw2.spec --start-radosgw
Zones zone2 created successfully
rgw管理器模塊將負責使用多站點同步用戶的訪問密鑰和密鑰來拉取領域和區域組周期。最后,它將創建zone2并進行最后一次更新,以便所有區域都具有最新的配置更改,并將zone2添加到 zonegroup multizg中。在radosgw-adminzonegroup get命令的以下輸出中,我們可以看到區域組端點。我們還可以看到zone1是我們的 zonegroup 的主區域以及zone1和zone2的相應端點。
[root@ceph-node-00 ~]# radosgw-admin zonegroup get
{
"id": "2761ad42-fd71-4170-87c6-74c20dd1e334",
"name": "multizg",
"api_name": "multizg",
"is_master": true,
"endpoints": [
"http://ceph-node-04.cephlab.com:8000",
"http://ceph-node-05.cephlab.com:8000"
],
"hostnames": [],
"hostnames_s3website": [],
"master_zone": "66df8c0a-c67d-4bd7-9975-bc02a549f13e",
"zones": [
{
"id": "66df8c0a-c67d-4bd7-9975-bc02a549f13e",
"name": "zone1",
"endpoints": [
"http://ceph-node-00.cephlab.com:8000",
"http://ceph-node-01.cephlab.com:8000"
],
"log_meta": false,
"log_data": true,
"bucket_index_max_shards": 11,
"read_only": false,
"tier_type": "",
"sync_from_all": true,
"sync_from": [],
"redirect_zone": "",
"supported_features": [
"compress-encrypted",
"resharding"
]
},
{
"id": "7b9273a9-eb59-413d-a465-3029664c73d7",
"name": "zone2",
"endpoints": [
"http://ceph-node-04.cephlab.com:8000",
"http://ceph-node-05.cephlab.com:8000"
],
"log_meta": false,
"log_data": true,
"bucket_index_max_shards": 11,
"read_only": false,
"tier_type": "",
"sync_from_all": true,
"sync_from": [],
"redirect_zone": "",
"supported_features": [
"compress-encrypted",
"resharding"
]
}
],
"placement_targets": [
{
"name": "default-placement",
"tags": [],
"storage_classes": [
"STANDARD"
]
}
],
"default_placement": "default-placement",
"realm_id": "beeea955-8341-41cc-a046-46de2d5ddeb9",
"sync_policy": {
"groups": []
},
"enabled_features": [
"resharding"
]
}
為了驗證復制是否正常工作,我們創建一個用戶和一個存儲桶:
[root@ceph-node-00 ~]# radosgw-admin user create --uid='user1' --display-name='First User' --access-key='S3user1' --secret-key='S3user1key'
[root@ceph-node-00 ~]# aws configure
AWS Access Key ID [None]: S3user1
AWS Secret Access Key [None]: S3user1key
Default region name [None]: multizg
Default output format [None]: json
[root@ceph-node-00 ~]# aws --endpoint http://s3.cephlab.com:80 s3 ls
[root@ceph-node-00 ~]# aws --endpoint http://s3.cephlab.com:80 s3 mb s3://firstbucket
make_bucket: firstbucket
[root@ceph-node-00 ~]# aws --endpoint http://s3.cephlab.com:80 s3 cp /etc/hosts s3://firstbucket
upload: ../etc/hosts to s3://firstbucket/hosts
如果我們從第二個 Ceph 集群zone2進行檢查,我們可以看到所有元數據都已復制,并且我們在zone1中創建的所有用戶和存儲桶現在都存在于zone2中。
[!CAUTION]
注意:在此示例中,我們將使用radosgw-admin命令進行檢查,但我們也可以使用 S3 API 命令將 AWS 客戶端指向第二個區域內 RGW 的 IP/主機名。
[root@ceph-node-04 ~]# radosgw-admin user list
[
"dashboard",
"user1",
"sysuser-multisite"
]
[root@ceph-node-04 ~]# radosgw-admin bucket stats --bucket testbucket | jq .bucket
"testbucket"
要檢查復制狀態,我們可以使用radosgw-admin sync status命令。例如:
[root@ceph-node-00 ~]# radosgw-admin sync status
realm beeea955-8341-41cc-a046-46de2d5ddeb9 (multisite)
zonegroup 2761ad42-fd71-4170-87c6-74c20dd1e334 (multizg)
zone 66df8c0a-c67d-4bd7-9975-bc02a549f13e (zone1)
current time 2024-01-05T22:51:17Z
zonegroup features enabled: resharding
disabled: compress-encrypted
metadata sync no sync (zone is master)
data sync source: 7b9273a9-eb59-413d-a465-3029664c73d7 (zone2)
syncing
full sync: 0/128 shards
incremental sync: 128/128 shards
data is caught up with source
總 結
我們詳細講解了如何使用rgw管理器模塊在兩個站點/區域之間部署Ceph對象存儲多站點復制。這只是一個開始,我們的目標是構建一個完整的部署,包括必要的負載均衡。