OpenStack其實有三個與存儲相關的組件,這三個組件被人熟知的程度和組件本身出現時間的早晚是相符的,按熟悉程度排列如下:
Swift——提供對象存儲 (Object Storage),在概念上類似於Amazon S3服務,不過swift具有很強的擴展性、冗餘和持久性,也兼容S3 API
Glance——提供虛機鏡像(Image)存儲和管理,包括了很多與Amazon AMI catalog相似的功能。(Glance的後台數據從最初的實踐來看是存放在Swift的)。
Cinder——提供塊存儲(Block Storage),類似於Amazon的EBS塊存儲服務,目前僅給虛機掛載使用。
(Amazon一直是OpenStack設計之初的假象對手和挑戰對象,所以基本上關鍵的功能模塊都有對應項目。除了上面提到的三個組件,對於AWS中的重要的EC2服務,OpenStack中是Nova來對應,並且保持和EC2 API的兼容性,有不同的方法可以實現)
② 資料庫冗餘怎麼辦
它將冗餘數據選擇到一個游標中,並根據(LastName,FirstName)來分組(在我們這個方案中),然後打開游標然後循環地取出每一行,然後用與先前的取出的鍵值進行比較,如果這是第一次取出這個值,或者這個值不是冗餘鍵,那麼跳過這個記錄然後取下一個,不然的話,這就是這個組中的冗餘記錄,所以刪掉它.
讓我嫌宴櫻們運行一下這個存儲過程
BEGIN
DeleteDuplicates;
END;
/
SELECT LastName, FirstName, COUNT(*)
FROM Customers
GROUP BY LastName, FirstName
HAVING COUNT(*) > 1;
最後一個查詢語句沒有返回值,所以冗餘數據沒有了從表中取冗餘數據的過程完全是由定義在csr_Duplicates 這個游標中的SQL語句來實現的,PL/SQl只是用來實現刪除冗餘數,那麼能不能完全用SQL語句來實現呢?
二.SQL解決方案,使用RANK()刪除冗餘數據Oracle8i分析函數RANK()來枚舉每一個組中的元素,在我們的方案中, 我們應用這個方案,我們使用這個函數祥鉛動態的把冗餘數據連續的排芹叢列起來加上編號,組由Partintion by 這個語句來分開,然後用Order by 進行分組SELECT ID, LastName, FirstName, RANK() OVER (PARTITION BY LastName,
FirstName ORDER BY ID) SeqNumber
FROM Customers
ORDER BY LastName, FirstName;
SQL
Listing 7. Output of single SQL statement that uses RANK()
顯示的是根據記錄的條數的個數來顯示尤其對於冗餘數據
ID LASTNAME FIRSTNAME SEQNUMBER
----- --------------- ---------- ----------
1018 Blake Becky 1
1013 Blue Don 1
1000 Bradley Tom 1
1002 Chang Jim 1
1008 Griffith David 1
1020 Hill Larry 1
1004 King Chuck 1
1005 Krieger Jeff 1
1012 Krieger Jeff 2
1017 Krieger Jeff 3
1003 Loney Julie 1
1007 Lord Don 1
1015 Mason Paul 1
1006 Monroe John 1
1009 Simon Michael 1
1010 Simon Michael 2
1001 Stone Tony 1
1011 Stone Tony 2
1014 Stone Tony 3
1016 Stone Tony 4
1019 Stone Tony 5
我們可以看一到,SeqNumber這一列中的數值,冗餘數據是根據ID號由小到大進行的排序,所有的冗餘數據的SqlNumber都大於一,所有的非冗餘數據都等於一,所以我們取自己所需,刪除那麼沒用的SELECT ID, LastName, FirstName
FROM
(SELECT ID, LastName, FirstName, RANK() OVER (PARTITION BY LastName,
FirstName ORDER BY ID) AS SeqNumber
FROM Customers)
WHERE SeqNumber > 1;
SQL
Listing 8. 冗餘鍵的鍵值
有七行必須被刪除
ID LASTNAME FIRSTNAME
----- --------------- ----------
1012 Krieger Jeff
1017 Krieger Jeff
1010 Simon Michael
1011 Stone Tony
1014 Stone Tony
1016 Stone Tony
1019 Stone Tony
7 rows selected.這顯示有七行需要刪除,還是用上一個表我測試了一下這個代碼,它用了77秒種就刪除了所有的數據准備好了用Sql語句來刪除冗餘數據,版本一它執行了135秒
DELETE
FROM CUSTOMERS
WHERE ID IN
(SELECT ID
FROM
(SELECT ID, LastName, FirstName, RANK() OVER (PARTITION BY LastName,
FirstName ORDER BY ID) AS SeqNumber
FROM Customers)
WHERE SeqNumber > 1);
我們可以看到最後的兩行語句對表中的數據進行了排序,這不是有效的,所以我們來優化一下最後一個查詢語句,把Rank()函數應用到只含有冗餘數據的組,而不是所有的列下面這個語句是比較有效率的,雖然它不像上一個查詢那樣精簡SELECT ID, LastName, FirstName
FROM
(SELECT ID, LastName, FirstName, RANK() OVER (PARTITION BY LastName,
FirstName ORDER BY ID) AS SeqNumber
FROM
(SELECT ID, LastName, FirstName
FROM Customers
WHERE (LastName, FirstName) IN (SELECT LastName, FirstName
FROM Customers
GROUP BY LastName, FirstName
HAVING COUNT(*) > 1)))
WHERE SeqNumber > 1;
選擇冗餘數據只用了26秒鍾,這樣就提高了67%的性能,這樣就提高了將這個作為子查詢的刪除查詢的效率,
DELETE
FROM Customers
WHERE ID IN
(SELECT ID
FROM
(SELECT ID, LastName, FirstName, RANK() OVER (PARTITION BY LastName,
FirstName ORDER BY ID) AS SeqNumber
FROM
(SELECT ID, LastName, FirstName
FROM Customers
WHERE (LastName, FirstName) IN (SELECT LastName, FirstName
FROM Customers
GROUP BY LastName, FirstName
HAVING COUNT(*) > 1)))
WHERE SeqNumber > 1);
現在只用了47秒鍾的就完成的上面的任務,比起上一個136秒,這是一個很大的進步,相比之下,存儲過程用了56秒,這樣存儲過程有些慢了使用PL/SQL語句我們和我們以上的代碼,會得到更好的更精確的代碼,和提高你代碼的執行效率,雖然對於從資料庫中枚舉數據PL/SQL對於Sql兩者沒有什麼差別,但是對於數據的比較上,PL/SQL就比SQL要快很多,但是如果冗餘數據量比較小的話,我們盡量使用SQL而不使用PL/SQL如果你的數據表沒有主鍵的話,那麼你可以參考其它技術
Rank()其它的方法
使用Rank()函數你可以對選擇你所保留的數據,(或者是小ID的或者是大ID 的,就由RECDate這個列來決定這種情況下,你可以把REcdate加入到(Orderby )子句中,倒序或者正序
這是一種保留最大Id的一種解決方案
DELETE
FROM Customers
WHERE ID IN
(SELECT ID
FROM
(SELECT ID, LastName, FirstName, RANK() OVER (PARTITION BY LastName, FirstName ORDER BY RecDate DESC, ID) AS SeqNumber
FROM
(SELECT ID, LastName, FirstName, RecDate
FROM Customers
WHERE (LastName, FirstName) IN (SELECT LastName, FirstName
FROM Customers
GROUP BY LastName, FirstName
HAVING COUNT(*) > 1)))
WHERE SeqNumber > 1);
這種技術保證了你可以控制每一個表中的保留的組,假設你有一個資料庫,有一個促銷或者有一個折扣信息,比如一個團體可以使用這種促銷5次,或者個人可以使用這個折扣三次,為了指出要保留的組的個數,你可以在where 和having子句中進行設置,那麼你將刪除所有大於你
設置有數的冗餘組
DELETE
FROM Customers
WHERE ID IN
(SELECT ID
FROM
(SELECT ID, LastName, FirstName, RANK() OVER (PARTITION BY LastName,
FirstName ORDER BY ID) AS SeqNumber
FROM
(SELECT ID, LastName, FirstName
FROM Customers
WHERE (LastName, FirstName) IN (SELECT LastName, FirstName
FROM Customers
GROUP BY LastName, FirstName
HAVING COUNT(*) > 3)))
WHERE SeqNumber > 3);
As you can see, using the RANK() function allows you to eliminate plicates in a
single SQL statement and gives you more capabilities by extending the power of
your
queries.
正如你所見使用Rank()可以消除冗餘數據而且能給你很大的可伸展性
③ 單個硬碟如何做冗餘
1、首先,您要知道什麼事冗餘。冗餘,指重復配置 系統的一些部件,當系統發生 故障時,冗餘配置的部件介入並承擔故障部件的工作,由此減少系統的故障時間。
2、常用冗餘的分類:
a、電源:高端伺服器產品中普遍採用雙電源 系統,這兩個電源是負載均衡的,在系統工作時它們都為系統提供電力,當一個電源出現故障時,另一個電源就承擔所有的負載。
b、磁碟鏡像:將相同的數據分別寫入兩個磁碟中。
c、RAID: 即磁碟陣列(Rendant array of inexpensive disks)的縮寫。它由幾個磁碟組成,通過一個控制器協調運動機制使單個數據流依次寫入這幾個磁碟中。常用的有RAID0、RAID1、RAID1+0、RAID3、RAID5;RAID3系統由5個磁碟構成,其中4 個 磁碟存儲數據,1個磁碟存儲校驗信息。如果一個磁碟發生故障,可以在線更換故障盤,並通過另3個磁碟和校驗盤重新創建新盤上的數據。RAID5將校驗信息分布在5個磁碟上,這樣可更換任一磁碟,其餘與RAID3相同。
d、網卡:冗餘網卡技術原為大型機及中型機上的技術,現在也逐漸被PC伺服器所擁有,多用於網路系統的某個核心環節出現故障而造成整個網路系統崩潰。
3、綜上所述,單個硬碟沒有冗餘功能。
④ 資料庫伺服器硬碟一定要有 冗餘機制 冗餘機制是干什麼的
通過多重備份來增加系統的可靠性!
冗餘系統配件主要有:
電源:高端伺服器產品中普遍採用雙電源系統,這兩個電源是負載均衡的,即在系統工作時它們都為系統提供電力,當一個電源出現故障時,另一個電源就承擔所有的負載。有些伺服器系統實現了DC的冗餘,另一些伺服器產品如Micron公司的NetFRAME 9000實現了AC、DC的全冗餘。
存儲子系統:存儲子系統是整個伺服器系統中最容易發生故障的地方。以下幾種方法可以實現該子系統的冗餘。
磁碟鏡像:將相同的數據分別寫入兩個磁碟中:
磁碟雙聯:為鏡像磁碟增加了一個I/O控制器,就形成了磁碟雙聯,使匯流排爭用情況得到改善;
RAID:廉價冗餘磁碟陣列(Rendant array of inexpensive disks)的縮寫。顧名思義,它由幾個磁碟組成,通過一個控制器協調運動機制使單個數據流依次寫入這幾個磁碟中。RAID3系統由5個磁碟構成,其中4個磁碟存儲數據,1個磁碟存儲校驗信息。如果一個磁碟發生故障,可以在線更換故障盤,並通過另3個磁碟和校驗盤重新創建新盤上的數據。RAID5將校驗信息分布在5個磁碟上,這樣可更換任一磁碟,其餘與RAID3相同。
I/O卡:對伺服器來說,主要指網卡和硬碟控制卡的冗餘。網卡冗餘是在伺服器中插上雙網卡。冗餘網卡技術原為大型機及中型機上的技術,現在也逐漸被PC伺服器所擁有。PC伺服器如Micron公司的NetFRAME9200最多實現4個網卡的冗餘,這4個網卡各承擔25%的網路流量。康柏公司的所有ProSignia/Proliant伺服器都具有容錯冗餘雙網卡。