一 前言
分佈式文件系統(Distributed File System):文件系統管理的物理存儲資源不必定直接鏈接在本地節點上,而是經過計算機網絡與節點相連.分佈式文件系統的設計基於C/S模式
1,什麼是Ceph?
Ceph:是一個 Linux PB 級分佈式文件系統
特色:
具備高擴展,高可用,高性能的特色
能夠提供對象存儲,塊存儲,文件存儲
能夠提供PB級別的存儲空間(PB->TB->GB)
幫助文檔:http://docs.ceph.org/start/intro
中文文檔:http://docs.ceph.org.cn/
Ceph核心組件:
OSD:存儲設備(OSD越多性能越好)
Monitor:集羣監控組件 (取基數,如3,5,7)
MDS:存放文件系統的元數據(對象存儲和塊存儲不須要該組件)
Client:ceph客戶端
二 搭建塊存儲
1,實驗環境
虛擬機都是rhel7.4,真機centos7
虛擬機:4臺
node1,node2,node3既是OSD,也是Mpnitor
真實機:(centos7)或者從新新建一臺虛擬機代替真機也能夠
鏡像地址:https://pan.baidu.com/s/1Uo_7yEl4mTXTiS7N98Abfwnode
2,安裝前準備
1)物理機爲全部節點配置yum源服務器。
[root@room9pc01 ~]# yum -y install vsftpd
[root@room9pc01 ~]# mkdir /var/ftp/ceph
[root@room9pc01 ~]# mount -o loop \
rhcs2.0-rhosp9-20161113-x86_64.iso /var/ftp/ceph #此光盤在網盤裏
[root@room9pc01 ~]# systemctl restart vsftpd
2)修改全部節點都須要配置YUM源(這裏僅以node1爲例)。
[root@node1 ceph-cluster]# cat /etc/yum.repos.d/ceph.repo
[mon]
name=mon
baseurl=ftp://192.168.4.254/ceph/rhceph-2.0-rhel-7-x86_64/MON
gpgcheck=0
[osd]
name=osd
baseurl=ftp://192.168.4.254/ceph/rhceph-2.0-rhel-7-x86_64/OSD
gpgcheck=0
[tools]
name=tools
baseurl=ftp://192.168.4.254/ceph/rhceph-2.0-rhel-7-x86_64/Tools
gpgcheck=0
3)修改/etc/hosts並同步到全部主機。
警告:/etc/hosts解析的域名必須與本機主機名一致!!!!
[root@node1 ceph-cluster]# cat /etc/hosts
... ...
192.168.4.10 client
192.168.4.11 node1
192.168.4.12 node2
192.168.4.13 node3
警告:/etc/hosts解析的域名必須與本機主機名一致!!!!
[root@node1 ceph-cluster]# for i in 10 11 12 13vim
do
scp /etc/hosts 192.168.4.$i:/etc/
done
[root@node1 ceph-cluster]# for i in 10 11 12 13
do
scp /etc/yum.repos.d/ceph.repo 192.168.4.$i:/etc/yum.repos.d/
done
3)配置無密碼鏈接(包括本身遠程本身也不須要密碼)。
[root@node1 ceph-cluster]# ssh-keygen -f /root/.ssh/id_rsa -N '' #生成密鑰
[root@node1 ceph-cluster]# for i in 10 11 12 13 #上傳密鑰到個個主機
do
ssh-copy-id 192.168.4.$i
donecentos
3,配置NTP時間同步
1)真實物理機建立NTP服務器。
[root@room9pc01 ~]# yum -y install chrony
[root@room9pc01~]# cat /etc/chrony.conf
server 0.centos.pool.ntp.org iburst
allow 192.168.4.0/24
local stratum 10
[root@room9pc01 ~]# systemctl restart chronyd
[root@room9pc01 ~]# iptables -F #若是有防火牆規則,須要清空全部規則
2)其餘全部節點與NTP服務器同步時間(以node1爲例)。
[root@node1 ceph-cluster]# cat /etc/chrony.conf
#server 0.rhel.pool.ntp.org iburst
#server 1.rhel.pool.ntp.org iburst
#server 2.rhel.pool.ntp.org iburst
server 192.168.4.254 iburst
[root@node1 ceph-cluster]# systemctl restart chronyd
[root@node1 ceph-cluster]# systemctl enable chronyd服務器
4,準備存儲磁盤網絡
直接打開虛擬機管理器添加磁盤,node1,node2,node3每臺添加三個10G磁盤app
5,部署軟件
1)在node1安裝部署工具,學習工具的語法格式。
[root@node1 ~]# yum -y install ceph-deploy
[root@node1 ~]# ceph-deploy --help #查看命令格式
2)建立目錄
[root@node1 ~]# mkdir ceph-cluster
[root@node1 ~]# cd ceph-cluster/
6,部署Ceph集羣
1)建立Ceph集羣配置。
[root@node1 ceph-cluster]# ceph-deploy new node1 node2 node3
2)給全部節點安裝軟件包。
[root@node1 ceph-cluster]# ceph-deploy install node1 node2 node3
3)初始化全部節點的mon服務(主機名解析必須對)
[root@node1 ceph-cluster]# vim ceph.conf #文件最後追加如下內容
public_network = 192.168.4.0/24 #避免會出現以下錯誤加上這一行
[root@node1 ceph-cluster]# ceph-deploy mon create-initial //拷貝配置文件,並啓動mon服務
常見錯誤及解決方法(非必要操做,有錯誤能夠參考):
若是提示以下錯誤信息:
[node1][ERROR ] admin_socket: exception getting command descriptions: [Error 2] No such file or directory
解決方案以下(在node1操做):
先檢查本身的命令是不是在ceph-cluster目錄下執行的!!!!若是時確認是在該目錄下執行的create-initial命令,依然保存,可使用以下方式修復。
[root@node1 ceph-cluster]# vim ceph.conf #文件最後追加如下內容
public_network = 192.168.4.0/24
修改後從新推送配置文件:
[root@node1 ceph-cluster]# ceph-deploy --overwrite-conf config push node1 node2 node3dom
7,建立OSD
1)準備磁盤分區(node1,node2,node3都要作)
[root@node1 ceph-cluster]# parted /dev/vdb mklabel gpt
[root@node1 ceph-cluster]# parted /dev/vdb mkpart primary 1M 50%
[root@node1 ceph-cluster]# parted /dev/vdb mkpart primary 50% 100%
[root@node1 ceph-cluster]# chown ceph.ceph /dev/vdb1 #受權給ceph用戶
[root@node1 ceph-cluster]# chown ceph.ceph /dev/vdb2
提示:重啓後失效,要想永久有效,1,把命令寫入/etc/rc.local文件中,並給文件賦予執行權限;2,用udev寫入權限
//這兩個分區用來作存儲服務器的日誌journal盤
2)初始化清空磁盤數據(僅node1操做便可)
[root@node1 ceph-cluster]# ceph-deploy disk zap node1:vdc node1:vdd
[root@node1 ceph-cluster]# ceph-deploy disk zap node2:vdc node2:vdd
[root@node1 ceph-cluster]# ceph-deploy disk zap node3:vdc node3:vdd
提示:若是已經初始化過了,須要從新清空磁盤數據,就要取(node1,node2,node3)卸載掉
3)建立OSD存儲空間(僅node1操做便可)
[root@node1 ceph-cluster]# ceph-deploy osd create node1:vdc:/dev/vdb1 node1:vdd:/dev/vdb2
//建立osd存儲設備,vdc爲集羣提供存儲空間,vdb1提供JOURNAL日誌,
//一個存儲設備對應一個日誌設備,日誌須要SSD,不須要很大
[root@node1 ceph-cluster]# ceph-deploy osd create node2:vdc:/dev/vdb1 node2:vdd:/dev/vdb2
[root@node1 ceph-cluster]# ceph-deploy osd create node3:vdc:/dev/vdb1 node3:vdd:/dev/vdb2
4)常見錯誤(非必須操做)
使用osd create建立OSD存儲空間時,如提示run 'gatherkeys',可使用以下命令修復:
[root@node1 ceph-cluster]# ceph-deploy gatherkeys node1 node2 node3 ssh
8,驗證測試
1) 查看集羣狀態
[root@node1 ceph-cluster]# ceph -s
cluster d3266b4f-5c8c-44f3-b11e-7a2cafd1f75b
health HEALTH_OK #出現ok就成功了,err就失敗了,若是出現warning,執行 systemctl restart ceph*.service ceph*.target重啓服務
monmap e1: 3 mons at {node1=192.168.4.11:6789/0,node2=192.168.4.12:6789/0,node3=192.168.4.13:6789/0}
election epoch 6, quorum 0,1,2 node1,node2,node3
osdmap e42: 6 osds: 6 up, 6 in
flags sortbitwise
pgmap v323: 64 pgs, 1 pools, 88496 kB data, 5147 objects
503 MB used, 119 GB / 119 GB avail
64 active+cleansocket
2)常見錯誤(非必須操做)
若是查看狀態包含以下信息:
health: HEALTH_WARN
clock skew detected on node2, node3…
clock skew表示時間不一樣步,解決辦法:請先將全部主機的時間都使用NTP時間同步!!!
若是狀態仍是失敗,能夠嘗試執行以下命令,重啓ceph服務:
[root@node1 ceph-cluster]# systemctl restart ceph*.service ceph*.target分佈式
9,建立鏡像
1)查看存儲池。
[root@node1 ceph-cluster]# ceph osd lspools
0 rbd,
2)建立鏡像、查看鏡像
兩種建立鏡像(共享硬盤)方式
方式一(沒有指明存儲池默認rbd)
[root@node1 ceph-cluster]# rbd create demo-image --image-feature layering --size 10G
方式二(指明存儲池rbd)
[root@node1 ceph-cluster]# rbd create rbd/image --image-feature layering --size 10G
[root@node1 ceph-cluster]# rbd list #rbd ls也能夠查看鏡像
demo-image
image
[root@node1 ceph-cluster]# rbd info demo-image #查看具體某個鏡像信息
rbd image 'demo-image':
size 10240 MB in 2560 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.d3aa2ae8944a
format: 2
features: layering
10,動態調整鏡像大小
1)縮小容量
[root@node1 ceph-cluster]# rbd resize --size 7G image --allow-shrink
[root@node1 ceph-cluster]# rbd info image
2)擴容容量
[root@node1 ceph-cluster]# rbd resize --size 15G image
[root@node1 ceph-cluster]# rbd info image
11,經過KRBD訪問
1)集羣內將鏡像映射爲本地磁盤
[root@node1 ceph-cluster]# rbd map demo-image#使用內核將鏡像映射到塊設備
/dev/rbd0
[root@node1 ceph-cluster]# lsblk
… …
rbd0 251:0 0 10G 0 disk #此處爲加載識別的塊設備
[root@node1 ceph-cluster]# mkfs.xfs /dev/rbd0 #格式化
[root@node1 ceph-cluster]# mount /dev/rbd0 /mnt #掛載使用
[root@node1 ceph-cluster]# df -h #查看當前掛載信息
2)客戶端經過KRBD訪問
#客戶端須要安裝ceph-common軟件包
#拷貝配置文件(不然不知道集羣在哪)
#拷貝鏈接密鑰(不然無鏈接權限)
[root@client ~]# yum -y install ceph-common
[root@client ~]# scp 192.168.4.11:/etc/ceph/ceph.conf /etc/ceph/ #從集羣中下載配置文件
[root@client ~]# scp 192.168.4.11:/etc/ceph/ceph.client.admin.keyring \
/etc/ceph/ #從集羣中下載密鑰
[root@client ~]# rbd map image #使用內核將鏡像映射到塊設備
[root@client ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
vda 252:0 0 20G 0 disk
├─vda1 252:1 0 1G 0 part /boot
└─vda2 252:2 0 19G 0 part
├─rhel-root 253:0 0 17G 0 lvm /
└─rhel-swap 253:1 0 2G 0 lvm [SWAP]
rbd0 251:0 0 15G 0 disk #此處是使用的網絡磁盤
[root@client ~]# rbd showmapped #查看使用的網絡鏡像(磁盤)信息
id pool image snap device
0 rbd image - /dev/rbd0
3) 客戶端格式化、掛載分區並使用
[root@client ~]# mkfs.xfs /dev/rbd0
[root@client ~]# mount /dev/rbd0 /mnt/
[root@client ~]# echo "test" > /mnt/test.txt
12,建立鏡像快照
磁盤快照(Snapshot)是針對整個磁盤卷冊進行快速的檔案系統備份,與其它備份方式最主要的不一樣點在於「速度」。進行磁盤快照時,並不牽涉到任何檔案複製動做。就算數據量再大,通常來講,一般能夠在一秒以內完成備份動做。
磁盤快照的基本概念與磁帶備份等機制有很是大的不一樣。在創建磁盤快照時,並不須要複製數據自己,它所做的只是通知LX Series NAS服務器將目前有數據的磁盤區塊所有保留起來,不被覆寫。這個通知動做只需花費極短的時間。接下來的檔案修改或任何新增、刪除動做,均不會覆寫本來數據所在的磁盤區塊,而是將修改部分寫入其它可用的磁盤區塊中。因此能夠說,數據複製,或者說數據備份,是在日常檔案存取時就作好了,並且對效能影響極低.
1)建立鏡像快照
[root@node1 ceph-cluster]# rbd snap create image --snap image-snap1
[root@node1 ceph-cluster]# rbd snap ls image #查看image的快照
SNAPID NAME SIZE
4 image-snap1 15360 MB
2)刪除客戶端寫入的測試文件
[root@client ~]# rm -rf /mnt/test.txt
[root@client ~]# umount /mnt 先卸載再去還原快照,否則會報下面錯誤
3) 還原快照
[root@node1 ceph-cluster]# rbd snap rollback image --snap image-snap1
#客戶端從新掛載分區
[root@client ~]# mount /dev/rbd0 /mnt/
[root@client ~]# ls /mnt
test.txt
快照還原問題:
[root@client ~]# mount /dev/rbd0 /mnt
mount: 文件系統類型錯誤、選項錯誤、/dev/rbd0 上有壞超級塊、
缺乏代碼頁或助手程序,或其餘錯誤
有些狀況下在 syslog 中能夠找到一些有用信息- 請嘗試 dmesg | tail 這樣的命令看看
解決辦法:
1,先在客戶機卸載
2,在node1在還原快照
2,在客戶機上掛載
13,建立快照克隆
1)克隆快照
[root@node1 ceph-cluster]# rbd snap protect image --snap image-snap1 #把快照保護起來
[root@node1 ceph-cluster]# rbd snap rm image --snap image-snap1 //會失敗
[root@node1 ceph-cluster]# rbd clone \
image --snap image-snap1 image-clone --image-feature layering
//使用image的快照image-snap1克隆一個新的image-clone鏡像
2)查看克隆鏡像與父鏡像快照的關係
[root@node1 ceph-cluster]# rbd info image-clone
rbd image 'image-clone':
size 15360 MB in 3840 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.d3f53d1b58ba
format: 2
features: layering
flags:
parent: rbd/image@image-snap1
#克隆鏡像不少數據都來自於快照鏈
#若是但願克隆鏡像能夠獨立工做,就須要將父快照中的數據,所有拷貝一份,但比較耗時!!!
[root@node1 ceph-cluster]# rbd flatten image-clone #解除與快照的關係
[root@node1 ceph-cluster]# rbd info image-clone
rbd image 'image-clone':
size 15360 MB in 3840 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.d3f53d1b58ba
format: 2
features: layering
flags:
#注意,父快照信息沒了
14,其餘操做
1) 客戶端撤銷磁盤映射
[root@client ~]# umount /mnt
[root@client ~]# rbd showmapped
id pool image snap device
0 rbd image - /dev/rbd0
[root@client ~]# rbd unmap /dev/rbd/rbd/image #撤銷磁盤映射image
2)刪除快照與鏡像
[root@node1 ceph-deploy]# rbd snap unprotect image --snap image-snap1 #解除保護
[root@node1 ceph-cluster]# rbd snap rm image --snap image-snap1 #刪除快照
[root@node1 ceph-cluster]# rbd list
[root@node1 ceph-cluster]# rbd rm image
15,塊存儲應用案例
1)建立磁盤鏡像。
[root@node1 ceph-cluster]# rbd create vm1-image --image-feature layering --size 10G
[root@node1 ceph-cluster]# rbd create vm2-image --image-feature layering --size 10G
[root@node1 ceph-cluster]# rbd list
[root@node1 ceph-cluster]# rbd info vm1-image
[root@node1 ceph-cluster]# qemu-img info rbd:rbd/vm1-image
image: rbd:rbd/vm1-image
file format: raw
virtual size: 10G (10737418240 bytes)
disk size: unavailable
2)Ceph認證帳戶。
Ceph默認開啓用戶認證,客戶端須要帳戶才能夠訪問,
默認帳戶名稱爲client.admin,key是帳戶的密鑰,
可使用ceph auth添加新帳戶(案例咱們使用默認帳戶)。
[root@node1 ceph-cluster]# cat /etc/ceph/ceph.conf //配置文件
[global]
mon_initial_members = node1, node2, node3
mon_host = 192.168.2.10,192.168.2.20,192.168.2.30
auth_cluster_required = cephx //開啓認證
auth_service_required = cephx //開啓認證
auth_client_required = cephx //開啓認證
[root@node1 ceph-cluster]# cat /etc/ceph/ceph.client.admin.keyring //帳戶文件
[client.admin]
key = AQBTsdRapUxBKRAANXtteNUyoEmQHveb75bISg==
3)部署客戶端環境。
注意:這裏使用真實機當客戶端!!!
客戶端須要安裝ceph-common軟件包,拷貝配置文件(不然不知道集羣在哪),
拷貝鏈接密鑰(不然無鏈接權限)。
[root@room9pc01 ~]# yum -y install ceph-common
[root@room9pc01 ~]# scp 192.168.4.11:/etc/ceph/ceph.conf /etc/ceph/ #下載ceph配置文件
[root@room9pc01 ~]# scp 192.168.4.11:/etc/ceph/ceph.client.admin.keyring \
/etc/ceph/ #下載ceph密鑰
4)建立KVM虛擬機。
使用virt-manager建立1臺普通的KVM虛擬機。名稱爲vm1
5)配置libvirt secret。
編寫帳戶信息文件(真實機操做)
[root@room9pc01 ~]# vim secret.xml //新建臨時文件,內容以下
<secret ephemeral='no' private='no'>
<usage type='ceph'>
<name>client.admin secret</name>
</usage>
</secret>
#使用XML配置文件建立secret
[root@room9pc01 ~]# virsh secret-define --file secret.xml
生成 secret c409ec4c-803b-46bc-b4e4-35dc86a08f85
//隨機的UUID,這個UUID對應的有帳戶信息
編寫帳戶信息文件(真實機操做)
--獲取client.admin的key,或者直接查看密鑰文件
方式一:
[root@room9pc01 ~]# ceph auth get-key client.admin
方式二:
[root@room9pc01 ~]# cat /etc/ceph/ceph.client.admin.keyring
[client.admin]
key = AQDExOpbE+W9BxAA9QBqQUAY0tFmSmjOWmS8Nw==
c409ec4c-803b-46bc-b4e4-35dc86a08f85 ceph client.admin secret
6)虛擬機的XML配置文件。
每一個虛擬機都會有一個XML配置文件,包括:
虛擬機的名稱、內存、CPU、磁盤、網卡等信息
[root@room9pc01 ~]# vim /etc/libvirt/qemu/vm1.xml
//修改前內容以下
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/vm1.qcow2'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</disk>
不推薦直接使用vim修改配置文件,推薦使用virsh edit修改配置文件,效果以下:
[root@room9pc01] virsh edit vm1 //vm1爲虛擬機名稱
<disk type='network' device='disk'>
<driver name='qemu' type='raw'/>
<auth username='admin'>
<secret type='ceph' uuid='c409ec4c-803b-46bc-b4e4-35dc86a08f85'/>
</auth>
<source protocol='rbd' name='rbd/vm1-image'>
<host name='192.168.4.11' port='6789'/>
</source>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</disk>
提示:保存退出出現"編輯了域 rhel7.4 XML 配置。"說明成功了
源路經:rbd://192.168.4.11:6789/rbd/vm1-image
Ceph塊存儲總結:
1,Linux能夠直接使用
2,Kvm虛擬機使用,修改kvm虛擬機xml配置文件
二 Ceph文件系統(MDS)
1,添加一臺新的虛擬機,要求以下:
IP地址:192.168.4.14
主機名:node4(部署元數據服務器)
配置yum源(包括rhel、ceph的源)
與真機主機同步時間([root@node1 ceph-deploy]# scp /etc/chrony.conf root@192.168.4.14:/etc/)
node1容許無密碼遠程node4 命令:ssh-copy-id root@192.168.4.14
[root@node1 ceph-deploy]#vim /etc/hosts #並拷貝到node1-4,client
192.168.4.10 client
192.168.4.11 node1
192.168.4.12 node2
192.168.4.13 node3
192.168.4.14 node4
2,部署元數據服務器
登錄node4,安裝ceph-mds軟件包
[root@node1 ceph-cluster]yum -y install ceph-mds
登錄node1部署節點操做
[root@node1 ceph-cluster]# cd /root/ceph-cluster #該目錄,是最先部署ceph集羣時,建立的目錄
[root@node1 ceph-cluster]# ceph-deploy mds create node4 #給nod4拷貝配置文件,啓動mds服務
[root@node1 ceph-cluster]# ceph-deploy admin node4 #同步配置文件和key
3,建立存儲池
[root@node1 ceph-cluster]ceph osd pool create cephfs_data 128 #建立存儲池,對應128個PG
[root@node1 ceph-cluster]ceph osd pool create cephfs_metadata 128 #建立存儲池,對應128個PG
4,建立Ceph文件系統
[root@node1 ceph-cluster]ceph mds stat //查看mds狀態
e2:, 1 up:standby
[root@node1 ceph-cluster]ceph fs new myfs1 cephfs_metadata cephfs_data
new fs with metadata pool 2 and data pool 1
//注意,如今medadata池,再寫data池
//默認,只能建立1個文件系統,多餘的會報錯
[root@node1 ceph-cluster]ceph fs ls
name: myfs1, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
[root@node1 ceph-cluster]ceph mds stat
e4: 1/1/1 up {0=node4=up:creating}
5,客戶端掛載
[root@client ~]# mount -t ceph 192.168.4.11:6789:/ /mnt/cephfs/ \
-o name=admin,secret=AQBTsdRapUxBKRAANXtteNUyoEmQHveb75bISg==
//注意:文件系統類型爲ceph
//192.168.4.11爲MON節點的IP(不是MDS節點)
//admin是用戶名,secret是密鑰
//密鑰能夠在/etc/ceph/ceph.client.admin.keyring中找到
三 建立對象存儲服務器(RGW)1,部署對象存儲服務器1)準備實驗環境,要求以下:IP地址:192.168.4.15主機名:node5配置yum源(包括rhel、ceph的源)與真機主機同步時間node1容許無密碼遠程node5 命令:ssh-copy-id root@192.168.4.15修改node1的/etc/hosts,並同步到全部node主機[root@node1 ceph-cluster]# vim /etc/hosts... ...192.168.4.10 client192.168.4.11 node1192.168.4.12 node2192.168.4.13 node3192.168.4.14 node4192.168.4.15 node5