目錄
1、對(duì)象存儲(chǔ)概念
?2、創(chuàng)建 RGW 接口
//在管理節(jié)點(diǎn)創(chuàng)建一個(gè) RGW 守護(hù)進(jìn)程
#創(chuàng)建成功后默認(rèn)情況下會(huì)自動(dòng)創(chuàng)建一系列用于 RGW 的存儲(chǔ)池?
#默認(rèn)情況下 RGW 監(jiān)聽(tīng) 7480 號(hào)端口?
//開(kāi)啟 http+https ,更改監(jiān)聽(tīng)端口
#更改監(jiān)聽(tīng)端口
?? ? ? ? ? //創(chuàng)建 RadosGW 賬戶
客戶端測(cè)試
OSD 故障模擬與恢復(fù)
?3、把原來(lái)壞掉的 osd 修復(fù)后重新加入集群
?方法二
1、對(duì)象存儲(chǔ)概念
對(duì)象存儲(chǔ)(object storage)是非結(jié)構(gòu)數(shù)據(jù)的存儲(chǔ)方法,對(duì)象存儲(chǔ)中每一條數(shù)據(jù)都作為單獨(dú)的對(duì)象存儲(chǔ),擁有唯一的地址來(lái)識(shí)別數(shù)據(jù)對(duì)象,通常用于云計(jì)算環(huán)境中。
不同于其他數(shù)據(jù)存儲(chǔ)方法,基于對(duì)象的存儲(chǔ)不使用目錄樹(shù)。
雖然在設(shè)計(jì)與實(shí)現(xiàn)上有所區(qū)別,但大多數(shù)對(duì)象存儲(chǔ)系統(tǒng)對(duì)外呈現(xiàn)的核心資源類型大同小異。從客戶端的角度來(lái)看,分為以下幾個(gè)邏輯單位:
●Amazon S3:
提供了
1、用戶(User)
2、存儲(chǔ)桶(Bucket)
3、對(duì)象(Object)
三者的關(guān)系是:
1、User將Object存儲(chǔ)到系統(tǒng)上的Bucket
2、存儲(chǔ)桶屬于某個(gè)用戶并可以容納對(duì)象,一個(gè)存儲(chǔ)桶用于存儲(chǔ)多個(gè)對(duì)象
3、同一個(gè)用戶可以擁有多個(gè)存儲(chǔ)桶,不同用戶允許使用相同名稱的Bucket,因此User名稱即可做為Bucket的名稱空間
●OpenStack Swift:?
提供了user、container和object分別對(duì)應(yīng)于用戶、存儲(chǔ)桶和對(duì)象,不過(guò)它還額外為user提供了父級(jí)組件account,用于表示一個(gè)項(xiàng)目或用戶組,因此一個(gè)account中可以包含一到多個(gè)user,它們可共享使用同一組container,并為container提供名稱空間
●RadosGW:
提供了user、subuser、bucket和object,其中的user對(duì)應(yīng)于S3的user,而subuser則對(duì)應(yīng)于Swift的user,不過(guò)user和subuser都不支持為bucket提供名稱空間,因此不同用戶的存儲(chǔ)桶不允許同名;不過(guò),自jewel版本起,RadosGW引入了tenant(租戶)用于為user和bucket提供名稱空間,但他是個(gè)可選組件
從上可以看出大多數(shù)對(duì)象存儲(chǔ)的核心資源類型大同小異,如 Amazon S3、OpenStack Swift 與 RadosGw。其中 S3 與 Swift 互不兼容,RadosGw 為了兼容 S3 與 Swift, Ceph 在 RadosGW 集群的基礎(chǔ)上提供了 RGW(RadosGateway)數(shù)據(jù)抽象層和管理層,它可以原生兼容 S3 和 Swift 的 API。
S3和Swift它們可基于http或https完成數(shù)據(jù)交換,由RadosGW內(nèi)建的Civetweb提供服務(wù),它還可以支持代理服務(wù)器包括nginx、haproxy等以代理的形式接收用戶請(qǐng)求,再轉(zhuǎn)發(fā)至RadosGW進(jìn)程。
RGW 的功能依賴于對(duì)象網(wǎng)關(guān)守護(hù)進(jìn)程實(shí)現(xiàn),負(fù)責(zé)向客戶端提供 REST API 接口。出于冗余負(fù)載均衡的需求,一個(gè) Ceph 集群上通常不止一個(gè) RadosGW 守護(hù)進(jìn)程。(##可以在多個(gè)節(jié)點(diǎn)去開(kāi)啟RGW守護(hù)進(jìn)程)
? 2、創(chuàng)建 RGW 接口
如果需要使用到類似 S3 或者 Swift 接口時(shí)候才需要部署/創(chuàng)建 RadosGW 接口,RadosGW 通常作為對(duì)象存儲(chǔ)(Object Storage)使用,類于阿里云OSS。
//在管理節(jié)點(diǎn)創(chuàng)建一個(gè) RGW 守護(hù)進(jìn)程
[root@admin /etc/ceph]#ceph-deploy rgw create node01
?
#創(chuàng)建成功后默認(rèn)情況下會(huì)自動(dòng)創(chuàng)建一系列用于 RGW 的存儲(chǔ)池?
ceph osd pool ls
rgw.root
default.rgw.control #控制器信息
default.rgw.meta #記錄元數(shù)據(jù)
default.rgw.log #日志信息
default.rgw.buckets.index #為 rgw 的 bucket 信息,寫(xiě)入數(shù)據(jù)后生成
default.rgw.buckets.data #是實(shí)際存儲(chǔ)的數(shù)據(jù)信息,寫(xiě)入數(shù)據(jù)后生成
#默認(rèn)情況下 RGW 監(jiān)聽(tīng) 7480 號(hào)端口?
//開(kāi)啟 http+https ,更改監(jiān)聽(tīng)端口
RadosGW 守護(hù)進(jìn)程內(nèi)部由 Civetweb 實(shí)現(xiàn),通過(guò)對(duì) Civetweb 的配置可以完成對(duì) RadosGW 的基本管理。
#要在 Civetweb 上啟用SSL,首先需要一個(gè)證書(shū),在 rgw 節(jié)點(diǎn)生成證書(shū)
1)生成CA證書(shū)私鑰:
openssl genrsa -out civetweb.key 2048
2)生成CA證書(shū)公鑰:
openssl req -new -x509 -key civetweb.key -out civetweb.crt -days 3650 -subj "/CN=192.168.20.7"
#3、將生成的證書(shū)合并為pem
cat civetweb.key civetweb.crt > /etc/ceph/civetweb.pem
#更改監(jiān)聽(tīng)端口
Civetweb 默認(rèn)監(jiān)聽(tīng)在 7480 端口并提供 http 協(xié)議,如果需要修改配置需要在管理節(jié)點(diǎn)編輯 ceph.conf 配置文件
vim ceph.conf
......
[client.rgw.node01]
rgw_host = node01
rgw_frontends = "civetweb port=80+443s ssl_certificate=/etc/ceph/civetweb.pem num_threads=500 request_timeout_ms=60000"
------------------------------------------------------------
●rgw_host:對(duì)應(yīng)的RadosGW名稱或者IP地址
●rgw_frontends:這里配置監(jiān)聽(tīng)的端口,是否使用https,以及一些常用配置:
?port:如果是https端口,需要在端口后面加一個(gè)s。
?ssl_certificate:指定證書(shū)的路徑。
?num_threads:最大并發(fā)連接數(shù),默認(rèn)為50,根據(jù)需求調(diào)整,通常在生產(chǎn)集群環(huán)境中此值應(yīng)該更大
?request_timeout_ms:發(fā)送與接收超時(shí)時(shí)長(zhǎng),以ms為單位,默認(rèn)為30000
?access_log_file:訪問(wèn)日志路徑,默認(rèn)為空
?error_log_file:錯(cuò)誤日志路徑,默認(rèn)為空
------------------------------------------------------------
#修改完 ceph.conf 配置文件后需要重啟對(duì)應(yīng)的 RadosGW 服務(wù),再推送配置文件
ceph-deploy --overwrite-conf config push node0{1..3}
systemctl restart ceph-radosgw.target
#在 rgw 節(jié)點(diǎn)上查看端口
netstat -lntp | grep -w 80
netstat -lntp | grep 443
#在客戶端訪問(wèn)驗(yàn)證
curl http://192.168.20.7:80
curl -k https://192.168.20.7:443
//創(chuàng)建 RadosGW 賬戶
在管理節(jié)點(diǎn)使用 radosgw-admin 命令創(chuàng)建 RadosGW 賬戶
[root@admin /etc/ceph]#radosgw-admin user create --uid="rgwuser" --display-name="rgw test user"
#創(chuàng)建成功后將輸出用戶的基本信息,其中最重要的兩項(xiàng)信息為 access_key 和 secret_key 。用戶創(chuàng)建成后功,如果忘記用戶信息可以使用下面的命令查看
radosgw-admin user info --uid="rgwuser"
客戶端測(cè)試
//S3 接口訪問(wèn)測(cè)試
1)在客戶端安裝 python3、python3-pip
yum install -y python3 python3-pip
python3 -V
Python 3.6.8
pip3 -V
pip 9.0.3 from /usr/lib/python3.6/site-packages (python 3.6)
2)安裝 boto 模塊,用于測(cè)試連接 S3
pip3 install boto
3)測(cè)試訪問(wèn) S3 接口
echo 123123 > /opt/123.txt
vim test.py
#coding:utf-8
import ssl
import boto.s3.connection
from boto.s3.key import Key
try:
_create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
pass
else:
ssl._create_default_https_context = _create_unverified_https_context
#test用戶的keys信息
access_key = "ER0SCVRJWNRIKFGQD31H" #輸入 RadosGW 賬戶的 access_key
secret_key = "YKYjk7L4FfAu8GHeQarIlXodjtj1BXVaxpKv2Nna" #輸入 RadosGW 賬戶的 secret_key
#rgw的ip與端口
host = "192.168.20.7" #輸入 RGW 接口的 public 網(wǎng)絡(luò)地址
#如果使用443端口,下述鏈接應(yīng)設(shè)置is_secure=True
port = 443
#如果使用80端口,下述鏈接應(yīng)設(shè)置is_secure=False
#port = 80
conn = boto.connect_s3(
aws_access_key_id=access_key,
aws_secret_access_key=secret_key,
host=host,
port=port,
is_secure=True,
validate_certs=False,
calling_format=boto.s3.connection.OrdinaryCallingFormat()
)
#一:創(chuàng)建存儲(chǔ)桶
#conn.create_bucket(bucket_name='bucket01')
#conn.create_bucket(bucket_name='bucket02')
#二:判斷是否存在,不存在返回None
exists = conn.lookup('bucket01')
print(exists)
#exists = conn.lookup('bucket02')
#print(exists)
#三:獲得一個(gè)存儲(chǔ)桶
#bucket1 = conn.get_bucket('bucket01')
#bucket2 = conn.get_bucket('bucket02')
#四:查看一個(gè)bucket下的文件
#print(list(bucket1.list()))
#print(list(bucket2.list()))
#五:向s3上存儲(chǔ)數(shù)據(jù),數(shù)據(jù)來(lái)源可以是file、stream、or string
#5.1、上傳文件
#bucket1 = conn.get_bucket('bucket01')
# name的值是數(shù)據(jù)的key
#key = Key(bucket=bucket1, name='myfile')
#key.set_contents_from_filename('/opt/123.txt')
# 讀取 s3 中文件的內(nèi)容,返回 string 即文件 123.txt 的內(nèi)容
#print(key.get_contents_as_string())
#5.2、上傳字符串
#如果之前已經(jīng)獲取過(guò)對(duì)象,此處不需要重復(fù)獲取
bucket2 = conn.get_bucket('bucket02')
key = Key(bucket=bucket2, name='mystr')
key.set_contents_from_string('hello world')
print(key.get_contents_as_string())
#六:刪除一個(gè)存儲(chǔ)桶,在刪除存儲(chǔ)桶本身時(shí)必須刪除該存儲(chǔ)桶內(nèi)的所有key
bucket1 = conn.get_bucket('bucket01')
for key in bucket1:
key.delete()
bucket1.delete()
4)按照以上步驟執(zhí)行 python 腳本測(cè)試
python3 test.py
OSD 故障模擬與恢復(fù)
1、模擬 OSD 故障
如果 ceph 集群有上千個(gè) osd,每天壞 2~3 個(gè)太正常了,我們可以模擬 down 掉一個(gè) osd
#如果 osd 守護(hù)進(jìn)程正常運(yùn)行,down 的 osd 會(huì)很快自恢復(fù)正常,所以需要先關(guān)閉守護(hù)進(jìn)程
ssh root@node03 systemctl stop ceph-osd@2
#down 掉 osd
ceph osd down 0
ceph osd tree
2、將壞掉的 osd 踢出集群
//方法一:
#將 osd.0 移出集群,集群會(huì)開(kāi)始自動(dòng)同步數(shù)據(jù)
ceph osd out osd.0
#將 osd.0 移除 crushmap
ceph osd crush remove osd.0
#刪除守護(hù)進(jìn)程對(duì)應(yīng)的賬戶信息
ceph auth rm osd.0
ceph auth list
#刪掉 osd.0
ceph osd rm osd.0
ceph osd stat
ceph -s
//方法二:
ceph osd out osd.0
#使用綜合步驟,刪除配置文件中針對(duì)壞掉的 osd 的配置
ceph osd purge osd.0 --yes-i-really-mean-it
3、把原來(lái)壞掉的 osd 修復(fù)后重新加入集群
#在 osd 節(jié)點(diǎn)創(chuàng)建 osd,無(wú)需指定名,會(huì)按序號(hào)自動(dòng)生成
cd /etc/ceph
ceph osd create
#創(chuàng)建賬戶
ceph-authtool --create-keyring /etc/ceph/ceph.osd.2.keyring --gen-key -n osd.0 --cap mon 'allow profile osd' --cap mgr 'allow profile osd' --cap osd 'allow *'
#導(dǎo)入新的賬戶秘鑰
ceph auth import -i /etc/ceph/ceph.osd.0.keyring
ceph auth list
#更新對(duì)應(yīng)的 osd 文件夾中的密鑰環(huán)文件
ceph auth get-or-create osd.0 -o /var/lib/ceph/osd/ceph-0/keyring
#加入 crushmap
ceph osd crush add osd.2 1.000 host=node03 #1.000 代表權(quán)重
#加入集群
ceph osd in osd.2
ceph osd tree
#重啟 osd 守護(hù)進(jìn)程
systemctl restart ceph-osd@2
ceph osd tree #稍等片刻后 osd 狀態(tài)為 up
//如果重啟失敗
報(bào)錯(cuò):
Job for ceph-osd@0.service failed because start of the service was attempted too often. See "systemctl status ceph-osd@0.service" and "journalctl -xe" for details.
To force a start use "systemctl reset-failed ceph-osd@0.service" followed by "systemctl start ceph-osd@0.service" again.
#運(yùn)行
systemctl reset-failed ceph-osd@0.service && systemctl restart ceph-osd@0.service
?3、把原來(lái)壞掉的 osd 修復(fù)后重新加入集群
#在 osd 節(jié)點(diǎn)創(chuàng)建 osd,無(wú)需指定名,會(huì)按序號(hào)自動(dòng)生成
cd /etc/ceph
ceph osd create
[root@admin /etc/ceph]#ceph osd create
2
[root@admin /etc/ceph]#ceph-authtool --create-keyring ceph.osd.2.keyring --gen-key -n osd.2 --cap mon 'allow profile osd' --cap mgr 'allow profile osd' --cap osd 'allow *'
導(dǎo)入新的賬戶秘鑰
[root@admin /etc/ceph]#ceph auth import -i ceph.osd.2.keyring
imported keyring
?
?方法二
?
?
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-804072.html
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-804072.html
到了這里,關(guān)于【分布式技術(shù)】分布式存儲(chǔ)ceph之RGW接口的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!