當前位置:首頁 » 服務存儲 » swift本地持久化存儲
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

swift本地持久化存儲

發布時間: 2022-12-15 00:52:34

『壹』 Swift 計算屬性、存儲屬性

存儲型屬性就是一般意義上理解的可以進行賦值和取值的變數。
var title = "學科"
計算型屬性,字面意思為計算型的屬性,這種屬性沒法存儲值

willSet能獲取將要賦給屬性的值newValue

初始化方法生成對象,並不會觸發屬性的willSet didSet方法

改用KVC的方式給對象初始化,就可以調用didSet了:

『貳』 ⑩ OpenStack高可用集群部署方案(train版)—OpenStack對接Ceph存儲

參考Ceph官方安裝文檔

Openstack環境中,數據存儲可分為臨時性存儲與永久性存儲。

臨時性存儲:主要由本地文件系統提供,並主要用於nova虛擬機的本地系統與臨時數據盤,以及存儲glance上傳的系統鏡像;

永久性存儲:主要由cinder提供的塊存儲與swift提供的對象存儲構成,以cinder提供的塊存儲應用最為廣泛,塊存儲通常以雲盤的形式掛載到虛擬機中使用。

Openstack中需要進行數據存儲的三大項目主要是nova項目(虛擬機鏡像文件),glance項目(共用模版鏡像)與cinder項目(塊存儲)。

下圖為cinder,glance與nova訪問ceph集群的邏輯圖:

ceph與openstack集成主要用到ceph的rbd服務,ceph底層為rados存儲集群,ceph通過librados庫實現對底層rados的訪問;

openstack各項目客戶端調用librbd,再由librbd調用librados訪問底層rados;
實際使用中,nova需要使用libvirtdriver驅動以通過libvirt與qemu調用librbd;cinder與glance可直接調用librbd;

寫入ceph集群的數據被條帶切分成多個object,object通過hash函數映射到pg(構成pg容器池pool),然後pg通過幾圈crush演算法近似均勻地映射到物理存儲設備osd(osd是基於文件系統的物理存儲設備,如xfs,ext4等)。

CEPH PG數量設置與詳細介紹

在創建池之前要設置一下每個OSD的最大PG 數量

PG PGP官方計算公式計算器

參數解釋:

依據參數使用公式計算新的 PG 的數目:
PG 總數= ((OSD總數*100)/最大副本數)/池數
3x100/3/3=33.33 ;舍入到2的N次幕為32

openstack集群作為ceph的客戶端;下面需要再openstack集群上進行ceph客戶端的環境配置

在openstack所有控制和計算節點安裝ceph Octopus源碼包,centos8有默認安裝,但是版本一定要跟連接的ceph版本一致

glance-api 服務運行在3個控制節點, 因此三台控制節點都必須安裝

cinder-volume 與 nova-compute 服務運行在3個計算(存儲)節點; 因此三台計算節點都必須安裝

將配置文件和密鑰復制到openstack集群各節點

配置文件就是生成的ceph.conf;而密鑰是 ceph.client.admin.keyring ,當使用ceph客戶端連接至ceph集群時需要使用的密默認密鑰,這里我們所有節點都要復制,命令如下

※Glance 作為openstack中鏡像服務,支持多種適配器,支持將鏡像存放到本地文件系統,http伺服器,ceph分布式文件系統,glusterfs和sleepdog等開源的分布式文件系統上。目前glance採用的是本地filesystem的方式存儲,存放在默認的路徑 /var/lib/glance/images 下,當把本地的文件系統修改為分布式的文件系統ceph之後,原本在系統中鏡像將無法使用,所以建議當前的鏡像刪除,部署好ceph之後,再統一上傳至ceph中存儲。

※Nova 負責虛擬機的生命周期管理,包括創建,刪除,重建,開機,關機,重啟,快照等,作為openstack的核心,nova負責IaaS中計算重要的職責,其中nova的存儲格外重要,默認情況下,nova將instance的數據存放在/var/lib/nova/instances/%UUID目錄下,使用本地的存儲空間。使用這種方式帶來的好處是:簡單,易實現,速度快,故障域在一個可控制的范圍內。然而,缺點也非常明顯:compute出故障,上面的虛擬機down機時間長,沒法快速恢復,此外,一些特性如熱遷移live-migration,虛擬機容災nova evacuate等高級特性,將無法使用,對於後期的雲平台建設,有明顯的缺陷。對接 Ceph 主要是希望將實例的系統磁碟文件儲存到 Ceph 集群中。與其說是對接 Nova,更准確來說是對接 QEMU-KVM/libvirt,因為 librbd 早已原生集成到其中。

※Cinder 為 OpenStack 提供卷服務,支持非常廣泛的後端存儲類型。對接 Ceph 後,Cinder 創建的 Volume 本質就是 Ceph RBD 的塊設備,當 Volume 被虛擬機掛載後,Libvirt 會以 rbd 協議的方式使用這些 Disk 設備。除了 cinder-volume 之後,Cinder 的 Backup 服務也可以對接 Ceph,將備份的 Image 以對象或塊設備的形式上傳到 Ceph 集群。

使用ceph的rbd介面,需要通過libvirt,所以需要在客戶端機器上安裝libvirt和qemu,關於ceph和openstack結合的結構如下,同時,在openstack中,需要用到存儲的地方有三個:

為 Glance、Nova、Cinder 創建專用的RBD Pools池

需要配置hosts解析文件,這里最開始已經配置完成,如未添加hosts解析需要進行配置

在cephnode01管理節點上操作 ;命名為:volumes,vms,images

記錄:刪除存儲池的操作

在cephnode01管理節點上操作

針對pool設置許可權,pool名對應創建的pool

nova-compute與cinder-volume都部署在計算節點 ,不必重復操作,如果計算節點與存儲節點分離需要分別推送;

全部計算節點配置;以compute01節點為例;

Glance 為 OpenStack 提供鏡像及其元數據注冊服務,Glance 支持對接多種後端存儲。與 Ceph 完成對接後,Glance 上傳的 Image 會作為塊設備儲存在 Ceph 集群中。新版本的 Glance 也開始支持 enabled_backends 了,可以同時對接多個存儲提供商。

寫時復制技術(-on-write) :內核只為新生成的子進程創建虛擬空間結構,它們復制於父進程的虛擬空間結構,但是不為這些段分配物理內存,它們共享父進程的物理空間,當父子進程中有更改相應的段的行為發生時,再為子進程相應的段分配物理空間。寫時復制技術大大降低了進程對資源的浪費。

全部控制節點進行配置;以controller01節點為例;
只修改涉及glance集成ceph的相關配置

變更配置文件,重啟服務

ceph官網介紹 QEMU和塊設備

對接 Ceph 之後,通常會以 RAW 格式創建 Glance Image,而不再使用 QCOW2 格式,否則創建虛擬機時需要進行鏡像復制,沒有利用 Ceph RBD COW 的優秀特性。

總結

將openstack集群中的glance鏡像的數據存儲到ceph中是一種非常好的解決方案,既能夠保障鏡像數據的安全性,同時glance和nova在同個存儲池中,能夠基於-on-write(寫時復制)的方式快速創建虛擬機,能夠在秒級為單位實現vm的創建。

全部計算節點進行配置; 以compute01節點為例;只修改glance集成ceph的相關配置

全部計算節點重啟cinder-volume服務;

任意openstack控制節點上查看;

在任意控制節點為cinder的ceph後端存儲創建對應的type,在配置多存儲後端時可區分類型;

為ceph type設置擴展規格,鍵值 volume_backend_name ,value值 ceph

任意控制節點上創建一個1GB的卷 ;最後的數字1代表容量為1G

查看創建好的卷

openstack創建一個空白 Volume,Ceph相當於執行了以下指令

從鏡像創建 Volume 的時候應用了 Ceph RBD COW Clone 功能,這是通過 glance-api.conf [DEFAULT] show_image_direct_url = True 來開啟。這個配置項的作用是持久化 Image 的 location,此時 Glance RBD Driver 才可以通過 Image location 執行 Clone 操作。並且還會根據指定的 Volume Size 來調整 RBD Image 的 Size。

一直存在的cirros_qcow2鏡像為對接ceph之前的鏡像,現在已無法使用,所以將之刪除

在openstack上從鏡像創建一個Volume,Ceph相當於執行了以下指令

任意控制節點操作;

查看快照詳細信息

在openstack上對鏡像的卷創建快照,Ceph相當於執行了以下指令

如果說快照時一個時間機器,那麼備份就是一個異地的時間機器,它具有容災的含義。所以一般來說 Ceph Pool backup 應該與 Pool images、volumes 以及 vms 處於不同的災備隔離域。

https://www.cnblogs.com/luohaixian/p/9344803.html

https://docs.openstack.org/zh_CN/user-guide/backup-db-incremental.html

一般的,備份具有以下類型:

在虛擬磁碟映像的計算節點上使用本地存儲有一些缺點:

Nova 為 OpenStack 提供計算服務,對接 Ceph 主要是希望將實例的系統磁碟文件儲存到 Ceph 集群中。與其說是對接 Nova,更准確來說是對接 QEMU-KVM/libvirt ,因為 librbd 早已原生集成到其中。

如果需要從ceph rbd中啟動虛擬機,必須將ceph配置為nova的臨時後端;
推薦在計算節點的配置文件中啟用rbd cache功能;
為了便於故障排查,配置admin socket參數,這樣每個使用ceph rbd的虛擬機都有1個socket將有利於虛擬機性能分析與故障解決;
相關配置只涉及全部計算節點ceph.conf文件的[client]與[client.cinder]欄位,以compute163節點為例

全部計算節點配置 ceph.conf文件相關的 [client] 與 [client.cinder] 欄位,以compute01節點為例;

在全部計算節點配置nova後端使用ceph集群的vms池,以compute01節點為例;

在全部計算節點操作;

在全部計算節點操作,以compute01節點為例;
以下給出libvirtd.conf文件的修改處所在的行num

『叄』 swift之存儲屬性和計算屬性

swift中的屬性分為 兩 類: 存儲 屬性和 計算 屬性
1.存儲屬性(包含 實例 存儲屬性和 類型 存儲屬性):把常量或變數的值作為實例的一部分,可以直接讀寫賦值。變數可用 var 或者 let 關鍵字定義,用 var 定義的屬性為 變數 存儲屬性,用 let 定義的屬性為 常量 存儲屬性

2.計算屬性:不直接存儲值,本身只起 計算作用 ,沒有 具體 的值,提供一個 getter 來獲取值,類似於 方法 的功能

存儲屬性和計算屬性比較:

『肆』 swift和cinder的區別

你好
關於cinder和swift的區別:
cinder與swift各自的用途是什麼?
cinder是塊存儲,用來給虛擬機掛擴展硬碟,就是將cinder創建出來的卷,掛到虛擬機里。cinder是OpenStack到F版,將之前在Nova中的部分持久性塊存儲功能(Nova-Volume)分離了出來,獨立為新的組件Cinder

swift是一個系統,可以上傳和下載,裡面一般存儲的是不經常修改的內容,比如用於存儲 VM 鏡像、備份和歸檔以及較小的文件,例如照片和電子郵件消息。更傾向於系統的管理

塊存儲具有安全可靠、高並發大吞吐量、低時延、規格豐富、簡單易用的特點,適用於文件系統、資料庫或者其他需要原始塊設備的系統軟體或應用。

上面其實很多感覺不是太直觀,個人認為cinder可以理解為個人電腦的移動硬碟,它可以隨意格式化,隨時存取。
對於swift可以作為網盤,相信對於雲技術的同學來說,網盤應該是不陌生的,如果把一些經常用的內容,放到網盤中是非常不方便的。

Swift 還是 Cinder?何時使用以及使用哪一種?
那麼,應該使用哪一種對象存儲:Swift 還是 Cinder?答案取決於您的應用程序。如果需要運行商用或遺留應用程序,那麼很少需要進行這種選擇。這些應用程序不可能被編碼來利用 Swift API,但您可以輕松掛載一個 Cinder 磁碟,它表現得就像是直接將存儲附加到大多數應用程序。
當然,您還可以對新應用程序使用 Cinder,但是不會從 Swift 自動附帶的彈性和冗餘中獲益。如果編程人員面對這樣的挑戰,那麼 Swift 的分布式可擴展架構是一個值得考慮的特性。

單點故障
Swift 架構是分布式的,可防止所有單點故障和進行水平擴展。
cinder存在單點故障還未解決

更多內容,以下來自ibm資料庫:

塊存儲 (Cinder)
Cinder 是 OpenStack Block Storage 的項目名稱;它為來賓虛擬機 (VM) 提供了持久塊存儲。對於可擴展的文件系統、最大性能、與企業存儲服務的集成以及需要訪問原生塊級存儲的應用程序而言,塊存儲通常是必需的。
系統可以暴露並連接設備,隨後管理伺服器的創建、附加到伺服器和從伺服器分離。應用程序編程介面 (API) 也有助於加強快照管理,這種管理可以備份大量塊存儲。

對象存儲 (Swift)

Swift 是兩種產品中較為成熟的一個:自 OpenStack 成立以來一直是一個核心項目。Swift 的功能類似於一個分布式、可訪問 API 的存儲平台,可直接將它集成到應用程序中,或者用於存儲 VM 鏡像、備份和歸檔以及較小的文件,例如照片和電子郵件消息。

Object Store 有兩個主要的概念:對象和容器。

對象就是主要存儲實體。對象中包括與 OpenStack Object Storage 系統中存儲的文件相關的內容和所有可選元數據。數據保存為未壓縮、未加密的格式,包含對象名稱、對象的容器以及鍵值對形式的所有元數據。對象分布在整個數據中心的多個磁碟中,Swift 可以藉此確保數據的復制和完整性。分布式操作可以利用低成本的商用硬體,同時增強可擴展性、冗餘性和持久性。

容器類似於 Windows® 文件夾,容器是用於存儲一組文件的一個存儲室。容器無法被嵌套,但一個租戶可以供創建無限數量的容器。對象必須存儲在容器中,所以您必須至少擁有一個容器來使用對象存儲。

與傳統的文件伺服器不同,Swift 是橫跨多個系統進行分布的。它會自動存儲每個對象的冗餘副本,從而最大程度地提高可用性和可擴展性。對象版本控制提供了防止數據意外丟失或覆蓋的額外保護
希望對你有幫助

『伍』 ios swift中採用什麼持久化數據

1、plist文件(屬性列表),通常用於儲存用戶設置,也可以用於存儲捆綁的信息; 2、preference(偏好設置),常用於保存少量數據; 3、NSKeyedArchiver(歸檔),將內存中的對象實例保存成binary到磁碟並且可以逆向這個過程用來保存用戶操作狀態等; 4、SQLite 3,使用資料庫進行存儲; 5、CoreData,它提供了對象-關系映射(ORM)的功能,即能夠將OC對象轉化成數據,保存在SQLite資料庫文件中,也能夠將保存在資料庫中的數據還原成OC對象。

『陸』 swift能幹什麼,不能幹什麼及相關概念

本帖最後由 pig2 於 2014-3-11 18:45 編輯
1.swift 是什麼?
OpenStackObject Storage (Swift) 是開源的,用來創建可擴展的、冗餘的、對象存儲(引擎)。 swift使用標准化的伺服器存儲 PB 級可用數據。但它並不是文件系統 (file system) ,實時的數據存儲系統(real-timedata storage system) 。 swift 看起來更像是一個長期的存儲系統 (long term storage system) ,為了獲得、調用、更新一些靜態的永久性的數據。比如說,適合存儲一些類型的數據:虛擬機鏡像,圖片存儲,郵件存儲,文檔的備份。沒有「單點」或者主控結點 (master point of control) , swift看起來具有更強的擴展性、冗餘和持久性。

2.swift 能做什麼?
長於存儲非結構化數據,大、小文件性能據說都很好(目前沒有測試數據, adrian otto 說測試過10 億個 1byte 數據)。
簡單來說swift是開發蘋果iOS的最快捷的計算機語言。
但是實際上swift已經可以進行一次性編譯之後,同時實現在蘋果iOS和安卓系統上的部署。能夠實現這個功能的目前唯一的IDE是SCADE,一個德國的軟體產品(目前處於試用狀態)。
而且從2015年起,swift不但支持在手機前端的開發,還支持開發伺服器後端的程序,比如使用PerfectlySoft出品的Perfect 2.0就可以確保swift在Linux Ubuntu 16.04上運行並實現一個Web伺服器,訪問各種資料庫並調用遠程訪問。實際上Perfect 2.0是市面上最快的HTTP伺服器,比php和java伺服器都快得多。

3.swift 不能做什麼?

Objects must be <5GB : swift 1.2 之後已經對 object 的大小不做限制
Not a Filesystem :不是文件系統。 swift 使用 REST API ,而不是使用傳統意義上的文件操作命令, open(), read(), write(), seek(), 和 close() 等。
No File Locking :乾脆不支持「文件鎖」。其實在 swift 中,「鎖」的概念是沒有必要的。
No Directory Hierarchies :沒有文件目錄結構。 swift 可以模擬目錄結構,但沒有必要
Not a Database :不是資料庫。 swift 使用 account-container-object 的概念存儲 object ,可以列表出指定 container 中的 object ,不支持 server 端的查詢和處理操作。

『柒』 Swift下UserDefaults的常見使用和注意事項

UserDefaults 適合存儲輕量級的本地客戶端數據,這是一種常見的數據持久化方式。(建議:如果是存儲大批量的數據不要使用這個方法)

這個方法可以基於iCloud做跨設備的UserDefaults數據存儲,參考 NSUbiquitousKeyValueStore

這個方法可以獲得當前App存儲的所有UserDefaults數據

這個通知可以在UserDefault發生改變時發出。可以考慮當這個通知發生時全局進行同步數據。 UserDefaults.didChangeNotification

在iOS7或者7以下,一般只會在app返回background的時候才會保存數據到disk,但是iOS8以及以上之後app都會在極其短的周期內去保存數據,除非極其頻繁且大規模地進行寫入的操作,一般而言都會在可接受的時間內完成這項操作。

在iOS8以及以上,讀數據大約需要0.5微妙的時間,但是寫入數據需要10倍左右的時間,需要將key-valu通過 NSPropertyListSerialization 轉化成plist data

總而言之,iOS8以及以上的系統內不太建議使用 synchronize() 方法

enum for Keys used to store data

Save in UserDefaults where you want

Retrieve data anywhere in app

Remove Values

利用UserDefaults我們可以方便地存取一些簡單的資料,然而當我們存取的資料類型是Int,Bool,Float,Double時,卻會遇到一個特別的問題。因為她們回傳的類型不是optional,所以不會返回nil,而是一個預設的值,比如0,false之類。可能我們存在一些需求,希望沒有存儲值時返回nil,那麼有兩種方式可以解決這個問題。

這個方法的返回值是不可選的,會有默認值

更多參考:

有些是返回可選類型的

使用register(defaults:)設定找不到key對應的value時回傳的預設值,比如nil

register設定的內容是暫存的,並沒有存檔,所以每次App啟動時都要再設定一次。(並且沒有設為nil這種操作,設為nil意味著取消該項的設置,後面取值時依舊會採用默認值)

通過回傳Any?的 object(forKey:) 搭配 as? 轉型判斷

這個方法返回值是可選的

比如:

由於回傳的類型是Any?,所以找不到key number對應的value時會回傳nil

參考鏈接: UserDefaults預設值

value(forKey:) 是KVC的語法,它並不是一個UserDefaults的直接方法。所以最好不要在 UserDefaults

Never use value(forKey:) on UserDefaults or Dictionary or any other class unless you have a clearly understood need to use key-value coding to get the desired result.

When you don't have such a need, use the standard access methods provided by UserDefaults object(forKey:)

再補充一點:
The value(forKey:) is not a UserDefaults-only method. It is enabled by the NSKeyValueCoding , which, According to Apple's Documentation.
NSKeyValueCoding is an informal protocol that objects adopt to provide indirect access to their properties. When an object is key-value coding compliant, its properties are addressable via string parameters through a concise, uniform messaging interface.

It happens that UserDefaults is NSKeyValueCoding compliant, so people have started (not necessarily in the correct way) using it for accessing UserDefaults.

簡而言之,UserDefaults也是遵循了 NSKeyValueCoding 協議的,所以使用 value(forKey:) 也是可以獲取到數據,但是不建議這種用法。在 UserDefaults 裡面最好使用 object(forKey:) ,這是標准用法

參考鏈接: 在UserDefaults中object(forKey:)和value(forKey:)的區別

NSUserDefaults — A Swift Introction
[NSUserDefaults synchronize] is Planned to be Deprecated

以上大多是一些需要注意的問題。關於Swift的常見用法,已經有很多博客在詳述了,可以參考: Swift:UserDefaults協議(Swift視角下的泛字元串類型API)

『捌』 對象存儲 - Swift

Swift 是 提供 高可用分布式對象存儲 的服務,為nova組件提供虛擬機鏡像存儲服務。
在數據冗餘方面,無需採用read【?】通過在軟體層面,引入一致性散列技術和數據冗餘,犧牲一定程度的數據一致性,來達到高可用和可伸縮性。
支持多租戶模式下,容器和對象讀寫操作,適用於互聯網應用場景下非結構化的數據存儲,比如,華為雲盤等。

以上術語之間的關系:

首先,可以創建多個account,每個account里可以創建多個容器container,每個container下可以創建多個object。 【container 之間不能相互嵌套】

Swift的介紹
Swift在物理結構上往往會存儲對象的多個副本,通常按照物理位置的特點,將對象拷貝到不同的物理位置的特點,將對象拷貝到不同的物理位置上,來保證數據的可靠性。

以上術語之間的關系:

可以根據不同的物理位置,有不同的Region,不同的region代表兩個不同的城市,然後在同一個region下,為冗餘的考慮,設置了多個可用區,zone。每一個可用區可以有不同的存儲節點,node;在更大的架構上,兩個region可以構成一個cluster。

首先,用戶提出一個對象存儲服務的申請,由Swift的API接受和處理,收到之後,先去找 Keystone 認證節點,對用戶的身份進行認證。
認證通過後,將請求提交給名稱為Swift Proxy的組件,Swift Proxy是Swift 的代理,由Swift Proxy來確定究竟應該將存儲對象放在哪一個滿足存儲要求的存儲節點上。最終將對象存儲到指定的存儲節點上即可。最終將返回結果返回給用戶。

『玖』 openstack中,為什麼要分離存儲

增加額外持久化的空間。
非持久化存儲用來運行操作系統,Cinder用來增加額外持久化的空間,Swift用於保存鏡像和數據,也可用於大數據。
非持久存儲開始,也稱為臨時存儲。顧名思義,在OpenStack環境中使用虛擬機的用戶在虛擬機終止後將丟失關聯的磁碟。當租戶在OpenStack集群上啟動虛擬機時,Glance鏡像的一份拷貝會下載到計算節點上。此鏡像將作為Nova實例的第一個磁碟,它提供臨時存儲。一旦Nova實例終止,存儲在該磁碟上的所有內容都將丟失。