企业分布式存储
分布存儲
1.分布存儲概述
1.1 存儲分類:
- 開源與商業:
- 單機存儲:
SCSI/SAS/USB/PCI-E、SSD/NVME(提升性能)
- 網絡存儲(帶文件系統):
NFS/Samba/NAS
SAN:SAN(Storage Area Network,存儲區域網絡)
**SAN存儲設備通過光纖連接,而NAS存儲設備通過TCP/IP連接。**由于這個原因,SAN通常用于高級解決方案,而NAS解決方案更易于家庭用戶或小型企業使用。為了通過SAN連接,設備必須能夠使用SCSI光纖通道。相比之下,NAS比較簡單,任何東西都可以通過以太網連接到NAS解決
單機磁盤的空間問題、IO 問題、高可用問題
服務分為讀數據和寫數據,讀可以在任何一個節點讀,但是寫只能寫在特定的節點,如 Redis 的 master、zookeeper 的 leader、MySQL 的 master 等場景。
1.2數據分類及存儲分類:
數據分為元數據和數據:
-
數據:實際數據
-
元數據 :元數據即是文件的屬性信息(文件名、權限(屬主、屬組)、大小、更新時間等),
分布式存儲的實現:
有一種路由機制,即當客戶端或者應用程序產生的客戶端數據被寫入到分布式存儲系統
的時候,會有一個服務(NameNode)提供文件元數據的路由功能,即告訴應用程序去哪個服
務器去請求文件內容,然后再有(DataNode)提供數據的讀寫請求及數據的高可用功能。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-WK2YnPoZ-1640169458466)(企業存儲.assets/image-20211213165030762.png)]
? 圖一傳統式
1.3 存儲方式
-
塊存儲:需要格式化,將文件直接保存到磁盤上。
-
文件存儲:提供數據存儲的接口,是由操作系統針對塊存儲的應用,即由操作系統提供存儲
接口,應用程序通過調用操作系統將文件保存到塊存儲進行持久化。
-
對象存儲:也稱為基于對象的存儲,其中的文件被拆分成多個部分并散布在多個存儲服務器,
在對象存儲中,數據會被分解為稱為“對象”的離散單元,并保存在單個存儲庫中,而不是
作為文件夾中的文件或服務器上的塊來保存,對象存儲需要一個簡單的 HTTP 應用編程接
口 (API),以供大多數客戶端(各種語言)使用。
Ceph 是一個開源的分布式存儲系統,包括對象存儲、塊設備、文件系統
ceph 是一個對象(object)式存儲系統,它把每一個待管理的數據流(文件等數據)切分為一到多
個固定大小(默認 4 兆)的對象數據,并以其為原子單元(原子是構成元素的最小單元)完成數
據的讀寫。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Ev18PEmy-1640169458467)(企業存儲.assets/image-20211213233119404.png)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-LPJRUJo9-1640169458468)(企業存儲.assets/image-20211213234004529.png)]
2 Ceph 簡介
Ceph 是一個開源的分布式存儲系統,包括對象存儲、塊設備、文件系統
ceph 是一個對象(object)式存儲系統,它把每一個待管理的數據流(文件等數據)切分為一到多
個固定大小(默認 4 兆)的對象數據,并以其為原子單元(原子是構成元素的最小單元)完成數
據的讀寫。
對象數據的底層存儲服務是由多個存儲主機(host)組成的存儲集群,該集群也被稱之為
RADOS(reliable automatic distributed object store)存儲集群,即可靠的、自動化的、分布式的
對象存儲系統。
2.1ceph的構成
-
Pool:存儲池、分區,存儲池的大小取決于底層的存儲空間。
-
PG(placement group):一個 pool 內部可以有多個 PG 存在,pool 和 PG 都是抽象的邏輯概念,一個 pool 中有多少個 PG 可以通過公式計算。
-
OSD(Object Storage Daemon):每一塊磁盤叫做 osd,多個 osd 組成一個主機
-
librados 是 RADOS 存儲集群的 API,支持 C/C++/JAVA/python/ruby/php 等編程語言客戶端調用。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-e7l63hZV-1640169458468)(企業存儲.assets/image-20211214001117468.png)]
存儲池要先創建才能往 ceph 保存數據,文件在向 ceph 保存之前要先進行一致性 hash 計算,
計算后會把文件保存在某個對應的 PG 的,某個文件一定屬于某個 pool 的 PG,在通過 PG
保存在 OSD 上。
數據對象在寫到主 OSD 之后再同步到從 OSD 以實現數據的高可用。
存儲過程:
第一步:把文件對象映射給 PG
第二步: 把文件對象映射到OSD,
第三步:通過 OSD 寫入到硬盤
監視器 mon 維護 OSD 和 PG 的集群狀態,
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-t8kR3F3l-1640169458469)(企業存儲.assets/image-20211214002218870.png)]
2.2 ceph 集群基礎:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-uljycOht-1640169458469)(企業存儲.assets/image-20211214002430009.png)]
一個 ceph 集群的組成部分:
2.2.1 Monitor(ceph-mon):ceph 監視器
在一個主機上運行的一個守護進程,用于維護集群狀態映射(maintains maps of the cluster state),比如 ceph 集群中有多少存儲池、每個存儲池有多少 PG 以及存儲池和 PG 的映 射關系等, monitor map, manager map, the OSD map, the MDS map, and the CRUSH map,這 些映射是 Ceph 守護程序相互協調所需的關鍵群集狀態,此外監視器還負責管理守護程序和 客戶端之間的身份驗證(認證使用 cephX 協議)。通常至少需要三個監視器才能實現冗余和高 可用性
2.2.2 Managers(ceph-mgr)的功能:
在一個主機上運行的一個守護進程,Ceph Manager 守護程序(ceph-mgr)負責跟蹤運 行時指標和 Ceph 集群的當前狀態,包括存儲利用率,當前性能指標和系統負載。Ceph Manager 守護程序還托管基于python 的模塊來管理和公開 Ceph 集群信息,包括基于 Web 的 Ceph 儀表板和 REST API。高可用性通常至少需要兩個管理器。
2.2.3 Ceph OSDs(對象存儲守護程序 ceph-osd):
提供存儲數據,一個磁盤就是一個 OSD,因此一個服務器的 OSD 不能超過磁盤的總數, OSD 用于處理 ceph 集群數據復制,恢復,重新平衡,并通過檢查其他 Ceph OSD 守護程序的 心跳來向 Ceph 監視器和管理器提供一些監視信息。通常至少需要 3 個 Ceph OSD 才能實現 冗余和高可用性。
2.2.4 MDS(ceph 元數據服務器,ceph-mds):
代表 ceph文件系統(NFS/CIFS)存儲元數據,(即 Ceph塊設備和 Ceph對象存儲不使用 MDS)
2.2.5 Ceph 的管理節點:
1.ceph 的常用管理接口是一組命令行工具程序,例如 rados、ceph、rbd 等命令,ceph 管理
員可以從某個特定的 ceph-mon 節點執行管理操作
理,管理節點的權限只對管理人員開放,可以避免一些不必要的誤操作的發生。
2.3 元數據的保存方式
Ceph 對象數據的元數據信息放在哪里呢? 對象數據的元數據以 key-value 的形式存在, 在RADOS 中有兩種實現:xattrs 和 omap:
ceph 可選后端支持多種存儲引擎,比如 filestore,kvstore,memstore,目前是以 kvstore 的 形式存儲對象數據的元數據信息。
2.3.1: xattr 擴展屬性
是將元數據保存在對象對應文件數據中并保存到系統磁盤上,這要求支持對象存儲的 本地文件系統(一般是 XFS)支持擴展屬性。元數據和數據放一起
2.3.2 omap(object map 對象映射):
omap:是 object map 的簡稱,是將元數據保存在本地文件系統之外的獨立 key-value 存儲 系統中,在使用 filestore 時是 leveldb,在使用 bluestore 時是 rocksdb,由于 filestore 存 在功能問題(需要將磁盤格式化為 XFS 格式)及元數據高可用問題等問題,因此在目前 ceph 主要使用 bluestore。
2.3.2.1 filestore與leveldb
ceph 早期基于 filestore 使用 google 的 levelDB 保存對象的元數據,LevelDb 是一個持久化存 儲的 KV 系統,和 Redis 這種內存型的 KV 系統不同,LevelDb 不會像 Redis 一樣將數據放在內存從而占用大量的內存空間,而是將大部分數據存儲到磁盤上,但是需要把磁盤上的 levelDB 空間格式化為文件系統(XFS).
FileStore 將數據保存到與 Posix 兼容的文件系統(例如 Btrfs、XFS、Ext4)。在 Ceph 后端使用傳 統的 Linux 文件系統盡管提供了一些好處,但也有代價,如性能、 對象屬性與磁盤本地文 件系統屬性匹配存在限制等
filestore 數據寫入的過程
1. 先把要寫入的數據全部封裝成一個事務,其整理作為一條日志,寫入日志磁盤(一般把 日志放在 ssd 上提高性 能),這個過程叫日志的提交(journalsubmit)。2. 把數據寫入對象文件的磁盤中(也就是 OSD 的磁盤中),這個過程叫日志的應用(journal apply)。這個過程不一定寫入磁盤,有可能緩存在本地文件系統的 page cache 中。 當系統在日志提交的過程中出錯,系統重啟后,直接丟棄不完整的日志條目,該條日志對應 的實際對象數據并沒有修改,數據保證了一致性。當日志在應用過程中出錯,由于日志已寫 入到磁盤中,系統重啟后,重放(replay)日志,這樣保證新數據重新完整的寫入,保證了 數據的一致性filestore 日志的三個階段
日志的提交(journal submit):日志寫入日志磁盤。 日志的應用(journal apply):日志對應的修改更新到對象的磁盤文件中。這個過程不一定寫入 磁盤,有可能緩存在本地文件系統的 page cache 中。 日志的同步(journal sync 或者 journal commit):確定日志對應的修改操作已經刷到磁盤 中2.3.2.2 bluestore 與 rocksdb
由于 levelDB 依然需要需要磁盤文件系統的支持,后期 facebok 對 levelDB 進行改進為 RocksDB,RocksDB 將對象數據的元數據保存在 RocksDB,但是 RocksDB 的數據又放在哪里呢?放在內存怕丟失,放在本地磁盤但是解決不了高可用,ceph 對象數據放在了每個 OSD 中,那么就在在當前 OSD 中劃分出一部分空間,格式化為 BlueFS 文件系統用于保存 RocksDB 中的元數據信息(稱為 BlueStore),并實現元數據的高可用, BlueStore 最大的特點是構建在裸磁盤設備之上,并且對諸如 SSD 等新的存儲設備做了很多 優化工作。
#RocksDB:rocksdb 是 facebook 基于 leveldb 開發的一款 kv 數據庫,BlueStore 將元數據全部 存放至 RocksDB 中,這些元數據包括存儲預寫式日志、數據對象元數據、Ceph 的 omap 數 據信息、以及分配器的元數據 。#BlueRocksEnv:這是 RocksDB 與 BlueFS 交互的接口;RocksDB 提供了文件操作的接口 EnvWrapper(Env 封裝器),可以通過繼承實現該接口來自定義底層的讀寫操作,BlueRocksEnv 就是繼承自 EnvWrapper 實現對 BlueFS 的讀寫。#BlueFS:BlueFS是BlueStore針對RocksDB開發的輕量級文件系統,用于存放RocksDB產生的.sst 和.log 等文件。 #BlockDecive:BlueStore 拋棄了傳統的 ext4、xfs 文件系統,使用直接管理裸盤的方式;BlueStore 支持同時使用多種不同類型的設備,在邏輯上 BlueStore 將存儲空間劃分為三層:慢速(Slow) 空間、高速(DB)空間、超高速(WAL)空間,不同的空間可以指定使用不同的設備類型, 當然也可使用同一塊設備BlueStore 的設計考慮了 FileStore 中存在的一些硬傷,拋棄了傳統的文件系統直接管理裸設 備,縮短了 IO 路徑,同時采用 ROW 的方式,避免了日志雙寫的問題,在寫入性能上有了極大的提高。
2.4 CRUSH 算法簡介
Controllers replication under scalable hashing #可控的、可復制的、可伸縮的一致性 hash 算法
Ceph 使用 CURSH 算法來存放和管理數據,它是 Ceph 的智能數據分發機制。Ceph 使用 CRUSH 算法來準確計算數據應該被保存到哪里,以及應該從哪里讀取,和保存元數據不同的 是,CRUSH 按需計算出元數據,因此它就消除了對中心式的服務器/網關的需求,它使得 Ceph 客戶端能夠計算出元數據,該過程也稱為CRUSH 查找,然后和 OSD 直接通信。
#1.如果是把對象直接映射到 OSD 之上會導致對象與 OSD 的對應關系過于緊密和耦合,當 OSD 由于故障發生變更時將會對整個 ceph 集群產生影響。#2.于是 ceph 將一個對象映射到 RADOS 集群的時候分為兩步走: 首先使用一致性 hash 算法將對象名稱映射到 PG 然后將 PG ID 基于 CRUSH 算法映射到 OSD 即可查到對象#3.以上兩個過程都是以”實時計算”的方式完成,而沒有使用傳統的查詢數據與塊設備的對應 表的方式,這樣有效避免了組件的”中心化”問題,也解決了查詢性能和冗余問題。使得 ceph 集群擴展不再受查詢的性能限制。#4.這個實時計算操作使用的就是 CRUSH 算法 Controllers replication under scalable hashing #可控的、可復制的、可伸縮的一致性 hash 算 法。CRUSH 是一種分布式算法,類似于一致性 hash 算法,用于為 RADOS 存儲集群控制數據的 分配[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-odDLzHc2-1640169458470)(企業存儲.assets/image-20211214110527709.png)]
3.部署
https://github.com/ceph/ceph
http://docs.ceph.org.cn/install/manual-deployment/ #簡要部署過程
ceph-ansible:https://github.com/ceph/ceph-ansible #python
ceph-salt:https://github.com/ceph/ceph-salt #python
ceph-container:https://github.com/ceph/ceph-container #shell
ceph-chef:https://github.com/ceph/ceph-chef #Ruby
ceph-deploy:https://github.com/ceph/ceph-deploy #python
是一個 ceph 官方維護的基于 ceph-deploy 命令行部署 ceph 集群的工具,基于 ssh 執行可以 sudo 權限的 shell 命令以及一些 python 腳本 實現 ceph 集群的部署和管理維護。 Ceph-deploy 只用于部署和管理 ceph 集群,客戶端需要訪問 ceph,需要部署客戶端工具。
3.1:服務器準備:
http://docs.ceph.org.cn/start/hardware-recommendations/ #硬件推薦
192.168.91.100 admin,osd, mon 作為管理和監控節點 192.168.91.101 osd,mds 192.168.91.102 osd,mds 192.168.91.103 ceph-client clientceph1作管理. osd. mon節點; ceph2和ceph3作osd mds; ceph-client客戶端;setenforce 0 systemctl stop firewalld sed -i '/^SELINUX=/s/=.*/=disabled/' /etc/selinux/config#前三臺服務器增加一塊硬盤/dev/sdb #創建目錄并掛載到/data/osd{1,2,3};##############前期準備,主機名,硬盤,hosts文件,ssh免密登錄################ [root@localhost ~]#hostnamectl set-hostname ceph1 #修改主機名 [root@localhost ~]#hostnamectl set-hostname ceph2 [root@localhost ~]#hostnamectl set-hostname ceph3 [root@localhost ~]#hostnamectl set-hostname ceph-client [root@localhost ~]#groupadd ceph -g 2021 && useradd -u 2021 -g 2021 ceph && echo "123456" | passwd --stdin ceph #新建ceph用戶和組[root@ceph1 ~]#echo "- - -" > /sys/class/scsi_host/host0/scan [root@ceph1 ~]#echo "- - -" > /sys/class/scsi_host/host1/scan [root@ceph1 ~]#echo "- - -" > /sys/class/scsi_host/host2/scan [root@ceph1 ~]#mkfs.xfs /dev/sdb[root@ceph1 ~]#mkdir -p /data/osd1 [root@ceph1 ~]#mount /dev/sdb /data/osd1/[root@ceph1 ~]#mkdir -p /data/osd2 [root@ceph1 ~]#mount /dev/sdb /data/osd2/[root@ceph1 ~]#mkdir -p /data/osd3 [root@ceph1 ~]#mount /dev/sdb /data/osd3echo "- - -" > /sys/class/scsi_host/host0/scan echo "- - -" > /sys/class/scsi_host/host1/scan echo "- - -" > /sys/class/scsi_host/host2/scan mkfs.xfs /dev/sdb mkdir -p /data/osd1 mount /dev/sdb /data/osd1/[root@ceph1 ~]#vim /etc/hosts #四臺服務器全部修改 192.168.91.100 ceph1 192.168.91.101 ceph2 192.168.91.102 ceph3 192.168.91.103 ceph-clientssh免密登錄 [root@ceph1 ~]#ssh-keygen [root@ceph1 ~]#ssh-copy-id ceph1 [root@ceph1 ~]#ssh-copy-id ceph2 [root@ceph1 ~]#ssh-copy-id ceph3 [root@ceph1 ~]#ssh-copy-id ceph-client[root@localhost ~]#yum install epel-release.noarch -y #安裝epel源,必須安裝rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-mimic/el7/noarch/ceph-release-1-1.el7.noarch.rpmsed -e 's!^metalink=!#metalink=!g' \-e 's!^#baseurl=!baseurl=!g' \-e 's!//download\.fedoraproject\.org/pub!//mirrors.tuna.tsinghua.edu.cn!g' \-e 's!http://mirrors\.tuna!https://mirrors.tuna!g' \-i /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel-testing.repo[root@ceph1 ~]#yum clean all &&yum -y install ceph-deploy [root@ceph1 ~]#mkdir /etc/ceph && cd /etc/ceph [root@ceph1 ceph]#ceph-deploy new ceph1 [root@ceph1 ceph]#ls ceph.conf ceph-deploy-ceph.log ceph.mon.keyring[root@ceph1 ceph]#echo "osd_pool_default_size = 2" >>/etc/ceph/ceph.conf #配置文件的默認副本數從3改成24.GFS 分布式數據系統
4.1GFS 概述
GlusterFS 是一個開源的分布式文件系統。 GlusterFS 主要由存儲服務器(Brick Server)、客戶端及 NFS/Samba 存儲網關(可選, 根據需要選擇使用)組成。 GlusterFS 架構中最大的設計特點是沒有元數據服務器組件,這有助于提升整個系統的 性能、可靠性和穩定性。 數據分為元數據和數據:
- 數據:實際數據
- 元數據 :元數據即是文件的屬性信息(文件名、權限(屬主、屬組)、大小、更新時間等)
傳統的分布式文件系統大多通過元服務器來存儲元數據,元數據包 含存儲節點上的目錄信息、目錄結構等。這樣的設計在瀏覽目錄時效率非常高,但是也存在 一些缺陷,例如單點故障。一旦元數據服務器出現故障,即使節點具備再高的冗余性,整個 存儲系統也將崩潰。 而 GlusterFS 分布式文件系統是基于無元服務器的設計,數據橫向擴展 能力強,具備較高的可靠性及存儲效率
GlusterFS同時也是Scale-out(橫向擴展)存儲解決方案Gluster的核心,在存儲數據方面具有強大的橫向擴展能力,通過擴展能夠支持數PB存儲容量和處理數千客戶端。
GlusterFS支持借助TCP/IP或InfiniBandRDNA網絡(一種支持多并發鏈接的技術,具有高帶寬、低時廷、高擴展性的特點)將物理分散分布的存儲資源匯聚在一起,統一提供存儲服務,并使用統一全局命名空間來管理數據。
4.2 GFS特點
- 擴展性和高性能 GlusterFS 利用雙重特性來提供高容量存儲解決方案 Scale-Out (橫向擴展)架構通過增加存儲節點的方式來提高存儲容量和性能(磁盤、計算和 I/O 資源都可以獨立增加),支持 10GbE 和 InfiniBand 等高速網絡互聯。
Gluster 彈性哈希(Elastic Hash)解決了 GlusterFS 對元數據服務器的依賴, GlusterFS 采用彈性哈希算法在存儲池中定位數據,放棄了傳統的通過元數據服 務器定位數據。GlusterFS 中可以智能地定位任意數據分片(將數據分片存儲在 不同節點上),不需要查看索引或者向元數據服務器查詢。這種設計機制實現了 存儲的橫向擴展, 改善了單點故障及性能瓶頸,真正實現了并行化數據訪問。
-
高可用性 GlusterFS 通過配置某些類型的存儲卷,可以對文件進行自動復制(類似 于 RAID1),即使某個節點出現故障,也不影響數據的訪問。當數據出現不一致時, 自動修復功能能夠把數據恢復到正確的狀態,數據的修復是以增量的方式在后臺執行, 不會占用太多系統資源。GlusterFS 可以支持所有的存儲,因為它沒有設計自己的私有數據文件格式,而是采用操作系統中標準的磁盤文件系統(如 EXT3、XFS 等)來 存儲文件,數據可以使用傳統訪問磁盤的方式被訪問。
-
全局統一命名空間 全局統一命名空間將所有的存儲資源聚集成一個單一的虛擬存儲 池,對用戶和應用屏蔽了物理存儲信息。存儲資源(類似于 LVM)可以根據生產環 境中的需要進行彈性擴展或收縮。在多節點場景中,全局統一命名空間還可以基于不 同節點做負載均衡,大大提高了存取效率。
-
彈性卷管理。 GlusterFS 通過將數據儲存在邏輯卷中,邏輯卷從邏輯存儲池進行獨立 邏輯劃分。邏輯存儲池可以在線進行增加和移除,不會導致業務中斷。邏輯卷可以根 據需求在線增長和縮減,并可以在多個節點中實現負載均衡。文件系統配置也可以實時在線進行更改并應用,從而可以適應工作負載條件變化或在線性能調優
-
基于標準協議 Gluster 存儲服務支持 NFS、CIFS、HTTP、FTP、SMB 及 Gluster 原生協議,完全與 POSIX 標準兼容。現有應用程序不需要做任何修改就可以對 Gluster 中的數據進行訪問,也可以使用專用 API 進行訪問(效率更高),這在公有 云環境中部署 Gluster 時非常有用,Gluster 對云服務提供商專用 API 進行抽象,然 后提供標準 POSIX 接口
4.3 Gluster 術語
- Brick(存儲塊): 主機池中由主機提供的用于物理存儲的專用分區,是 GlusterFS 中的基本存儲單元,同時也是用存儲池中服務器上對外提供的存儲目錄。 存儲目錄的格式由服務器和目錄的絕對路徑構成,表示方法為 SERVER:EXPORT, 如 192.168.1.4:/ data/mydir/。
- Volume(邏輯卷): 一個邏輯卷是一組 Brick 的集合。卷是數據存儲的邏輯設備,類 似于 LVM 中的邏輯卷。大部分 Gluster 管理操作是在卷上進行的。
- FUSE(Filesystem inUserspace): 是一個內核模塊,允許用戶創建自己的文件系統, 無須修改內核代碼。
- VFS: 內核空間對用戶空間提供的訪問磁盤的接口。
- Glusterd(后臺管理進程): 在存儲群集中的每個節點上都要運行。
4.4 模塊化堆棧式架構
GlusterFS 采用模塊化、堆棧式的架構,可以根據需 求配置定制化的應用環境,如大文件存儲、海量小文件存儲、云存儲、多傳輸協議應用等。 通過對模塊進行各種組合,即可實現復雜的功能。例如 Replicate 模塊可實現 RAID1,Stripe 模塊可實現 RAID0,通過兩者的組合可實現 RAID10 和 RAID01,同時獲得更高的性能及可靠性。
4.5GlusterFS 工作流程
(1) 客戶端或應用程序通過 GlusterFS 的掛載點訪問數據。 (2) Linux 系統內核通過 VFS API 收到請求并處理。 (3) VFS 將數據遞交給 FUSE 內核文件系統,并向系統注冊一個實際的文件系統 FUSE, 而 FUSE 文件系統則是將數據通過/dev/fuse 設備文件遞交給了 GlusterFS client 端。可以 將 FUSE 文件系統理解為一個代理。 (4) GlusterFS client 收到數據后,client 根據配置文件對數據進行處理。 (5) 經過 GlusterFS client 處理后,通過網絡將數據傳遞至遠端的 GlusterFS Server, 并且將數據寫入服務器存儲設備。4.6 彈性HASH算法
- 保證數據平均分布在每個 Brick 中
- 解決了對元數據服務器的依賴,進而解決了單點故障及訪問瓶頸。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-gJBLSR2p-1640169458470)(企業分布式存儲.assets/image-20211214225122947.png)]
4.7 GlusterFS 支持卷類型
GlusterFS 支持七種卷,即分布式卷、條帶卷、復制卷、分布式條帶卷、分布式復制卷、 條帶復制卷和分布式條帶復制卷,這七種卷可以滿足不同應用對高性能、高可用的需求。
分布式卷(Distribute volume): 文件通過 HASH 算法分布到所有 Brick Server 上, 這種卷是 Glusterf 的基礎;以文件為單位根據 HASH 算法散列到不同的 Brick,其實 只是擴大了磁盤空間,如果有一塊磁盤損壞,數據也將丟失,屬于文件級的 RAID 0, 不具有容錯能力。條帶卷(Stripe volume): 類似 RAID0,文件被分成數據塊并以輪詢的方式分布到多 個 Brick Server 上,文件存儲以數據塊為單位,支持大文件存儲,文件越大,讀取效 率越高復制卷(Replica volume): 將文件同步到多個 Brick 上,使其具備多個文件副本, 屬于文件級 RAID 1,具有容錯能力。因為數據分散在多個 Brick 中,所以讀性能得 到很大提升,但寫性能下降。分布式條帶卷(Distribute Stripe volume Brick Server 數量是條帶數(數據塊分布 的 Brick 數量)的倍數,兼具分布式卷和條帶卷的特點分布式復制卷(Distribute Replica volume): Brick Server 數量是鏡像數(數據副本 數量)的倍數,兼具分布式卷和復制卷的特點。分布式卷
分布式卷是 GlusterFS 的默認卷,在創建卷時,默認選項是創建分布式卷。在該模式下, 并沒有對文件進行分塊處理,文件直接存儲在某個 Server 節點上。直接使用本地文件系統 進行文件存儲,大部分 Linux 命令和工具可以繼續正常使用。需要通過擴展文件屬性保存 HASH 值,目前支持的底層文件系統有 EXT3、EXT4、ZFS、XFS 等。 由于使用的是本地文件系統,所以存取效率并沒有提高,反而會因為網絡通信的原因而 有所降低;另外支持超大型文件也會有一定的難度,因為分布式卷不會對文件進行分塊處理。 雖然 EXT4 已經可以支持最大 16TB 的單個文件,但是本地存儲設備的容量實在有限。File1 和 File2 存放在 Server1,而 File3 存放在 Server2,文件都是隨機存儲,一 個文件(如 File1)要么在 Server1 上,要么在 Server2 上,不能分塊同時存放在 Server1 和 Server2 上。
分布式卷具有如下特點:
- 文件分布在不同的服務器,不具備冗余性。
- 更容易且廉價地擴展卷的大小。
- 存在單點故障會造成數據丟失。
- 依賴底層的數據保護。
條帶卷
Stripe 模式相當于 RAID0,在該模式下,根據偏移量將文件分成 N 塊(N 個條帶節點), 輪詢地存儲在每個 Brick Server 節點。節點把每個數據塊都作為普通文件存入本地文件系統 中,通過擴展屬性記錄總塊數(Stripe-count)和每塊的序號(Stripe-index)。在配置時指 定的條帶數必須等于卷中 Brick 所包含的存儲服務器數,在存儲大文件時,性能尤為突出, 但是不具備冗余性。
- 條帶卷具有如下特點。
- 數據被分割成更小塊分布到塊服務器群中的不同條帶區。
- 分布減少了負載且更小的文件加速了存取的速度。
- 沒有數據冗余性
復制卷
復制模式,也稱為 AFR(AutoFile Replication),相當于 RAID1,即同一文件保存一份 或多份副本,每個節點上保存相同的內容和目錄結構。復制模式因為要保存副本,所以磁盤 利用率較低。如果多個節點上的存儲空間不一致,那么將按照木桶效應取最低節點的容量作,為該卷的總容量。在配置復制卷時,復制數必須等于卷中 Brick 所包含的存儲服務器數,復制卷具備冗余性,即使一個節點損壞,也不影響數據的正常使用。
復制卷具有如下特點。
- 卷中所有的服務器均保存一個完整的副本。
- 卷的副本數量可由客戶創建的時候決定。
- 至少有兩個塊服務器或更多服務器。
- 具備冗余性
分布式條帶卷
分布式條帶卷兼顧分布式卷和條帶卷的功能,主要用于大文件訪問處理,創建一個分布 式條帶卷最少需要 4 臺服務器
分布式復制卷
分布式復制卷兼顧分布式卷和復制卷的功能,主要用于需要冗余的情況下
4.8實際操作
setenforce 0 systemctl stop firewalldecho "- - -" > /sys/class/scsi_host/host0/scan echo "- - -" > /sys/class/scsi_host/host1/scan echo "- - -" > /sys/class/scsi_host/host2/scan #!/bin/bash dev=`ls /dev/sd* |grep -o 'sd[b-z]'| uniq` for i in $devdoecho -e "n\np\n\n\n\nw\n" | fdisk /dev/$i &> /dev/nullmkfs.xfs /dev/${i}"1" &> /dev/nullmkdir -p /data/${i}"1" &> /dev/nullecho "/dev/${i}"1" /data/${i}"1" xfs defaults 0 0 " >> /etc/fstab done mount -a &> /dev/nullhostnamectl set-hostname node1 hostnamectl set-hostname node2 hostnamectl set-hostname node3 hostnamectl set-hostname node4 hostnamectl set-hostname node5[root@node1 ~]#vim /etc/hosts 192.168.91.100 node1 192.168.91.101 node2 192.168.91.102 node3 192.168.91.103 node4echo " 192.168.91.100 node1 192.168.91.101 node2 192.168.91.102 node3 192.168.91.103 node4 192.168.91.104 node5">>/etc/hosts#########################本地源安裝##############################################[root@node1 opt]#tar xf gfsrepo.tar.gz [root@node1 yum.repos.d]#mkdir bak [root@node1 yum.repos.d]#mv *.repo bak/ [root@node1 yum.repos.d]#ls bak [root@node1 yum.repos.d]#vim local.repo[local] name=local baseurl=file:///opt/gfsrepo gpgcheck=0[root@node1 opt]#yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma scp local.repo 192.168.91.101:/etc/yum.repos.d/ scp local.repo 192.168.91.102:/etc/yum.repos.d/#####################################################################################使用網絡源,版本較新取消了一些功能########################[root@node1 opt]#cd /opt [root@node1 opt]#yum install centos-release-gluster -y [root@node1 opt]#yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma --skip-broken###################################################################################[root@node1 opt]#systemctl start glusterd.service [root@node1 opt]#systemctl status glusterd.service 添加節點到存儲信任池中(在 node1中) gluster peer probe node1 gluster peer probe node2 gluster peer probe node3 gluster peer probe node4 [root@node1 opt]#gluster peer status Number of Peers: 3Hostname: node2 Uuid: bdcab81e-f3fc-4633-9697-e5e1b4676d6a State: Peer in Cluster (Connected)Hostname: node3 Uuid: 9633f84f-05b7-46fa-9925-42e1cfc4c53a State: Peer in Cluster (Connected)Hostname: node4 Uuid: 0b63b591-5d06-4809-ab86-a85c916e1693 State: Peer in Cluster (Connected)卷名稱 卷類型 Brick dis-volume 分布式卷 node1(/data/sdb1) node2(/data/sdb1) stripe-volume 條帶卷 node1(/data/sdc1) node2(/data/sdc1) rep-volume 復制卷 node3(/data/sdb1) node4(/data/sdb1) dis-stripe 分布式條帶卷 node1(/data/sdd1) node2(/data/sdd1)node3(/data/sdd1)node4(/data/sdd1) dis-rep 分布式復制卷 node1(/data/sde1) node2(/data/sde1)node3(/data/sde1)node4(/data/sde1)1創建分布式卷,默認創建的是分布式卷 gluster volume create dis-voluem node1:/data/sdb1 node2:/data/sdb1 forcegluster volume list #查看卷列表 gluster volume start dis-volume #啟動卷 gluster volume info dis-volume #查看卷的基本信息2創建條帶卷 #指定的類型是stripe 數值為2 且后面跟了兩個 brick server ,所以創建的是條帶卷 gluster volume create stripe-volume stripe 2 node1:/data/sdc1 node2:/data/sdc1 force gluster volume start stripe-volume #啟動3 復制卷 #指定類型為replica 數值為2 且后面跟了兩個 brick server ,所以創建的是復制卷 gluster volume create replica-volume replica 2 node3:/data/sdb1 node4:/data/sdb1 force gluster volume start replica-volume4創建分布式條帶卷 #指定的類型是stripe 數值為2 且后面跟了4個 brick server ,所以創建的是分布式條帶卷 gluster volume create dis-stripe stripe 2 node1:/data/sdd1 node2:/data/sdd1 node3:/data/sdd1 node4:/data/sdd1 force gluster volume start dis-stripe5創建分布式復制卷 #指定類型為replica 數值為2 且后面跟了4個 brick server 所以創建的分布式復制卷 gluster volume create dis-rep replica 2 node1:/data/sde1 node2:/data/sde1 node3:/data/sde1 node4:/data/sde1 force gluster volume start dis-rep##########客戶機操作############# setenforce 0 systemctl stop firewalld[root@node1 opt]#tar xf gfsrepo.tar.gz [root@node1 yum.repos.d]#mkdir bak [root@node1 yum.repos.d]#mv *.repo bak/ [root@node1 yum.repos.d]#ls bak [root@node1 yum.repos.d]#vim local.repo[local] name=local baseurl=file:///opt/gfsrepo gpgcheck=0 [root@localhost yum.repos.d]#yum install glusterfs glusterfs-fuse -ymkdir -p /data/{dis,stripe,rep,dis_stripe,dis_rep} #建立掛載目錄echo " 192.168.91.100 node1 192.168.91.101 node2 192.168.91.102 node3 192.168.91.103 node4">>/etc/hosts臨時掛載 mount.glusterfs node1:dis-volume /data/dis永久掛載 node1:dis-volume /data/dis glusterfs defaults,_netdev 0 0 node1:dis-rep /data/dis_rep glusterfs defaults,_netdev 0 0 node1:dis-stripe /data/dis_stripe glusterfs defaults,_netdev 0 0 node1:replica-volume /data/rep glusterfs defaults,_netdev 0 0 node1:stripe-volume /data/stripe glusterfs defaults,_netdev 0 0mount -a測試: cd /opt dd if=/dev/zero of=/demo1.log bs=1M count=40 dd if=/dev/zero of=/demo2.log bs=1M count=40 dd if=/dev/zero of=/demo3.log bs=1M count=40 dd if=/dev/zero of=/demo4.log bs=1M count=40 dd if=/dev/zero of=/demo5.log bs=1M count=40cp /demo* /data/dis cp /demo* /data/stripe/ cp /demo* /data/rep/ cp /demo* /data/dis_stripe/ cp /demo* /data/dis_rep/[root@node1 opt]#ll /data/sdb1 #已文件形式的分布式 總用量 163840 -rw-r--r--. 2 root root 41943040 12月 15 06:39 demo1.log -rw-r--r--. 2 root root 41943040 12月 15 06:39 demo2.log -rw-r--r--. 2 root root 41943040 12月 15 06:39 demo3.log -rw-r--r--. 2 root root 41943040 12月 15 06:39 demo4.log [root@node2 opt]#ll /data/sdb1 總用量 40960 -rw-r--r--. 2 root root 41943040 12月 15 06:39 demo5.log[root@node1 opt]#ll -h /data/sdc1 #條帶卷 總用量 101M -rw-r--r--. 2 root root 20M 12月 15 06:39 demo1.log -rw-r--r--. 2 root root 20M 12月 15 06:39 demo2.log -rw-r--r--. 2 root root 20M 12月 15 06:39 demo3.log -rw-r--r--. 2 root root 20M 12月 15 06:39 demo4.log -rw-r--r--. 2 root root 20M 12月 15 06:39 demo5.log [root@node2 opt]#ll -h /data/sdc1 總用量 101M -rw-r--r--. 2 root root 20M 12月 15 06:39 demo1.log -rw-r--r--. 2 root root 20M 12月 15 06:39 demo2.log -rw-r--r--. 2 root root 20M 12月 15 06:39 demo3.log -rw-r--r--. 2 root root 20M 12月 15 06:39 demo4.log -rw-r--r--. 2 root root 20M 12月 15 06:39 demo5.log[root@node3 opt]# ll -h /data/sdb1 #復制1 總用量 200M -rw-r--r--. 2 root root 40M 12月 15 06:39 demo1.log -rw-r--r--. 2 root root 40M 12月 15 06:39 demo2.log -rw-r--r--. 2 root root 40M 12月 15 06:39 demo3.log -rw-r--r--. 2 root root 40M 12月 15 06:39 demo4.log -rw-r--r--. 2 root root 40M 12月 15 06:39 demo5.log[root@node4 yum.repos.d]#ll -h /data/sdb1 總用量 200M -rw-r--r--. 2 root root 40M 12月 15 06:39 demo1.log -rw-r--r--. 2 root root 40M 12月 15 06:39 demo2.log -rw-r--r--. 2 root root 40M 12月 15 06:39 demo3.log -rw-r--r--. 2 root root 40M 12月 15 06:39 demo4.log -rw-r--r--. 2 root root 40M 12月 15 06:39 demo5.log#####破壞測試####systemctl stop glusterd.service ###當我們關機node2 在客戶端上查看文件是否正常####分布式卷數據查看### [root@localhost dis]# ll ###我們在客戶上發現少了demo5.log文件,這個是node2上的, 總用量 163840 -rw-r--r-- 1 root root 41943040 10月 18 14:50 demo1.log -rw-r--r-- 1 root root 41943040 10月 18 14:50 demo2.log -rw-r--r-- 1 root root 41943040 10月 18 14:50 demo3.log -rw-r--r-- 1 root root 41943040 10月 18 14:50 demo4.log####條帶卷### [root@localhost text]# cd stripe/ ####無法訪問,條帶卷不具備冗余性 [root@localhost stripe]# ll 總用量 0#####分布式條帶卷#### [root@localhost dis_and_stripe]# ll #####無法訪問,分布條帶卷不具備冗余性 總用量 40960 -rw-r--r-- 1 root root 41943040 10月 18 14:51 demo5.log###分布式復制卷#### [root@localhost dis_and_rep]# ll #####可以訪問,分布式復制卷具備冗余性 總用量 204800 -rw-r--r-- 1 root root 41943040 10月 18 14:52 demo1.log -rw-r--r-- 1 root root 41943040 10月 18 14:52 demo2.log -rw-r--r-- 1 root root 41943040 10月 18 14:52 demo3.log -rw-r--r-- 1 root root 41943040 10月 18 14:52 demo4.log -rw-r--r-- 1 root root 41943040 10月 18 14:52 demo5.log###node2 和node4 掛機#### 1、測試復制卷是否正常 [root@localhost rep]# ls -l ###在客戶機上測試正常 數據有 總用量 204800 -rw-r--r-- 1 root root 41943040 10月 18 14:51 demo1.log -rw-r--r-- 1 root root 41943040 10月 18 14:51 demo2.log -rw-r--r-- 1 root root 41943040 10月 18 14:51 demo3.log -rw-r--r-- 1 root root 41943040 10月 18 14:51 demo4.log -rw-r--r-- 1 root root 41943040 10月 18 14:51 demo5.log 2、測試分布式條卷是否正常 [root@localhost dis_and_stripe]# ll ###在客戶機上測試正常 沒有數據 總用量 0 3、測試分布式復制卷是否正常 [root@localhost dis_and_rep]# ll ###在客戶機上測試正常 有數據 總用量 204800 -rw-r--r-- 1 root root 41943040 10月 18 14:52 demo1.log -rw-r--r-- 1 root root 41943040 10月 18 14:52 demo2.log -rw-r--r-- 1 root root 41943040 10月 18 14:52 demo3.log -rw-r--r-- 1 root root 41943040 10月 18 14:52 demo4.log -rw-r--r-- 1 root root 41943040 10月 18 14:52 demo5.log#####上述實驗測試,凡是帶復制數據,相比而言,數據比較安全####gluster volume stop dis-stripe #停止卷 gluster volume delete dis-volume #刪除卷 gluster volume status #查看狀態 gluster volume set dis-rep auth.allow 192.168.91.* gluster volume set dis-rep auth.deny 192.168.91.100 #設置權限51 demo2.log
-rw-r–r-- 1 root root 41943040 10月 18 14:51 demo3.log
-rw-r–r-- 1 root root 41943040 10月 18 14:51 demo4.log
-rw-r–r-- 1 root root 41943040 10月 18 14:51 demo5.log
2、測試分布式條卷是否正常
[root@localhost dis_and_stripe]# ll ###在客戶機上測試正常 沒有數據
總用量 0
3、測試分布式復制卷是否正常
[root@localhost dis_and_rep]# ll ###在客戶機上測試正常 有數據
總用量 204800
-rw-r–r-- 1 root root 41943040 10月 18 14:52 demo1.log
-rw-r–r-- 1 root root 41943040 10月 18 14:52 demo2.log
-rw-r–r-- 1 root root 41943040 10月 18 14:52 demo3.log
-rw-r–r-- 1 root root 41943040 10月 18 14:52 demo4.log
-rw-r–r-- 1 root root 41943040 10月 18 14:52 demo5.log
#####上述實驗測試,凡是帶復制數據,相比而言,數據比較安全####
gluster volume stop dis-stripe
#停止卷
gluster volume delete dis-volume
#刪除卷
gluster volume status
#查看狀態
gluster volume set dis-rep auth.allow 192.168.91.*
gluster volume set dis-rep auth.deny 192.168.91.100
#設置權限
總結
- 上一篇: android手机用多久会卡机,你知道A
- 下一篇: 马云:我不为996辩护,我向奋斗者致敬