近來由於工作需要,爲用戶配置了幾套Ceph對象存儲,今天忙裏偷閒:),將配置過程記錄下來,分享於讀者。
前言
安裝前的準備
該文中所使用的Ceph版本爲 Hammer 0.94.1;在配置rgw
前,需確保Ceph
集羣已經準備就緒並能正常工作,radosgw
網關程序已經安裝。
相關的名稱解釋
Region :可以理解爲區域,是基於地理位置的邏輯劃分;如:華南,華北之類,包含多個region
的Ceph
集羣必須指定一個master region
,一個region
可以包含一個或者多個zone
Zone : 可以理解爲可用區,它包含一組Ceph rgw
實例,一個region
必須指定一個master zone
用以處理客戶端請求
部署拓撲
本文描述的多可用區部署拓撲如下:
Ceph
|
SH
/ \
SH-1 SH-2
| |
SH-SH-1 SH-SH-2
在Ceph
集羣配置名爲SH
的Region
,在Region
下配置名爲SH-1
及SH-2
兩個Zone
,並將SH-1
設置爲master
, SH-2
備用,可以通過radosgw-agent
實現數據複製;每個Zone
各運行一個rgw
實例,分別爲SH-SH-1
及SH-SH-2
rgw
組成要素
rgw
作爲一個客戶端,包含如下基本元素:
rgw
實例名, 本文中兩個實例分別是SH-SH-1
,SH-SH-2
rgw
實例用戶- 存儲池
ceph.conf
中配置入口rgw
實例運行時數據目錄- 前端配置文件
下文對各步驟一一說明,請繼續往下看:
配置rgw
創建pools
Ceph rgw
需要使用多個pool
來存儲相關的配置及用戶數據。如果後續創建的rgw
用戶具有相關權限,在rgw
實例啓動的時候是會自動創建某些存儲池的;但是,通常都會建議用戶自行創建。爲便於區別不同Zone
,在各存儲池名前冠以.{region-name}-{zone-name}
前綴,SH-1
及SH-2
的各存儲池如下:
.SH-SH-1.rgw.root
.SH-SH-1.rgw.control
.SH-SH-1.rgw.gc
.SH-SH-1.rgw.buckets
.SH-SH-1.rgw.buckets.index
.SH-SH-1.rgw.buckets.extra
.SH-SH-1.log
.SH-SH-1.intent-log
.SH-SH-1.usage
.SH-SH-1.users
.SH-SH-1.users.email
.SH-SH-1.users.swift
.SH-SH-1.users.uid
.SH-SH-2.rgw.root
.SH-SH-2.rgw.control
.SH-SH-2.rgw.gc
.SH-SH-2.rgw.buckets
.SH-SH-2.rgw.buckets.index
.SH-SH-2.rgw.buckets.extra
.SH-SH-2.log
.SH-SH-2.intent-log
.SH-SH-2.usage
.SH-SH-2.users
.SH-SH-2.users.email
.SH-SH-2.users.swift
.SH-SH-2.users.uid
創建存儲池的命令如下:
ceph osd pool create {pool_name} 128 128
注意:不要忘記存儲池名前的’.’,否則在啓動
rgw
實例的時候會失敗
創建rgw
用戶及祕鑰
創建祕鑰文件
在
/etc/ceph/
目錄下創建祕鑰文件並設置執行權限
#ceph-authtool --create-keyring /etc/ceph/ceph.client.radosgw.keyring
#chmod +r /etc/ceph/ceph.client.radosgw.keyring
- 創建
rgw
用戶及祕鑰
爲每個實例生成用戶及祕鑰,並存儲到前述創建的祕鑰文件中
#ceph-authtool /etc/ceph/ceph.client.radosgw.keyring -n client.radosgw.SH-SH-1 --gen-key
#ceph-authtool /etc/ceph/ceph.client.radosgw.keyring -n client.radosgw.SH-SH-2 --gen-key
- 授權
爲前述創建的用戶授予合適的權限
#ceph-authtool -n client.radosgw.SH-SH-1 --cap osd 'allow rwx' --cap mon 'allow rwx' /etc/ceph/ceph.client.radosgw.keyring
#ceph-authtool -n client.radosgw.SH-SH-2 --cap osd 'allow rwx' --cap mon 'allow rwx' /etc/ceph/ceph.client.radosgw.keyring
- 註冊
將用戶添加到Ceph
集羣
#ceph -k /etc/ceph/ceph.client.admin.keyring auth add client.radosgw.SH-SH-1 -i /etc/ceph/ceph.client.radosgw.keyring
#ceph -k /etc/ceph/ceph.client.admin.keyring auth add client.radosgw.SH-SH-2 -i /etc/ceph/ceph.client.radosgw.keyring
添加rgw
實例信息到配置文件
- 添加下述信息到
ceph.conf
配置文件
[global]
rgw region root pool = .SH.rgw.root //用於存儲region信息,會自動創建
[client.radosgw.SH-SH-1] //實例名,格式爲:{tpye}.{id}
rgw region = SH //region名
rgw zone = SH-1 //zone名
rgw zone root pool = .SH-SH-1.rgw.root //根存儲池,存儲zone信息
keyring = /etc/ceph/ceph.client.radosgw.keyring //祕鑰文件
rgw dns name = {hostname} //DNS
;rgw socket path = /var/run/ceph/$name.sock //unix路徑
rgw frontends = fastcgi socket_port=9000 socket_host=0.0.0.0
host = {host-name} //主機名,通過`hostname -s`獲得
[client.radosgw.SH-SH-2]
rgw region = SH
rgw zone = SH-2
rgw zone root pool = .SH-SH-2.rgw.root
keyring = /etc/ceph/ceph.client.radosgw.keyring
rgw dns name = {hostname}
rgw frontends = fastcgi socket_port=9000 socket_host=0.0.0.0
host = {host-name}
各配置的含義請看上文的註解,這裏要說明的一點是:
rgw socket path
及rgw frontends
中的socket_port
配置是互斥的並且rgw socket path
配置優先,即:如果配置了rgw socket path
,rgw
實例將啓動unix socket
監聽並忽略socket_port
配置,只有在沒有配置rgw socket path
的情況下,rgw
實例纔會使用socket_port
及socket_host
建立socket
監聽
- 更新
ceph
節點的配置信息
通過ceph-deploy
推送配置文件到rgw
實例節點
#ceph-deploy --overwrite-conf config push {inst-1} {inst-2}
創建Region
- 創建
region
配置文件
創建一個包含region信息,名爲sh.json
的配置文件:
{ "name": "SH", //region名
"api_name": "SH",
"is_master": "true", //設置爲master
"endpoints": "", //region之間的複製地址
"master_zone": "SH-1", //master zone
"zones": [
{ "name": "SH-1",
"endpoints": [
"http:\/\/{fqdn}:80\/"], //zone之間的複製地址
"log_meta": "true",
"log_data": "true"},
{ "name": "SH-2",
"endpoints": [
"http:\/\/{fqdn}:80\/"],
"log_meta": "true",
"log_data": "true"}],
"placement_targets": [ //可用的位置組,
{
"name": "default-placement",
"tags": []
}
],
"default_placement": "default-placement"}
endpoints
是用於region
之間,zone
之間的數據複製地址,需設置爲rgw
實例前端(上例中{fqdn}需設置爲主機名)的地址;如果是單region
或者單zone
配置,該地址可不設置
placement_targets
指定可用的位置組,上文中只配置了一個;zone中的placement_pools
配置值來源於此,placement_pools
用來存儲zone的用戶數據,如:bucket,bucket_index
- 創建
Region
通過前述的sh.json
配置文件創建region
(通過一個實例執行即可)
#radosgw-admin region set --infile us.json --name client.radosgw.SH-SH-1
- 設置默認
Region
#radosgw-admin region default --rgw-region=SH --name client.radosgw.SH-SH-1
- 更新
regionmap
#radosgw-admin regionmap update --name client.radosgw.SH-SH-1
#radosgw-admin regionmap update --name client.radosgw.SH-SH-2
創建Zone
- 創建兩個分別包含zone
SH-1
及SH-2
信息,名爲sh-1.json
及sh-2.json
的配置文件,sh-1.json
的內容如下(sh-2.json
中只是將SH-SH-1
替換爲SH-SH-2
):
{ "domain_root": ".SH-SH-1.domain.rgw",
"control_pool": ".SH-SH-1.rgw.control",
"gc_pool": ".SH-SH-1.rgw.gc",
"log_pool": ".SH-SH-1.log",
"intent_log_pool": ".SH-SH-1.intent-log",
"usage_log_pool": ".SH-SH-1.usage",
"user_keys_pool": ".SH-SH-1.users",
"user_email_pool": ".SH-SH-1.users.email",
"user_swift_pool": ".SH-SH-1.users.swift",
"user_uid_pool": ".SH-SH-1.users.uid",
"system_key": { "access_key": "", "secret_key": ""},
"placement_pools": [
{ "key": "default-placement",
"val": { "index_pool": ".SH-SH-1.rgw.buckets.index",
"data_pool": ".SH-SH-1.rgw.buckets"}
}
]
}
注意
placement_pools
配置,用來存儲bucket,bucket index等信息key
需要是定義region時placement_target
中指定的某個name
- 創建
Zone
-SH-1
#radosgw-admin zone set --rgw-zone=SH-1 --infile sh-1.json --name client.radosgw.SH-SH-1
#radosgw-admin zone set --rgw-zone=SH-1 --infile sh-1.json --name client.radosgw.SH-SH-1
- 創建
Zone
-SH-2
#radosgw-admin zone set --rgw-zone=SH-2 --infile sh-2.json --name client.radosgw.SH-SH-2
#radosgw-admin zone set --rgw-zone=SH-2 --infile sh-2.json --name client.radosgw.SH-SH-2
- 更新
regionmap
#radosgw-admin regionmap update --name client.radosgw.SH-SH-1
#radosgw-admin regionmap update --name client.radosgw.SH-SH-2
創建Zone
- 用戶
Zone
用戶信息存儲在Zone
的存儲池中,所以需要先配置Zone
再創建用戶;創建用戶後,請注意保留access_key
及secret_key
信息,以便後面更新Zone
信息:
#radosgw-admin user create --uid="sh-1" --display-name="Region-SH Zone-SH-1" --name client.radosgw.SH-SH-1 --system
#radosgw-admin user create --uid="sh-2" --display-name="Region-SH Zone-SH-2" --name client.radosgw.SH-SH-2 --system
更新 Zone
將上述創建的兩個用戶的access_key
及secret_key
分佈拷貝到創建Zone
那一節創建的兩個配置文件sh-1.json
及sh-2.json
中,並執行下面的命令更新Zone
配置:
#radosgw-admin zone set --rgw-zone=SH-1 --infile sh-1.json --name client.radosgw.SH-SH-1
#radosgw-admin zone set --rgw-zone=SH-1 --infile sh-1.json --name client.radosgw.SH-SH-1
#radosgw-admin zone set --rgw-zone=SH-2 --infile sh-2.json --name client.radosgw.SH-SH-2
#radosgw-admin zone set --rgw-zone=SH-2 --infile sh-2.json --name client.radosgw.SH-SH-2
配置前端
- 生成rgw配置
Apache,Nignx及civetweb都可以作爲rgw
前端,在這之前,曾寫過一篇有關rgw
各前端配置的文章,有需要的讀者可以前往閱讀。下面,給出本文中的apache配置(/etc/httpd/cond.d/rgw.conf):
<VirtualHost *:80>
ServerName {fqdn}
DocumentRoot /var/www/html
ErrorLog /var/log/httpd/rgw_error.log
CustomLog /var/log/httpd/rgw_access.log combined
# LogLevel debug
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
SetEnv proxy-nokeepalive 1
#ProxyPass / unix:///var/run/ceph/ceph-client.radosgw.SH-SH-1.asok
ProxyPass / fcgi://{fqdn}:9000/
</VirtualHost>
{fqdn}需替換爲所在節點的主機名,ProxyPass需要根據
ceph.conf
文件中的rgw實例配置來設置
- 創建數據目錄
在實例節點上分別爲rgw
實例創建數據目錄,目錄格式:{type}.{id}:
#mkdir -p /var/lib/ceph/radosgw/ceph-radosgw.SH-SH-1
#mkdir -p /var/lib/ceph/radosgw/ceph-radosgw.SH-SH-2
啓動實例
在兩個實例節點上分別啓動實例及前端
#radosgw -c /etc/ceph/ceph.conf -n client.radosgw.SH-SH-1
#systemctl restart httpd.service
#radosgw -c /etc/ceph/ceph.conf -n client.radosgw.SH-SH-2
#systemctl restart httpd.service
主備複製
rgw
配好後,可以通過radosgw-agent
將master zone - SH-1
中的數據複製到slave zone - SH-1
,實現提高可用性及讀性能的目的
配置
創建cluster-data-sync.conf
文件,並填充如下內容:
src_access_key: {source-access-key} //master zone用戶的祕鑰信息
src_secret_key: {source-secret-key}
destination: https://{fqdn}:port //這裏是slave zone的endpoints地址
dest_access_key: {destination-access-key} //slave zone用戶的祕鑰信息
dest_secret_key: {destination-secret-key}
log_file: {log.filename} //日誌文件
發起複製
通過下面的命令,發起主備複製:
#radosgw-agent -c region-data-sync.conf
至此,一個‘一Region兩Zone’的Ceph rgw
配置就完成了。如有不正確的地方,歡迎指正,謝謝大家!